搭建对话系统是一个相对专业而复杂的过程,通常分三个主要的阶段。首先是需求分析,然后是使用平台搭建技能,***是持续优化。
需求分析
***阶段需求分析,这个阶段应该有产品经理或需求分析师这样的角色参与。
- 首先要分析业务场景;
- 然后进行对话机器人的功能定义;
- 接着要梳理业务场景里的对话逻辑;
- ***要收集场景里的对话数据。
下面以订火车票的场景来讲解整个流程要做哪些工作。
业务场景分析:确定边界,明确目标
首先进行业务场景的分析,确定一个场景下机器人应该做什么,不应该做什么。
火车票场景中,应该做订票、退票、改签、查询以及一些火车票相关的规章制度等常见问题解答。而毫无目标的闲聊是不应该做的。
功能定义:确定优先级及关键信息要素
在确定边界和目标后,就可以对火车票对话机器人的功能进行定义了。
在功能定义的阶段,要先确定各功能的优先级,并确定每个功能对应的实体要素。显而易见的,火车票这个场景,订票、退票、改签、查询都是***优的功能。
完成功能的定义后,接下来还需要对业务场景下的对话逻辑进行梳理,包括正常的对话逻辑和异常的对话逻辑。另外,关于问答型对话,其实都是用户对一些规则、规则制度的提问,这些问题都是标准、固定答案的。这类型的对话逻辑梳理其实就是要对问题进行分类,或者叫知识分类。
场景数据收集:在真实场景下用户会怎么问?
完成对话的逻辑梳理后,还要进行需求分析***一个环节的工作,即数据收集。
针对任务型的对话,要收集真实场景下用户买票的各种问法,越多越好。而对问答型的对话,要根据前面的知识分类去收集每个分类下的问题与答案,即问答对。
在这个阶段收集的数据将在后面技能搭建的第二个阶段使用。
搭建技能
注册百度账号,打开(http://unit.baidu.com),进入 UNIT:
1. 新建 技能
在 UNIT 平台搭建对话技能的***步是创建技能。
2. 定义自定义技能:新建对话 / 问答意图
创建完后就进入技能定义的阶段,技能又分自定义技能和预置技能
每个技能都是由多个相关的意图组成,这个阶段的新建意图就对应需求分析阶段的功能定义。比如订票功能就可以转化为订票意图 BOOK_TICKET,订票的关键信息可以定义为实现订票意图的词槽,这里简单一些,仅定义出发时间、出发站点、到达站点、车次四个词槽;分别命名为user_time、user_from、user_to、trainnumber。
具体操作步骤如下:
2.1 新建对话意图
点击【火车票】技能,进入技能模块,在自定义技能中【新建对话意图】:
2.2 添加词槽
***步是选择【添加方式】,选 「新建自定义词槽」,并设置词槽名(user_time)和词槽别名 (出发时间),
第二步先打开【系统词槽词典】的开关,然后选择系统词典 sys_time(时间)
- UNIT 平台中词槽的识别依赖词槽对应的词典。支持自定义词典,也可以选择系统预置词典,建议在能选择系统词典的情况下尽量选择使用系统词典,当系统词典里没有你需要的类型时可以添加自定义词典。
第三步设置词槽与意图关联属性,这里火车票的出发时间是订票里必须的关键信息,所以选择必填。澄清话术就是当用户表达订票需求的语句里缺少出发时间时 对话技能主动让用户澄清的话术。还可以设置让用户澄清多少轮后放弃要求澄清,默认是 3 次。
添加完所有词槽后如下图:
在词槽列表中可以调整词槽澄清的顺序。
2.3 设置答复
技能回应就是当技能识别出用户的意图和所有必填词槽值时给用户的反馈。
有三种回应方式:【答复】、【引导至对话意图】、【引导值问答意图】
2.4 新建问答意图
3. 添加训练数据
完成技能定义后,进入第二个环节,给技能添加训练数据,让模型能理解用户query的意图。
3.1 配置对话模板
首先是配置对话模板,对话模板是对用户需求表达的一种规则抽象,可以通过对模板片段的必填选填,前后顺序,阈值大小的配置,使其快速具备一定的泛化能力。
当我们有多个对话模板时,它们之间是有优先级的,在列表的位置越靠前,优先级越高,可以选中一条对话模板,然后执行上移、下移的操作来调整优先级。
3.2 标注对话样本
这部分要把需求分析***一个阶段收集到的对话数据添加到 UNIT 平台,然后给他们逐条标注意图、词槽。经过深度学习的策略训练后,让对话模型获得更好的对话理解能力,而且数据越丰富,模型的泛化效果越好。
然后在对话样本集中新建 『买火车票』样本集,将数据添加进去:
机器学习会随着数据的不断丰富,拥有越来越强的泛化能力,而当你很难收集到大量的对话样本时怎么办?UNIT 平台提供了推荐对话样本的工具,只需要你收集 50 条真实场景的对话样本后就可以用它作为种子样本来推荐类似的样本,种子样本质量越高,推荐的样本质量越好。
3.3 添加问答对
在需求分析阶段就收集整理的问答对数据在问答集中导入即可
并不是每个场景都必须添加上面的三种训练数据才可以进行对话,这要根据您自己场景中的对话类型和数据收集情况来定。
- 假如你的场景是任务型的又缺少对话样本,这时你就可以先去配置对话模板,快速达到一定效果后再从日志中筛选更多的对话样本;
- 假如你一开始就有对话样本,这时你可以对话模板、对话样本一起上,这样可以快速达到一个更好的效果;
- 而如果你还有问答行的对话时,只要添加问答对就可以了,这个最简单。
3.4 训练模型
训练技能有两种方式,一种是指训练上面配置的对话模板,另外一种是训练对话样本同时训练对话模板。
系统默认必须训练对话模板,不论你有没有标注对话模板。选择快速生效策略,训练模型并生效到沙盒,会需要 15~30 秒的时间。
也可以选择对话样本集,并使用深度训练策略,则对应后端的训练将采用深度学习的策略进行模型训练,这时训练的速度会与标注的对话样本量成正比。这里建议选择系统自带的「闲聊负例样本」,这样可以降低技能的误召回情况,就是告诉技能哪些 query 是闲聊而不是买票。
4. 测试体验
完成模型的训练后,就可以在测试窗口跟技能聊一聊,看看最终的效果了:
UNIT 使用技巧与持续优化
准确理解领域问题
- 任务型场景,该场景特点是有任务目标,需要把请求参数化,并且在多轮对话之间,参数还可以继承。
- 问答型场景,该场景特点是有任务目标,不需要把请求参数化
- 聊天型场景,该场景特点是没有任务目标
高效建设领域资源
高效建设词槽
首先看内置词槽与自定义词典、规则的关系
- 自定义词典、规则的优先级高于系统内置,但是系统词槽如果包含了自定义词,会按系统词槽识别。
- 自定义此点之间优先级相等,如果一个词属于多个词典,会相应的识别出多个词槽候选。因此,不必担心自定义词典之间的冲突与歧义,一切都有模板兜底。
- 规则的形式是正则表达式,要注意控制通配的范围,善用捕捉功能加以限制。不加约束的通配,是 badcase 的重要来源。
那么该如何定义词槽以及如何高效地扩充系统内没有包含的词槽呢?
扩展法:针对每个词槽 / 特征词至少产出 3-5 个实例,可进行基于资源的扩展(树形结构、结构化信息、开放分类),基于相关度的扩展(上下文相似度、Word embedding),基于语料的扩展(Set expansion 算法)。
挖掘法:可在垂直网站爬取词槽,或者在离线知识库 Dump。
当然,也可采取挖掘 + 扩展的方法,先挖掘出词槽,随后再进行扩展。另外,质检工作很重要,当挖掘的量很大时,可以选择使用众包。
自然语言理解配置对话模板配置技巧
- 关键词可以抽象上下文的表达方式
- 基于模板的意图推到,有队词槽进行消歧的能力
- 善用模板片段,增强模板泛化能力
- 模板的定义顺序决定了意图的解析顺序
对话样本配置技巧
- 关于数据量:100 可训;1000 可用
- 所有已标注样本都会进入 K-V 字典,K-V 字典保证样本一定会按标注的方式解析,当词槽识别出现不稳定时,注意看看样本
定期评估与优化
定期评估指定期随机业务日志,人工评估效果,其重点关注情况为以下几点:
- 意图解析失败 / 错误、词槽缺失
- 可能的原因:出现了之前没见过的说法,出现了当前不覆盖的词槽
- 应对方案:新增模板,标注样本,扩展词槽
- 词槽解析错误、归一化错误
- 可能的原因:系统词槽 badcase,用户词槽出现了歧义,用户词典覆盖了系统词槽
- 应对方案:向 UNIT 吐槽,调整词典 / 模板,少量 case 可以直接通过标注样本强制解决
- 存在新需求不能满足
- 应对方案:分析是否需要支持——是:新增技能;否:引导用户的功能预期。