控制交谈流
了解当有人在运行时与您的助手进行交互时,如何处理您的对话。 了解如何以对您有利的方式使用交谈流,并在必要时更改交谈流。
您可以使用以下功能来影响交谈流:
消歧
消歧指示助手在有多个对话节点可以响应客户的输入时,要求客户提供帮助。 您的助手会与用户共享最热门节点选项的列表,并要求用户选取正确的节点,而不是猜测要处理哪个节点。

满足以下条件时,将触发消歧:
- 在用户输入中检测到的次热门意向的置信度分数接近最热门意向的置信度分数值。
- 最热门意向的置信度分数大于 0.2。
即使满足以上条件,仍不会执行消歧,除非对话中有两个或更多独立节点满足以下条件:
- 节点条件包含已触发消歧的其中一个意向。
- 为“节点名”字段中的节点提供了节点用途的描述。 (或者,描述可以包含在“外部节点名”字段中。)
如果节点具有布尔节点条件且求值为 true,那么该节点可能会包含在消歧列表中。 例如,如果节点检查实体类型,而用户输入中提到了该实体,那么该实体就有资格被列入列表。 此类节点不会触发消歧,但是如果触发了消歧,那么可能会将这些节点包含在生成的消歧列表中。
了解更多
消歧示例
例如,您的对话有两个节点,其中带有处理取消请求的意向条件。 条件如下:
- eCommerce_Cancel_Product_Order
- Customer_Care_Cancel_Account
如果用户说 i must cancel it today
,那么可能会在输入中检测到以下意图:
[
{"intent":"Customer_Care_Cancel_Account","confidence":0.5602024316787719},
{"intent":"eCommerce_Cancel_Product_Order","confidence":0.46903514862060547},
{"intent":"Customer_Care_Appointments","confidence":0.29033891558647157},
{"intent":"General_Greetings","confidence":0.2894785046577454},
如果在“试用”窗格中进行测试,可以将鼠标悬停在眼睛图标上,查看测试输入中识别出的前三个意图。

您的助手对用户目标与 0.5618281841278076
意向匹配的置信度为 #Customer_Care_Cancel_Account
(56%)。 如果另一个意向的置信度分数接近此最热门意向的分数,那么会触发消歧。 在本例中,#eCommerce_Cancel_Product_Order
意向的置信度为 46%。
因此,当用户说 i must cancel it today
时,两个对话节点都有可能被认为是可行的候选回应。 为了确定要处理哪个对话节点,助手会要求用户选取一个对话节点。 为了帮助用户进行选择,助手提供了有关每个节点所执行操作的简短摘要。 摘要文本将直接从节点的名称字段中抽取。 如果存在外部节点名字段,并且向其添加了描述,将改为从该字段中获取文本。
消歧列表中显示的描述来自意向匹配所在分支中处理的最后一个节点的名称(或外部节点名)。 有关更多信息,请参阅禁用跳转至实用程序节点。

请注意,助手会将用户输入中的词汇 today
识别为日期(@sys-date
实体的提及项)。 如果对话树包含以 @sys-date
实体为条件的节点,那么该节点也可能会包含在消歧选项列表中。 下图显示了该节点在列表中作为捕获日期信息选项。

编辑消歧配置
对于所有新的对话技能,会自动启用消歧。 您可以从选项页面更改自动应用到消歧的设置。
要编辑消歧设置,请完成以下步骤:
-
在 选项中,单击 消岐。
-
在消歧消息字段中,添加要显示在对话节点选项列表前面的文本。 例如,您想做什么?
-
在“其他任何内容”字段中,添加文本作为额外选项显示,如果其他对话框节点选项都不能反映用户想要做的事情,用户可以选择该选项。 例如,以上都不适用。
使消息保持简短,以便显示时与其他选项排列整齐。 信息必须少于 512 个字符。 有关用户选择此选项时助手执行的操作的信息,请参阅处理“以上都不适用”。
-
如果要限制可以向用户显示的消歧选项数,请在最大建议数字段中,指定 2 到 5 之间的数字。
这将自动保存您的更改。
您可以使用 API 来修改更多消岐设置。 这些设置包括消岐敏感度,这会影响消岐触发的频率以及包含的选项数。 有关更多信息,请参阅 API 参考。
选择不显示为消歧选项的节点
所有节点都有资格包含在消歧列表中。
- 包括树层次结构中任何级别的节点。
- 包括以意向、实体、特殊条件、上下文变量或这些值的任意组合为条件的节点。
请考虑隐藏消歧列表中的一些节点。
-
隐藏具有
welcome
和anything_else
条件的根节点除非您为这些节点添加了额外的功能,否则它们通常不是消歧义列表中的有用选项。
-
隐藏跳转至实用程序节点
消歧列表中的文本是根据节点条件匹配的分支中最后处理的节点的节点名称(或外部节点名称)填充的。
不要在消岐列表中包含实用程序节点 (例如,感谢用户,告别或询问答案质量反馈),而不是描述匹配根节点用途的短语。
例如,具有匹配意向条件
#store-location
的根节点可能会跳转至询问用户是否对响应感到满意的节点。 如果#check_satisfaction
节点有节点名称和消歧,则跳转到的节点名称会显示在消歧列表中。 因此,Check satisfaction
会显示在消歧列表中,用于表示#store-location
分支,而不是显示根节点中的Get store location
名称。 -
隐藏仅以实体或上下文变量为条件的根节点
只有具有匹配意向的节点可以触发消歧。 不过,一旦触发,任何条件匹配的节点都会被列入消歧义列表。 例如,当对话包含以实体为条件的节点时,树层次结构中的节点顺序会以意外的方式变得有意义。
-
节点的顺序会影响是否触发消歧。 例如,查看先前用于引入消歧的场景。 如果以
@sys-date
为条件的节点在对话树中的位置高于以#Customer_Care_Cancel_Account
和#eCommerce_Cancel_Product_Order
意图为条件的节点,那么当用户输入i must cancel it today
时就不会触发消歧。 由于相应节点在树中的位置,您的助手会认为提到的日期 (today
) 比引用的意图更重要。 -
节点的顺序会影响消歧选项列表中包含哪些节点。 有时,节点未按预期列为消歧选项。 如果某个条件值还被某个节点引用,但该节点由于某种原因而没有资格包含在消歧列表中,那么可能会发生这种情况。 例如,一个实体可能会触发一个节点,该节点位于对话树的较前位置,但未启用消歧功能。 如果同一实体是启用了消歧功能的节点的唯一条件,但该节点在树中的位置较低,那么它可能就不是一个消歧选项,因为你的助手从未到达过它。 如果它与较早的节点相匹配,并且已省略,那么助手可能不会处理后面的节点。
-
完全隐藏节点以禁用消歧
您可以阻止对话中的每个节点或单个对话节点进入消歧列表。
要完全禁用消歧,请执行以下操作:
-
在 选项中,单击 消岐。
-
将开关设置为关闭。
要阻止单个对话节点进入消歧列表:
-
单击对话框节点,在编辑视图中打开该节点。
-
单击设置。
-
将显示节点名开关设置为关闭。
加 如果您在外部节点名称字段而不是名称字段中添加了节点摘要说明,请将其删除。
外部节点名字段有两个用途。 一个用途是在节点包含在消歧列表中时,向客户提供有关该节点的信息。 另一个用途是在交谈转接到某个人员时,在与服务台座席共享的聊天摘要中描述该节点。 外部节点名称字段仅在属于付费计划实例的技能中可见。 如果外部节点名字段包含文本,将使用该字段的文本(无论名称字段中是否有文本)。
对于每个节点,请测试期望节点包含在消歧选项列表中的场景。 通过测试,您可以调整节点顺序或其他可能影响运行时消歧效果的因素。 请参阅测试消歧。
使节点的优先级高于消歧列表
有些节点对客户来说非常重要,当助手确信该节点满足客户需求时,就会在消歧义列表之外单独返回这些节点。
例如,您可能有一个节点与 #stolen_card
意向匹配。 每当有入局消息表明客户想要报告被盗的信用卡时,您不希望助手的响应成为消歧列表中的选项。 您希望助理只回答一个问题,帮助客户解决这个紧急问题。
要设计对话来将单个节点置于消歧之外,请完成以下步骤:
-
在意向的条件节点中,单击 定制 以启用多个条件响应。
-
添加具有以下条件的条件响应:
intent.confidence > n
其中
n
是对训练数据有意义的置信度分数。 例如:intent.confidence > 0.7
-
将响应上移至条件响应列表的最上方。
-
单击齿轮图标以定制条件响应。
-
在助手应答部分,打开上下文编辑器。
-
添加以下上下文变量:
上下文变量 变量 值 system
{"prevent_disambiguation":true}
-
单击保存。
或者,您也可以添加一个根节点,并设置如下条件:
#stolen_card && intent.confidence > 0.7
将此节点置于树中以
#stolen_card
为条件的节点之上,允许节点包含在消歧列表中。 -
测试对话。 确保当满足相应的置信度分数阈值时,将返回节点的响应,而不是返回消歧列表。
处理“以上都不适用”
当用户单击以上都不适用选项时,助手会从消息中剥离在用户输入中识别到的意向,并再次提交该消息。 此操作通常会触发对话树中的“其他”节点。
要定制在这种情况下返回的响应,可以添加一个根节点,该节点有一个条件用于检查用户输入中是否没有识别到的意向(请记住,这些意向已剥离)并包含 suggestion_id
属性。 触发消歧时,助手会添加 suggestion_id
属性。
添加具有以下条件的根节点:
intents.size()==0 && input.suggestion_id
只有当输入触发了一组消歧义选项,而用户说其中没有一个符合目标时,才能满足这一条件。
添加一个回复,告诉用户你了解所建议的选项都不能满足他们的需求,并采取适当的行动。
同样,节点在树中的位置很重要。 如果以用户输入中提及的实体类型为条件的节点在树中的位置高于此节点,那么会改为显示那个节点的响应。
测试消歧
测试时,选项的列示顺序可能会更改。 事实上,包含在消歧义列表中的选项本身也可能在不同的测试中发生变化。
此行为是有意为之。 为了帮助助手从用户的选择中自动学习,目前正在进行的开发工作的一部分就是有意识地对选项及其在消歧义列表中的顺序进行随机化。 改变顺序有助于避免出现偏差,因为有一部分人总是选择第一个选项,而不事先仔细审查所有选项。
要测试消歧,请完成以下步骤:
-
在“试试看”窗格中,输入一个适合消歧义的测试语句,这意味着有两个或更多对话节点被配置为处理类似的语句。
-
如果响应不包含可供您选择的对话节点选项列表,请检查您是否向节点名 (或外部节点名) 字段添加了摘要信息。
-
如果仍未触发消歧,那么可能是节点的置信度分数值不像您认为的那么接近。
-
要查看在输入中检测到的前三个最热门意向的置信度分数,请将鼠标悬停在“试用”窗格中的眼睛图标上。
-
要查看从用户输入中检测到的所有意图的置信度分数,请在已知会触发的节点的节点响应末尾临时添加
<? intents ?>
。此 SpEL 表达式将在用户输入中检测到的意向作为数组显示。 数组包含意向名称以及助手对意向反映用户预期目标的置信度级别。
-
要查看用户输入中检测到了哪些实体(如果有的话),可以暂时用包含 SpEL 表达式
<? entities ?>
的单个文本响应替换当前响应。此 SpEL 表达式将在用户输入中检测到的实体作为数组显示。 该数组包括实体名称、实体提及位置、实体提及字符串以及该术语是指定实体类型提及的置信度。
-
要查看所有工件 (包括调用时的上下文变量值等其他属性) 的详细信息,请检查整个 API 响应。 请参阅查看 API 调用详细信息。
-
-
暂时删除至少一个节点的名称字段(或外部节点名称字段)中的描述,将其作为消歧选项。
-
在“试用”窗格中,再次输入测试话语。
如果您在回复中添加了
<? intents ?>
表达式,那么文本中就会包含助手在测试语篇中识别出的意图列表,并包括每个意图的置信度得分。意向和置信度分数
完成测试后,请除去附加到节点响应的任何 SpEL 表达式,或者重新添加任何已替换为表达式的原始响应,然后重新填充从中除去了文本的任何名称或外部节点名字段。
离题
当用户位于用于处理一个目标的对话流中,但切换主题以启动用于处理另一个目标的对话流时,将发生离题。 如果对话分支中没有任何节点与用户上次输入的目标匹配,那么对话将检查根节点条件是否存在适当的匹配。 通过每个节点可用的离题设置,您可以进一步定制这种行为。
使用离题设置,您可以允许交谈返回到发生离题时中断的对话流。 例如,用户可能正在订购一部新手机,但切换主题来询问有关平板电脑的问题。 您的对话框可以回答有关平板电脑的问题,然后让用户回到电话订购时的位置。 通过允许发生离题并返回,用户在运行时可以更好地控制交谈流。 他们可以更改主题,继续不相关主题的对话流直到结束,然后返回到原来的位置。 这样可以使对话流更近似地模拟人与人之间的交谈。
准备工作
测试总体对话时,请决定何时以及何处可合理地允许发生离题以及从离题返回。 以下离题控件将自动应用于节点。
-
缺省情况下,对话中的每个根节点都配置为允许离题将其设定为目标。 子节点不能成为离题的目标。
-
有槽的节点配置为阻止离题。 其他所有节点都配置为允许离题。 但是,在以下情况下,交谈无法从节点离题:
-
如果当前节点的任何子节点包含
anything_else
或true
条件。 这些条件的特殊性在于,它们的评估结果总是真实的。 由于这些条件的已知行为,因此通常在对话中将这些条件用于强制父节点对特定子节点连续求值。 为防止破坏现有的对话流程逻辑,在这种情况下不允许离题。 您必须将该子节点的条件更改为其他内容后,才能允许从此类节点离题。 -
如果节点被配置为在处理后跳转到另一个节点或跳过用户输入。 节点的最后步骤部分说明节点处理完毕后的情况。 当对话框被配置为直接跳转到另一个节点时,通常要确保遵循特定的顺序。 此外,节点配置为跳过用户输入时,等同于强制对话连续处理当前节点之后的第一个子节点。 为了防止破坏现有的对话流逻辑,在这两种情况下都不允许离题。 必须更改最后一步部分中指定的内容后,才能允许从此节点离题。
-
定制离题
您无法定义离题的开始和结束。 用户在运行时对离题流具备完全控制权。 您可以指定如何将每个节点包括在用户主导的离题中。 对于每个节点,您可以配置是否离题:
- 从节点开始并离开节点
- 在其他地方启动的节点可以瞄准并进入该节点
- 从其他地方开始并进入节点的对话,必须在当前对话流程结束后返回到中断的对话流程
要更改单个节点的离题行为,请完成以下步骤:
-
单击节点以打开其编辑视图。
-
单击定制,然后单击离题选项卡。
配置选项根据您在编辑的节点是根节点、子节点、有子节点的节点还是有槽的节点而有所不同。
从此节点离题
如果早先列出的情况不适用,那么可以做出以下选择:
-
所有节点类型:选择是否允许用户在到达当前对话分支末尾之前从当前节点离题。
-
有子节点的所有节点:如果节点的回复已显示,且其子节点与目标无关,则选择是否要让对话返回当前节点。 将允许从在此节点的响应后触发的离题返回开关设置为否,以阻止对话返回到当前节点并继续处理其分支。
例如,如果用户询问
Do you sell cupcakes?
,而回复We offer cupcakes in a variety of flavors and sizes
显示在用户更改主题之前,则可能不希望对话框返回到原来的位置。 特别是,如果子节点涉及用户可能提出的后续问题,可以安全地忽略不计。但是,如果节点依赖其子节点来处理问题,那么可能需要强制交谈返回并继续处理当前分支中的节点。 例如,初始响应可能为
We offer cupcakes in all shapes and sizes. Which menu do you want to see: gluten-free, dairy-free, or regular?
。 如果用户更改了主题,您可能希望返回对话框,以便用户选择菜单类型并获取他们想要的信息。 -
有槽的节点:选择是否要允许用户在填充所有槽之前从节点离题。 将允许在槽填充时离题开关设置为是以启用离题。
如果启用,当交谈从离题返回时,将显示下一个未填充槽的提示,以鼓励用户继续提供信息。 如果禁用,那么在用户提交的任何输入中不包含可填充槽的值时,将忽略这些输入。 但是,您可以通过定义槽处理程序来处理您预期用户在与节点交互时可能会主动提出的问题。 有关更多信息,请参阅 添加槽。
-
有插槽的节点:选择 只从插槽跳转到允许返回的节点 复选框,选择是否允许用户在返回当前节点时离题。
选中后,当对话查找节点以回答用户的不相关问题时,将忽略未配置为在离题后返回的所有根节点。 如果要防止用户在填写完所需空格之前永久离开节点,请选择此复选框。
离题到此节点
针对离题到节点的行为表现,您可以做出以下选择:
-
阻止用户离题到节点。 有关更多详细信息,请参阅禁止离题到根节点。
-
在允许离题到节点后,选择对话是否必须返回到之前从中离题的对话流。 当前节点的分支处理完毕后,对话流返回到中断的节点。 要在对话结束后返回,请选择“离题后返回”。
-
-
单击应用。
-
使用“试用”窗格来测试离题行为。
同样,您无法定义离题的开始和结束。 用户可以控制何处以及何时发生离题。 您可以应用各种设置来确定单个节点如何参与其中。 由于离题是如此难以预测,因此很难知道你的配置决定会对整个对话产生怎样的影响。 要真正了解所做选择的影响,您必须测试对话。
节点 #reservation 和 #cuisine 代表可以参与单个用户导向型离题的两个对话分支。 为每个单独的节点配置的离题设置用于在运行时实现此类型的离题。
离题用法提示
自定义返回信息:对于可以从离题处返回的任何节点,请考虑添加一些措辞,告诉用户从上一个对话流中离开后将返回到哪里。 在文本回复中,使用特殊语法添加两个版本的回复。
如果不添加信息,则会第二次显示相同的文本回复,告诉用户他们回到了离题的节点。 您可以通过指定返回时显示的唯一信息,让用户更清楚地知道他们返回到了原始对话线程。
例如,如果节点的原始文本响应是 What's the order number?
,那么当用户返回到该节点时,可能需要显示类似 Now let's get back to where we left off. What is the order number?
的信息。
为此,请使用以下语法来指定节点文本响应:
<? (returning_from_digression)? "post-digression message" : "first-time message" ?>
例如:
<? (returning_from_digression)? "Now, let's get back to where we left off.
What is the order number?" : "What's the order number?" ?>
在添加的文本响应中不能包含 SpEL 表达式或简写语法。 事实上,您根本无法使用简写语法。 您必须改为通过将文本字符串和完整的 SpEL 表达式语法并置在一起以构成完整响应,从而构建消息。
例如,使用以下语法在文本回复中包含一个上下文变量,您通常会将其指定为 What can I do for you, $username?
:
<? (returning_from_digression)? "Where were we, " +
context["username"] + "? Oh right, I was asking what can I do
for you today." : "What can I do for you today, " +
context["username"] + "?" ?>
有关完整 SpEL 表达式语法详细信息,请参阅用于访问对象的表达式。
阻止返回:在某些情况下,您可能希望根据用户在当前对话流中所做的选择,阻止返回到中断的交谈流。 您可以使用特殊语法来阻止从特定节点返回。
例如,您可能有一个节点以 #General_Connect_To_Agent
或类似的意向为条件。 触发后,如果想在将用户转移到外部服务之前获得用户的确认,可以添加一个响应,如 Do you want me to transfer you to an agent now?
。 您可以添加两个子节点,分别以 #yes
和 #no
为条件。
管理此类型分支的离题的最佳方法是设置根节点以允许离题返回。 但是,在 #yes
节点上,在回复中包含 SpEL 表达 <? clearDialogStack() ?>
。 例如:
OK. I will transfer you now. <? clearDialogStack() ?>
该 SpEL 表达式可防止从该节点进行离线返回。 请求确认时,如果用户回复 yes,那么会显示相应的响应,并且不会恢复已中断的对话流。 如果用户回复 no,那么会将用户返回到已中断的流。
禁止离题到根节点
当流离题到根节点时,会遵循为该节点配置的对话过程。 该流可能在节点分支结束之前处理一系列子节点,然后返回到中断的对话流。 通过测试,您可能会发现在意外时间触发根节点的频率过高,或者对话过于复杂,并将用户发送到太远的位置。 如果您确定不想允许用户离题到根节点,那么可以将根节点配置为不允许离题到其中。
要完全禁止离题到根节点,请完成以下步骤:
- 单击以打开要编辑的根节点。
- 单击定制,然后单击离题选项卡。
- 将“允许离题到此节点”设置为“关闭”。
- 单击应用。
如果您决定要阻止离题到多个根节点,但又不想分别编辑每一个根节点,那么可以将这些节点添加到一个文件夹中。 在文件夹的“自定义”页面中,可以将“允许离题到此节点”开关设置为“关”,以便将配置应用到所有节点。 有关更多信息,请参阅 使用文件夹组织对话。
设计注意事项
避免回退节点过多:许多对话设计人员会在每个对话分支的末尾包含一个具有 true
或 anything_else
条件的节点,以防止用户卡在分支中。 如果用户输入与您预期的任何内容都不匹配并且包含要处理的特定对话节点,那么此设计会返回一条通用消息。 但是,用户无法从使用这种方法的对话流离题。
对使用此方法的任何分支求值,以确定允许从该分支离题是否更好。 如果用户的输入与您预期的内容不匹配,它可能会在您的对话树中找到与之完全不同的对话流。 您可以使对话的其余部分有效地用于尝试处理用户的输入,而不使用通用消息进行响应。 此外,根级别的 Anything else
节点始终可以响应其他任何根节点都无法处理的输入。
重新考虑跳转到关闭节点:许多对话框都设计了一个标准的关闭问题,例如:Did I answer your question today?
用户不能从配置为跳转到另一个节点的节点离题。 因此,如果将所有最终分支节点配置为跳转至通用结束节点,那么不会发生离题。 请考虑通过度量值或其他某种方式来跟踪用户满意度。
测试可能的离线链:如果用户从当前节点离题到另一个允许离题的节点,那么用户可能会从另一个节点离题,并重复这种模式。 如果将离题链中的起始节点配置为在离题后返回,那么用户最终会回到当前对话节点。 事实上,对于链中配置为不返回的任何后续节点,都不会将其纳入离题目标的考虑范围。 请对多次离题的场景进行测试,以确定各个节点是否按预期运行。
离散返回时不重新评估步骤条件:由于步骤条件在离散之前已经评估过,因此在离散返回时不会再次评估。 如果会话流程要求再次评估步骤条件,那么就在离题开始的同一步骤添加重新提示。 如果不想在同一步骤重新提示,并防止离题返回,请执行以下步骤:
- 转到 主页 > 操作 > 由您创建。
- 选择要防止离题返回的操作。
- 单击 操作设置。
- 在更改对话主题中将切换开关切换为打开。
- 选择 完成此操作后永不返回原始操作。
- 单击保存。
当前节点获得优先权:只有在当前流程无法处理用户输入时,当前流程之外的节点才会被视为离题目标。 在有允许离题的插槽的节点中,要让用户清楚需要哪些信息,并在用户提供数值后添加确认语句。
在槽填充过程中可以填充任何槽。 所以,槽可能会意外捕获用户输入。 例如,您可能有一个有槽的节点,用于收集进行晚餐预订所需的信息。 其中一个槽收集日期信息。 用户可能会询问 What's the weather meant to be tomorrow?
。 您可能有一个以 #forecast 为条件的根节点,可以回答用户的问题。 但是,由于用户的输入包含 tomorrow
这个词,而带有时段的预订节点正在处理中,因此助手认为用户提供或更新的是预订日期。
当前节点始终优先。 如果定义了明确的确认语句(例如 Ok, setting the reservation date to tomorrow,
),那么用户更有可能意识到存在理解错误并进行相应更正。
如果用户提供的值不是任何槽所期望的值,那么它可能与用户从未打算将其消解到的不相关根节点相匹配。
在配置离题行为时,务必执行大量测试。
何时使用离题而不是槽处理程序:对于用户可能提出的一般问题,使用允许离题的根节点,处理输入,然后返回正在进行的流程。 对于有插槽的节点,应尽量预测用户在填写插槽时可能想问的相关问题类型,并通过在节点中添加处理程序来解决这些问题。
例如,如果“槽”节点收集完成保险索赔所需的信息,则可能需要添加处理程序来解决有关保险的常见问题。 但是,如果是有关如何获得帮助、商店位置或公司历史的问题,请使用根节点。