Dialogflow将不相关的短语与现有意图进行匹配

时间:2018-03-29 16:22:15

标签: dialogflow

我创建了一个聊天机器人,通知用户我(扩展)家庭成员的姓名以及他们的生活地点。我已经创建了一个包含MySQL的小型数据库,其中存储了这些数据,并且只要这是合适的,我就会使用PHP脚本来获取它们,具体取决于用户与聊天机器人的交互。

出于这个原因,我已经为Default Fallback IntentDefault Welcome Intent创建了两个意图:

  • Names
  • Location_context

第一个意图('Names')是通过诸如“你叔叔的名字是什么?”这样的短语来训练的。并有一个输出上下文。第二个意图('Location_context')是通过以下短语进行训练的:“他住在哪里?','他在哪里?','在哪里?他找到了?' '他居住在哪个城市?'等,并有一个输入上下文(来自'Names')。

一般来说,这个基本的聊天机器人可以很好地满足它的需求。但是,我的问题是(在触发'Names'意图之后)如果你问一些荒谬的事情,例如“他在哪里下雪?”#39;然后聊天机器人将触发'Location_context'意图,聊天机器人将响应(如其定义)您的叔叔居住在纽约'。另外,请允许我提一下,由于我已经构建了聊天机器人,因此这种响应得分高于0.75,这是非常高的。

如何让我的聊天机器人在这些荒谬的问题中触发默认后备意图(甚至在更合理的问题中,例如'他在哪里吃?'然而这些问题与{无关紧要} {1}}意图)而不是触发'Location context'之类的意图,它只包含一些类似的关键字,例如单词'Location_context'

2 个答案:

答案 0 :(得分:3)

尝试在代理设置(ML CLASSIFICATION THRESHOLD)中使用Settings > ML Settings。默认情况下,它的分数非常低(0.2),这有点激进。

  

定义置信度分数的阈值。如果退回   如果值小于阈值,则回退意图将是   触发或,如果没有定义回退意图,没有意图   被触发。

您可以在JSON响应中查看查询的分数:

{
    "source": "agent",
    "resolvedQuery": "Which city does he live at?",
    "metadata": {
        "intentId": "...",
        "intentName": "Location_context"
    },
    "fulfillment": {
        "speech": "Your uncle is living in New York",
        "messages": [{
            "type": 0,
            "speech": "Your uncle is living in New York"
        }]
    },
    "score": 0.9
}

比较正确和错误比赛之间的得分,您将很好地了解哪个自信得分对您的代理人来说是正确的。

更改此设置后,让它训练,再试一次,然后进行调整直至满足您的需求。

<强>更新

对于仍会获得高分的查询,例如Where is he cooking?,您可以添加另一个意图自定义回退,以处理这些误报,可能使用自定义实体:{{ 1}},并在用户表达式中使用NonLocationActions(@)。

  • 他在哪里template mode
  • 他所在的城市@NonLocationActions:NonLocationActions

enter image description here

因此,这些查询将在新的自定义回退中获得1分,而不是在位置意图中获得0.7分。

答案 1 :(得分:1)

我正在使用dialogflow在聊天机器人上工作,并且遇到了类似的问题。

我们的测试经理发明了“香肠测试”,将问题中的某些单词替换为“香肠”一词,而我们的机器人则崩溃了!即使将阈值设置为0.8,我们仍然会经常遇到一些意想不到的句子引发问题的问题,并且借助提供产品安装建议的企业级聊天机器人,我们也无法承担错误的责任。

我们发现,在某些情况下,对于明显模糊的“香肠式”输入,我们获得了最高置信度(1)。

解决这个问题的方法是将所有答案都备份到API上,并将置信度得分与其他测试结合使用。例如,我们引入了正则表达式测试来检查问题中的关键字以及参数匹配(确保关键实体参数也在DialogFlow的数据中传递)。

最近,我们还开始在回复的开头添加低信度句子,即“我认为您是在询问XYZ,但如果不是,请重新说明您的问题。这是你的答案。当我们所有额外的测试都失败并且阈值在0.8到0.98之间时,我们就会执行此操作。