这一章我们一起来看一下语音助手中多轮对话的实现方案。在目前的语音助手的多轮实现方案中,基本分为两大部分:rule_base(基于规则) 和 model_base(基于模型),从线上效果可控和快速开发的角度来看,大多数的多轮会话仍然是rule_base的,一般分为:基于有限状态自动机,或者基于对话剧本,此时可以在整个流程中的部分模块中利用model起到提高准召的效果,至于纯粹的model_base的多轮,目前还都是在学术界,在工业界中落地的很少。
基本概念:
1、封闭域的多轮会话
- 任务驱动的,主要目的为补全必要槽位,并根据槽位执行意图。
- 每次会话维护一个轮询状态,有明确的进入和退出状态。
1.1 轮询状态
封闭域的多轮对话可以利用有限状态自动机(FSM)来实现。当初步明确用户意图时,进入轮询状态,当必要槽位满足或者用户主动打断时,退出轮询。比如下面的例子:
U::帮我导航 # 识别到用户意图为导航,同时缺少必要槽位,进入轮询状态
A::你要去哪里呢? # 轮询状态中
U:北京 # 轮询状态中,用户回复问题
A:好的 # 必要槽位满足,退出轮询状态
当处在轮询状态时,BOT根据当前FSM的节点状态对用户进行询问,并根据用户的回答进行节点跳转,直至轮询状态结束。如下图:
由于封闭域多轮会话有明确的轮询状态,并且是助手主导的,所以一般可以认为用户的下一轮话术大概率是在回复当前助手的询问,此时可以选择直接判断并填充槽位信息,当然,如果想做的比较精细一些,就需要判断用户的回复是否是缺失的槽位,有以下两种情况:
U: 买张火车票 # 识别到用户意图,缺失地点和时间槽位
A: 你要去哪呢? # 进入轮询状态
U: 我想买明天出发的 # 用户答非所问,但是属于当前场景的槽位,此时需要能够把这个槽位填充到时间槽位中
A: 好的,那么你想去哪里呢? # 发现仍然缺失地点槽位,继续询问
U: 买张火车票 # 识别到用户意图
A: 你要去哪呢? # 进入轮询状态
U: 今天天气怎么样? # 用户答非所问,是其他可执行意图
A: 今天天气晴,气温。。 # 此时需要能够跳出,执行其他意图
U: 北京 # 用户回复上一个问题,这里属于打断恢复,需要能够接续上
上面两种情况是封闭域多轮中比较常见的问题,解决方案也比较简单,对于第一个问题,可以依赖NER识别用户回复中是否包含槽位对应的实体类型,对于第二个问题,可以利用场景分类或者意图模型来判别是否存在其他意图。
2、开放域多轮会话
区别于封闭域多轮有明确的轮询状态,开放域多轮会话一般指的是没有明确的轮询状态,需要基于语义理解来判断用户本轮话术是否与上文存在关联,一般分为三种类型:指代消解、省略补全、语义顺承。
比如下面的例子:
(指代消解)
U: 周杰伦是谁?
A: 周杰伦是.......
U: 我想听他的歌 # 需要理解为:我想听周杰伦的歌
(省略补全)
U: 今天天气怎么样?
A: 今天天气......
U:明天呢? # 需要理解为:明天天气怎么样
(语义顺承)
U: 定一个明天上午8点的闹钟
A: 好的,已经帮你设定了
U: 取消闹钟 # 需要理解为:取消刚才设定的明天上午8点的闹钟。
这里说一下省略补全和语义顺承的区别,省略补全一般是指如果单纯的看当前这一轮对话,并不能确定其意图是什么,需要结合上文才能够确定具体意图。 而语义顺承是指当前这一轮具有明确的意图,只是槽位缺失,需要结合上文来判断是否存在可以顺承的槽位信息。
除了上面的三种类型的多轮外,还有另外两种情况,不过其在线上出现的比较少,所以我们目前也是没有实现的,下面简单介绍下:
(动作纠正)用户本轮话术是对其上一轮话术的纠正
U: 打电话给小红
U: 彩虹的虹 # 此时需要能够理解为: 打电话给小虹
(实体消歧)本轮话术中的实体存在歧义,需要结合上文进行消歧
U: 三星的手机怎么样?
U: 我还是更喜欢苹果
2.1、上下文/语境
这里说的上下文并不一定是时序上与当前话术最接近的,而是语义层面与当前关联的关联意图,比如刚才提到的打断恢复的例子。
同时上文也不局限与历史对话信息,主要可以分为以下几类:
- 对话上下文:
- 用户当前话术与用户上文话术构成上下文, 比如前面列举的都是这样的例子
- 用户当前话术与上文助手的回复构成上下文,比如下面的例子:
U: 世界之窗在哪里?
A: 世界之窗在深圳。
U: 买一张去那的机票。 # 需要理解为:买一张去深圳的机票。
- 设备上下文:指用户当前话术与用户当前设备状态有关,比如下面的例子:
# 用户当前正使用QQ音乐播放王菲唱的《红豆》
U: 换成方大同的。 # 此时需要能够理解为:换成方大同唱的《红豆》
2.2 槽位对齐
在理解本轮话术和上文话术的语义联系后,需要将上下文关联的信息提取出来并补充到本轮的意图中,一般分为以下两种:
- 槽位继承
U: 明天天气怎么样
U: 北京天气呢? # 北京明天天气怎么样?
- 意图继承
U: 今天天气怎么样
U: 明天呢? # 明天天气怎么样?
这一章就先讲到这里,下一章我们再来一起看下开放域多轮中的语义顺承、省略补全、指代消解的具体实现流程和细节。