Lưu dữ liệu trong cuộc trò chuyện (Dialogflow)

Khám phá trong Dialogflow

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

  1. Nhập tên nhân viên hỗ trợ rồi tạo một nhân viên hỗ trợ Dialogflow mới cho mẫu.
  2. Sau khi nhập xong nhân viên hỗ trợ, hãy nhấp vào Chuyển đến nhân viên hỗ trợ.
  3. Trên trình đơn điều hướng chính, hãy chuyển đến mục 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ã mẫu.
  5. Trên trình đơn điều hướng chính, hãy chuyển đến phần Tích hợp, rồi nhấp vào Trợ lý Google.
  6. Trong cửa sổ phụ xuất hiện, hãy bật tính năng Auto-preview changes (Tự động xem trước các thay đổi) rồi nhấp vào Test (Kiểm thử) để mở Trình mô phỏng hành động.
  7. Trong trình mô phỏng, hãy nhập Talk to my test app để kiểm tra mẫu!

Để mang lại trải nghiệm tuyệt vời cho người dùng, thường thì bạn có thể lưu dữ liệu giữa các lượt trò chuyện hoặc trong nhiều cuộc trò chuyện với người dùng. Điều này rất hữu ích nếu bạn đang cung cấp các lời nhắc lại hữu ích trong một cuộc trò chuyện, lưu điểm số trò chơi trong các phiên hoặc ghi nhớ những thông tin nhỏ cho người dùng.

Các yêu cầu sẽ khác nhau một chút tuỳ thuộc vào việc bạn cần lưu dữ liệu trong một cuộc trò chuyện hay trong nhiều cuộc trò chuyện. Để lưu dữ liệu trong một cuộc trò chuyện, bạn có thể sử dụng trường conversationToken của đối tượng AppResponse.

Để lưu dữ liệu trong các cuộc trò chuyện, hãy làm theo các bước sau:

  1. Xác định xem người dùng đã được xác minh hay là khách.
  2. Lưu trữ hoặc truy cập dữ liệu người dùng bằng trường userStorage của đối tượng AppResponse.

Lưu dữ liệu giữa các lượt của một cuộc trò chuyện

Trường conversationToken là một chuỗi chứa mã thông báo mờ sẽ được tuần hoàn vào Hành động mỗi khi cuộc trò chuyện diễn ra. Ví dụ: nếu bạn đặt giá trị thành "count=1" trong AppResponse ở lượt đầu tiên của cuộc trò chuyện, thì AppRequest mà Hành động của bạn nhận được ở lượt thứ hai của cuộc trò chuyện sẽ chứa "count=1" trong conversationToken.

Mã thông báo luôn được khởi tạo ở một chuỗi trống ở đầu cuộc trò chuyện. Nếu sử dụng thư viện ứng dụng Actions on Google Node.js, bạn có thể giao tiếp với mã thông báo cuộc trò chuyện dưới dạng đối tượng JSON bằng conv.data, trong đó conv là thực thể của Conversation.

Mẫu sau đây cho biết cách lưu bộ đếm trong trường conversationToken của AppResponse:

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

Hãy lưu ý rằng JSON dưới đây mô tả phản hồi webhook sử dụng outputContexts thay vì conversationToken.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

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

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

Hãy xem hướng dẫn về phương pháp hay nhất Cung cấp lời nhắc hữu ích và không thành công của chúng tôi để tham khảo ví dụ về cách sử dụng thực tế.

Lưu dữ liệu trong các cuộc trò chuyện

Trường userStorage của đối tượng AppResponse là một chuỗi chứa mã thông báo mờ do Hành động (Action) cung cấp. Mã này được lưu trong các cuộc trò chuyện của một người dùng cụ thể. Ví dụ: một trò chơi có thể lưu điểm số cao nhất của người dùng trong userStorage và sử dụng giá trị của trò chơi đó trong thông báo chào mừng mỗi khi người dùng bắt đầu một cuộc trò chuyện mới.

Xác định và xử lý trạng thái xác minh người dùng

Trạng thái xác minh của người dùng có thể có giá trị là GUEST hoặc VERIFIED. Khi bắt đầu mỗi cuộc trò chuyện, Actions on Google sẽ đặt trạng thái xác minh của người dùng dựa trên nhiều chỉ báo khi cuộc trò chuyện bắt đầu. Ví dụ: một người dùng đã đăng nhập vào Trợ lý Google trên thiết bị di động của họ sẽ có trạng thái xác minh là VERIFIED.

Sau đây là những lý do có thể khiến người dùng có trạng thái xác minh là GUEST:

  • Người dùng đã tắt tính năng kết quả cá nhân.
  • Người dùng đã tắt chế độ Hoạt động trên web và ứng dụng. Xin lưu ý rằng một số người dùng có thể bị tắt chế độ cài đặt này ở cấp miền.
  • Nếu một thiết bị đã bật tính năng Voice Match nhưng tính năng so khớp không thành công hoặc người dùng gọi Trợ lý mà không dùng giọng nói của họ (chẳng hạn như nhấn và giữ trên Google Home).
  • Người dùng chưa đăng nhập.

Luôn kiểm tra trạng thái xác minh của người dùng trước khi lưu trữ dữ liệu bằng userStorage hoặc bắt đầu quy trình liên kết tài khoản để ngăn người dùng khách tương tác với một tính năng sẽ không hoạt động đối với họ.

Nếu sử dụng Thư viện ứng dụng Actions on Google cho Node.js, thì bạn có thể giao diện với bộ nhớ người dùng dưới dạng đối tượng JSON bằng conv.user.storage, trong đó conv là thực thể của Conversation. Mẫu sau đây cho biết cách lưu bộ đếm trong trường userStorage của AppResponse:

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Java

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

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

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

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

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

Hãy xem hướng dẫn phương pháp hay nhất Cá nhân hoá cuộc trò chuyện bằng lựa chọn ưu tiên của người dùng để tham khảo ví dụ về cách sử dụng thực tế.

Lưu ý pháp lý: Cần có sự đồng ý trước khi truy cập vào userStorage. Một số quốc gia có quy định yêu cầu nhà phát triển phải có được sự đồng ý của người dùng trước khi họ có thể truy cập hoặc lưu một số thông tin nhất định (như thông tin cá nhân) trong userStorage. Nếu hoạt động ở một trong những quốc gia này và muốn truy cập hoặc lưu thông tin đó trong userStorage, bạn phải sử dụng Trình trợ giúp xác nhận để yêu cầu người dùng đồng ý và có được sự đồng ý trước khi có thể bắt đầu lưu trữ những thông tin đó trong userStorage.

Ngày hết hạn bộ nhớ của người dùng

Khi Trợ lý có thể so khớp một danh tính với người dùng, nội dung của userStorage sẽ không bao giờ hết hạn và chỉ người dùng hoặc Hành động đó mới có thể xoá nội dung đó.

Khi Trợ lý không thể so khớp danh tính với người dùng, nội dung của userStorage sẽ bị xoá ở cuối cuộc trò chuyện. Dưới đây là một số ví dụ về trường hợp Trợ lý không thể so khớp danh tính với người dùng:

  • Tính năng Voice Match đã được thiết lập và không có kết quả trùng khớp nào.
  • Người dùng đã tắt dữ liệu cá nhân.

Xoá nội dung của trường userStorage

Bạn có thể xoá nội dung của trường userStorage của Hành động bằng cách đặt trường resetUserStorage của AppResponse thành true (đúng). Nếu bạn đặt giá trị của userStorage thành một chuỗi trống, thì giá trị của userStorage sẽ không thay đổi trong lượt trò chuyện tiếp theo. Điều này giúp bạn tránh phải gửi lại toàn bộ userStorage lần lượt khi nội dung của nó không thay đổi.

Nếu đang sử dụng Thư viện ứng dụng Actions on Google cho Node.js, bạn chỉ cần đặt giá trị của conv.user.storage thành {} (đối tượng trống).

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Java

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

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

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

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

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

Là người dùng, bạn có thể xem nội dung của trường userStorage trong một Hành động mà bạn đã gọi. Bạn cũng có thể xoá dữ liệu người dùng đã lưu trữ khỏi Hành động cụ thể đó bằng cách không cho dịch vụ ghi nhớ bạn.

  1. Mở ứng dụng Trợ lý trên điện thoại.
  2. Nhấn vào biểu tượng ngăn.

  3. Trong thẻ Khám phá, hãy tìm Hành động bạn muốn xem hoặc xoá bộ nhớ của người dùng rồi nhấn vào Hành động đó để mở trang chi tiết.
  4. Di chuyển xuống cuối trang.
    • Để xem nội dung của trường userStorage, hãy nhấn vào [Xem dữ liệu đã lưu trữ].
    • Để xoá dữ liệu người dùng đã được lưu trữ, hãy nhấn vào Ngăn $action ghi nhớ tôi.