【提升篇】UNIT2.0--火车票场景实例教程
tiancorn 发布于2018-07 浏览:65681 回复:81
30
收藏
最后编辑于2021-02

1 UNIT2.0基本概念
https://ai.baidu.com/docs#/UNIT-v2-intro/top

 

2 搭建对话技能的总体流程


总共分为3大阶段,1是需求分析,2是使用平台搭建最小可用的对话技能,3是持续的优化。第1阶段 需求分析,这个阶段应该有产品经理或需求分析师这样的角色参与,首先要分析业务场景,然后进行对话技能的功能定义,接着要梳理业务场景里的对话逻辑,最后要收集场景里的对话数据。

完成第1阶段后即可进入UNIT平台来搭建对话技能,首先要进行技能定义:定义意图和词槽,然后要针对这些意图提供训练数据,接着去训练模型,教会它我们定义的那些意图。最后就可以进行对话测试了。完成第二阶段后,我们就需要进入一个周期性的循环的 持续优化阶段,在这个阶段须要我们不停的对技能的对话理解效果进行评估,然后优化训练数据,当对话理解效果达到一定水平后,就可以把这个对话技能集成到产品中提供给用户使用了。在使用一段时间后可以收集到大量的用户对话日志和用户反馈,这时我们又可以进行优化。本文中主要介绍前两个阶段工作,帮助大家快速入门。第三个阶段的工作我们在单独的文章中做详细的介绍。

3 需求分析
下面以订火车票这样的场景来讲解整个流程,先说需求分析阶段要做的工作

3.1   业务场景分析:确定边界,明确目标


首先我们进行业务场景的分析,确定一个场景下应该做什么,不应该做什么。火车票这个场景,根据用户需求的轻重缓急判断,应该做 订票、退票、改签、查询以及一些火车票相关的一些规章制度的常见问题解答。为了用户体验也可以做一些简单的问候和查天气的一些功能。而毫无目标的闲聊是不应该做的。接下来我们还要看看 业务场景下的对话都是什么类型的?任务型的对话 都有明确的目标,这个目标其实就是用户的意图,同时也会有一些关键信息需要参数化,就是需要把满足用户意图的关键信息参数化为词槽。火车票场景下 订票、退票的对话都是任务型的。再说问答型,它也有明确的任务目标,但这类型的对话不需要把用户问话中的信息参数化,因为这类型的用户问题基本都是针对一些规则、规章制度的提问,都有固定、明确的答案,不需要再用词槽去做进一步判断处理。比如,退票怎么扣费。最后一种闲聊型的对话,其实就是随便的聊聊天,没有任何任务目标。如果把这类型的对话加入到对话机器人中 就会对任务型的对话理解造成一些干扰,影响任务目标的达成,所以不应该做。

3.2 功能定义:确定优先级及关键信息要素
那么在确定边界和目标后,我们就可以对火车票对话机器人的功能进行定义了。

在功能定义的阶段,我们要先确定各功能的优先级,并确定每个功能对应的实体要素。火车票这个场景,我们认为订票、退票、改签、查询都是最高优的功能。建议大家使用MVP原则 先完成一个最小化可行的产品,比如我们就先完成一个只有订票功能的对话机器人,那就要分析要完成订票 需要哪些实体要素, 出发时间、出发站点、到达站点这三个是必须的,还可能需要火车类型、车次、座位类型,同时要完成一个能真实落地的订火车票机器人,其实还需要你自己的业务系统完成个人信息、账户信息、票务状态的管理与业务逻辑的处理。UNIT平台将主要为你完成用户订票需求的精确理解。

完成功能的定义后,我们接下来还需要对业务场景下的对话逻辑进行梳理

3.3 对话逻辑梳理:任务型对话的常规与异常情况、问答型的知识分类


我们要先看订火车票的正常对话逻辑,一般都是用户提出订票需求,当缺少订票的必须信息时火车票技能应该像售票员一样,让你补充这些缺失的信息,补充完成后就可以根据订票的信息到火车票系统中查询到合适的车票让用户确定,用户确定支付后,就完成了订票的流程。

完成正常对话逻辑的梳理,我们还要看一些异常的对话逻辑。

比如,当火车票技能已经完成用户订票所有信息的收集并给出可订车票时 用户又突然提出要变更相关信息,比如把出发时间从周五中午换成周六早上,这时我们的火车票技能也要像真人售票员一样能理解这种需求的变更,并根据用户的最新信息查询出新的可订车票。

这样的对话逻辑梳理可以帮助我们后续更合理地定义技能。

完成任务型的对话逻辑梳理后,我们还要对看看问答型的对话逻辑

前面我们说问答型对话 其实都是用户对一些规则、规则制度的提问,这些问题都是标准、固定答案的。这类型的对话逻辑梳理其实就是要对问题进行分类,或者叫知识分类。比如我们把火车票相关的问题分类为儿童票问题、学生票问题、行李托运问题、退票问题等。

完成两种类型对话的逻辑梳理后,我们还要进行需求分析的最后一个环节的工作,就是数据收集。

3.4   场景数据收集:在真实场景下用户会怎么问?


针对任务型的对话,我们要收集真实场景下用户买票的各种问法,越多越好。而对问答型的对话 要根据前面的知识分类去收集每个分类下的问题与答案,即问答对。

在这个阶段收集的数据将在后面技能搭建的第二个阶段使用,其实他们就是教会机器人对话理解技能的材料,越多越好。关于这些材料收集的技巧在《UNIT 使用技巧与持续优化 https://pan.baidu.com/s/1gyQXvExLka5yjdZr3tUziA 》中会有详细的介绍,在此就不展开了。

好了,到目前为止,我们需求分析第一大阶段的工作就完成了,接下来我们进入UNIT快速搭建订票机器人的阶段。

4 搭建对话技能

-------可拷贝或选择下面红色的文字 在UNIT里一步一步配置出火车票技能-------
注册百度账号,打开http://unit.baidu.com ,进入UNIT-->「我的技能」

 

4.1 新建技能


在UNIT平台搭建对话机器人的第一步是先创建一个技能,只需要输入一个技能名称。

技能名称火车票

4.2 自定义技能:新建对话/问答意图


创建完后就进入技能定义的阶段,技能又分自定义技能和预置技能,每个技能都是由多个相关的意图组成,这个阶段的新建意图就对应我们需求分析阶段的功能定义。订票功能就可以转化为订票意图BOOK_TICKET,订票的关键信息可以定义为实现订票意图的词槽,这里我们简单一些,把出发时间、出发站点、到达站点、车次定义为词槽:user_time、user_from、user_to、trainnumber。

具体操作步骤:

4.2.1  新建对话意图
点击【火车票】技能,进入技能模块,在自定义技能中【新建对话意图】:

意图名称BOOK_TICKET

意图别名订票

4.2.2  添加词槽

添加四个词槽:

1、词槽名:user_time别名出发时间,词典:系统词典——sys_time(时间)必填

第一步是选择【添加方式】,选 「新建自定义词槽」,并设置词槽名(user_time)和词槽别名(出发时间),

第二步先打开【系统词槽词典】的开关,然后选择系统词典sys_time(时间)

  • UNIT平台中词槽的识别依赖词槽对应的词典。支持自定义词典,也可以选择系统预置词典,我们建议在能选择系统词典的情况下尽量选择使用系统词典(详见:http://ai.baidu.com/forum/topic/show/869949 ),当系统词典里没有你需要的类型时可以添加自定义词典。

第三步设置词槽与意图关联属性,这里 火车票的出发时间是订票里必须的关键信息,所以我们选择必填。澄清话术就是当用户表达订票需求的语句里缺少出发时间时技能主动让用户澄清的话术。还可以设置让用户澄清多少轮后放弃要求澄清,默认是3次。

按照上面的步骤完成下面3个词槽的配置

2、词槽名:user_from,别名:出发站点,词典:系统词典——sys_loc(地点)必填

3、词槽名:user_to,别名:到达站点,词典:系统词典——sys_loc(地点)必填

4、词槽名:user_trainnumber,别名:车次,词典:系统词典——sys_train_num(火车车次)非必填

添加完所有词槽后如下图:

在词槽列表中可以调整词槽澄清的顺序。

4.2.3  设置对话回应


对话回应就是当技能模型识别出用户的意图和所有必填词槽值 时给用户的反馈。

有三种回应方式:【答复】、【引导至对话意图】、【引导值问答意图

这里我们以【答复】为例,设置答复文本内容为:"为您找到的车次和座位信息如下,确认下单吗?" ,

触发规则 我们选择智能生成,但因为词槽 user_trainnumber是非必填词槽,这里可以删掉,如下图,点击user_trainnumber 对应规则后面的叉号 删除:

最终保存意图

  • 注意点:实际落地的时候这里其实需要你在自己的业务代码里判断当前技能解析的用户意图为订票,且用户提供了出发时间、出发站点、到达站点,这时你用这三个词槽值去火车票系统中找出符合条件的火车票,并生成一个火车票list返回给用户,供用户选择,并完成支付。
  • 引导值对话意图:是当前对话满足一定条件时把当前意图到另一个对话意图,让用户进入另一个意图的对话中。
  • 引导至问答意图:是当前对话满足一定条件时把当前意图到另一个问答意图,让用户直接在目标问答意图下提问并获取答案。

4.2.4  新建问答意图


针对前期分析问答型对话的退票问题 定义一个问答意图 FAQ_REFUND,意图别名:问退款问题

4.3   添加预置技能
完成自定义技能后 我们还可以加一个问候的预置技能。

而添加问候技能无须任何开发,只要在预置技能中选择添加即可。后续我们陆续开放更多的预置技能。

4.4   添加训练数据
完成技能定义后,我们进入搭建技能的最重要的第2个环节,给技能添加训练数据,这个阶段就是要提供1到3种学习数据,让其学习我们定义的功能(意图、词槽的识别)。

4.4.1  配置对话模板
首先是配置对话模板,对话模板是对用户需求表达的一种规则抽象,配置好对话模板,可以快速识别不同表达方式的用户需求。

比如,订一下北京到上海的火车票,多谢了,我们就首先可以从中提取出订票意图的词槽表达。

接着我们还可以抽象出一些特征词,比如把我需要、我要定 都抽象为表达预订的特征词kw_booking,把到、去、往、回归纳为kw_to特征词,这些特征词在新建模板前就可以新建好,并添加好尽量多的词典值,这样能让一条模板可以覆盖尽量多的用户query。而有些即不能归纳为词槽,也不能归纳为特征词,但又经常可能在用户的一句话里出现的,可以用通配符去表达。比如这句话里的多谢了,就可以用通配来表达。

了解完上面的基本概念后,我们来看UNIT2.0中对话模板更强大的用法,多个模板片段组成一个对话模板,每个模板片段都可以由词槽、特征词、特定文本单独或组合而成,而且多个模板片段可以是无序的,也可以是有序的。顺序设为0就表示这个模板片段可以出现在用户query中的任意位置。而非0的,必须按照数字顺序在query中出现。此外还可以设置一个模板片段是否必须在用户query中出现。

看这个对话模板,有5个模板片段, 按照顺序的意思就是 什么时间要订从哪到哪的票,这里出发时间的顺序设为0,表示出发时间可以在用户query中的任何位置,而下面的要定从哪到哪的票 这是固定顺序的。当然用户的一句话里不一定说的这么全,只要有 我要定、火车票 这样的特征词就能确定用户是要订票的意图了——必须匹配设为”是”。其他的信息都可以在后续的对话中让用户去澄清补充的。

最后大家还要了解的一个概念是阈值,它是说当前模板配置的词槽、特征词 占用户query的长度比例,当只有这个比例达到这个阈值的时候,我们才会判定用户的query就是这个模板所表示的意图。大家会需要经常调整这个阈值,调的太低,可能会造成很多误召回,太高可能会导致召回率很低。

当我们有多个对话模板时,它们之间是有优先级的,在对话模板列表的上面的优先级要高于下面的,可以选中一条对话模板,然后执行上移、下移的操作来调整优先级。

这里我们定义了四个特征词:kw_booking、kw_to、kw_ticket、kw_seattype

kw_booking,描述:订、买,我要买

词典值:

预订



订购

我要
我需要
我要定
帮我订
订一下
定一下
我要定
帮我定

kw_to,描述:到、去、回、往

词典值:





kw_ticket描述:票、火车票

词典值:


火车票
高铁
高铁票
动车
动车票
城际
城际火车票
城际高铁票
直达
直达火车票
直达列车
直达火车
特快
特快火车票
特快票
快车
快车票
临时
临时火车票
普通火车票 

kw_seattype描述:硬卧、软卧、一等座、二等座

词典值:

特等座
商务座
一等座
二等座
高级软卧
卧铺
软卧
硬卧
软座
硬座
无座 

定义完特征词后下载 对话模板的文件(该文件是我在系统配置好的对话模板导出的文件)(链接:https://pan.baidu.com/s/19OfZR34lzgt0B96HenQwiA  密码:9arz)

再导入系统:

这里大家可以尝试自己按照上面的介绍新建对话模式 试试,导入的对话模板也可以编辑看看结构。

关于对话模板的更多技巧说明可 下载文档进一步学习了解:https://pan.baidu.com/s/1j6cx9HPuRav1tvOToW2mEA

4.4.2  标注对话样本

这部分我们要把需求分析最后一个阶段收集到的对话数据导入UNIT平台,然后给他们逐条标注意图、词槽。这部分数据可以用于后续的样本学习,让对话机器人获得更好的对话理解泛化能力。

本示例中的对话样本 可下载文件(链接:https://pan.baidu.com/s/19OfZR34lzgt0B96HenQwiA  密码:9arz)在【对话样本】页面直接导入:

然后在对话样本集中新建 『买火车票、查天气』样本集,把上面下载的两个对话样本文件(这两个文件是我之前标注好从系统中导出的)导入:

 

机器学习一般对训练样本有数量的要求,几条几十条数据,基本训练不出什么泛化理解能力,而当你很难收集到大量的对话样本时怎么办?UNIT平台提供了推荐对话样本的工具,只需要你收集50条真实场景的对话样本后就可以用它作为种子样本来推荐类似的样本,种子样本质量越高越好,它对推荐质量有直接影响。

4.4.3  添加问答对
在需求分析阶段就收集整理的问答对数据,这里我们把退款相关的问答对在问答集中导入即可

本示例中的问答对数据文件 可下载(链接:https://pan.baidu.com/s/19OfZR34lzgt0B96HenQwiA  密码:9arz)在【问答集:FAQ_REFUND】中导入:

 

并不是每个场景都需要添加上面的三种训练数据,该如何选择?这要根据您自己场景中的对话类型和数据收集情况来定。

Ø  假如你的场景是任务型的又缺少对话样本,这时你就可以先去配置对话模板,快速达到一定效果后再从日志中筛选更多的对话样本;

Ø  假如你一开始就有对话样本,这时你可以对话模板、对话样本一起上,这样可以快速达到一个更好的效果;

Ø  而如果你还有问答行的对话时,只要添加问答对就可以了,这个最简单。

4.5 训练模型


训练技能需要:1、选训练数据;2、选训练策略,一种是快速生效,一种是深度训练

系统默认必须训练对话模板,不论你有没有标注对话模板

如上图,选择快速生效会把对话模板和选择的对话样本、问答集使用基于知识规则、基于样本实例的训练策略进行快速训练,一般会需要15~1分钟(对话样本如果比较多的话会约慢一些)。

如果选择了深度训练,则会把上面选的数据,除了使用快速训练的策略训练之外 还会对所选数据进行融合、加工处理后进行深度机器学习训练,训练时长会与标注的对话样本量成正比。

这里需要注意的是一定要选择系统自带的「闲聊」负例样本,这样可以降低技能模型的误召回情况,就是告诉模型哪些query是闲聊而不是买票的。

4.6 测试体验
完成模型的训练后,就可以在测试窗口跟技能聊一聊,看看它有没有学会你交给他的技能了:

本入门教程到此结束,该教程中的火车票BOT 相关的意图、词槽定义,对话模板、训练样本、问答集数据都分享在下面的网盘中,可以下载后体验时参考、导入使用:

链接:https://pan.baidu.com/s/19OfZR34lzgt0B96HenQwiA  密码:9arz

使用过程中有任何问题欢迎留言交流,或加入百度Hi群:1617262、QQ群:584835350 讨论交流。

也欢迎微信扫码关注UNIT公众号,获取最新动态消息。

 

收藏
点赞
30
个赞
共81条回复 最后由射手散落一地回复于2021-02
#22mircoteam回复于2018-07

能否细化训练进度的状态,因为一直是训练中,对时间不可预测的一种恐惧感。

看看是否可以进度预估时间。

0
#21tiancorn回复于2018-07
#20 dingsoft010回复
请问类似姓名、身份证号这种词槽要怎么处理?

http://ai.baidu.com/forum/topic/show/492687 参考一下这个帖子里的说明

身份证号可以用正则词槽去判断

名字可以用包含正则词槽的模板去识别,在产品里也要加一些表达方式的引导,好让用户的表达能和模板匹配上。

比如模板可以设置为:[D:kw_mynameis][D:user_name]

其中[D:kw_mynameis]为特征词,里面的值可以为:我叫、我是、我的名字是、我名字叫、我的姓名是、我名字是……

[D:user_name]为姓名词槽,设置自定义词典值,如果姓名可以枚举,直接放在自定义词典里,如果是开放性的不知道目标用户名字,要获取姓名,就在自定义词典里设$$$[\u4e00-\u9fff]{2,3}

0
#20dingsoft010回复于2018-07

请问类似姓名、身份证号这种词槽要怎么处理?

0
#19dingsoft010回复于2018-07

类似姓名、身份证号这种词槽怎么办?

0
#18tiancorn回复于2018-07
#17 hellozhouyuan回复
跪求大佬出个视频教程,一步步教下怎么配置。按文中的步骤走下来之后结果很不理想 T_T
展开

稍后我把所有步骤的截图和数据都贴出来吧

0
#17hellozhouyuan回复于2018-07

跪求大佬出个视频教程,一步步教下怎么配置。按文中的步骤走下来之后结果很不理想 T_T

0
#16hellozhouyuan回复于2018-07

跪求大佬出个视频教程,一步步教下怎么配置。按文中的步骤走下来之后结果很不理想 T_T

0
#15tiancorn回复于2018-07

如果你没有数据,就先配对话模板,可以快速的获得一定的理解效果。但模板到达一定量了以后如果想进一步提升效果还是要标注样本的,目前我们的机器学习和对话模板策略做了融合,要求比之前标注的样本少很多了。

0
M
#14m18126462931回复于2018-07
#12 tiancorn回复
你是说对话样本要大量标注的数据比较麻烦?

对啊,得一条一条标注,有简单方法吗

0
#13tiancorn回复于2018-07
#9 冰削宏魄回复
这个UNIT平台提供了推荐对话样本的工具? 没有找到入口呀  

需要先选中一个大于等于50条对话样本的样本集后才能推荐哦

0
#12tiancorn回复于2018-07
#10 果断叫小黑回复
对话样本训练太繁杂了

你是说对话样本要大量标注的数据比较麻烦?

0
#11tiancorn回复于2018-07
#8 firstbyte860回复
最终怎么和订票的app集成?

订票app里可以加一个语音订票的入口,把用户订票的语音输入 转成文字(用百度的语音识别)提交给你UNIT平台的订票BOT,订票BOT解析完用户的意图、词槽后,订票app的服务端根据意图、词槽去查询出符合条件的车票 返给用户……

0
#10果断叫小黑回复于2018-07

对话样本训练太繁杂了

0
#9冰削宏魄回复于2018-07

这个UNIT平台提供了推荐对话样本的工具? 没有找到入口呀

 

0
#8firstbyte860回复于2018-07

最终怎么和订票的app集成?

1
#7彦丶子凡回复于2018-07

嗯嗯,我整理一下再提出来

0
#6tiancorn回复于2018-07
#5 彦丶子凡回复
这个教程有时候看的话还是很全面,但是还有欠缺

有哪些问题 欢迎提出来哦,我会及时调整更新的

0
#5彦丶子凡回复于2018-07

这个教程有时候看的话还是很全面,但是还有欠缺

0
#4tiancorn回复于2018-07
#2 qjhys回复
看完这个教程 感觉应该由我们公司的PM来先用,前期的工作完全不用开发

确实,现在就有不少bot是由产品经理先配置出来的,完成一个简单可对话测试的BOT完全没问题。后续的样本扩展,词槽词典与特征词词典扩展、后面调用对话api集成到业务产品中……这些需要研发人员来做。

0
#3用户已被禁言回复于2018-07
#2 qjhys回复
看完这个教程 感觉应该由我们公司的PM来先用,前期的工作完全不用开发

需求。产品。市场。售后都可以前期参与进来的

0
TOP
切换版块