介绍
今天跟大家一起探讨一下聊天机器人如何使用知识图来解析从含糊不清的话语中提取的实体。
技术栈
- Rasa:快速构建聊天机器人
- TypeDB:作为知识图展示,使用国外开源知识资源
- 示例源码:https://gitee.com/stonelin/rasa_kg.git
问题陈述
假设您的任务是为一家电商构建一个聊天机器人,以提高他们的客户体验。这意味着机器人应该能够处理账单支付、常见客户查询、在线购买等业务。
比如,客户咨询:
我想买个iphone
很明显,用户的意图是购买苹果手机而非水果苹果,而“iPhone”一词就是手机的代名词。因此,解析这句话的意图和实体很简单。
现在,考虑以下语句:
iPhone
如果没有额外的上下文,很难弄清楚如何解释上述话语。
假设话语“iPhone”出现在以下上下文中:
显示用户想要提问。机器人的回应是要求用户澄清他们的问题是关于移动合同还是互联网合同(假设机器人只能处理这些类型的问题),并为用户提供几个按钮来表明他们的意图。
假设用户不确定他们拥有哪份合同:他们从公司获得了一部 iPhone,但不确定它是通过移动合同还是互联网合同购买的,因为……iPhone 是一种可以用来上网的移动设备互联网。
因此,用户没有点击任何一个按钮,而是决定输入“iPhone”,希望机器人足够聪明,能够找出正确的合同。
我们如何将这种“智能”构建到聊天机器人中?
意图和实体注释都不是可行的选择,因为话语只有一个词,缺少上下文,即没相关联的词,无法很好地进行意图分类或实体提取。
一个明显的解决方案是使意图分类和实体提取与上下文相关,例如,根据用户的话语和n
对话中的先前轮流来训练意图分类器和实体提取器。如果你使用的聊天机器人框架支持它,或者您愿意自己构建此功能所需的资源,那就好办了。
如果上市时间是一个关键因素,那么您需要尽可能多地利用现有解决方案。在这种情况下,构建一个特征来推理知识图谱是比较好的选择。
解决方案
概述
使用知识图帮助聊天机器人解决不明确的实体涉及 3 个步骤:
- 定义知识图谱
- 编写逻辑来解析实体
- 调用消歧逻辑
第 1 步:定义知识图谱
我们使用以下知识图来演示该解决方案的工作原理:
显示电信公司有 3 种类型的设备:智能手表、路由器、电话。它有两种类型的计划:移动和互联网。“合同”将计划与设备相关联。
以下是在我们试图解决的问题的背景下,我们可以对图 2 中的知识图进行的相关观察:
- 有一份合同,其中“三星”手机附带“just kids”移动计划。
- 有一份合同,其中“iPhone”手机附带“start unlimited”移动计划。
- 有一份合同,其中“链接区”路由器附带“最大互联网”互联网计划。
- 智能手表没有合同
- “一加”手机没有合同
因此,如果用户在被问及是否对移动或互联网合同有疑问时回答“iPhone”,则可以合理地假设他们指的是移动合同。同样,如果他们回答“链接区”,那么他们可能指的是互联网合同。
让我们看看如何实现这个逻辑。
第 2 步:编写解析实体的逻辑代码
Rasa 的自定义操作功能允许执行任意代码。因此,这是实现自定义实体解析逻辑的好地方。这是执行此操作的代码:
如果用户单击了图 1 中的任一按钮,则contract_type
插槽将填充正确的实体。这意味着我们无需执行任何操作即可退出自定义操作(第 58 行)。
如果用户没有点击任何一个按钮,并且他们的话语包含一个device
实体,例如“iPhone”、“带 iPhone 的那个”等,那么我们会找出设备计划的类型(第 61 行)并contract_type
相应地设置插槽。
这是找出设备计划的功能:
第 12-18 行是我们将发送到知识图的查询,以返回设备的计划。
如果查询返回一个计划,那么我们返回计划的类型(第 30 行)。否则,我们返回None
(第 28 行)。请注意,我们假设一台设备只有一种计划类型。
剩下的就是在对话期间调用此自定义操作。
第 3 步:调用消歧逻辑
这一步很简单:我们只需在用户表达偏好后插入对自定义操作的调用。
例如,如果我们使用以下规则实现图 1 中的对话:
然后,我们需要将其更改为:
图 6:图 5 的更新以支持实体解析
请注意,我们必须做的唯一更改是调用我们在图 3 中定义的自定义操作(第 35 行)。
演示
如果用户点击“移动合同”,将会发生以下情况:
如果用户点击“互联网合同”:
由于“iPhone”已连接到移动计划,因此当用户说出“iPhone”时,我们预计会出现与图 7 相同的结果。如果用户键入“链接区域”,则类似的推理适用:
由于“one plus”手机与任何计划无关,我们预计机器人无法理解用户的意图:
结论
尽管可以在没有知识图的情况下实现解析逻辑,但使用它的好处是可以将逻辑委托给外部专门服务。不再是应用程序的责任,即聊天机器人开发人员对其进行编码。这在可维护性、可扩展性和支持更复杂的解析逻辑方面具有巨大的好处。