生成式策略指南

生成式策略方案为使用大型语言模型 (LLM) 创建 Dialogflow CX 代理提供了一种新方法。您可以通过 Playbook 的形式提供自然语言指令和结构化数据,而不是定义流程、页面、intent 和转换。这样可以显著缩短代理的创建和维护时间,并为您的企业带来全新的对话体验。

如果您仍然需要在某些对话场景中使用数据流提供的明确控制,可以将策略方案和数据流的强大功能组合到单个混合代理中。

限制

存在以下限制:

  • 仅支持英语。
  • 仅支持 us-central1global 区域。
  • playbook 代理不支持从默认启动流中的“默认欢迎意图”路由发送通话配套短信,但您可以在标准流中启用通话配套短信选项。

手册概览

Playbook 是 Playbook 代理的基本构建块。一个代理通常具有多个 Playbook,其中每个 Playbook 都定义为处理特定任务。策略方案数据提供给 LLM,让 LLM 获得回答问题和执行任务所需的信息。 每个 Playbook 都可以提供信息、将查询发送到外部服务,或者将对话处理推迟到传统流程或其他 Playbook 来处理子任务。

创建 playbook 代理

创建 Dialogflow 代理时,您可以选择让该代理与 playbook( playbook 代理)或 flow(传统代理)开始对话。

如需创建 Playbook 代理,请执行以下操作:

  1. 按照相应步骤创建代理,并选择自行构建
  2. 选择生成式作为代理类型。
  3. 点击保存

请注意,左侧导航栏中有三个新的资源选择器。通过这些选择器,您可以从以下选项中进行选择:

  • 流资源
  • 生成式资源
  • 共享资源

创建 playbook 代理时,系统会自动创建 default playbook

playbook 数据

本部分介绍了定义 playbook 的数据。

playbook 名称

Playbook 名称是 Playbook 的显示名称。Playbook 可以通过此名称相互引用。

playbook 目标

Playbook 目标是对 Playbook 应完成的简要说明。

例如:

Help customers to book flights and hotels.

playbook 步骤

手册步骤定义了实现 playbook 目标所应执行的流程。

每个步骤都包含一条自然语言指令,其中可能包含以下任意内容:

  • LLM 可以理解的基本指令。
  • 用于指示用户转到另一个 playbook 的说明。 Playbook 使用 ${PLAYBOOK: playbook_name} 格式引用。
  • 使用特定工具的说明。工具使用 ${TOOL: tool_name} 格式进行引用。
  • 有关将用户路由到 Dialogflow 流的说明。 使用 ${FLOW: flow_name} 格式引用数据流。

每个步骤说明都以“-”开头,您可以使用缩进定义子步骤。

例如:

- greet the customer and ask them how you can help.
    - If the customer wants to book flights, route them to ${PLAYBOOK: flight_booking}.
    - If the customer wants to book hotels, route them to  ${PLAYBOOK: hotel_booking}.
    - If the customer wants to know trending attractions, use the ${TOOL: attraction_tool} to show them the list.
- help the customer to pay for their booking by routing them to ${FLOW: make_payment}.

playbook 参数

Playbook 可以使用明确定义的参数接受和发出上下文信息。创建 playbook 后,您可以使用参数标签页为每个 playbook 定义参数。

playbook 参数具有类型、名称和说明。定义参数后,请在 playbook 示例中使用这些参数,以展示 Playbook 如何可靠地读取、写入和使用参数值。如需指导,请参阅手册示例输入和输出以及传递参数

playbook 输入参数

输入参数允许 playbook 使用从流和其他 playbook 传递的值。例如,Playbook 可能会接收用户的首选名称作为参数,并使用该名称来感谢用户自己,或者 playbook 可能会接收订单标识符作为参数,并使用它来使用工具检索订单详情。

playbook 输入参数按 playbook 定义,并且默认情况下,Playbook 不会显示其他 Dialogflow CX 参数类型。当流程转换为 Playbook 时,如果目标 Playbook 具有同名的输入参数,则页面参数和会话参数将传播到 Playbook。如需在过渡期间将信息从数据流传送到 playbook,请使用与过渡之前存在的会话或页面参数相同的名称来定义 playbook 输入参数。

创建示例来控制输入参数值应如何影响 playbook 操作。例如,如果输入参数应影响代理对用户的称呼方式,请创建定义参数值的示例,然后在示例的语音操作中使用相同的值。如需了解详情,请参阅传递参数

playbook 输出参数

输出参数允许 Playbook 发出可供其他数据流或 Playbook 使用的信息。例如, playbook 可能会从用户那里收集订单号,并通过一个输出参数发出该订单号;Playbook 可以使用工具预订航班,并通过一个输出参数发出确认号。

创建示例来控制 Playbook 应如何确定每个输出参数的值。例如,如果表示确认数字的输出参数应从工具使用的输出派生其值,请创建其中工具使用的输出与 playbook 输出参数的值匹配的示例。

传递参数

与数据流不同,策略方案不支持使用特定语法注入参数值。策略方案依赖于指令和少量提示示例来确定应该如何使用参数值,以及在指定参数值时应如何确定值。

请考虑采用以下策略方案专为活动门票销售而设计的代理:

  1. 一个名为 Ticket ordering 的 playbook,使用名为 Ticket sales API工具下单。
    1. 此 playbook 接受类型为 number 且名称为 event_id 的输入参数。
    2. Ticket sales API 工具需要包含 event_id 的请求。
  2. 一个名为 Event selection 的 playbook,可帮助用户选择事件,然后使用参数 event_id 将他们路由到 Ticket ordering 以购买门票。

在此示例中,为了确保 event_id 可靠地从 Event selection 传递到 Ticket ordering 以及从 Ticket ordering 传递到 Ticket sales API,需要几个示例

Ticket ordering Playbook 应包含多个符合以下要求的示例:

  • 为输入参数 event_id 指定某个实际值,该值在每个示例中有所不同。
  • 添加工具使用操作,其请求正文包含输入参数中指定的实际 event_id 值。

Event selection Playbook 应包含多个符合以下要求的示例:

  • 添加一段用户话语,即用户选择具有某种真实 event_id 的事件,每个示例中的事件都有所不同。
  • 添加 Ticket ordering 的 playbook 调用,这会将 event_id 参数设置为用户选择决定的实际 event_id

除了添加示例之外,还可以尝试向使用指南步骤使用指南目标或说明如何使用参数的工具详细信息中添加具体说明。例如, playbook Ticket ordering 包含以下步骤:

- Use parameter event_id to send a buy_tickets request with ${TOOL: Ticket sales API}

提供上述示例和说明后,Event selection playbook 会根据用户的选择正确确定 event_id,并将其作为名为 event_id 的输入参数传递给 Ticket ordering playbook。然后,Ticket ordering 会将请求正文中的同一 event_id 传递给 Ticket sales API。策略方案依赖于具有不同参数值的示例来帮助他们推断应该如何使用参数。

playbook 示例

每个 Playbook 都应该有一个或多个示例。这些示例是最终用户与代理之间的对话示例,包括对话和代理执行的对话和操作。这些是适用于 LLM 的少样本提示示例

控制台提供了一个界面,供您输入操作。 例如:

示例条目的屏幕截图

输入摘要和输出摘要示例

除了输入和输出参数之外,Playbook 还支持接收输入摘要和发出输出摘要,以便与其他 playbook 交换信息。摘要有助于在 playbook 之间传递抽象上下文信息,而参数对于在 Playbook 之间传递明确定义的结构化字段更有帮助。参数是在数据流和 Playbook 之间交换数据的唯一方式。

向示例添加相关的输入摘要,以调节 playbook 以在运行时根据输入摘要调整其操作。添加输出摘要,包括与示例对话相关且准确的详细信息,向使用指南展示需要汇总哪些详细信息。

输入和输出参数示例

除了输入摘要和输出摘要之外,如果 playbook 定义了输入或输出参数,则 playbook 的示例还应该定义这些输入或输出参数,以帮助语言模型推断如何可靠地使用参数值。

Playbook 的每个示例都应为 playbook 中定义的每个参数指定和使用值,如本 playbook 中所示,具有两个输入参数和一个输出参数:

填充了输入和输出参数的示例的屏幕截图

Playbook 输出状态示例

对于您创建的每个示例,请选择最能代表示例对话结束状态的playbook 状态

  • OK:Playbook 的目标已实现。
  • CANCELLED:由于对话中某些情况, playbook 未实现其目标便停止了。例如,如果对话中有用户改变了主意,改变了主意,想要获得帮助,那么此状态可能是合适的。
  • FAILED:由于错误或无法处理的情况, playbook 未实现其目标。例如,如果在工具调用期间由于网络问题而无法实现目标,则此状态可能适合。
  • ESCALATED:由于用户请求上报给人工代理,因此 playbook 未实现其目标。

检索策略

检索策略用于控制是否将每个样本包含在 playbook 的提示中。

  • DEFAULT:如果提示接近词元限制,则可以省略示例。
  • STATIC:始终包含示例。
  • NEVER:示例绝不会包含在提示中。该示例不会对 Playbook 的性能产生任何影响。

创建 Playbook

如需创建 playbook,请执行以下操作:

  1. 在左侧导航栏中,选择生成资源。
  2. 点击 Playbooks
  3. 点击新建 (Create new)。
  4. 按照上述说明提供数据。

默认 playbook

当您创建生成代理时,系统会自动创建默认 Playbook

默认 playbook 是对话的起点,因此它与其他 playbook 有一些重要区别:

  • 默认 playbook 不会收到之前对话转动的摘要。
  • 默认 playbook 无法定义或接收输入参数。

playbook 版本

您可以保存 playbook 版本,这是 Playbook 的不可变快照。

如需保存 playbook 版本,请执行以下操作:

  1. 在控制台中加载 playbook。
  2. 点击版本历史记录
  3. 点击 Create version(创建版本)。
  4. 提供版本名称,然后点击保存

如需查看版本记录,请执行以下操作:

  1. 在控制台中加载 playbook。
  2. 点击版本历史记录
  3. 点击查看版本历史记录
  4. 版本历史记录面板会在右侧打开。 您可以点击各个版本来查看其内容。

工具

playbook 步骤可以参考用于完成该步骤的工具。 对于 Playbook 使用的每个工具,您可以通过提供 OpenAPI 架构来提供工具的详细信息。

目前支持 HTTP API 调用或数据存储区查询。

您可以以路径或查询参数的形式提供会话 ID。 例如:

parameters:
  - name: petId
    in: path
    description: ID of pet that needs to be updated
    required: true
    schema:
      $ref: '@dialogflow/sessionId'
  - name: petName
    in: query
    description: ID of pet that needs to be updated
    required: true
    schema:
      $ref: '@dialogflow/sessionId'

HTTP API 调用存在以下限制:

  • 不支持除会话 ID 之外的查询参数。
  • 请求和响应正文必须为空或 JSON。
  • 不支持 oneOf 等高级架构功能。

以下示例展示了如何引用数据存储区:

"dataStoreConnections": [
    {
       "dataStoreType": "DATA_STORE_TYPE",
       "dataStore": "projects/PROJECT_ID/locations/LOCATION_ID/collections/default_collection/dataStores/DATA_STORE_ID"
    }
]

DATA_STORE_TYPE 值可以是以下值之一:

  • PUBLIC_WEB:包含公开 Web 内容的数据存储区。
  • UNSTRUCTURED:包含非结构化私有数据的数据存储区。
  • STRUCTURED:包含结构化数据(例如 FAQ)的数据存储区。

以下示例展示了如何引用 HTTP API 工具:

openapi: 3.0.2
info:
  title: Search Attraction Tool
  description: >-
    This API search for attractions for travel purposes
  version: 1.0
servers:
  - url: https://search-attraction.app
paths:
  /search:
    post:
      summary: Search for attractions given a query
      operationId: search
      requestBody:
        description: Query
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Query'
      responses:
        '200':
          description: Successfully got results (may be empty)
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: string
components:
  schemas:
    Query:
      required:
        - text
      type: object
      properties:
        text:
          type: string

最佳实践

以下最佳实践可帮助您构建可靠的代理。

每个 playbook 至少有一个示例

每个 Playbook 都应该至少有一个示例。如果没有足够的示例,Playbook 可能会导致不可预测的行为。如果代理未以您期望的方式响应或行为,则可能是缺少示例或定义不明确的原因。请尝试改进示例或添加新示例。

说明和示例的精确程度

虽然写出清晰的描述性操作步骤有助于编写清晰的描述性步骤,但实际上,样本的质量和数量决定了代理行为的准确性。 换言之,要编写详尽的示例,而不是编写十分精确的指令。

工具架构操作 ID 字段

在为工具定义架构时,operationId 值非常重要。您的 playbook 说明将引用此值。 以下是有关此字段的命名建议:

  • 只能包含字母、数字和下划线。
  • 在架构中所述的所有 operationId 中必须是唯一的。
  • 必须是能够反映所提供功能的有意义名称。

工具架构验证

您应验证您的工具架构。 您可以使用 Swagger Editor 检查 openAPI 3.0 架构语法。

使用 Bard 生成架构

Bard 可以为您生成架构。例如,尝试输入“can you create an example openAPI 3.0 Schema for Google Calendar”(你能为 Google 日历创建一个示例 openAPI 3.0 架构吗)。

重点策略方案

避免创建超大型且复杂的 playbook。 每个 playbook 都应完成具体而明确的任务。 如果您的 playbook 较为复杂,请考虑将其细分为更小的子 playbook。

测试用例

现有的测试用例功能已得到增强,以支持 Playbook。

添加了必需的预期测试用例结果字段,该字段以手册示例的形式提供操作列表。 测试用例会验证操作是否按预期执行。

查看 playbook 或 playbook 版本时,您可以点击 playbook 数据上方的 Test case 标签页,查看测试用例结果并按需执行测试用例。

您还可以比较不同版本的 playbook 的测试用例结果。选择一个测试用例,然后点击比较

如需查看代理的所有测试用例,请点击左侧导航栏中的测试用例

对话记录

现有的对话记录功能已得到增强,可支持 Playbook。

添加了有关工具执行、Playbook 调用和 playbook 代理的数据流调用的信息。