是否有一种本地方式来重新处理对提示的响应?

Is there a native way to re-handle a response to a prompt?

我们的聊天机器人(用 .NET core 3.1 编写)有多个提示,以按钮的形式提供选择。在用户通过聊天发送轮流(通过单击按钮或键入任何内容)后,我们隐藏按钮,因为单击它们只是发送按钮文本作为轮流。然后,我们的提示会获取用户的响应并将其与选择字典进行比较,以生成对后端更友好的结果,以供在对话步骤中使用。

用户向我们反馈了我们的处理方式。一个经常被请求的功能是向上滚动到上一个提示并对问题给出不同的回答。这是一个例子:

“您想了解哪种超声波的更多信息?

用户通常只寻找其中一个,但提示本身会激发好奇心。他们会选择他们最初寻找的选项,然后希望看到其他响应之一。目前,我们的用户将不得不重新键入触发超声意图的短语,该短语将他们路由到超声对话框,在该对话框中触发提示。理想情况下,他们会向上滚动到提示并单击不同的按钮,可能需要一个中间步骤,即他们单击提示问题上的 "Choose a different option"-按钮。

我们已经简要研究了如何实现此功能,并正在考虑在对话中存储提示的选择词典。然后我们会添加很多自定义逻辑来处理话语,可能是通过在前端使用特殊标签。或者我们会让中间步骤将对话倒回提示符并从那里处理他们的进一步操作。

在我们继续进行任何操作之前,我们对自己说 "Microsoft must have thought of this" 但是我们无法找到任何关于重新使用提示的文档。

Bot Framework 是否有允许用户从前端重新激活已在后端处理过的提示的本机方法?

不,没有本地方法可以按照您的意思重新处理对提示的响应。为了 design 您的机器人正确运行,您需要了解一些有关 Bot Framework 的内容。

什么是提示?

提示是 dialog 的一种类型,可以将其视为机器人向用户提问。如果用户的回答是第一次可以接受,它可能会在一个回合内结束,或者如果机器人没有立即获得它需要的信息,它可能需要多个回合。在选择提示的情况下,只有当用户的回答可以被识别为可用选项之一时,它才会被接受。既然你提到了选择,我假设你使用的是选择提示。

选择提示可以以五种可能的方式显示其选择,称为列表样式。有两种方法可以将选项显示为按钮,两种方法可以将选项显示为文本,还有一种方法可以完全不显示任何选项。如果您查看 enum,您会看到第六个选项:“自动”。这是默认设置,它将根据您的选择和频道的功能选择最佳选项。在您的情况下,它必须将选择呈现为建议的操作。

建议的操作是什么?

建议的操作是当用户单击其中一个按钮时消失的按钮。与所有 UI 元素一样,它们非常特定于通道,Azure 机器人服务将尝试将它们转换为给定通道的适当格式。例如,在 Facebook Messenger 中,建议的操作将变成“快速回复”。网络聊天是 Bot Framework 的一部分,因此您无需进行任何转换。

您会在 docs 中看到建议的操作旨在防止您的机器人担心处理旧卡片上的点击:

Unlike buttons that appear within rich cards (which remain visible and accessible to the user even after being tapped), buttons that appear within the suggested actions pane will disappear after the user makes a selection. This prevents the user from tapping stale buttons within a conversation and simplifies bot development (since you will not need to account for that scenario).

听起来您的用户希望能够返回并单击按钮,因此您需要使用卡片而不是建议的操作。

什么是卡片?

目前大约有九种类型的 cards officially supported by the Bot Framework. Adaptive Cards 适用于更高级的场景,但由于您只需要几个按钮,您可以选择最简单的选项:英雄卡。

您之前可能已经注意到,“英雄卡片”是列表样式的另一个按钮选项。因此,您所要做的就是设置使用英雄卡片列表样式的提示,您的选择将以卡片形式呈现,而不是建议的操作。

这些信息可能足以解决您的问题,但我想确保您走在正确的轨道上。我一开始说“不”的原因是你不应该试图将你的对话倒回到特定的提示。这不是对话框或提示的工作方式。如果您希望机器人能够在对话中的任何时候响应这些选择,您需要将这些选择作为中断处理。

什么是中断?

Interruptions are when the bot responds to a user utterance or action in a way that doesn't follow the flow of the current dialog. You can see an example of interruptions in the core bot sample。在该示例中,您可以看到仅在对话范围内处理中断,这使您可以决定何时允许中断。或者,您可以通过将该逻辑放在任何对话框之外来全局处理中断。

您可以设置中断,以便机器人将始终在您的所有选择提示中收听您所有选择中的确切文本。文本将是一个关键短语,就像示例中的“帮助”或“取消”一样。请注意,如果您走这条路,用户可能会在发送卡片之前通过键入关键短语来访问该功能。另一种方法是让按钮发送 postBack 操作而不是默认的 imBack 操作。这将发送用户键入无法模拟的不可见消息,并且它们将更容易被您的机器人识别为中断。

如果您将按钮响应为中断,那么甚至根本没有提示也是有意义的。当对话到达开始选择提示的位置时,它可以发送卡片并结束对话,因为它知道机器人将能够响应用户选择的任何内容。请注意,这意味着您将无法使用选择提示提供的所有选择识别选项,因此用户将无法执行类似键入数字 2 的操作。