Lời nhắc lại (Dialogflow)

Khám phá trong Dialogflow

Nhấp vào Tiếp tục để nhập mẫu Lời nhắc lại của chúng tôi vào Dialogflow. Sau đó, hãy làm theo các bước bên dưới để triển khai và thử nghiệm mẫu:

  1. Nhập tên nhân viên hỗ trợ và tạo một nhân viên hỗ trợ Dialogflow mới cho mẫu.
  2. Sau khi nhân viên hỗ trợ nhập xong, hãy nhấp vào Chuyển đến nhân viên hỗ trợ.
  3. Trong trình đơn điều hướng chính, hãy chuyển đến phần Fulfillment (Thực hiện đơn hàng).
  4. Bật Inline Editor (Trình chỉnh sửa cùng dòng), sau đó nhấp vào Deploy (Triển khai). Trình chỉnh sửa chứa mẫu .
  5. Trong trình đơn điều hướng chính, hãy chuyển đến mục Tích hợp, rồi nhấp vào Google Trợ lý Google.
  6. Trong cửa sổ phụ xuất hiện, hãy bật tuỳ chọn Tự động xem trước các thay đổi rồi nhấp vào Kiểm tra để mở Trình mô phỏng thao tác.
  7. Trong trình mô phỏng, hãy nhập Talk to my test app để kiểm tra mẫu!

Bạn có thể sử dụng các tính năng sau đây để xử lý những trường hợp người dùng không cung cấp đầu vào cho Hành động của bạn (lỗi không nhập):

  • Lời nhắc lại theo mặc định của hệ thống – Những câu lệnh này sẽ tự động nhắc lại người dùng với những câu lệnh nhắc lại soạn sẵn dành cho mọi trường hợp.
  • Lời nhắc lại linh hoạt – Khai báo rằng bạn muốn xử lý việc nhắc lại trên sở hữu và nhận ý định (SDK hành động) hoặc sự kiện (Dialogflow) mỗi khi không có dữ liệu đầu vào, do đó bạn có thể xử lý theo từng trường hợp.

Câu lệnh nhắc lại theo mặc định của hệ thống

Theo mặc định, khi bạn trả lời Trợ lý, hệ thống sẽ sử dụng các lời nhắc mặc định để yêu cầu người dùng lặp lại hoặc nhập lại nội dung họ đã nhập.

Dialogflow

Dialogflow thực thi tối đa 3 giá trị đầu vào không khớp và không có dữ liệu đầu vào. Sau khi một cuộc trò chuyện đạt 3 lượt thử thu thập dữ liệu, nhân viên hỗ trợ Dialogflow của bạn sẽ kết thúc cuộc trò chuyện bằng phản hồi mặc định. Mục nhập không khớp trong Dialogflow là khi một trong các ý định dự phòng của bạn được kích hoạt.

Câu lệnh lại linh hoạt

Bạn có thể nhận được một ý định hoặc sự kiện Dialogflow mỗi khi Hành động của bạn không thực hiện được nhận bất kỳ thông tin đầu vào nào. Thao tác này cho phép bạn trả về một phản hồi khác dựa trên một số logic (nếu cần) và nhắc lại người dùng một cách thích hợp.

Dialogflow

Bạn có thể tạo 2 loại ý định không có đầu vào:

  • Ý định thông thường – Phương thức này không áp dụng bất kỳ ngữ cảnh nào nên sẽ được kích hoạt khi không có ý định nào khác phù hợp với bối cảnh để kích hoạt. Thông tin này hữu ích cho những câu lệnh chung mà bạn muốn áp dụng trong hầu hết các trường hợp.

  • Ý định theo dõi – Ý định tiếp theo được thực thi thông qua Dialogflow ngữ cảnh, đảm bảo lời nhắc lại chỉ được kích hoạt sau một số lượt cuộc trò chuyện. Thông tin này rất hữu ích cho các câu lệnh nhắc lại được điều chỉnh cho phù hợp với bạn mà bạn muốn áp dụng tình huống cụ thể.

Cách xử lý sự kiện không nhập dữ liệu:

  1. Trong bảng điều hướng bên trái, hãy nhấp vào Ý định.
  2. Tạo một ý định thông thường hoặc ý định theo dõi.
    • Đối với ý định thông thường: Nhấp vào biểu tượng + trong trình đơn Ý định mục và đặt tên cho ý định của bạn, chẳng hạn như "Nhắc lại".

    • Đối với ý định tiếp theo: Di chuột qua ý định mà bạn muốn tuỳ chỉnh lời nhắc không nhập dữ liệu và nhấp vào Thêm ý định tiếp theo > tuỳ chỉnh. Một ý định mới được tạo bên dưới ý định ban đầu.

  3. Nhấp vào ý định mới tạo để mở trình chỉnh sửa ý định.
  4. Nhấp vào mục Sự kiện rồi nhập " actions_intent_NO_INPUT" vào Trường Thêm sự kiện.
  5. Trong phần Hành động, hãy nhập tên hành động hoặc sử dụng tên được cung cấp theo mặc định. Trong ví dụ này, chúng tôi sẽ sử dụng "no.input".

  6. Nhấp vào Lưu.
  7. Trong thanh điều hướng bên trái, hãy nhấp vào Tích hợp
  8. Chọn Trợ lý Google rồi nhấp vào Kiểm tra để thực hiện đảm bảo các thay đổi được phản ánh trong dự án Actions của bạn.

Mỗi khi xảy ra trường hợp không nhập dữ liệu cho ý định này, bạn có thể sử dụng phương thức thực hiện của bạn để trả về một câu trả lời phù hợp hoặc tạo một câu trả lời trong Dialogflow. Ví dụ: dưới đây là một số mã phương thức thực hiện sử dụng thư viện ứng dụng để xử lý một ý định thông thường không có dữ liệu đầu vào có tên là "Reprompt".

Node.js

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Reprompt', (conv) => {
  const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT'));
  if (repromptCount === 0) {
  conv.ask(`What was that?`);
  } else if (repromptCount === 1) {
  conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`);
  } else if (conv.arguments.get('IS_FINAL_REPROMPT')) {
  conv.close(`Okay let's try this again later.`);
  }
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Java

package com.example;

import com.google.actions.api.ActionRequest;
import com.google.actions.api.ActionResponse;
import com.google.actions.api.DialogflowApp;
import com.google.actions.api.ForIntent;
import com.google.actions.api.response.ResponseBuilder;

public class MyActionsApp extends DialogflowApp {

  @ForIntent("Reprompt")
  public ActionResponse reprompt(ActionRequest request) {
    ResponseBuilder responseBuilder = getResponseBuilder(request);
    int repromptCount = request.getRepromptCount();
    String response;
    if (repromptCount == 0) {
      response = "What was that?";
    } else if (repromptCount == 1) {
      response = "Sorry, I didn't catch that. Could you repeat yourself?";
    } else {
      responseBuilder.endConversation();
      response = "Okay let's try this again later.";
    }
    return responseBuilder.add(response).build();
  }
}

Yêu cầu JSON

Xin lưu ý rằng tệp JSON bên dưới mô tả một yêu cầu webhook.

{
  "responseId": "f26a9188-4998-42eb-ac16-d0e6e273b137-712767ed",
  "queryResult": {
    "queryText": "actions_intent_NO_INPUT",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "Webhook failed for intent: Reprompt",
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            "Webhook failed for intent: Reprompt"
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_media_response_audio"
      },
      {
        "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_account_linking"
      },
      {
        "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_audio_output"
      },
      {
        "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/google_assistant_input_type_voice"
      },
      {
        "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_intent_no_input",
        "parameters": {
          "REPROMPT_COUNT": 2,
          "IS_FINAL_REPROMPT": true
        }
      }
    ],
    "intent": {
      "name": "projects/df-reprompts-kohler/agent/intents/75dfd97d-6368-4436-9533-70f05ae76c96",
      "displayName": "Reprompt"
    },
    "intentDetectionConfidence": 1,
    "languageCode": "en"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "user": {
        "locale": "en-US",
        "userVerificationStatus": "VERIFIED"
      },
      "conversation": {
        "conversationId": "ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA",
        "type": "ACTIVE",
        "conversationToken": "[]"
      },
      "inputs": [
        {
          "intent": "actions.intent.NO_INPUT",
          "rawInputs": [
            {
              "inputType": "VOICE"
            }
          ],
          "arguments": [
            {
              "name": "REPROMPT_COUNT",
              "intValue": "2"
            },
            {
              "name": "IS_FINAL_REPROMPT",
              "boolValue": true
            }
          ]
        }
      ],
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          },
          {
            "name": "actions.capability.ACCOUNT_LINKING"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          }
        ]
      },
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            },
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            }
          ]
        }
      ]
    }
  },
  "session": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA"
}

JSON phản hồi

Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Okay let's try this again later."
            }
          }
        ]
      }
    }
  }
}

SDK Hành động

Cách xử lý các ý định không có đầu vào:

  1. Trong đối tượng conversations bên trong gói hành động, hãy khai báo rằng bạn muốn để nhận ý định actions.intent.NO_INPUT mỗi khi người dùng không cung cấp đầu vào.
    {
      "actions": [
        {
          "description": "Default Welcome Intent",
          "name": "MAIN",
          "fulfillment": {
            "conversationName": "conversation_1"
          },
          "intent": {
            "name": "actions.intent.MAIN"
          }
        }
      ],
      "conversations": {
        "conversation_1": {
          "name": "conversation_1",
          "url": "YOUR_FULFILLMENT_URL",
          "inDialogIntents": [
            {
              "name": "actions.intent.NO_INPUT"
            }
          ]
        }
      }
    }
  2. Khi Trợ lý không nhận được bất kỳ hoạt động đầu vào nào từ người dùng, bạn sẽ nhận được ý định không đầu vào trong yêu cầu tiếp theo đến phương thức thực hiện của bạn. Sau đó, bạn có thể xử lý ý định và trả về phản hồi nhắc lại thích hợp. Dưới đây là một ví dụ:

    Node.js

    const {actionssdk} = require('actions-on-google');
    const functions = require('firebase-functions');
    
    const app = actionssdk({debug: true});
    
    app.intent('actions.intent.MAIN', (conv) => {
      conv.ask(`Hi! Try this sample on a speaker device, ` +
        `and stay silent when the mic is open. If trying ` +
        `on the Actions console simulator, click the no-input ` +
        `button next to the text input field.`);
    });
    
    app.intent('actions.intent.TEXT', (conv, input) => {
      conv.ask(`You said ${input}`);
      conv.ask(`Try this sample on a speaker device, ` +
        `and stay silent when the mic is open. If trying ` +
        `on the Actions console simulator, click the no-input ` +
        `button next to the text input field.`);
    });
    
    app.intent('actions.intent.NO_INPUT', (conv) => {
      const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT'));
      if (repromptCount === 0) {
        conv.ask(`What was that?`);
      } else if (repromptCount === 1) {
        conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`);
      } else if (conv.arguments.get('IS_FINAL_REPROMPT')) {
        conv.close(`Okay let's try this again later.`);
      }
    });
    
    exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

    Java

    package com.example;
    
    import com.google.actions.api.ActionRequest;
    import com.google.actions.api.ActionResponse;
    import com.google.actions.api.ActionsSdkApp;
    import com.google.actions.api.ConstantsKt;
    import com.google.actions.api.ForIntent;
    import com.google.actions.api.response.ResponseBuilder;
    import com.google.actions.api.response.helperintent.Confirmation;
    import com.google.actions.api.response.helperintent.DateTimePrompt;
    import com.google.actions.api.response.helperintent.Permission;
    import com.google.actions.api.response.helperintent.Place;
    import com.google.api.services.actions_fulfillment.v2.model.DateTime;
    import com.google.api.services.actions_fulfillment.v2.model.Location;
    
    public class MyActionsApp extends ActionsSdkApp {
    
      @ForIntent("actions.intent.MAIN")
      public ActionResponse welcome(ActionRequest request) {
        ResponseBuilder responseBuilder = getResponseBuilder(request);
        responseBuilder.add("Hi! Try this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field.");
        return responseBuilder.build();
      }
    
      @ForIntent("actions.intent.TEXT")
      public ActionResponse fallback(ActionRequest request) {
        ResponseBuilder responseBuilder = getResponseBuilder(request);
        responseBuilder.add("You said " + request.getRawInput().getQuery());
        responseBuilder.add("Try this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field.");
        return responseBuilder.build();
      }
    
      @ForIntent("actions.intent.NO_INPUT")
      public ActionResponse reprompt(ActionRequest request) {
        ResponseBuilder responseBuilder = getResponseBuilder(request);
        int repromptCount = request.getRepromptCount();
        String response;
        if (repromptCount == 0) {
          response = "What was that?";
        } else if (repromptCount == 1) {
          response = "Sorry, I didn't catch that. Could you repeat yourself?";
        } else {
          responseBuilder.endConversation();
          response = "Okay let's try this again later.";
        }
        return responseBuilder.add(response).build();
      }
    
    }

    Yêu cầu JSON

    Xin lưu ý rằng tệp JSON bên dưới mô tả một yêu cầu webhook.

    {
      "user": {
        "locale": "en-US",
        "userVerificationStatus": "VERIFIED"
      },
      "conversation": {
        "conversationId": "ABwppHEVDuKUPjdZ4Ud-F2yBXN5ssRg2funUp59hSHQheAi-B5Y3EzehAKFtVwMkduqMRWscUp77ScrDjYnYxISqAM-qOXuXEuCw",
        "type": "ACTIVE",
        "conversationToken": "{\"data\":{}}"
      },
      "inputs": [
        {
          "intent": "actions.intent.NO_INPUT",
          "rawInputs": [
            {
              "inputType": "VOICE"
            }
          ],
          "arguments": [
            {
              "name": "REPROMPT_COUNT",
              "intValue": "2"
            },
            {
              "name": "IS_FINAL_REPROMPT",
              "boolValue": true
            }
          ]
        }
      ],
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.ACCOUNT_LINKING"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          }
        ]
      },
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            },
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            }
          ]
        }
      ]
    }

    JSON phản hồi

    Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook.

    {
      "expectUserResponse": false,
      "finalResponse": {
        "richResponse": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Okay let's try this again later."
              }
            }
          ]
        }
      }
    }