Fulfillment

每轮对话过程中,代理必须通过回答问题,询问信息或终止会话来响应最终用户。您的代理可能还需要与您的服务联系,以生成动态响应或执行操作。Fulfillment 用于完成所有这些操作。

fulfillment 可能包含以下任一选项:

  • 静态响应消息。
  • 用于动态响应和/或执行操作的网络钩子调用。
  • 用于设置或替换参数值的参数预设。

在代理每轮对话期间,系统可以(且有时需要)调用多个 fulfillment,每个 fulfillment 都可以生成响应消息。Dialogflow CX 会在响应队列中维护这些响应。 代理的每轮对话结束后,Dialogflow CX 会将已排序的响应发送给最终用户。

Fulfillment 用例

通过履单,您可以在以下位置提供响应消息:

对于每种用例,控制台都会打开一个 Fulfillment 修改窗格。

Fulfillment 屏幕截图

代理回答(对话选项)

在设计时创建 fulfillment 时定义代理响应消息。在运行时,这些响应将添加到响应队列中。

有几种类型的响应消息,我们将在下面的小节中进行介绍。使用控制台时,Fulfillment 面板有一个初始代理对话卡片,但您可以点击添加对话响应以给其他响应消息类型添加更多卡片。

静态文本响应

静态文本响应消息向用户提供文本对话。如果您的检测意图 API 调用或集成调用使用语音合成,则此文本会生成音频内容。对于这些消息,提供的文本使用语音合成标记语言 (SSML)

您可以定义多个文本响应卡片,并在每个卡片中定义多个文本响应。如果您定义了多个卡片,那么这些卡片会在运行时针对单个响应进行串联。如果您在一个卡片内定义多个响应,那么会在运行时随机选择该卡片中的一条消息。

这些文本消息可以包含参数引用和内嵌系统函数

自定义负载

某些集成支持自定义载荷响应以处理丰富的响应。这些自定义载荷必须以集成文档中定义的 JSON 格式提供。例如,请参阅 Dialogflow CX Messenger 自定义载荷格式

您可以在自定义载荷 JSON 中添加参数引用。请使用英文双引号将它们引起来,以便将它们视为 JSON 字符串值。例如:

{
  "someField": "$session.params.date"
}

自定义载荷 JSON 的深度必须限制为 24 级。

您还可以将自定义载荷发送到您开发的集成。Dialogflow CX 不会处理这类载荷,因此您必须在自己的业务逻辑中进行处理。

如需了解详情,请参阅自定义载荷模板

在线客服人员交接

此响应会告知检测意图 API 调用方是否应将对话移交给人工客服。Dialogflow CX 仅使用此信号来识别出于衡量目的而移交的对话,不会更改会话状态。

您的系统或集成可以使用此信号来采取任何必要的措施以转接对话。由于 Dialogflow CX 不会对这些数据应用任何结构,因此您可以选择任何适合您系统的结构。

对话成功元数据

此响应会告知检测意图 API 调用方与 Dialogflow CX 代理之间的对话成功。Dialogflow CX 使用此信号来识别成功进行衡量的对话,并且不会以任何方式更改会话状态。

您的系统或集成可以使用此信号来执行任何必要的操作。Dialogflow CX 不会对此数据应用任何结构,因此您可以选择任何适合您系统的结构。

播放预先录制的音频

此响应会为支持此功能的集成播放音频文件。

不同集成的音频文件格式要求可能会有所不同。例如,请参阅 Dialogflow CX 电话网关的要求

对于合作伙伴电话集成,合作伙伴必须能够访问音频文件的网址。合作伙伴始终可以访问公开可用的网址,例如 Cloud Storage 中的公开文件。合作伙伴还可以为音频文件提供受限访问权限。如需了解详情,请参阅合作伙伴文档。

输出音频文本

此响应与文本响应类似,但仅适用于语音合成。如果代理可以处理文本和语音会话,您可以使用唯一文本和输出音频文本响应为文本和语音创建不同的用户体验。如果为语音会话提供了输出音频文本,纯文本响应将被忽略。

如果代理处理文本和语音会话,并且您希望使用相同的响应消息,则对文本和语音会话均使用文本响应。

输出音频文本的串联方式与文本响应类似。如果输出音频文本响应同时包含文本和 SSML,则串联结果被视为 SSML。您最好一致地使用文本或 SSML。

条件式响应

此响应类型提供条件式响应:

基本格式为:

if [condition]
  [response]
elif [condition]
  [response]
elif [condition]
  [response]
else
  [response]
endif

其中:

  • [condition] 使用与路由条件相同的格式。
  • [response] 是文本响应。
  • elifelse 块是可选的。

例如:

if $session.params.user-age >= 21
  Ok, you may enter.
else
  Sorry, you cannot enter.
endif

[condition][response] 都可以使用内嵌系统函数在对话期间生成动态值。如需了解详情,请参阅系统函数路由条件[condition] 是根据履单开始时的会话状态解析的。如果 [response] 依赖于会话状态,则会在履单结束时根据更新后的会话状态进行解析。

对于多语言代理[condition] 对所有语言都是通用的,而 [response] 针对特定语言。如果您在控制台中更新了一种语言的 [condition],则此部分会在代理的所有语言中进行更新。因为它成为新的条件,所以系统会针对除更新 [condition] 时选择的语言之外的其他所有语言清除 [response]

电话通话转接

电话转接仅适用于 Dialogflow CX 电话网关

对于某些手机集成,您可以为来电转接指定美国手机号码。在运行时,当 Dialogflow CX 代理触发包含来电转接的 fulfillment 时,该来电会被转接到指定的号码,并且代理处理会被暂停。

数据存储区工具响应

此响应类型用于配置从关联的数据存储区工具返回的代理响应。如果您在此履单中配置了数据存储区工具,系统会自动填充数据存储区工具响应卡片。

  • 来源链接:设置在回答后返回给用户的引用数量上限。引用是指数据存储区中信息来源的链接,以按钮形式呈现。默认值为 1。
  • 内嵌引用:限制每句话返回的内嵌引用数量,而不是在回答后列出链接。
  • 生成式后备:配置智能体,使其在数据存储区返回空结果时尝试生成 AI 生成的回答。如果此操作失败,代理会使用静态响应。
  • 静态响应:在最后一个字段中输入静态文本响应,以便逐字逐句地发送给用户。

频道专用响应消息

定义 fulfillment 时,您可以创建特定于渠道的响应消息,以便为文本聊天、语音、短信或支持渠道的特定集成创建有针对性的响应。不特定于任何渠道的任何响应消息都称为默认响应消息

在运行时,当检测意图请求指定渠道时,Dialogflow CX 会选择默认响应消息或特定于渠道的响应消息。最佳实践是,即使您使用特定于渠道的响应消息,也应定义默认响应消息。当系统无法提供有效渠道时,默认响应消息会作为后备。

频道名称是一个自定义字段,您可以将其设置为任何文本。如果您直接使用 Dialogflow CX API 进行运行时调用,则可以使用任何您喜欢的渠道名称。如果您使用现有集成,则必须使用该集成可识别的渠道名称。

在设计时设置特定于渠道的响应消息

如需在使用控制台时为 fulfillment 提供特定于渠道的响应消息,请执行以下操作:

  • 添加默认回答消息后,点击添加渠道,以添加特定于渠道的回答消息。再次点击添加频道,以添加其他频道。

使用 API 时,为 fulfillment 提供渠道专用响应消息:

  • Fulfillment.messages[i].channel 字段设置为每个响应消息的所选渠道。如果未设置此字段,则将相应响应视为默认响应消息。

在运行时利用特定于渠道的响应消息

如果您使用的是支持渠道的现有集成,则集成实现会执行这些步骤。

如需接收特定于渠道的响应消息,您必须在检测意图请求消息中指定渠道。请参阅 Sessions 类型的 detectIntent 方法中的 queryParams.channel 字段。

选择会话引用的协议和版本

协议 V3 V3beta1
REST 会话资源 会话资源
RPC 会话界面 会话界面
C++ SessionsClient 不可用
C# SessionsClient 不可用
Go SessionsClient 不可用
Java SessionsClient SessionsClient
Node.js SessionsClient SessionsClient
PHP 不可用 不可用
Python SessionsClient SessionsClient
Ruby 不可用 不可用

如果请求未定义渠道,或者如果 fulfillment 找不到匹配的渠道,Dialogflow CX 会返回默认响应消息。

自定义载荷模板

如果您经常使用自定义载荷,请使用自定义载荷模板。 自定义载荷有时会很大且很复杂,因此使用模板可简化代理创建流程。

在代理设置中提供这些模板,以便在为代理创建履单时选择这些模板。

例如,可以将“是”和“否”按钮的 JSON 载荷定义为自定义载荷模板。创建需要这些按钮的履单时,请在创建履单时选择相应模板。

如果您为履单自定义载荷选择模板,系统会将模板的内容插入到载荷中。然后,您可以根据需要修改载荷。

如果您更改模板,更改不会自动传播到引用该模板的所有履单载荷。

如需创建自定义载荷模板,请参阅代理常规设置

如需在创建履单时选择自定义载荷模板,请在创建履单自定义载荷时点击选择模板

网络钩子调用

当 fulfillment 触发网络钩子时,代理会向您的服务发送请求。您的网络钩子可以执行操作、提供动态响应消息、替换参数值以及更改当前页面。

下面介绍了针对履行的 Webhook 设置:

X
启用网络钩子 这样可为实现启用网络钩子。
网络钩子 选择 webhook 资源。
标记 您在此处提供的文本标记将填充到发送给网络钩子服务的网络钩子请求的 WebhookRequest.fulfillmentInfo.tag 字段中。这可用于以特定于履单的方式控制 Webhook 行为。
返回只答完一部分的回答 允许取消只答完一部分的回答的播放。如需了解详情,请参阅高级语音设置

参数预设

使用 fulfillment 提供用于设置或替换当前参数值的预设。系统会在解析静态响应消息或调用网络钩子之前应用这些预设。

您还可以使用系统函数将参数预设为动态生成的值。

以下是一些示例:

  • 将参数 now 设置为当前时间:

    参数
    现在 $sys.func.NOW()
  • 将现有参数 counter 递增 1:

    参数
    计数器 $sys.func.ADD($session.params.counter, 1)
  • 将参数 new-cost 设置为参数值 other-cost,同时保持完整的复合对象值:

    参数
    new-cost $sys.func.IDENTITY($session.params.other-cost)

数据存储区工具

如需详细了解此功能,请参阅数据存储区工具文档

高级语音设置

这些高级语音设置可以覆盖页面语音设置流语音设置代理语音设置

响应队列

在代理每轮对话期间,您可以调用多个 fulfillment,每个 fulfillment 都可以生成响应消息。Dialogflow CX 会在响应队列中维护这些响应。

流式传输 API 的部分响应

默认情况下,Dialogflow CX 仅在代理轮替结束后向最终用户发送有序响应。您还可以在 fulfillment 中启用返回只答完一部分的回答选项,以便在使用串流 API 时将已加入队列的响应作为只答完一部分的回答返回。如需了解详情,请参阅页面的生命周期

例如,如果您的网络钩子很可能会运行很长时间,则您可以在 fulfillment 中添加一个静态响应并启用只答完一部分的回答。这样,Dialogflow CX 便可以刷新响应队列,并在调用网络钩子之前将所有消息作为部分响应进行发送。

以下功能不支持只答完一部分的回答:

如需在模拟器中测试此功能,请启用部分响应。

模拟器中的部分响应的屏幕截图

在以下示例中,假设您的网络钩子需要 5 秒才能完成,并且您未启用部分响应。在网络钩子完成之前,Dialogflow CX 代理的对话回合不会结束。在此 5 秒回合期间,响应会在等待网络钩子完成期间位于队列中,并且在回合完成之前不会返回给最终用户。这会导致糟糕的用户体验。

未启用部分响应。

如果您在第一个 fulfillment 中启用只答完一部分的回答,则 Dialogflow CX 会快速返回第一个 fulfillment 消息并调用网络钩子。网络钩子完成后,Dialogflow CX 会返回最终响应。在这种情况下,最终用户体验会得到改善,因为系统会指示最终用户等待一小段时间。此外,网络钩子调用会与发送到最终用户的响应并发执行。

启用了部分响应。

语音合成标记语言 (SSML)

您可以在文本或输出音频文本履单字段中使用语音合成标记语言 (SSML)。这样一来,您就可以提供有关暂停以及首字母缩写词、日期、时间、缩写或应予以屏蔽的文本的音频格式等详细信息,从而自定义音频响应。

如需了解语法详情,请参阅 Text-to-speech SSML 文档