本文是全系列中第4 / 8篇:聊天机器人
聊天机器人的类别根据其应用场景和实现方式的不同可以有多种方式的划分,在本文中,我们根据聊天机器人对话场景的特点将其划分为两类:封闭域(Closed Domain)聊天机器人和开放域(Open Domain)聊天机器人。
-
封闭域(Closed Domain)聊天机器人
封闭域聊天机器人主要针对于特定的任务,例如客服机器人、订餐机器人等。在我们提供的体验版聊天机器人“磐小妹”中,其具有的诸如“天气查询”、“听音乐”、“美食推荐”等功能均属于封闭域的聊天,即对话的内容限定于某一特定的场景。封闭域聊天机器人的实现方式主要是基于规则,根据对话的场景,由我们人为的去定义好这些规则。
-
开放域(Open Domain)聊天机器人
开放域聊天机器人主要指闲聊类机器人,这一类机器人不针对特定的任务,聊天的话题也是开放式的,例如微软小冰(为了提升聊天机器人的体验效果,往往在开放域的聊天机器人中我们也会加入一些封闭域的聊天功能,即使用规则去提升对话效果)。这类聊天机器人的实现方式主要是基于生成式的模型,例如Sequence to Sequence模型。
图1 聊天机器人的类别
1. 意图识别、多轮对话和填槽
意图识别、多轮对话以及填槽是聊天机器人中的几个重要组成部分,ChatBot的一般流程如下:
图2 ChatBot的一般流程
1.1 意图识别
聊天机器人的对话过程中,机器人需要根据用户说话的意图进行相应回复或反馈。例如用户说“我想听歌”,则机器人应该播放音乐,或者询问用户的喜好后播放相应的音乐。这个过程中首先要做的就是意图识别。意图识别的常用方法主要有两种:
-
基于规则
最常用的意图识别的方式是基于规则,例如识别关键词、利用正则匹配等。这种方法工作量较大,需要针对每一个意图制定相应的规则,另外每个用户说话的习惯都不同,因此制定的规则往往很难覆盖到所有的情况,经常会出现意图没有被识别到的情况。但该方法的实现较为简单,当积累了足够的规则后,识别的准确率和效果也较好。如下是“磐小妹”代码中针对“听音乐”意图的部分规则:
// 正则匹配歌手
private String[] pattenStar = {
".*来一首.*的歌.*",
".*播放.*的歌.*",
".*我想听.*的歌.*",
".*我要听.*的歌.*",
".*唱首.*的歌.*",
".*唱一首.*的歌.*",
".*来一首.*的.*",
".*播放.*的.*",
".*我想听.*的.*",
".*我要听.*的.*",
".*唱首.*的.*",
".*唱一首.*的.*",
".*我还想听.*的.*",
".*我还要听.*的.*",
};
-
基于文本分类
基于文本分类的方法也可以用于意图识别,利用有标签的数据训练一个意图分类的模型,这种方法免去了制定规则的麻烦,数据量足够的话,即使不同用户的说话习惯不同也不会影响效果,但是数据的获取和打标也需要较大的工作量。
1.2 填槽和多轮对话
在聊天机器人中,“槽”用来将用户对话的内容转化为明确的指令。例如“天气查询”意图,我们针对这一意图设计一个槽:
这个“槽”由两个槽位“[时间]”和“[地点]”组成。当用户询问:“明天深圳的天气怎么样?”;意图识别为“天气查询”;进行填槽,提取出[时间]为“明天”,[地点]为“深圳”;填槽成功,利用“槽”的信息查询天气信息,并返回给用户。
在上面这个示例“槽”中,[时间]和[地点]是两个“槽位”。一个“槽”可以由一个或多个“槽位”组成。通常一个意图往往不只有一个“槽”,例如“听音乐”这个意图,该意图拥有多个“槽”:
例如,当用户说“我想听周杰伦的歌”、“我想听七里香”以及“我想听周杰伦的七里香”时,分别对应前面的三个“槽”。从这里可以看到,不同的“槽”是有优先级之分的。
多轮对话是围绕着填槽来进行的,例如用户询问“明天天气怎么样?”,首先意图识别为“天气查询”意图,接着我们提取关键信息进行填槽,这里我们只提取到了[时间]这个槽位信息,然而完整的槽还需要有[地点]这个槽位信息,根据图2的流程图所示,我们需要询问用户,来补全缺失的信息。
1.3 上下文管理
在多轮对话时,上下文信息的管理是一个重要部分。以如下对话为例:
用户:你好,帮我订一张明天去杭州的机票!
Bot:好的,您是要从哪出发呢?
用户:深圳!
在上面的对话例子中,当机器人发出询问后,用户回复了补充信息。但有些时候,用户不一定会回复补充信息,有时候是想修改上一条指令甚至直接跳转到另一个话题。例如:
用户:你好,帮我订一张明天去杭州的机票!
Bot:好的,您是要从哪出发呢?
用户:算了,帮我定后天的机票吧!(或者:明天杭州的天气怎么样?)
对于这种话题的突然切换以及槽位信息的更改是上下文管理模块需要处理好的。另外,用户在聊天的过程中会产生很多有用的信息,将这些有用信息合理的保存和利用对于提升聊天机器人的体验效果至关重要。例如,用户在之前的聊天中已经给出了自己的位置信息,那么用户在询问天气的时候,如果没有提取到[位置]信息,应该考虑从之前的对话内容中获取信息。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2019/08/25/3f6c4a8de6/