【提升篇】UNIT2.0--火车票场景实例教程
tiancorn 发布于2018-07-08 02:17 浏览:20731 回复:54
14
收藏
最后编辑于2018-11-11

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

 

2 搭建对话BOT的总体流程


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

4 搭建BOT

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

4.1 新建BOT


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

BOT名称火车票

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


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

具体操作步骤:

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

意图名称BOOK_TICKET

意图别名订票

4.2.2  添加词槽

添加四个词槽:

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

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

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

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

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

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

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

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

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

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

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

4.2.3  设置BOT回应


BOT回应就是当BOT识别出用户的意图和所有必填词槽值 时给用户的反馈。

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

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

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

最终保存意图

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

4.2.4  新建问答意图


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

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

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

4.4   添加训练数据
完成BOT的技能定义后,我们进入搭建BOT的最重要的第二个环节,给BOT添加训练数据,这个阶段就是要给BOT提供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 训练模型


训练bot有两种方式,一种是指训练我们上面配置的对话模板,另外一种是 训练对话样本同时训练对话模板

系统默认必须训练对话模板,不论你有没有标注对话模板。如果这时如上图 你在对话样本集里使用了默认选项『使用沙盒中的模型』,直接训练模型并生效到沙盒,会需要15~30秒的时间。

如果如上图在对话样本集选项中选择了『重新选择样本』且选中了有标注样本的样本集,则对应后端的训练讲采用深度机器学习的策略进行样本的训练学习,同时也会把标注的模板也融合进来一起训练。这时训练的速度会与标注的对话样本量成正比。这里需要注意的是一定要选择系统自带的「闲聊负例样本」,这样可以降低BOT的误召回情况,就是告诉BOT哪些query是闲聊而不是买票。

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

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

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

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

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

 

收藏
点赞
14
个赞
共54条回复 最后由189******80回复于2018-11-11 14:01
#55189******80回复于2018-11-11 14:01:08

这个很方便了

0
#54伊茨米可回复于2018-11-08 00:36:07
#53 故事从哪里结束回复
请问完成自定义查询火车票的技能后,怎么加问候的预置技能???怎么把自己的自定义技能和多个预置的技能放在一个自动问答系统呢中?
展开

现在自定义技能和预置技能是独立的,您可以同时调用,然后按优先级获取答复结果传给终端用户(智能对话常见的使用方法),后面UNIT会推出机器人的概念,来帮助您完成这部分工作

0
#53故事从哪里结束回复于2018-11-07 20:36:29

请问完成自定义查询火车票的技能后,怎么加问候的预置技能???怎么把自己的自定义技能和多个预置的技能放在一个自动问答系统呢中?

0
#52liguanghui2588回复于2018-11-07 08:37:04

这个通过语音下单挺方便的

0
#51伊茨米可回复于2018-09-30 11:24:24
#50 蓝兰兰111回复
你用的开发平台是什么?

0
#50蓝兰兰111回复于2018-09-30 10:54:31
#41 伊茨米可回复
您说的有屏互动是一整套解决方案,其中语义解析部分(例如对话),可以通过UNIT实现
展开

你用的开发平台是什么?

0
#49chenglei605回复于2018-09-26 11:09:51

如何将  月初   转化为具体的时间段?     例如月初   2018-09-01  ---   2018-09-10 .

意思是将时间的汉语表达(月初,月底,昨天上午,昨天下午2点到4点)  转化为具体的时间(段)格式

1
#48伊茨米可回复于2018-09-10 14:30:40
#46 grophor回复
输入“”“我要去北京”,提示“”您是要订票吗?“;但是输入“我要去深圳”,就提示“我不知道应该怎么答复您。”这是怎么回事啊?
展开

是不是用模板训练的的,模板里把地点词槽写死了。

或者用样本训练,但样本量不够。

0
#47伊茨米可回复于2018-09-10 14:29:41
#45 soukeyH回复
场景是需要订多张票,每张票都不一样,不能一起订吗?该怎么设置词槽? 比如 "帮我订一张北京到南京的,一张北京到杭州的"
展开

可以的,一样的词槽,一样的标注方式

0
#46grophor回复于2018-09-07 16:34:02

输入“”“我要去北京”,提示“”您是要订票吗?“;但是输入“我要去深圳”,就提示“我不知道应该怎么答复您。”这是怎么回事啊?

0
#45soukeyH回复于2018-08-28 16:39:38

场景是需要订多张票,每张票都不一样,不能一起订吗?该怎么设置词槽?

比如

"帮我订一张北京到南京的,一张北京到杭州的"

2
#44tiancorn回复于2018-08-24 19:19:35
#43 无名java生回复
python的调用UNIT API小例子哪位大神施舍我一份,我做了一下可是有一些地方不懂,如何做成实时对话?
展开

写了一个Python2的调用示例,你看看 https://ai.baidu.com/forum/topic/show/880531

0
#43无名java生回复于2018-08-24 08:51:36

python的调用UNIT API小例子哪位大神施舍我一份,我做了一下可是有一些地方不懂,如何做成实时对话?

0
#42丁页古月哥欠回复于2018-08-21 10:01:38

弄不明白,我太菜了

0
#41伊茨米可回复于2018-08-16 11:04:18
#40 蓝兰兰111回复
想了解一下BOT结合小度在家的有屏技能,如何实现和用户的互动?

您说的有屏互动是一整套解决方案,其中语义解析部分(例如对话),可以通过UNIT实现

0
#40蓝兰兰111回复于2018-08-16 06:59:44

想了解一下BOT结合小度在家的有屏技能,如何实现和用户的互动?

0
#39tiancorn回复于2018-08-02 22:34:47
#36 rock虫子回复
这个评论模块好过分哦,换个页竟然回到了页面顶部,划拉了我好久

确实是……,我反馈给论坛的同学优化一下

0
#38tiancorn回复于2018-08-02 22:28:44
#35 shishi11回复
能否在文档中给一个表达式用法 现在只会用[D:XXX]

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

0
#37tiancorn回复于2018-08-02 22:27:32
#34 丿VagranT回复
[图片]请问“换成周六早上的吧”这种更换词槽的动作应该怎么实现,还有在第一句话“帮我定下周五中午回京的高铁票吧”中这个“京”怎样能识别成词槽。
展开

换成周六早上的吧,这个系统会自动识别为词槽更新的意图,基本上都不用做特殊的处理。

如果更新词槽的意图没识别,可以在对话模板里配置一个更新词槽的模板即可。

回京的京 可以在对应词槽的自定义词典里添加一个词典值 北京,同义词 为京

0
#36rock虫子回复于2018-08-02 14:27:49

这个评论模块好过分哦,换个页竟然回到了页面顶部,划拉了我好久

1
TOP
切换版块