首页 > 解决方案 > DialogFlow:在上下文冲突时控制意图识别

问题描述

我正在构建一个具有多个意图的 DialogFlow 代理,其中一些具有冲突的变量,并且我正在努力创建一个干净的对话流 - 特别是围绕在意图之间来回移动的区域。

例如,假设我支持提供有关天气和航班的信息,我为每个人建立了相应的意图。考虑以下对话框:

此时,我希望能够识别飞行意图,并获取“Rome”作为参数,以及之前保存的“today”参数。但是,我无法判断系统是否会识别航班或天气意图,因为这句话可能适用于两者 - 取决于上下文。

我设法通过为每个对话主题定义一个主要和 2 个上下文相关参数意图(即以航班作为输出上下文的航班、以航班作为输入和输出上下文的航班时间、以航班作为输入和输出的航班目的地)来获得所需的行为上下文,天气也一样),通过为每个上下文设置 1 的生命周期,并在另一个意图完成后在代码中恢复它 - 为了保留已经填充的插槽,并支持诸如“罗马”之类的短语”并理解它们是上下文相关的。我还考虑过动态更改意图优先级,但不确定是否可能。

话虽如此,感觉这是我应该从基础设施中开箱即用的东西。我指的是类似堆栈的意图优先级,因此最后一个未实现的意图上下文将获得最高优先级。大家有遇到过这样的问题吗?我是否缺少一些可以帮助我更自然地实现这种行为的关键功能?也许是一种干扰意图识别的方法?

标签: dialogflow-esgoogle-assistant-sdk

解决方案


我认为使您的方法绊倒的是对话不一定像堆栈一样,并且 Intent 在 Dialogflow 模型中没有“实现”。意图只匹配用户所说的内容,如果合适的话,可以根据上下文缩小范围。能够设置上下文可以让您确定如何处理用户响应的方向,但您仍然可以使用这些输入来确定用户响应的内容。

通常,我会保留一个带有参数的长寿命上下文,这些参数仅维护我想要保留的所有状态,从而使用户朝着他们的目标前进。每次用户说话时,我可能会根据较短的上下文和触发的实际 Intent 更新该状态。在大多数情况下,我避免使用后续意图,因为它们最终会成为重复的老鼠窝。


推荐阅读