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

本页介绍了如何构建一个 Google Chat 应用,该应用可以使用 Dialogflow 理解自然语言并以自然语言做出回应。本指南使用 Dialogflow CX,该平台可直接与 Google Chat 集成。您还可以按照 Dialogflow ES Google Chat 指南使用 Dialogflow ES 构建 Dialogflow ES Google 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 聊天应用
    图 4. 在 Google Chat 中与 Dialogflow Chat 应用就预订租车事宜进行对话。

目标

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

前提条件

架构

下图展示了使用 Dialogflow 构建的聊天应用的架构:

使用 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 项目中启用它们。 您可以在单个 Google Cloud 项目中开启一个或多个 API。
  1. 在 Google Cloud 控制台中,启用 Google Chat API 和 Dialogflow API。

    启用 API

  2. 确认您要在正确的云项目中启用 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. 点击 Create agent。
    2. 选择自动生成以创建数据存储区代理,或选择自行构建以创建其他类型的代理。

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

  4. 配置基本代理设置:

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

  6. 您可以视需要自定义代理。如需详细了解 CX 智能体自定义流程,请参阅创建 Dialogflow CX 智能体。

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

    1. 点击 Test agent。
    2. 选择在环境中测试代理。
    3. 在“环境”中,选择草稿。
    4. 在“Flow”(流程)中,选择 Default Start Flow(默认初始流程)。
    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. 在功能下,选择加入聊天室和群组对话。
    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. 在添加 1 位或多位用户字段中,输入 Chat 应用的名称。
  4. 从结果中选择 Chat 应用。系统会打开私信对话。

  5. 在与应用来往的新私信中,输入 Hello,然后按 enter。

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

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

测试对话示例

如需在 Dialogflow CX 控制台或 Google Chat 中测试 Dialogflow CX Chat 应用,请进行以下对话。 此说明有助于您了解 Dialogflow CX 智能体如何解读用户的自然语言,以及在对话的每个步骤中生成自己的自然语言回答。此对话示例基于名为 Travel: car rental 的预构建代理。

Dialog 说明
最终用户:你好
代理:你好!我是虚拟租车代理。我可以帮助您开始预订新租车。How can I assist you today?
  1. 系统调用默认初始流中的默认欢迎意图路由。
  2. 此状态处理程序的实现(“你好!我…") 已添加到响应队列中。
  3. 代理将响应队列发送给最终用户。
最终用户:我想租一辆车。
智能体:您想在哪个地点取车?
  1. 系统会匹配起始页中的 car_rental.reservation_create intent 路由。
  2. 会话将过渡到上车地点页面。
  3. 由于取货地点页面表单未完成,因此代理使用 pickup_location 参数提示用户(“您想在什么地方取货…”),并添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:拉斯维加斯
代理:好的,您的取货地点是拉斯维加斯。
Agent: Is your drop off location different from your pickup location?
  1. 最终用户输入的内容会填充智能体在上一轮对话中请求的 pickup_location 参数。
  2. 系统会匹配默认初始流中的 car_rental.return_different_location intent 路由。
  3. 系统会评估并调用取货地点页面中的表单完成路线。 它具有执行方式(“好的,您的取货地点是…”),该执行方式会添加到响应队列中,其参数引用已解析为最终用户提供的实际值。
  4. 会话将过渡到确认位置页面。
  5. 确认地点页面上有一个条目完成情况(“您的下车地点是否与…不同”), 并添加到响应队列中。
  6. 代理将响应队列发送给最终用户。
最终用户:是。我会在洛杉矶还车。
客服人员:好的,您的送货地点是洛杉矶。
客服人员:您想在什么日期和时间取车?
  1. 系统会匹配默认初始流中的 car_rental.return_different_location intent 路由。
  2. 会话会过渡到送达地点页面。
  3. 最终用户输入的内容会填充智能体在上一轮对话中请求的 drop_off_location 参数。
  4. 系统会评估并调用送达地点页面中的表单完成路线。 它具有一个履单(“好的,您的送货…”),该履单会添加到响应队列中。
  5. 会话将过渡到租赁时长页面。
  6. 租期页面上的表单值不完整,因此系统会提示用户输入 pickup_date_time 参数(“您想在什么日期和时间取车…”), 并添加到响应队列中。
  7. 代理将响应队列发送给最终用户。
最终用户:我想在 3 月 5 日中午取车。
代理:您想在什么日期和时间还车?
  1. 最终用户输入的内容会填充智能体在上一轮对话中请求的 pickup_date_time 参数。
  2. 租车时长页面还有另一个缺失的表单值,因此系统会提示用户输入 drop_off_date_time 参数(“您想在什么日期和时间还车?”),并添加到响应队列中。
  3. 代理将响应队列发送给最终用户。
最终用户:3 月 15 日中午。
客服人员:请确认:

您将于 2024 年 3 月 5 日 12:00:00 在拉斯维加斯取车, 并于 2024 年 3 月 15 日 12:00:00 在洛杉矶还车

这样没问题吧?
  1. 最终用户输入的内容会填充智能体在上一轮对话中请求的 drop_off_date_time 参数。
  2. 会话将过渡到确认租赁时长页面。
  3. 确认租期页面上有一个条目完成情况(“因此,为了确认…”),并添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:好的,谢谢。
客服人员:太棒了!现在,我们来选择车辆。
智能体:您想要经济型车辆还是豪华型车辆?
  1. 系统会匹配确认租期页面中的 small_talk.confirmation.yes intent 路由。
  2. 代理会通过一条消息确认用户的选择(“太棒了!现在,我们来选择…”, 并添加到响应队列中。
  3. 会话会过渡到车辆消除歧义页面。
  4. “车辆消除歧义”页面表单不完整,因此代理使用 vehicle_type 参数提示用户(“您想要经济型还是豪华型…”),并添加到响应队列中。
  5. 代理将响应队列发送给最终用户。
最终用户:请选择经济配送。
智能体:您想要 Cymbal Car 还是 Cymbal Truck?
  1. 系统会匹配 $session.params.vehicle_type="economy_vehicle" 意图路由。
  2. 会话将过渡到经济型选项页面。
  3. 经济型选项页面包含一个条目完成提示(“您是否希望…”), 并添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
最终用户:Cymbal Truck。
客服人员:Cymbal 卡车的价格为每天 50.33 美元。 可容纳 4 人,并配备 AM/FM 收音机。 要继续付款吗?
最终用户:好的,请继续。
  1. 系统会匹配 $session.params.vehicle_type="Cymbal Truck" 意向路由,并填充 vehicle_model 参数。
  2. 会话将过渡到确认 Cymbal Truck 页面。
  3. Confirm Cymbal Truck 页面具有条目履单(“The Cymbal Truck is $50.33 per day…”)、 并添加到响应队列中。
  4. 代理将响应队列发送给最终用户。
  5. 用户的回答与 small_talk.confirmation.yes 路线匹配。
客服人员:您将使用哪种类型的卡?
最终用户:Altostrat
代理:请输入卡号。
最终用户:1234 1234 1234 1234
代理:卡上的姓名是什么?
最终用户:Charlie
客服人员:账单街道地址是什么?
最终用户:1800 Amphibious Blvd. Mountain View, CA
代理:账单邮政编码是什么?
最终用户:94045
智能体:您将于 2024-03-05 12:00:00 在拉斯维加斯取 Cymbal Car,并于 2024-03-15 12:00:00 还车。此行程的总费用为 175.38 美元。
客服人员:感谢您向我们租车,祝您度过愉快的一天!
  1. 会话将过渡到付款页面。
  2. 由于付款表单未填写完整,因此代理会提示用户提供 card_type、card_number、billing_name、billing_street_address 和 billing_zip_code 参数(“What card type will…”), 这些消息会依次添加到响应队列中,并在用户做出响应时发送。用户的回答会设置每个参数值。
  3. 会话将过渡到租赁确认页面。
  4. 租车确认页面包含一个条目完成情况(“好的,您的取车时间为…”), 并添加到响应队列中。
  5. 代理将响应队列发送给最终用户。
  6. 会话将过渡到结束会话页面。

从 Dialogflow 发送卡片消息

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

以下 JSON 展示了如何在履单中以自定义载荷的形式发送卡片消息:

json

{ "hostAppDataAction": { "chatDataAction": { "createMessageAction": {
  "message": { "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"
        }}
      }]}}]}]
    }
  }]}
}}}}

限制和注意事项

  • 将 Google Chat 应用与 Dialogflow 搭配使用时,聊天事件对象具有以下限制和注意事项:
    • 应用首页活动:目前尚不支持 APP_HOME 活动。
    • Dialogflow 查询输入:作为查询输入发送给 Dialogflow 代理的文本取决于事件类型:
      • MESSAGE:聊天消息中 argumentText 字段的值。
      • APP_COMMAND:字符串 "APP_COMMAND_PAYLOAD"。
      • ADDED_TO_SPACE:字符串 "ADDED_TO_SPACE_PAYLOAD"。
      • REMOVED_FROM_SPACE:字符串 "REMOVED_FROM_SPACE_PAYLOAD"。
      • CARD_CLICKED:字符串 "BUTTON_CLICKED_PAYLOAD"。
      • WIDGET_UPDATED:字符串 "WIDGET_UPDATED_PAYLOAD"(用于自动补全)。
    • 完整事件载荷:聊天互动事件的完整 JSON 载荷会通过 WebhookRequest.payload 字段发送到 Dialogflow。您可以在 Dialogflow webhook 中访问此信息。如需了解详情,请参阅 Dialogflow CX webhook 请求文档。
  • 在响应命令和从卡片或对话框接收数据时,请注意以下事项:
  • 不支持链接预览。
  • 如果 Dialogflow 代理只回复一条消息,则该消息会同步发送到 Google Chat。如果 Dialogflow 代理回复了多条消息,则会通过在 Chat API 中对 spaces.messages 资源调用 create 方法,将所有消息异步发送到 Chat。每条消息调用一次该方法。
  • 将 Dialogflow CX 与 Chat 集成时,Dialogflow 代理和 Chat 应用必须在同一 Google Cloud 项目中设置。如果您需要在不同的云项目中设置 Dialogflow 和 Chat,则可以设置中间服务器来促成连接。如需了解具体操作方法,请参阅 GitHub 上针对 Dialogflow CX 的聊天集成示例。

问题排查

如需调试 Chat 应用,请先查看错误日志。由于此应用使用 Dialogflow,因此您可以使用多种日志记录和问题排查资源:

  • Google Workspace 附加组件日志:查询日志,获取有关 Chat 应用行为的详细信息,包括其与 Chat 的互动。请参阅查询 Google Workspace 加购项的日志。

  • Google Chat 应用错误:如需了解一般的 Chat 应用错误消息和修复方法,请参阅排查和修复 Chat 应用错误。

  • Dialogflow CX Cloud Logging:确保在 Dialogflow 代理设置中启用 Cloud Logging,以捕获详细的执行日志,包括来自代理和网络钩子互动的错误。如需了解如何启用和配置此功能,请参阅 Dialogflow CX 智能体设置文档。您可以在 Google Cloud 控制台的 Logs Explorer 中查看这些日志。

  • Dialogflow CX 对话记录:查看过往互动,了解对话流程并确定问题发生的位置。请参阅对话记录。

  • Dialogflow 一般问题排查:如需排查更广泛的 Dialogflow 问题,请参阅 Dialogflow CX 问题排查指南。

清理

为避免系统因本教程中使用的资源而向您的 Google Cloud 账号收取费用,我们建议您删除云项目。

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

    前往资源管理器

  2. 在项目列表中,选择要删除的项目,然后点击删除图标 。
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。

非插件的 Chat 应用:构建 Dialogflow CX Google Chat 应用

如果您正在构建或维护非 Google Workspace 插件的 Chat 应用,请注意以下配置、载荷和事件差异。

配置非插件的 Dialogflow CX Chat 应用

在 Google Cloud 控制台中配置 Google Chat API 时:

  1. 取消选中将此 Chat 扩展应用作为 Google Workspace 插件构建。系统会打开一个对话框,要求您确认。在该对话框中,点击停用。
  2. 完成其余 Dialogflow CX 配置设置,然后点击保存。

从非插件的 Dialogflow CX Chat 应用发送卡片消息

在不是插件的 Chat 应用中,在 fulfillment 的 Dialogflow 自定义载荷中指定顶级 cardsV2 对象:

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"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  }]
}

非插件的 Dialogflow CX Chat 应用的限制和注意事项

  • 聊天互动事件具有以下支持和注意事项:
    • 系统支持以下互动事件类型:
      • MESSAGE
      • ADDED_TO_SPACE
      • CARD_CLICKED
    • 对于 MESSAGE 或 ADDED_TO_SPACE 事件,发送给 Dialogflow 代理的查询输入对应于聊天消息中 argumentText 字段的值。如果消息包含斜杠命令,则系统会改用 text 字段的值。
    • 对于 CARD_CLICKED 事件,发送给 Dialogflow 代理的查询输入格式为 CARD_CLICKED.functionName,其中 functionName 对应于附加到互动卡片元素(例如按钮)的 Action 对象的 function 字段的值。
    • 每次 Chat 互动事件的完整 JSON 载荷都会作为查询参数中的自定义载荷发送到 Dialogflow,并且可以通过查询 WebhookRequest.payload 字段的值,使用 Dialogflow Webhook 进行访问。
  • 在非插件的聊天应用中,针对响应斜杠命令和接收来自卡片或对话框的数据的注意事项:
    • 当不是插件的 Dialogflow Chat 应用收到包含斜杠命令的消息时,查询输入仅包含 text 字段的值。text 字段以斜杠命令的名称(例如 /command)开头,您可以使用该字段配置 Dialogflow 代理的 intent 以检测斜杠命令。
    • 如需在非插件的 Chat 应用中显示来自 Dialogflow 代理的对话框,请使用单个自定义 JSON 载荷进行响应,该载荷包含一条包含 DIALOG 操作响应的消息。
    • 如需处理从非插件 Chat 应用中的卡片输入的数据,Dialogflow 代理可以检测以文本 CARD_CLICKED 开头的意图,并使用包含相应 action 的单个自定义 JSON 载荷进行响应。