参照百度大脑的项目经验训练我们自己的模型,研发我们的自然语言理解平台。
【提升篇】酒店语音助手实例教程
1 UNIT2.0基本概念
https://ai.baidu.com/docs#/UNIT-v2-intro/top
2 训练智能对话技能的总体流程
总共分为3个阶段,需求分析并做好前期准备工作→通过UNIT创建最小可用技能模型→持续优化技能模型,具体如下:
(1)第1阶段:需求分析。当前阶段需要有熟悉业务的人员参加,例如:产品经理、业务负责人等。先分析业务,明确业务中哪里需要通过和用户的对话来完成;再确认相关对话逻辑。最后基于之前的分析,从之前沉淀的数据中提取有价值信息,用于后续技能创建与训练;如果是新业务或之前没有准备,也先不用着急,我们可以先完成其他部分,但综合来看,业务中的真实数据是训练技能时最理想的“知识”。
(2)第2阶段,创建&训练技能。当前阶段就是要赋予技能模型对话能力了。赋予技能模型对话能力和教小朋友说话一样,要先确认教他的知识点,而这些知识点就是技能的意图。基本定义灌输完成后,就需要通过大量的练习题来帮助技能模型理解、巩固与记忆。最后,可以通过考试,来检测技能模型的学习成果。当考试合格后,就可以用于实战了,即接入咱们的业务中(API、SDK等)。
(3)第3阶段,持续优化。因着业务程度复杂、用户画像变化等因素,技能之前掌握的只是知识可能不足以应对新市场,这时我们需要通过更多的“练习”与“考试”来帮助技能提高能力。目前技能还无法完全自主学习并提高自己,还需要训练人员辅助。
本文将基于酒店服务这一场景,通过搭建酒店智能语音助手技能(下简称酒店助手技能)来讲解整个流程。
3 需求分析
需求分析是训练智能对话技能举足轻重的一步,需要基于自身业务场景进行深入透彻的思考,从而明确整个对话技能的架构,后续的技能创建与训练工作全部在此架构的基础上展开。这一步在训练智能对话技能时很容易被忽视,但草率分析需求即着手训练的技能往往后续需要投入更多的时间和精力进行调整,甚至需要推翻重来;
3.1 业务场景分析:确定边界,明确目标
3.1.1 挖掘需求,确定边界
首先是对业务场景进行分析,在酒店服务这一场景下存在很多酒店助手“可以做”的业务,我们应当从用户需求和用户体验入手,思考在该场景下用户的刚需,以及如何通过引入对话交互来大幅提升用户体验,从而在大范围的“可以做”的业务中找到其中“必须做”和“应该做”的业务。
在酒店服务这一场景下,用户主要的活动空间是在酒店房间内,因此酒店助手的首要目标为尽可能优化用户在酒店房间内的体验,像联系前台、呼叫客房服务这些都是需要优先满足的需求;而设置日程提醒、控制房间内的家电,这些功能通过语音交互来实现可以使用户进一步感受到智能化酒店的舒适和创新;意见反馈有助于收集用户的反馈以不断优化酒店的服务,通过酒店助手的对话来完成可以获得比纸质调查表更高的反馈率。
而关于酒店的常见问题的咨询,也是酒店助手应当实现的功能之一:一方面这些问题对于新入住的顾客而言是切实需要获得解答的,另一方面直接通过对话方式获得问题的解答比传统的从宣传单中查找或是致电询问前台都更加简单便捷。
对于一些超出酒店基本服务以外的拓展服务,如新闻播报、城市导览等功能,可以对用户体验起到一定的提升,但并非强需求,同时需要对接大量的资源库;而我们的目标是首先搭建最小可用技能,因此这部分功能可以先不去开发或低优先级开发。
3.1.2 明确目标,确定任务类型
在确定了业务场景的边界之后,我们就需要明确这些功能的目标,从而确定任务的类型,不同的任务类型对应着不同的配置方式;首先我们来了解一下任务类型的分类:
可以看出,任务类型区分的关键在于任务目标的有无以及是否需要把请求参数化;了解了这一点后,我们不难将之前梳理的功能进行分类:
3.2 功能定义:确定优先级及关键信息要素
在确定边界和目标后,我们就可以动手对功能进行定义了,在这一阶段,我们需要确定各功能的优先级,并确定每个功能的实体要素。
3.2.1 优先级的确定
首先是优先级的确定,其实在确定边界的过程中,我们已经对功能的重要程度和实现难度进行了分析,在此基础上不难确定出功能的优先级:
3.2.2 关键信息要素的分析
任务型的对话需要将请求参数化,相应的我们就需要分析要完成每个对话都需要将哪些实体要素参数化,而这些实体要素所对应的正是技能的对话意图及其词槽。我们以酒店房间内场景下P0优先级的功能为例进行分析,可以梳理出如下的关键信息要素:
可以发现标红部分因为其关键信息要素的重合而产生了意图的合并,具体如何处理相似功能间意图的拆解与合并,我们在下节对话逻辑梳理中展开讲解。
3.3 对话逻辑梳理:任务型对话的常规与异常情况、问答型的知识分类
3.3.1 任务型对话的意图梳理
任务型对话因具有将请求参数化的这一特点,在配置到对话意图时需整体考虑该场景下的相似任务和相关任务,在这一阶段将对话任务与意图间的映射关系梳理清晰,可以在后续的配置中达到事半功倍的效果。
以上节中进行了关键信息要素分析的功能为例,在物品需求类型的功能间和智能家电的开关控制中出现了功能的关键信息要素重合的情况,下面我们分别针对这两类功能进行分析:
1. 物品需求类型功能
在实际的酒店场景中顾客可能产生远比本文列出的示例更多的物品需求,在物品需求与意图之间建立一一映射关系不仅会浪费大量的人力,而且存在拓展性差、不同意图间的query相似性强相互干扰影响效果的缺点。因此我们采取合并意图、通过词槽来区分具体物品的方式,这种方式前期工作量小,后期拓展性强(只需调整词槽词典即可增删物品)。但也不可不管三七二十一将所有物品需求合并为同一意图,需要从实际场景出发进行合理的意图合并与区分。
2. 家电控制类型功能
家电控制类型的功能在意图的梳理上与物品需求类型的功能基本相同,在上节的梳理中考虑方便未来的拓展,把只有开关指令的设备汇总到一个意图中。
注意:本例中假设灯具只有开关两种指令,若存在更复杂的指令如(柔和模式、工作模式……),则需单独设立意图不可合并。
3.3.2 问答型对话的意图梳理
问答型对话没有需要参数化的内容,往往具有固定的标准答案;这类型的对话逻辑梳理其实就是要对问题进行分类,或者叫知识分类。比如酒店的问题咨询可以如下分类:
3.4 场景数据收集:在真实场景下用户会怎么问?
人工智能实现语义理解的过程,和教牙牙学语的小朋友讲话的过程是相似的:最初他只能懂你教他的一模一样的内容(训练数据量少时泛化能力差),等到教的内容多了之后就可以理解这个意思的不同表达方式(基于大量的训练数据产生泛化能力)。
因此我们在收集场景数据时,需要尽可能贴近真实场景下用户的表达方式,最好是从实际业务场景中沉淀下来的真实数据,全面覆盖用户在该场景下可能出现的表达方式。关于这些数据收集的技巧在《UNIT 使用技巧与持续优化 https://pan.baidu.com/s/1gyQXvExLka5yjdZr3tUziA 》中有详细的介绍,可参考该教程进行数据的收集。
4 搭建技能模型
-———可拷贝或选择下面红色的文字 在UNIT里一步一步配置出酒店助手技能———-
注册百度账号,打开http://unit.baidu.com ,进入UNIT:
4.1 新建技能
在UNIT平台搭建对话机器人的第一步是先创建一个技能,只需要输入一个技能名称,非常简单。
技能名称:酒店助手
4.2 自定义技能:新建对话/问答意图
创建完后就进入技能定义的阶段,技能又分自定义技能和预置技能,每个技能都是由多个相关的意图组成,这个阶段的新建意图就对应我们需求分析阶段的功能定义。以需确认数量物品这一功能为例,可以如下转化为意图:
下面展开讲解具体操作步骤:
4.2.1 新建对话意图
点击【酒店助手】技能,进入技能模块,在自定义技能中【新建对话意图】:
意图名称:ITEM\_NUM\_NEEDED
意图别名:需确认数量物品
4.2.2 添加词槽
添加两个词槽:
1、词槽名:user\_item\_numneeded,别名:需确认数量物品类型,词典:自定义词典——上传自定义词典文件,必填
第一步是选择【添加方式】,选 「新建自定义词槽」,并设置词槽名(user\_item\_numneeded)和词槽别名(需确认数量物品类型),
第二步【上传自定义词典】
- UNIT平台中词槽的识别依赖词槽对应的词典。支持自定义词典,也可以选择系统预置词典,我们建议在能选择系统词典的情况下尽量选择使用系统词典(详见:http://ai.baidu.com/forum/topic/show/869949 ),当系统词典里没有你需要的类型时可以添加自定义词典。
- 本例中我们希望通过这一词槽来匹配酒店中顾客需要确认数量的物品需求,需要根据自身需求来添加自定义词典,词典文件格式参考demo下载,这里不做展开介绍。
词典值:
毛巾
牙刷
水
矿泉水
纯净水
浴巾
香皂
第三步设置词槽与意图关联属性,在该意图中的物品类型是必须的关键信息,所以我们选择必填。澄清话术就是当用户表达订票需求的语句里缺少出发时间时技能主动让用户澄清的话术。还可以设置让用户澄清多少轮后放弃要求澄清,默认是3次。
2、配置物品数量词槽的流程与上面的步骤基本相同,在选择词典时需打开【系统词槽词典】的开关,然后选择系统词典sys\_generic\_unit (更丰富的数字+单位,如:一块两毛、三桶、两摞、3千克/立方米)
词槽名:user\_item\_num,别名:物品数量,词典:系统词典——sys\_generic\_unit (更丰富的数字+单位,如:一块两毛、三桶、两摞、3千克/立方米),必填
添加完所有词槽后如下图:
在词槽列表中可以调整词槽澄清的顺序。
4.2.3 设置对话回应
对话回应就是当对话识别出用户的意图和所有必填词槽值 时给用户的反馈。
有三种回应方式:【答复】、【引导至对话意图】、【引导至问答意图】
这里我们以【答复】为例,设置答复文本内容为:"好的,马上为您送到"
设置完成后最终保存意图
注意点:实际落地的时候这里其实需要你在自己的业务代码里判断当前技能解析的用户意图为需确认数量物品,且用户提供了物品重量、物品数量,这时将这两个词槽值传递到自己的业务管理系统通知到相应服务人员。
引导至对话意图:是当前对话满足一定条件时把当前意图到另一个对话意图,让用户进入另一个意图的对话中。
引导至问答意图:是当前对话满足一定条件时把当前意图到另一个问答意图,让用户直接在目标问答意图下提问并获取答案。
4.2.4 新建问答意图
针对前期分析问答型对话的退票问题 定义一个问答意图 FAQ\_PARK,意图别名:停车场相关问题
4.3 添加训练数据
完成技能的意图定义后,我们进入创建和训练技能的最重要的第二个环节,给技能添加训练数据,这个阶段用到的正是我们之前收集的真实场景下的数据,在其基础上进行总结和分类,给技能提供1到3种学习数据,让其学习我们定义的技能。
在训练数据的选择上,我们应当根据自身场景中的对话类型和数据收集情况来进行选择:
- 假如你的场景是任务型的又缺少对话样本,这时你就可以先去配置对话模板,快速达到一定效果后再从日志中筛选更多的对话样本;
- 假如你一开始就有对话样本,这时你可以对话模板、对话样本一起上,这样可以快速达到一个更好的效果;
- 而如果你还有问答行的对话时,只要添加问答对就可以了,简单易上手。
4.3.1 配置对话模板
对话模板是基于用户的表达方式归纳出的匹配规则,归纳得当的对话模板配置起来简单快速,可以识别多种表达方式,适合短时间内使技能达到可用的对话效果。同时对话模板的优先级高于对话样本,可用于对对话样本训练结果的优化。
在开始配置对话模板之前,我们来明确几个概念:
- 特征词:特征词通常是具有一类特征的词,可用于在对话模板中匹配这一类词。举例:对于“缝补衣服”意图,用户可能会说“我想缝衣服”、“我想补衣服”、“找谁缝补衣服”,那么对应的模板中,可以设置表示缝补的特征词:缝衣服、补衣服、缝补衣服……这些词不需要作为词槽被提取出来提供给业务,仅用于约束模板的匹配,因此使用特征词而非词槽。
- 口语化词:口语化词将在语义解析时会被自动忽略掉,以此来提高解析的精准率。比如通用场景下:嗯我看一下明天的天气吧 —> 明天天气,这里把”嗯、我、看一下、的、吧”等口语化词都去掉了。又比如特定场景里:预定如家酒店 —> 预订如家,在定酒店的场景里省略了 “酒店”, 可以将“酒店”配置为口语化的词。
- 模板片段:UNIT2.0的对话模板提供了一种非常强大的用法——模板片段。多个模板片段组成一个对话模板,每个模板片段都可以由词槽、特征词、特定文本单独或组合而成,而且多个模板片段可以是无序的,也可以是有序的。顺序设为0就表示这个模板片段可以出现在用户query中的任意位置。而非0的,必须按照数字顺序在query中出现。此外还可以设置一个模板片段是否必须在用户query中出现。
阈值:它是说当前模板配置的词槽、特征词占用户query的长度比例,当只有这个比例达到这个阈值的时候,我们才会判定用户的query就是这个模板所表示的意图。
理解了这些概念后,我们就可以从真实场景的数据中提炼相应的对话模板了。以需确认数量物品这一意图为例:
我们首先来定义代表对物品的需求的特征词:
在页面较下方找到特征词列表,点击新建特征词,填写下列内容,点击确定保存该特征词:
kw_item_want,描述:物品需求
词典值:
我想要
我要
给我拿
给我送一下
给我
送
要
完成新建我们所需的特征词后,点击添加对话模板来进行配置:
在选择必须匹配这一项时,因为在用户提到的物品类型为需确认数量物品类型时,我们才会定位到需确认数量物品意图,因此将user\_item\_numneeded词槽这一模板片段设置为必须匹配,而其余两个模板片段设置为非必须匹配,来保证模板的泛化能力。
目前我们只配置了一条对话模板,当我们有多个对话模板时,它们之间是有优先级的,在对话模板列表的上面的优先级要高于下面的,可以选中一条对话模板,然后执行上移、下移的操作来调整优先级。
关于对话模板的更多技巧说明可 下载文档进一步学习了解:https://pan.baidu.com/s/1j6cx9HPuRav1tvOToW2mEA
4.3.2 标注对话样本
对话样本是技能通过对海量标注数据的深度学习,获得“理解”相应场景下的对话的能力。这部分我们要把需求分析最后一个阶段收集到的对话数据导入UNIT平台,然后给他们逐条标注意图、词槽。这部分数据可以用于后续的样本学习,让对话机器人获得更好的对话理解泛化能力。
注意机器学习一般对训练样本有数量的要求,几条几十条数据很难训练出令人满意的泛化理解能力,在实际配置时需要海量样本的标注。标注方式参考产品手册,这里不做示例。
4.3.3 添加问答对
在创建问答意图FAQ\_PARK时,系统已自动创建相应的问答集FAQ\_PARK,我们可在其中添加问答对。问答对有直接在页面上录入和导入问答对数据文件两种方式,本文示例在页面上录入问答对的方式:
点击添加问题,录入问题文本后,再点击添加答案,录入问题的对应答案;问题与答案之间支持多对多的对应关系;
问题:
停车场在哪
车往哪停
查询停车场位置
哪里有停车场
答案:
停车场的位置在酒店地下一至三层,您可通过……进入停车场
点击保存,保存该问答对。
4.5 训练模型
训练技能有两种方式,一种是只训练我们上面配置的对话模板,另外一种是 训练对话样本同时训练对话模板
系统默认必须训练对话模板,不论你有没有标注对话模板。如果这时如上图你在对话样本集里使用了默认选项『使用沙盒中的模型』,直接训练模型并生效到沙盒,会需要15~30秒的时间。(首次训练只能选择『使用沙盒中的模型』)
如果如上图在对话样本集选项中选择了『重新选择样本』且选中了有标注样本的样本集,则对应后端的训练讲采用深度机器学习的策略进行样本的训练学习,同时也会把标注的模板也融合进来一起训练。这时训练的速度会与标注的对话样本量成正比。这里需要注意的是一定要选择系统自带的「闲聊负例样本」,这样可以降低技能的误召回情况,就是告诉技能哪些query是闲聊而不是我们设置的意图。
4.6 测试体验
完成模型的训练后,就可以在测试窗口测试一下对话,看看对话效果是否符合预期了:
本入门教程到此结束