IBM Watson Assistant:如何训练聊天机器人选择正确的意图?

IBM Watson Assistant: How to train the chatbot to pick the right intent?

在开发和测试对话时,IBM Watson Assistant 会识别多个意图并响应置信度最高的意图。有时我希望它响应第二个意图而不是第一个意图,因为它与当前对话上下文更相关。例如,如果对话包含处理转账或支付的节点,则在转账场景中,用户可以说执行,这将同时匹配执行转账和执行支付。因此,我希望 Watson 始终响应当前上下文的执行转帐,即使它以更高的置信度识别执行付款也是如此。

因此,假设机器人知道当前上下文并会做出相应答复,用户会提出一般性问题。

例如,假设我正在开发一个 FAQ 机器人来回答有关 2 个程序忠诚度和储蓄的查询。为简单起见,我假设有 4 个意图

(忠诚度定义 - 包含与忠诚度计划相关的示例) (忠诚度加入 - 其中包含与如何加入忠诚度计划相关的示例) (Saving-Define - 其中有与什么是保存程序相关的示例) (Saving-Join - 其中有与如何加入储蓄计划相关的示例)

因此用户可以通过像 "tell me about the loyalty program" 这样的话语开始对话。然后他们会问 "how to join"(没有提到程序假设机器人知道)。在这种情况下,Watson 将识别 2 个意图(忠诚度加入、保存加入)并且保存加入意图可能具有更高的置信度。

所以我需要拦截对话(可能正在创建一个父节点来检查上下文,并基于此过滤错误的意图)。

我找不到在对话中编写代码来检查上下文和修改 intents 数组的方法,所以我想问一下这样做的最佳做法。

您可以train Watson Assistant做出相应的回应。在您处理技能的工具中,单击导航栏中的用户对话页面。在消息概览中,您需要确定那些回答错误的消息,然后指定正确的意图。 Watson Assistant 会捡起它,重新训练,然后希望能正确回答。

此外,您可以重新审视如何定义意图。这些示例是否像真实的用户消息?你能提供更多的变化吗?导致 Watson Assistant 选择一个而不是另一个意图的冲突是什么?

已添加:

如果您希望 Watson Assistant "know" 关于上下文,您可以提取当前意图并将其作为主题存储在上下文变量中。然后,如果检测到 "join" 意图,则切换到基于意图 "join" 和特定主题的对话节点。为此,我建议对 "join program" 只有一个意图,或者如果确实需要,将有关细节的详细信息放入意图中。可能没有太大区别,您最终只有一个意图。

您无法编辑 intents 对象,因此这会使您想做的事情变得棘手,但并非不可能。

在您的答案节点中,添加一个上下文变量,例如 $topic。你用一个表示主题的术语来填充它。

然后,如果用户的问题没有得到回答,您可以检查主题上下文并将其添加到新的上下文变量中。这个新变量然后被应用层拾取以重新提出问题。

示例:

User: tell me about the loyalty program
WA-> Found #Loyality-Define
     Set $topic to "loyalty"
     Return answer. 

User: how to join
 WA-> No intent found. 
      $topic is not blank. 
      Set $reask to "$topic !! how to join"
APP-> $reask is set. 
      Ask question "loyalty !! how to join"
      Clear $reask and $topic
 WA-> Found #Loyalty-join
      $topic set to "loyalty"
      Return answer

现在在最后一种情况下,如果即使没有找到已加载的问题,清除 $topic 也会停止循环。

另一件需要注意的事情是,如果用户更改主题,您必须设置或清除主题。为了防止它选择旧主题。

注意:问题已更改,因此从技术上讲这是一个不同的问题。在下面留下以前的答案


您可以使用intents[] 对象来分析返回的结果。

因此您可以检查第一个意图和第二个意图之间的置信度差异。如果它们落在一定范围内,那么你就可以采取行动。

示例条件:

intents[0] > 0.24 && intents.[1] - intents[0] > 0.05

这会检查两个意图是否在彼此的 5% 以内。 0.24 的阈值是忽略第二个意图,因为它可能会低于 0.2,这通常意味着不应对该意图采取行动。

你可能想玩玩这个门槛。

只是为了解释你为什么这样做。看看这两个图表。第一个很明显只问了一个问题。第二张图表显示这两个意图非常接近。


要采取实际行动,最好有一个关闭的文件夹(条件=false)。在该文件夹中,您查找匹配 intents[1]。这将降低对话框中的复杂性。


如果你想要更复杂的东西,你可以在应用层做k-means。然后在应用层传回第二个意图,让对话逻辑采取行动。有一个example here

Watson Assistant Plus 还使用消歧功能自动执行此操作。