构建一个可以使用自然语言理解和响应的 Dialogflow CX Google Chat 应用

本页介绍了如何使用 Dialogflow 构建可以理解和响应自然语言的 Google Chat 应用。本指南使用的是与 Google Chat 直接集成的 Dialogflow CX。您还可以按照 Dialogflow ES Google Chat 指南,使用 Dialogflow ES 构建 Dialogflow ES Google Chat 应用。

以一款可帮助用户租车的聊天应用为例用户可能会这样写:“我想租车”。Chat 应用可能会以类似“您想要在哪里取车?”这样的问题进行回应,这会与用户开始类似真人的对话,在预订汽车租赁服务时,Chat 应用能够理解人类语音,并以人类语音做出响应。

这只是一个示例。Dialogflow Chat 应用在所有类型的交互中都非常有用。如果它需要自然的人类语音,则需要 Dialogflow Chat 应用。预建代理可帮助您快速上手,并展示 Dialogflow 的功能,例如:

  • 预订航班
  • 预约医生
  • 订外卖
  • 回答有关零售商品清单的问题 例如商品是否有其他颜色可供选择
  • 预构建的 Dialogflow 代理选择页面。
    图 1.为 Dialogflow Chat 应用选择预建代理。
  • 在 Dialogflow CX 中测试代理。
    图 2.在 Dialogflow CX 中测试代理,以确保代理的逻辑和配置按预期运行。该图显示了一组连续的主题页面,这些页面涉及对话中的特定步骤(例如为租车设置上车点和还车地点),并配置了连接这些点的逻辑。系统将在模拟器中测试对话。
  • 配置 Dialogflow Chat 应用。
    图 3.在 Google Cloud 控制台的 Chat API 配置页面上配置 Chat 应用以使用 Dialogflow CX 代理处理响应。
  • 测试 Dialogflow CX Chat 应用
    图 4.在 Google Chat 中使用 Dialogflow Chat 应用,讨论租车事宜。

目标

  • 设置环境。
  • 创建和部署 Dialogflow CX 代理。
  • 创建和部署由 Dialogflow CX 代理提供支持的 Chat 应用。
  • 测试 Chat 应用。

前提条件

架构

下图显示了使用 Dialogflow 构建的 Chat 应用的架构:

使用 Dialogflow 实现的 Chat 应用的架构。

在上图中,与 Dialogflow Chat 应用交互的用户具有以下信息流:

  1. 用户在 Chat 中通过私信或 Chat 聊天室向 Chat 应用发送消息。
  2. 位于 Google Cloud 中的 Dialogflow 虚拟客服会接收和处理消息以生成响应。
  3. (可选)使用 Dialogflow webhook,Dialogflow 代理可以与外部第三方服务(例如项目管理系统或工单工具)进行交互。
  4. Dialogflow 代理将响应发送回 Chat 中的 Chat 应用服务。
  5. 系统会将回复发送到 Chat 聊天室。

设置环境

在使用 Google API 之前,您需要先在 Google Cloud 项目中启用这些 API。您可以在单个 Google Cloud 项目中启用一个或多个 API。
  1. 在 Google Cloud 控制台中,启用 Google Chat API 和 Dialogflow API。

    启用 API

  2. 确认您是在正确的 Cloud 项目中启用 API,然后点击下一步

  3. 确认您启用的 API 正确无误,然后点击启用

创建 Dialogflow CX 客服

Dialogflow CX 代理是一种虚拟客服,可处理与最终用户的并发对话。它是一个自然语言理解模块,可以理解人类语言的细微差别。Dialogflow 可以在对话过程中将最终用户文本转换为应用和服务可以理解的结构化数据。您可以设计和构建一个 Dialogflow 代理来处理系统所需的对话类型。

Dialogflow 代理就像人类呼叫中心的客服人员。您可以对两者进行训练,以处理预期的对话场景,并且您的训练不需要过于明确。

以下是创建 Dialogflow CX 代理的方法:

  1. 在 Dialogflow CX 控制台中,打开 Dialogflow CX 控制台。点击菜单 > Dialogflow CX

    转到 Dialogflow CX 控制台

  2. 选择一个 Google Cloud 项目。如需查找您的项目,您可能需要点击全部,然后进行搜索。

  3. 现在,您可以选择预建代理或创建自己的代理。如果您希望稍后详细了解代理自定义,请选择一个预建代理,这对了解代理的功能也很有帮助。

    如需选择预建代理,请按以下步骤操作:

    1. 点击使用预建代理
    2. 选择预建代理。在本指南中,选择旅行:汽车租赁

      根据代理使用的功能数量以及对话逻辑的复杂程度,我们将代理评为初级、中级或高级。选择中级或高级代理可能需要特定于代理的自定义和设置,包括在 Google Cloud 控制台中启用功能和 API。

    3. 点击作为代理导入

    如需创建您自己的代理,请按照下列步骤操作:

    1. 点击创建代理
    2. 选择自动生成可创建数据存储区代理,或选择自行构建以创建其他类型的代理。

    如需详细了解代理构建流程,请参阅创建 Dialogflow CX 代理

  4. 配置基本的代理设置:

    1. 显示名中,输入显示名。
    2. 选择您的首选位置。如果要更改高级位置信息设置,请点击修改
    3. 选择您的首选时区。
    4. 选择代理的默认语言。 代理的默认语言一经创建便无法更改。
  5. 点击创建。Dialogflow CX 开始创建代理,然后显示代理的默认启动流程。

  6. (可选)自定义代理。如需详细了解代理自定义过程,请参阅创建 Dialogflow CX 代理

  7. 最佳实践是,测试代理:

    1. 点击 Test agent
    2. 选择在环境中测试代理
    3. 在“环境”中,选择草稿
    4. 在“流”中,选择默认启动流
    5. 在“页面”中,选择初始页
    6. 与代理交谈的撰写栏中,输入 Hello 并按 Enter 键。 代理通过自我介绍来进行回应。
    7. 通过测试示例对话完成测试。
  8. Dialogflow CX 代理已创建。返回到 Dialogflow CX 控制台。 点击菜单 > Dialogflow CX

    转到 Dialogflow CX 控制台

  9. 代理下,点击 > 复制名称。请保存此名称,因为您在配置 Chat 应用时使用此名称。

创建一个聊天应用并将其与 Dialogflow 代理连接

创建 Dialogflow CX 代理后,请按照以下步骤将其转换为 Chat 应用:

  1. 在 Google Cloud 控制台中,前往 Google Chat API。搜索“Google Chat API”并点击 Google Chat API,然后点击管理

    前往 Chat API

  2. 点击配置并设置 Chat 应用:

    1. 应用名称中,输入 Dialogflow App
    2. 头像网址中,输入 https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png
    3. 说明中,输入 Responds to real human conversation
    4. 功能下,选择接收 1 对 1 消息加入聊天室和群组对话
    5. 连接设置下,选择 Dialogflow
    6. Dialogflow 设置下,选择 Dialogflow CX
    7. 代理或环境资源名称中,粘贴您在创建 Dialogflow CX 代理末尾复制的 Dialogflow CX 代理名称。
    8. 将此聊天应用提供给您网域中的特定人员和群组,然后输入您的电子邮件地址。
    9. 日志下,选择将错误记录到 Logging
  3. 点击保存

Chat 应用已准备好接收和回复 Chat 中的消息。

测试 Chat 应用

在 Google Chat 中发送消息以测试 Dialogflow CX Chat 应用。

  1. 使用将自己添加为受信任的测试人员时提供的 Google Workspace 帐号打开 Google Chat。

    前往 Google Chat

  2. 点击 发起新对话
  3. 添加一人或多人字段中,输入您的 Chat 应用的名称。
  4. 从结果中选择您的 Chat 应用。系统会打开一条私信。

  5. 在与应用的新私信对话中,输入 Hello 并按 enter

    Dialogflow Chat 应用通过自我介绍来做出响应。

  6. 通过测试对话示例完成测试。

测试对话示例

如需在 Dialogflow CX 控制台或 Google Chat 中测试 Dialogflow CX Chat 应用,请进行以下对话。该说明可帮助您了解 Dialogflow CX 代理如何解读用户的自然语言,并在对话的每个步骤中生成自己的自然语言响应。此示例对话基于名为“旅行:汽车租赁”的预构建代理

对话框 解释
最终用户:Hello
代理:Hi!我是虚拟租车代理人。我可以帮你开始新的租车预订。您现在需要什么帮助?
  1. 系统会调用默认启动流程中的默认欢迎意图路由。
  2. 此状态处理程序的 fulfillment(“Hi!我是...”) 已添加到响应队列中。
  3. 代理将响应队列发送给最终用户。
最终用户:我想租车。
代理:Where would you like to take up the vehicle?
  1. 匹配初始页中的 car_rental.reservation_create 意图路由。
  2. 会话转换到自提位置页面。
  3. Pickup Location 页面表单尚未填写完毕,因此代理使用 pickup_location 参数来提示用户(“Where would you like to take up...”)该响应将被添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:Las Vegas
代理:Ok, your pickup will be in Las Vegas.
代理:Is your sales off location different from your pickup location?
  1. 最终用户输入会填充客服人员在上一轮对话中请求的 pickup_location 参数。
  2. 匹配car_rental.return_different_location中的 car_rental.return_different_location intent 路由。
  3. 系统会评估和调用自提位置页面中的表单填写路线。 它有一个执行方式(“Ok, your pickup...”),该执行方式会添加到响应队列中,并且其参数引用会解析为最终用户提供的实际值。
  4. 会话转换到确认位置页面。
  5. Confirm Location 页面有一个条目执行方式(“Is your next location different...”)该响应将被添加到响应队列中。
  6. 代理将响应队列发送给最终用户。
最终用户:是。我会在洛杉矶还车。
代理:好的,您的下车点将在洛杉矶。
代理:What date and time would you like to Pick up the vehicle?
  1. 匹配car_rental.return_different_location中的 car_rental.return_different_location intent 路由。
  2. 会话转换到下车地点页面。
  3. 最终用户输入会填充代理在上一轮对话中请求的 drop_off_location 参数。
  4. 系统会评估并调用下车地点页面中的表单填写路线。它包含一个执行方式(“Ok, your drop off...”),该执行方式已添加到响应队列中。
  5. 会话转换到租借时长页面。
  6. 租期页面所含的表单值不完整,因此会提示用户输入 pickup_date_time 参数(“您希望取货的日期和时间...”)。该响应将被添加到响应队列中。
  7. 代理将响应队列发送给最终用户。
最终用户:我想在 3 月 5 日中午取车。
代理:What date and time would you like to off the vehicle?
  1. 最终用户输入会填写客服人员在上一轮对话中请求的 pickup_date_time 参数。
  2. 租借时长页面还有一个缺失的表单值,因此它会提示用户输入 drop_off_date_time 参数(“您想要在什么日期和时间还车...”)。该响应将被添加到响应队列中。
  3. 代理将响应队列发送给最终用户。
最终用户:3 月 15 日中午。
代理:请确认:

You will Picking the vehicle up in Las Vegas 2024-03-05 12:00:00 and put it off in Loswing 2024-03-15 12:00:00

该车辆是否合适?
  1. 最终用户输入会填充客服人员在上一轮对话中请求的 drop_off_date_time 参数。
  2. 会话转换到确认租借时长页面。
  3. 确认租借时长页面有一个条目执行方式(“因此确认...”), 该响应将被添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:是,谢谢。
代理:Great!现在,让我们选择一辆车。
代理:您想要经济型或豪华车型吗?
  1. 匹配确认租借时长页面中的 small_talk.confirmation.yes intent 路由。
  2. 代理通过一条消息确认用户的选择(“太好了!现在选择...”), 该响应将被添加到响应队列中。
  3. 会话转换到车辆消歧页面。
  4. Vehicle Disambiguation 页面表单尚未完成,因此代理使用 vehicle_type 参数来提示用户(“Would you like a 经济或者豪华...”)该响应将被添加到响应队列中。
  5. 代理将响应队列发送给最终用户。
最终用户:请尽量经济。
代理:您希望 Cymbal Car or the Cymbal Truck?
  1. 匹配 $session.params.vehicle_type="economy_vehicle" 意图路由。
  2. 会话转换到经济选项页面。
  3. Economy Options 页面有一个条目执行方式(“Would you like the...”) 该响应将被添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:Cymbal Truck。
代理:The Cymbal Truck is $50.33 per day. 该设备可容纳 4 人,并配有一个 AM/FM 收音机。 要继续付款吗?
最终用户:是的,谢谢。
  1. 系统会匹配 $session.params.vehicle_type="Cymbal Truck" 意图路线,并填充了 vehicle_model 参数。
  2. 会话转换到 Confirm Cymbal Truck 页面。
  3. Confirm Cymbal Truck 页面有一个条目执行方式(“The Cymbal Truck is $50.33 per day...”),该响应将被添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
  5. 用户的响应与 small_talk.confirmation.yes 路由匹配。
代理:What card type will you are using?
最终用户:Altostrat
代理:请输入卡号。
最终用户:1234 1234 1234 1234
代理:What is the name on the card?
最终用户:Charlie
代理:What is the billing street address?
最终用户:1800 Amphibious Blvd. Mountain View, CA
代理:What is the billing ZIP code?
最终用户:94045
代理:You will Picking the Cymbal Car up in Las Vegas, 2024-03-05 12:00:00 and dropping it off, 2024-03-15 12:00:00. 本次行程的总费用为 $175.38。
代理:感谢您与我们租房,并祝您度过愉快的一天!
  1. 会话转换到付款页面。
  2. Payment 表单尚未填写完毕,因此代理提示用户输入 card_typecard_numberbilling_namebilling_street_addressbilling_zip_code 参数(“What card type will...”)这些响应会依序添加到响应队列中并在用户响应时发送。用户的响应会设置每个参数值。
  3. 会话转换到租借确认页面。
  4. 租借确认页面有一个条目执行方式(“Ok, your pickup will be...”)。 该响应将被添加到响应队列中。
  5. 代理将响应队列发送给最终用户。
  6. 会话转换到结束会话页面。

通过 Dialogflow 发送卡片消息

Dialogflow 可以使用文本卡片消息进行响应。如需使用卡片消息进行响应,请在 fulfillment 中将其指定为自定义载荷

以下 JSON 展示了如何将卡片消息作为执行方式中的自定义载荷发送:

json

{
  'cardsV2': [{
    'cardId': 'createCardMessage',
    'card': {
      'header': {
        'title': 'A card message!',
        'subtitle': 'Sent from Dialogflow',
        'imageUrl': 'https://developers.google.com/chat/images/chat-product-icon.png',
        'imageType': 'CIRCLE'
      },
      'sections': [
        {
          'widgets': [
            {
              'buttonList': {
                'buttons': [
                  {
                    'text': 'Read the docs!',
                    'onClick': {
                      'openLink': {
                        'url': 'https://developers.google.com/workspace/chat'
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  }]
}

限制和注意事项

  • 我们对聊天互动事件的支持较为有限,下面列出了一些注意事项:
    • 支持以下互动事件类型
      • MESSAGE
      • ADDED_TO_SPACE
      • CARD_CLICKED
    • 对于 MESSAGEADDED_TO_SPACE 事件,发送到 Dialogflow 代理的查询输入与 Chat 消息中 argumentText 字段的值相对应。如果消息包含斜杠命令,则改用 text 字段的值。
    • 对于 CARD_CLICKED 事件,发送到 Dialogflow 代理的查询输入的格式为 CARD_CLICKED.functionName,其中 functionName 对应于附加到交互式卡片元素(如按钮)的 Action 对象的 function 字段的值。
    • 每个 Chat 互动事件的完整 JSON 载荷将作为查询参数中的自定义载荷发送到 Dialogflow,并可以通过查询 WebhookRequest.payload 字段的值使用 Dialogflow webhook 进行访问。
  • 响应斜杠命令以及从卡片或对话框接收数据的注意事项:
    • 当 Dialogflow Chat 应用收到包含斜杠命令的消息时,查询输入仅包含 text 字段的值。text 字段以斜杠命令的名称开头(例如 /command),您可以使用它来配置 Dialogflow 代理的意图以检测斜杠命令。
    • 如果 Dialogflow 代理需要处理 Chat 互动事件 JSON 载荷,则可以使用 Dialogflow webhook 检查查询参数中的自定义载荷。
    • 如需显示来自 Dialogflow 代理的对话框,请使用单个自定义 JSON 载荷进行响应,该载荷包含一条包含 DIALOG 操作响应的消息。
    • 为了处理从卡片输入的数据,Dialogflow 代理可以检测以文本 CARD_CLICKED 开头的意图,并使用包含相应操作的单个自定义 JSON 载荷进行响应。
  • 不支持链接预览
  • 如果 Dialogflow 代理只响应一条消息,则该消息会同步发送到 Google Chat。如果 Dialogflow 代理返回多条消息,那么系统会针对每条消息对 Chat API 中的 spaces.messages 资源调用 create 方法,将所有消息异步发送到 Chat。
  • 将 Dialogflow CX 与 Chat 集成时,Dialogflow 代理和 Chat 应用必须在同一 Google Cloud 项目中设置。如果您需要在不同 Cloud 项目中设置 Dialogflow 和 Chat,则可以设置中间服务器来促进连接。如需了解具体方法,请参阅 GitHub 上的此针对 Dialogflow CX 的 Chat 集成示例

排查问题

当 Google Chat 应用或卡片返回错误时,Chat 界面会显示一条消息,提示“出了点问题”。或“无法处理您的请求”。有时,Chat 界面不显示任何错误消息,但 Chat 应用或卡片会产生意外结果;例如,卡片消息可能不会显示。

虽然 Chat 界面中可能未显示错误消息,但当为 Chat 应用启用错误日志记录时,系统会提供描述性错误消息和日志数据来帮助您修复错误。如需查看、调试和修正错误方面的帮助,请参阅排查和修正 Google Chat 错误

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,我们建议您删除 Cloud 项目。

  1. 在 Google Cloud 控制台中,前往管理资源页面。依次点击菜单 > IAM 和管理 > 管理资源

    前往 Resource Manager

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。
  • Dialogflow CX 在 Dialogflow 代理设计中采用状态机方法,可让您清晰明确地控制对话,提升最终用户体验和开发工作流。构建 Dialogflow Chat 应用时,我们建议使用 Dialogflow CX。
  • Dialogflow ES 是将 Dialogflow 与聊天应用结合使用的另一种方式。