每轮对话过程中,代理必须通过回答问题,询问信息或终止会话来响应最终用户。 您的代理可能还需要与您的服务联系,以生成动态响应或执行操作。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"
}
您还可以将自定义载荷发送到您开发的集成。 Dialogflow CX 不会处理这类载荷,因此您需要在自己的业务逻辑中进行处理。
另请参阅以下自定义载荷模板 部分。
在线客服人员交接
此响应会告知检测意图 API 调用方应将对话移交给人工客服。Dialogflow CX 仅使用此信号来识别出于衡量目的而取消的会话,并且不会以任何方式更改会话状态。您的系统或集成可以使用此信号来执行将对话移交所需的任何操作。Dialogflow CX 不对此数据施加任何结构,因此您可以选择适合您系统的任何结构。
话题成功元数据
此响应会向检测意图 API 调用方发送信号,表明与 Dialogflow CX 代理之间的对话成功。Dialogflow CX 仅使用此信号来识别成功进行衡量的会话,并且不会以任何方式更改会话状态。您的系统或集成可以使用此信号来执行任何必要的操作。Dialogflow CX 不对此数据施加任何结构,因此您可以选择适合您系统的任何结构。
播放预先录制的音频
此响应会为 支持此功能的 集成播放音频文件。
不同集成的音频文件格式要求可能会有所不同。 例如,请参阅 要求 Dialogflow CX Phone Gateway。
对于 合作伙伴电话集成, 合作伙伴必须能够访问音频文件的网址。 合作伙伴始终可以访问可公开访问的网址,例如 Cloud Storage 中的公共文件, 合作伙伴还可以提供对音频文件的受限访问权限。如需了解详情,请参阅合作伙伴文档。
输出音频文本
此响应与文本响应类似,但仅适用于语音合成。如果代理可以处理文本和语音会话,您可以使用唯一文本和输出音频文本响应为文本和语音创建不同的用户体验。如果为语音会话提供了输出音频文本,纯文本响应将被忽略。
如果代理处理文本和语音会话,并且您希望使用相同的响应消息,则对文本和语音会话均使用文本响应。
输出音频文本的串联方式与文本响应类似。如果输出音频文本响应同时包含文本和 SSML,则串联结果被视为 SSML。代理设计人员最好一致地使用文本或 SSML。
条件式响应
此响应类型用于条件式响应。基本格式为:
if [condition] [response] elif [condition] [response] elif [condition] [response] else [response] endif
其中:
[condition]与路由条件使用的格式相同[response]是文本响应elif和else块是可选的
例如:
if $session.params.user-age >= 21 Ok, you may enter. else Sorry, you cannot enter. endif
[condition] 和 [response] 都可以使用内嵌系统函数在对话期间生成动态值。如需了解详情,请参阅
系统函数和
路由条件参考文档。[condition] 根据 fulfillment 开始时的会话状态进行解析。如果 [response] 依赖于会话状态,则会根据 fulfillment 结束时更新的会话状态进行解析。
对于 多语言代理,
[condition] 对所有语言都是通用的,而 [response]
针对特定语言。如果您在控制台中更新了一种语言的 [condition],则此部分会在代理的所有语言中进行更新,并且因为它成为新的条件,所以系统会针对除更新 [condition] 时选择的语言之外的其他所有语言清除 [response]。
电话转接来电
对于某些手机集成,您可以为来电转接指定美国手机号码。 在运行时,当 Dialogflow CX 虚拟客服通过来电转接调用 fulfillment 时,该调用将被转接到指定的号码,并且虚拟客服处理将被暂停。
数据存储区工具响应
此响应类型用于配置从链接的 数据存储区工具返回的代理响应。如果您在此 fulfillment 中配置了数据存储区工具,系统会自动填充数据存储区工具响应卡片。
- 来源链接:用于设置响应后将 返回给用户的引用次数上限。引用是指数据存储区中信息来源的链接,以按钮形式呈现。默认值为 1。
- 内嵌引用:此字段不是在响应后列出链接,而是用于限制每个句子返回的内嵌引用数量。
- 生成式后备:选中此复选框后,如果数据存储区返回空结果,代理会尝试生成 AI-生成的响应。如果失败,它将继续执行静态响应。
- 静态响应:您可以在最后一个字段中输入静态文本响应。这些响应会逐字发送给用户。
频道专用响应消息
定义 fulfillment 时, 您可以创建 频道专用响应消息, 以便为文本聊天、语音、短信、 支持频道的特定集成等创建有针对性的响应。任何不特定于频道的响应消息都称为默认响应消息 。
在运行时,如果检测意图请求指定了频道,Dialogflow CX 将选择默认响应消息或频道专用响应消息。 最佳做法是,即使您使用的是频道专用响应消息,也应定义默认响应消息。 如果您的系统无法提供有效的渠道,默认响应消息可以作为后备。
频道名称是一个自定义字段,您可以将其设置为任何文本。如果您直接使用 Dialogflow CX API 进行运行时调用,则可以使用任何您喜欢的频道名称。 如果您使用的是现有集成,则必须使用集成可识别的频道名称。
在设计时设置频道专用响应消息
如需在使用控制台时为 fulfillment 提供频道专用响应消息,请执行以下操作:
- 添加默认响应消息后,点击添加频道 。 用户界面将允许您添加频道专用响应消息。 再次点击添加频道 以添加其他频道。
如需在使用 API 时为 fulfillment 提供频道专用响应消息,请执行以下操作:
- 为每条响应消息将
Fulfillment.messages[i].channel字段设置为所需的频道。 如果未设置此字段,则响应为默认响应消息。
在运行时使用频道专用响应消息
如需接收频道专用响应消息,必须在检测意图请求消息中指定频道。
请参阅 queryParams.channel 字段 在 detectIntent 方法
的 Sessions 类型。
选择会话引用的协议和版本:
| 协议 | 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 将返回默认响应消息。
自定义载荷模板
如果您经常使用自定义载荷, 则应使用自定义载荷模板。 自定义载荷有时很大且很复杂,因此使用模板有助于简化代理创建过程。
您可以在代理设置中提供这些模板,这样,每当您为代理创建 fulfillment 时,都可以选择这些模板。
例如,您可以将“是”和“否”按钮的 JSON 载荷定义为自定义载荷模板。 创建需要这些按钮的 fulfillment 时,您只需在创建 fulfillment 时选择模板即可。
当您为 fulfillment 自定义载荷选择模板时,模板的内容会插入到载荷中。 然后,您可以根据需要修改载荷。
如果您更改了模板,更改不会自动传播到所有引用该模板的 fulfillment 载荷。
如需创建自定义载荷模板,请参阅 代理常规设置。
如需在创建 fulfillment 时选择自定义载荷模板,请在创建 fulfillment 自定义载荷时点击选择模板 。
网络钩子调用
调用 fulfillment 并且 fulfillment 具有网络钩子时,代理会向您的网络钩子发送请求。您的网络钩子可以在您的服务中执行任何必要的操作,提供动态响应消息,替换参数值以及更改当前页面。
以下介绍了 fulfillment 的网络钩子设置:
| 术语 | 定义 |
|---|---|
| 启用网络钩子 | 启用 fulfillment 的网络钩子。 |
| 网络钩子 | 选择网络钩子资源。 |
| 标记 | 您在此处提供的文本标记将填充到发送给您的网络钩子服务的网络钩子请求的 WebhookRequest.fulfillmentInfo.tag 字段中。这可用于以 fulfillment 特定的方式控制网络钩子行为。 |
| 返回只答完一部分的回答 | 允许取消只答完一部分的回答的播放。如需了解详情,请参阅高级语音设置。 |
参数预设
您可以使用 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)
您可以在文本或输出音频文本 fulfillment 字段中使用语音合成标记语言 (SSML)。这样,您就可以通过提供有关暂停以及首字母缩写词、日期、时间、缩写或应予以屏蔽的文本的音频格式等详细信息,来自定义音频响应。
如需了解语法详情,请参阅 Text-to-speech SSML 文档。