每轮对话过程中,代理必须通过回答问题,询问信息或终止会话来响应最终用户。您的代理可能还需要与您的服务联系,以生成动态响应或执行操作。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 电话网关的要求。
对于合作伙伴电话集成,合作伙伴必须能够访问音频文件的网址。合作伙伴始终可以访问公开提供的网址,例如 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] 是根据履单开始时的会话状态来解析的。如果 [response] 依赖于会话状态,则会在履单结束时根据更新后的会话状态进行解析。
对于多语言代理,[condition] 对所有语言都是通用的,而 [response] 针对特定语言。如果您在控制台中更新了一种语言的 [condition],则此部分会在代理的所有语言中进行更新,并且因为它成为新的条件,所以系统会针对除更新 [condition] 时选择的语言之外的其他所有语言清除 [response]。
电话转接来电
对于某些手机集成,您可以为来电转接指定美国手机号码。在运行时,当 Dialogflow CX 虚拟客服通过来电转接调用 fulfillment 时,该调用将被转接到指定的号码,并且虚拟客服处理将被暂停。
数据存储区工具响应
此响应类型用于配置从关联的数据存储区工具返回的智能体响应。如果您在此履单中配置了数据存储区工具,系统会自动填充数据存储区工具响应卡片。
- 来源链接:用于设置在回答后返回给用户的引用数量上限。引用是指向数据存储区中信息来源的链接,以按钮形式呈现。默认值为 1。
- 内嵌引用:此字段可让您限制每句话返回的内嵌引用数量,而不是在回答后列出链接。
- 生成式回退:选中此框后,如果数据存储区返回空结果,智能体将尝试生成 AI 生成的回答。如果失败,则会继续使用静态响应。
- 静态回答:您可以在最后一个字段中输入静态文本回答。这些消息会原封不动地发送给用户。
频道专用响应消息
定义 fulfillment 时,您可以创建特定于渠道的响应消息,以便为文本聊天、语音、短信、支持渠道的特定集成等创建有针对性的响应。不特定于任何渠道的响应消息称为默认响应消息。
在运行时,如果检测意图请求指定了渠道,Dialogflow CX 将选择默认响应消息或特定于渠道的响应消息。最佳做法是,即使您使用的是渠道专用响应消息,也应定义默认响应消息。当系统无法提供有效渠道时,默认响应消息可作为后备方案。
频道名称是一个自定义字段,您可以将其设置为任意文本。 如果您直接使用 Dialogflow CX API 进行运行时调用,则可以使用任何您喜欢的渠道名称。如果您使用的是现有集成,则必须使用该集成可识别的渠道名称。
在设计时设置特定于渠道的响应消息
如需在使用控制台时为履单提供特定于渠道的响应消息,请执行以下操作:
- 添加默认回复消息后,点击添加渠道。 通过该界面,您可以添加特定于渠道的回复消息。再次点击添加渠道,以添加其他渠道。
使用 API 时,如需为履单操作提供渠道专属的响应消息,请执行以下操作:
- 将每个响应消息的
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 将返回默认的响应消息。
自定义载荷模板
如果您经常使用自定义载荷,则应使用自定义载荷模板。 自定义载荷有时很大且很复杂,因此使用模板有助于简化代理创建流程。
您可以在代理设置中提供这些模板,这样一来,每当您为代理创建 fulfillment 时,都可以选择这些模板。
例如,可以将“是”和“否”按钮的 JSON 载荷定义为自定义载荷模板。 创建需要这些按钮的履单时,您只需在创建履单时选择模板即可。
如果您为履单自定义载荷选择模板,则模板的内容会插入到载荷中。 然后,您可以根据需要修改载荷。
如果您更改模板,相应更改不会自动传播到引用该模板的所有履单载荷。
如需创建自定义载荷模板,请参阅代理常规设置。
如需在创建履单时选择自定义载荷模板,请在创建履单自定义载荷时点击选择模板。
网络钩子调用
调用 fulfillment 并且 fulfillment 具有网络钩子时,代理会向您的网络钩子发送请求。您的网络钩子可以在您的服务中执行任何必要的操作,提供动态响应消息,替换参数值以及更改当前页面。
下面介绍了针对履行的 Webhook 设置:
| 术语 | 定义 |
|---|---|
| 启用网络钩子 | 这样可为执行启用网络钩子。 |
| 网络钩子 | 选择 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 文档。