目录
Automatic Speech Recognition (ASR)
Natural Language Understanding (NLU)
Natural Language Generation (NLG)
一、基本概念
对话系统:与真人进行对话的系统。
这里首先用案例介绍一下对话系统的基本概念,然后重点介绍任务型对话系统的。
这里举一个小例子,结合一起来理解对话系统的相关概念。
用户 (User):指产品或服务的使用者。
对话代理人 (Agent):对话代理人既可以是真人,如客服人员、客户支持代表,也可以是虚拟人,如机器人。在对话系统内部,因其设计目的不同,既可用于解决单领域 (single-domain) 问题,也可用于解决多领域 (multi-domain) 问题。
发言 (Utterance):在对话中,对话代理人与用户任何一方说出的任意一句话。
对话轮次(Turns):一来一回合称一轮turn,来回多次称为多轮对话。
会话(Session):由一个用户发起的某次多轮对话。会话是对话代理人与用户之间发生的一次连续对话,不同对话系统可以有自己对「连续」的定义。
对接渠道 (Channel):对话代理人本身只负责对话逻辑,并不包含对接渠道(对话载体),如钉钉、美洽、飞书、Slack 等等。
意图 (Intent):意图是系统能够识别的最小的用户目的,是系统决策的基本元素之一。只有在识别用户发言背后的含义后,机器人才能决定回复什么。剧本中的每一章节由用户意图的识别和机器人采用的回答构成。从发言的角度出发,意图约等价于发言中的动词。如「下周我要飞去上海」中的「飞」就是意图。
实体/槽值/槽位填充物 (Entity/Slot value/Slot filler):实体和领域息息相关,如票据这样的实体几乎不会出现在点餐机器人系统中;有些实体则比较通用,比如时间、地点、数字等等。和领域相关的实体需要单独定义,通用实体则可以由平台统一支持。
槽位 (Slot):盛放实体/槽值信息的容器为槽位,信息本身为槽位填充物 (slot filler)。想象填写一张表格,表中的每个空就是槽位,填写的内容就是槽位填充物。 槽位和实体的区别是什么? 实体指的是从单句发言中提取到的信息,而槽位存储整个会话过程中提取到的所有信息,前者是后者的数据来源,槽位存储的信息会被用于后续对话系统决策的过程中。
动作 (Action):理解用户的意图后,对话代理人除了回复消息外,可能需要帮助用户去做一些动作,比如:修改日程、注销账号等。不同领域的对话代理人需要执行的动作不同,需要定制化开发。在设计中,机器人回复消息通常也会被认为是一种动作。
二、对话系统的应用场景
问答 | 助手 | 聊天 |
常见于智能客服系统,问题和答案都比较固定,背后常常与知识库挂钩。 | 助手场景常见于智能设备上的语音助手,如 Siri 等,它的问题和答案相对固定,背后也可能与知识库挂钩。同时,助手需要和许多三方服务对接,以完成用户交付的任务,因此也常常被称为任务机器人 (task bot)。 | 聊天场景指的是像人一样与人交谈,市面上存在的系统有贤二机器僧、微软小冰等。理论上,聊天不存在固定内容,天南海北都可以侃。著名的图灵测试就是用于验证机器是否可以让人无法分辨他是在和人聊天还是在和机器聊天。 |
三、对话系统的常见构建方式
基于规则的对话系统 | 基于语料的对话系统 | 混合型对话系统 | |
结构 |
| 准备大量真实环境的对话数据,根据这些数据训练出对话模型再投入使用。 基于信息检索的模型只能生成训练数据中已知的回答,相比基于规则的模型,它不需要逐条地维护规则,而是将规则通过穷举的方式沉淀在数据集中。 | 将基于规则和基于语料的方案融合。 |
优点 | 1. 开发速度快、成本低、易集成 | 1. 系统维护成本低,训练完后无需其它维护成本 | 1. 规则和语料训练的模型可以互补: |
缺点 | 1. 维护成本高,需要人工维护规则和优先级,复杂度高了以后难以管理 | 1. 开发周期长、成本高、需要大量训练数据 | 1. 规则和语料训练的模型冲突的情况可能影响会话 |
四、一般架构
对话系统的一般架构图如下所示:
Automatic Speech Recognition (ASR)
ASR 模块负责将用户输入的音频转化为文本,得到用户发言的文本。这个模块既可以采用通用型 ASR 服务,也可以在领域内通过迁移学习定制化开发。ASR 的识别准确度将对后续所有模块的处理产生深远的影响,就好比在传话游戏中,越靠前的表述错误会被放得越大。
⚠️ 如果对话系统仅需支持文本对话则无需 ASR 模块,因此在架构图中用虚线表示
Natural Language Understanding (NLU)
NLU 模块负责从用户的发言中解析出对话中包含的关键信息,如领域、意图、实体等等。在早期的对话系统中,主要依靠基于规则匹配的方式提取信息,而现代对话系统则主要采用统计机器学习模型,基于大量语料训练得到。用于领域、意图识别和实体提取的模型通常会共享文本特征,在预测模块中区分。当然,也存在混合解决方案的 NLU,如同时支持基于规则和基于语料的实体提取。
NLU 模块有时也会被用于从粗筛后的备选答案中做精筛,比如根据发言与语料中备选回复的特征距离来做出最终选择。
Dialogue Management (DM)
DM 模块负责管理当前对话的状态 (State) 和策略 (Policy),其中对话状态包括用户与对话代理人之间的历史聊天记录以及关键信息,策略是根据状态输出回复的函数。
Natural Language Generation (NLG)
当对话代理人做完决定后,需要把它想回复的内容转化成自然语言,这一步骤就由 NLG 模块负责完成。NLG 有两种方案:基于模板和基于统计。
基于模板
基于模板的生成方案中,对话代理人的所有发言都由对话设计师设计而成,然后将剧本中的上下文信息,如槽位填充物,填入模板。举例如下:
1 | const template = "What time do you want to leave %s" |
通常为了让回复不那么呆板,会为同一个回答预置多个模板,然后在回复时通过一些策略选取一个。
基于固定对话剧本来进行对话
基于统计
基于统计生成的目标就是在大量标注语料训练后,能够自动生成含义相同、表述不同的发言,如:
1 | 1. Au Midi is in Midtown and serves French food. |
基于统计的生成方案需要大量的训练数据,这些数据本身很难获取,难度体现在两方面:
- 在某领域的对话代理人上线之前,很难获得和生产环境相近的数据
- 以上面的句子为例,如果要训练一个点餐机器人,那么要找到包含所有饭店、地点和菜色组合的语料几乎不可能
因此有一种比较常用的技术叫 delexicalization,即将句子中的实体替换成实体类型,如:
在训练时使用实体类型,预测时将实体真实取值填入即可,后者被称为 relexicalize。