【问题标题】:IBM Watson Assistant: How to train the chatbot to pick the right intent?IBM Watson Assistant:如何训练聊天机器人选择正确的意图?
【发布时间】:2019-03-08 06:48:37
【问题描述】:

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

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

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

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

因此用户可以通过“告诉我有关忠诚度计划”之类的话语来开始对话。然后他们会问“如何加入”(假设机器人知道该程序,但不提及该程序)。在这种情况下,Watson 将识别 2 个意图(Loyalty-Join、Saving-Join),而 Saving-Join 意图可能具有更高的置信度。

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

我找不到在对话中编写代码来检查上下文和修改意图数组的方法,所以我想询问最佳实践。

【问题讨论】:

    标签: ibm-cloud ibm-watson watson-conversation


    【解决方案1】:

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

    在您的答案节点中,添加一个上下文变量,例如 $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 还通过消歧功能自动执行此操作。

    【讨论】:

    • 感谢@simon 的详细回复。我用一个例子更新了我的问题以澄清我的问题。
    • 我已经更新了答案。但是为了将来参考,如果您将问题更改得足够多,以至于不再是同一个问题,那么请创建一个新问题。方便其他人日后查找。
    【解决方案2】:

    您可以train Watson Assistant进行相应回复。在您使用该技能的工具中,单击导航栏中的“用户对话”页面。在消息概述中,您需要识别那些被错误回答的内容,然后指定正确的意图。 Watson Assistant 会接受它,重新训练,然后希望能正确回答。

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

    添加:

    如果您希望 Watson Assistant “了解”上下文,您可以提取当前意图并将其作为主题存储在上下文变量中。然后,如果检测到“加入”意图,则根据“加入”意图和特定主题切换到对话节点。为此,我建议要么只有一个“加入计划”的意图,要么如果真的需要,将有关细节的细节放入意图中。可能没有太大区别,您最终只有一个意图。

    【讨论】:

    • 感谢@data_henrik 的回复。有时培训无法解决问题,因为用户可以提出只能在特定上下文中回答的通用问题。我用一个例子更新了这个问题,以获得更多说明
    • 添加了更多内容
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2019-02-22
    • 2019-01-13
    • 2019-12-03
    • 2019-02-24
    • 2019-11-21
    相关资源
    最近更新 更多