Phương thức thực hiện bản dựng (Dialogflow)

Phương thức thực hiện sẽ xác định giao diện trò chuyện cho Hành động của bạn để lấy thông tin đầu vào của người dùng và logic để xử lý dữ liệu đầu vào, cuối cùng là thực hiện Hành động đó.

Xác định cuộc trò chuyện của bạn

Giờ thì bạn đã xác định Hành động, bạn có thể tạo cuộc trò chuyện tương ứng cho các Hành động đó. Bạn thực hiện việc này bằng cách tạo ý định Dialogflow xác định ngữ pháp hoặc những điều người dùng cần nói để kích hoạt ý định và phương thức thực hiện tương ứng để xử lý ý định khi ý định được kích hoạt.

Bạn có thể tạo bao nhiêu ý định tuỳ thích để xác định ngữ pháp của toàn bộ cuộc trò chuyện.

Tạo ý định

Nhấp vào dấu + bên cạnh mục trong trình đơn Ý định trong trình đơn điều hướng bên trái của Dialogflow. Trình chỉnh sửa ý định (Intent Editor) sẽ xuất hiện để bạn có thể nhập các thông tin sau:

  • Intent name (Tên ý định) là tên của ý định hiện trong IDE.
  • Ngữ cảnh cho phép bạn xác định phạm vi kích hoạt ý định trong các trường hợp cụ thể. Hãy đọc tài liệu Dialogflow về Ngữ cảnh để biết thêm thông tin.
  • Sự kiện kích hoạt ý định mà không cần người dùng nói bất cứ điều gì. Một ví dụ là sự kiện GOOGLE_ASSISTANT_WELCOME. Sự kiện này cho phép Trợ lý Google gọi Hành động của bạn. Sự kiện này được dùng cho Hành động mặc định của Hành động. Hãy tham khảo tài liệu của chúng tôi để biết thêm thông tin về các ý định của trình trợ giúp tích hợp sẵn.
  • Cụm từ huấn luyện xác định những gì người dùng cần nói (ngữ pháp) để kích hoạt ý định. Nhập một vài cụm từ ở đây (5-10) về những gì người dùng có thể nói để kích hoạt ý định. Dialogflow tự động xử lý các biến thể tự nhiên của các cụm từ mẫu mà bạn cung cấp.
  • Hành động và tham số sẽ xác định dữ liệu cần truyền đến phương thức thực hiện nếu phương thức thực hiện được bật cho ý định này. Dữ liệu này bao gồm dữ liệu được phân tích cú pháp từ hoạt động đầu vào của người dùng và tên mà bạn có thể sử dụng trong phương thức thực hiện của mình để phát hiện ý định nào được kích hoạt. Sau này, bạn sẽ sử dụng tên này để liên kết ý định của mình với logic thực hiện tương ứng. Xem Hành động và thông số trong tài liệu Dialogflow để biết thêm thông tin về cách xác định Hành động.

  • Phản hồi là Trình tạo phản hồi Dialogflow, nơi bạn có thể xác định phản hồi cho ý định này ngay trong Dialogflow mà không cần thực hiện cuộc gọi. Tính năng này hữu ích cho các phản hồi tĩnh không yêu cầu phương thức thực hiện. Bạn có thể sử dụng tính năng này để gửi tin nhắn chào mừng hoặc tin nhắn tạm biệt đơn giản. Tuy nhiên, bạn có thể sẽ dùng phương thức thực hiện để phản hồi người dùng đối với hầu hết ý định.

  • Phương thức thực hiện chỉ định xem bạn có muốn gọi phương thức thực hiện hay không khi ý định này được kích hoạt. Rất có thể bạn sẽ bật tính năng này cho hầu hết ý định của nhân viên hỗ trợ Dialogflow. Để xem mục này trong ý định, bạn phải bật phương thức thực hiện cho tác nhân trong trình đơn Fulfillment (Thực hiện).

Tạo phản hồi trong Dialogflow

Đối với một số ý định, có thể bạn không cần phương thức thực hiện trả về phản hồi. Trong những trường hợp này, bạn có thể sử dụng trình tạo phản hồi trong Dialogflow để tạo phản hồi.

Trong khu vực Phản hồi, hãy cung cấp phản hồi bằng văn bản mà bạn muốn trả lại cho người dùng. Phản hồi mặc định bằng tin nhắn văn bản là những phản hồi bằng văn bản TTS đơn giản, có thể hoạt động với nhiều công cụ tích hợp Dialogflow. Bạn có thể xem nội dung phản hồi của Trợ lý Google trên trang Phản hồi.

Xây dựng lượt phản hồi về việc thực hiện đơn hàng

Mã phương thức thực hiện của bạn được lưu trữ trong logic thực hiện webhook cho một Hành động. Ví dụ: trong mẫu Silly Name Maker, logic này có trong index.js cho Hàm Cloud cho Firebase.

Khi một ý định được kích hoạt bằng phương thức thực hiện, bạn sẽ nhận được yêu cầu từDialogflow chứa thông tin về ý định. Sau đó, bạn phản hồi yêu cầu bằng cách xử lý ý định và trả về một phản hồi. Yêu cầu và phản hồi này được xác định bằng Webhook Dialogflow.

Bạn nên sử dụng thư viện ứng dụng Node.js để xử lý yêu cầu và trả về phản hồi. Sau đây là quy trình chung về việc sử dụng thư viện ứng dụng:

  1. Khởi động đối tượng Dialogflow. Đối tượng này tự động xử lý việc lắng nghe yêu cầu và phân tích cú pháp để bạn có thể xử lý các yêu cầu đó trong phương thức thực hiện của mình.
  2. Tạo hàm để xử lý yêu cầu. Các hàm này xử lý hoạt động đầu vào của người dùng và các thành phần khác của ý định, đồng thời tạo phản hồi để quay lại Dialogflow.

Khởi động đối tượng Dialogflow

Mã sau đây tạo thực thể cho Dialogflow và thực hiện một số quá trình thiết lập Node.js nguyên mẫu cho Google Cloud Functions:

Node.js
'use strict';

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

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

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

Tạo hàm để xử lý yêu cầu

Khi người dùng nói một cụm từ kích hoạt ý định, bạn sẽ nhận được yêu cầu từDialogflow mà bạn xử lý bằng một hàm trong phương thức thực hiện. Trong hàm này, bạn thường sẽ làm những việc sau:

  1. Thực hiện mọi logic cần thiết để xử lý hoạt động đầu vào của người dùng.
  2. Xây dựng phản hồi để phản hồi các ý định được kích hoạt. Xem xét nền tảng mà người dùng đang sử dụng để tạo phản hồi thích hợp. Xem các chức năng của nền tảng để biết thêm thông tin về cách phục vụ phản hồi cho nhiều nền tảng.
  3. Gọi hàm ask() bằng phản hồi của bạn.

Mã sau đây cho bạn biết cách tạo 2 phản hồi TTS xử lý ý định gọi (input.welcome) và ý định trong hộp thoại (input.number) để chào mừng người dùng đến với Hành động của bạn, đồng thời đọc lại số điện thoại mà người dùng đã nói cho ý định Dialogflow kèm theo tên:

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

Ý định tuỳ chỉnh Input Number (Số đầu vào), đi kèm với mã ở trên, sử dụng thực thể @sys.number để trích xuất một số từ cách nói của người dùng. Sau đó, ý định sẽ gửi tham số num (chứa số từ người dùng) đến hàm trong phương thức thực hiện.

Thay vì có từng trình xử lý cho mỗi ý định, bạn có thể thêm một hàm dự phòng. Bên trong hàm dự phòng, hãy kiểm tra xem ý định nào đã kích hoạt ý định đó rồi làm điều thích hợp cho phù hợp.

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

Lời nhắc lại không khớp

Khi không thể khớp với bất kỳ ngữ pháp đầu vào nào đã xác định trong Cụm từ huấn luyện của ý định, Dialogflow sẽ kích hoạt một ý định dự phòng. Ý định dự phòng thường nhắc lại người dùng để cung cấp dữ liệu đầu vào cần thiết cho Hành động của bạn. Bạn có thể cung cấp các cụm từ nhắc lại bằng cách chỉ định các cụm từ đó trong khu vực Phản hồi của ý định dự phòng hoặc bạn có thể sử dụng webhook để đưa ra câu trả lời.

Khi phản hồi của người dùng không khớp với các cụm từ huấn luyện của Hành động, Trợ lý Google sẽ cố gắng xử lý thông tin đầu vào đó. Hành vi này hỗ trợ người dùng thay đổi Hành động giữa cuộc trò chuyện. Ví dụ: một người dùng hỏi "Tuần này có phim gì?" rồi thay đổi bối cảnh giữa cuộc trò chuyện: "Thời tiết ngày mai thế nào?" Trong ví dụ này, vì "Thời tiết ngày mai thế nào?" không phải là phản hồi hợp lệ cho cuộc trò chuyện do câu lệnh ban đầu kích hoạt nên Trợ lý sẽ tự động tìm cách xử lý việc so khớp và đưa người dùng vào một cuộc trò chuyện phù hợp.

Nếu Trợ lý không tìm thấy Hành động thích hợp, phù hợp với hoạt động đầu vào của người dùng, thì người dùng sẽ được trả về ngữ cảnh của Hành động đó.

Vì Trợ lý có thể làm gián đoạn Hành động của bạn để phản hồi trong trường hợp không khớp hợp lệ, đừng sử dụng ý định dự phòng làm cách để thực hiện truy vấn của người dùng. Bạn chỉ nên sử dụng ý định dự phòng để nhắc lại người dùng khi nhập dữ liệu hợp lệ.

Cách tạo ý định dự phòng:

  1. Nhấp vào Ý định trong trình đơn điều hướng của Dialogflow.
  2. Nhấp vào biểu tượng ⋮ bên cạnh Create Intent (Tạo ý định) rồi chọn Create Build Intent (Tạo ý định dự phòng). (Hoặc, nhấp vào Ý định dự phòng mặc định để chỉnh sửa.)
  3. Chỉ định các cụm từ nhắc lại để trả lời người dùng. Những cụm từ này cần có tính tương tác và hữu ích nhất có thể đối với ngữ cảnh hiện tại của người dùng.

    Cách thực hiện việc này mà không cần phương thức thực hiện: Chỉ định các cụm từ trong khu vực Response (Phản hồi) của ý định. Dialogflow chọn ngẫu nhiên các cụm từ từ danh sách này để phản hồi người dùng cho đến khi kích hoạt ý định cụ thể hơn.

    Cách thực hiện việc này bằng phương thức thực hiện:

    1. Bật/tắt chế độ Bật lệnh gọi webhook cho ý định này trong mục Thực hiện của ý định.
    2. Trong logic của phương thức thực hiện, hãy xử lý ý định dự phòng như mọi ý định khác, như mô tả trong phần Tạo hàm để xử lý yêu cầu.

    Ví dụ: hàm sau sử dụng đối tượng conv.data (tải trọng dữ liệu tuỳ ý mà bạn có thể dùng để duy trì trạng thái) từ thư viện ứng dụng Node.js để lưu trữ một bộ đếm theo dõi số lần một ý định dự phòng được kích hoạt. Nếu được kích hoạt nhiều lần, Hành động sẽ thoát. Mặc dù ý định này không xuất hiện trong mã, nhưng bạn nên thực hiện các ý định khác đặt lại bộ đếm này về 0 khi kích hoạt ý định không phải dự phòng. (Hãy xem mẫu Trình tạo số để biết thông tin chi tiết về cách triển khai dữ liệu này.)

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

Sử dụng ngữ cảnh

Sử dụng ngữ cảnh nếu bạn muốn Dialogflow chỉ kích hoạt ý định dự phòng trong một số trường hợp nhất định. Điều này rất hữu ích nếu bạn muốn có nhiều ý định dự phòng cho các trường hợp không khớp khác nhau.

  • Nếu bạn không đặt ngữ cảnh cho một ý định dự phòng, thì đây được coi là ý định dự phòng chung mà Dialogflow kích hoạt khi không có ý định nào khác được so khớp. Bạn chỉ nên xác định một trong những giá trị này nếu chọn sử dụng.
  • Nếu bạn đặt ngữ cảnh đầu vào cho một ý định dự phòng, Dialogflow sẽ kích hoạt ý định dự phòng này khi các trường hợp sau đây là đúng:

    • Ngữ cảnh hiện tại của người dùng là tập mẹ của các ngữ cảnh được xác định trong ý định.
    • Không có ý định nào khác trùng khớp.

    Điều này cho phép bạn sử dụng nhiều ý định dự phòng với nhiều ngữ cảnh đầu vào để tuỳ chỉnh tính năng nhắc lại không khớp cho các trường hợp cụ thể.

  • Nếu đặt ngữ cảnh đầu ra cho ý định dự phòng, thì bạn sẽ giữ người dùng trong cùng một ngữ cảnh sau khi ý định dự phòng được kích hoạt và xử lý.

Xem phần Ngữ cảnh Dialogflow để biết thêm thông tin.

Lời nhắc lại không cần nhập

Hãy xem trang Lời nhắc lại để biết thông tin chi tiết về cách xử lý khi người dùng không cung cấp thêm dữ liệu đầu vào trên thiết bị thoại như Google Home cần tương tác liên tục.