【NLP-ChatBot】能干活的聊天机器人-对话系统概述
我们之前介绍过,按照应用场景的不同,聊天机器人可以分为问答系统,对话系统以及闲聊机器人三类。今天我们就来详细讲一讲其中的对话系统。
作者&编辑 | 小Dream哥
1 什么是对话系统
通常来讲,对话系统会面向某一个任务,具备处理一些业务的能力。对话系统首先能够理解人类给出的信息,将其表示为一个内部状态,然后根据策略和对话状态选择一些动作,最后把动作转化为自然语言的表达形式。
例如,一个可以完成订票任务的对话系统,可以根据系统目前的所掌握的信息(目标城市),向用户询问还需要了解的信息(票的数目),来完成用户订票的需求。
如上图所示,对话系统一般由语音识别(ASR),自然语言理解(NLU),对话管理(DM),自然语言生成(NLG),语音合成(TTS)5个部分构成。各部分的功能如下:
1)语音识别(ASR)将原始的语音信号转换成文本信息;
2)自然语言理解(NLU)将识别出来的文本信息转换为机器可以理解的语义表示;
3)对话管理(DM)基于对话的状态判断系统应该采取什么动作,这里的动作可以理解为机器需要表达什么意思;
4)自然语言生成(NLG)将系统动作转变成自然语言文本;
5)语音合成(TTS)将自然语言文本变成语音输出给用户。
第一和第五部分不是必需的,我们后面会着重介绍二三部分,即NLU和DM部分。
2 自然语言理解NLU
自然语言理解(NLU)的目标是将文本信息转换为可被机器处理的语义表示。
因为同样的意思有很多种不同的表达方式,对机器而言,理解一句话里每个词的确切含义并不重要,重要的是理解这句话表达的意思,也就是意图识别。
NLU还有一个重要的任务就是槽位提取,例如,接受订外卖的机器人,需要提取用户所订的餐馆的名字和所订食物的名称。
举个例子,当用户说“我想订一份肯德基的外卖”。对话系统接受到这个输入之后,先进行意图识别,识别到用户的意图是定餐;然后再进行实体识别,识别到餐厅名字肯德基。因此,“我想订一份肯德基的外卖”可以转化为对话系统能处理的语义表示:{"intent":"订餐","entity":"肯德基"}
意图识别的本质其实就是一种文本匹配,主要由两种实现方法:语义匹配和文本分类。关于语义匹配和文本分类,笔者之前都有文章介绍,感兴趣的读者可以出门左转,再看一下:
槽位提取的本质其实就是命名实体识别,笔者曾经写过专门的系列文章介绍过,感兴趣的读者可以再看看:
3 对话管理DM
因为对话系统常常涉及多轮对话,因此需要对目前的对话状态进行管理,以决定系统下一步的动作和给用户的回应。本质上,对话管理实际上就是一个决策过程,系统在对话过程中不断根据当前状态决定下一步应该采取的最优动作(如:提供结果,询问特定限制条件,澄清或确认需求等),从而最有效的辅助用户完成信息或服务获取的任务。
DM的输入就是用户输入的语义表达(或者说是用户行为,是 NLU 的输出)和当前对话状态,输出就是下一步的系统行为和更新的对话状态。这是一个循环往复不断流转直至完成任务的过程。
对话管理是对话系统中最独特的部分,是个很庞大的工程,涉及的知识又多又杂,在这里挑重点做一个引导性的介绍。
总的来说,对话管理模块主要由以下功能:
1.对话状态维护
主要负责维护和更新对话状态,假设t时刻的对话状态为s_t,它依赖于前一时刻的状态 s_t-1,和前一时刻系统行为a_t-1,以及当前时刻对应的用户行为a_t ,即s_t= f(s_t-1,a_t-1, a_t)。
2.生成系统决策
根据当前的系统对话状态s_t,决定系统下一步的行为dialog act(da),即da_t =g(s_t)。
3.作为接口与后端/任务模型进行交互
4.生成有效的用户答复
对话管理的研究非常的多,其具体的实现方式,总结起来,大致分为三种:
1)基于规则的对话管理
总的来说,基于规则的对话管理就是把对话管理建模为有限状态机(Finite State Machine),把对话看做是在有限状态内跳转的过程,每个状态都有对应的动作和回复,如果能从开始节点顺利的流转到终止节点,任务就完成了。
DM每次有新的输入时,对话状态都根据输入进行跳转。跳转到下一个状态后,都会有对应的动作被执行。上图中展示了一个控制物体前后左右移动或停止的对话系统中的基于FSM的DM,大家可以清晰的看到各种状态的定义和状态间的跳转逻辑。基于FSM的DM,优点是简单易用,缺点是状态的定义以及每个状态下对应的动作都要靠人工设计,因此不适合复杂的场景。
这个方法有以下的特点:
1.人为定义对话流程
2.完全由系统主导,系统问,用户答
3.答非所问的情况直接忽略
4.建模简单,能清晰明了的把交互匹配到模型
5.难以扩展,很容易变得复杂
6.适用于简单任务,对简单信息获取很友好,难以处理
复杂的问题
7.缺少灵活性,表达能力有限,输入受限,对话结构和
流转路径受限
2)基于统计的对话管理
前面提到的方法是需要人工来制定规则和状态,然而人很难预测所有可能的场景,这种方法也并不能重用,换个任务就需要从头再来。这种情况下,强化学习的优势就凸显出来了,RL-Based DM能够对系统理解用户输入的不确定性进行建模,让算法来自己学习最好的行为序列。
简单来说,它将对话表示成一个部分可见的马尔可夫决策过程。所谓部分可见,是因为DM的输入是存在不确定性的,例如NLU的结果可能是错误的。因此,对话状态不再是特定的马尔可夫链中特定的状态,而是针对所有状态的概率分布。在每个状态下,系统执行某个动作都会有对应的回报(reward)。基于此,在每个对话状态下,选择下一步动作的策略即为选择期望回报最大的那个动作。
这个方法有以下的特点:
1)只需定义马尔可夫决策过程中的状态和动作,状态间的转移关系可以通过学习得到;
2)使用强化学习可以在线学习出最优的动作选择策略。
3)仍然需要人工定义状态,因此在不同的领域下该方法的通用性不强。
3)基于数据的对话管理
最后一种DM方法是基于神经网络的。它的基本思路是直接使用神经网络去学习动作选择的策略,即将NLU的输出等其他特征都作为神经网络的输入,将动作选择作为神经网络的输出,其中一个例子是rasa框架。
这样做的好处是,对话状态直接被神经网络的隐向量所表征,不再需要人工去显式的定义对话状态。当然这种方法的问题是需要大量的数据去训练神经网络,其实际的效果也还有待大规模应用的验证。
总结
对话系统的搭建是一个具有挑战的工作。由于用户对系统的期待高,对错误的容忍度很低。而自然语言的表达方式非常灵活多变,这对NLU的准确度和DM的灵活度都提出了非常大的挑战。
我们在知识星球实现了一个完整的对话系统,感兴趣的同学可以扫描下面的二维码了解。