这是 公众号:【朱利安笔记】2018年的原创文章,欢迎关注公众号,定期推送AI产品干货 ~
一、百度UNIT简介
上周体验了讯飞的AIUI后,接着来体验下百度的UNIT,继续了解各家在人机对话领域的开放平台。
UNIT是百度AI开发平台中开放的一项人机对话能力,官方解释如下
随着AI技术和理念的兴起,很多产品都希望采用对话式的人机交互方式。然而对话系统的研发对于大多数开发者而言却是一个很困难的工作,对技术和数据的要求都很高。
为此,百度将积累多年的自然语言理解与交互技术对外开放,推出了可定制的对话系统开发UNIT(Understanding and Interaction Technology),将业界领先的技术能力输出给广大的开发者,以便降低对话系统的研发门槛。
wiki:https://ai.baidu.com/docs#/UNIT-guide/top
教学视频:https://ai.baidu.com/support/video#video-category-unit
二、百度UNIT结构
· 整体结构
因为我对流程很重视,所以不仅会关注UNIT实际训练出chatbot的效果,还会关注它的使用流程,所以会画上流程图说明。
我一直认为一个好的流程是“美”的,高效的。百度UNIT流程如下:
要在百度的UNIT创建一个可用的chatbot,主要有6大步骤
1. 创建场景:根据业务需要创建场景,一个场景即一个可对外输出使用的功能
例如“控制电视场景”、“办理信用卡场景”等
2. 创建技能:技能是功能的最小单位,用于识别用户意图。
例如“控制电视”的场景中,技能(或意图)可以是“切换频道”,“调整音量”,“开关机”等
3. 准备训练数据:技能创建好之后,只是一个空壳
还是“控制电视”的场景,我们只是脑中想好了一个功能是“切换频道”,但是需要准备好数据,让machine去学习,什么是“切换频道”
4. 训练技能:当技能空壳创建好后,数据也准备好了,扔进去一锅乱炖即可,训练技能
5. 验证技能:当machine训练好后,我们要看下machine学的好不好,需要考考他,互动下
例如发出“切换CCTV5”,结果执行了“关机”,你就一脸懵逼了,这时候就要再调整,再训练……
6. 发布场景:训练好技能,就可以发布上线见客人了
这整个过程和做产品特别的像
· 创建场景(UNIT) -> 发起项目(PM)
· 创建技能(UNIT) -> 拟定Fearture List(PM)
· 准备训练数据(UNIT) -> 撰写PRD文档(PM)
· 训练技能(UNIT) -> 投入研发(PM)
· 验证技能(UNIT) -> 验收需求(PM)
· 发布场景(UNIT) -> 项目上线(PM)
是不是有点意思:P
百度的整个框架刚开始使用不好上手,具体讲讲每个环节
三、UNIT六大步骤
1)创建场景(场景管理模块)
进入UNIT,通过场景管理先创建场景,场景的定义
一个场景对应一个独立完整的对话系统,通常按垂类划分(例如,天气场景、电视遥控器场景等)。
场景中包含了一系列对话单元用于完成该场景下的所有对话任务(例如,查温度、换台等)。
场景内可以含有一系列的“对话单元”,和讯飞AIUI的“应用”内可以创建各式“技能”相似。
1. 模型
模型是场景的属性,同app版本的概念,每一次训练后都会产生一个模型,可以不断的迭代模式,或者修改训练的技能或素材,对比不同模型的优劣。
2. 沙盒
沙盒是模型使用的场所,必须将模型放入沙盒内才能使用,每次仅会有一个模型在沙盒内生效。
模型和沙盒的关系,和app的版本与手机的关系相同,一个手机只能装一个app的某个版本,app在手机上运行;一个沙盒只能装载一个模型,模型在沙盒上运行。
2)创建技能(技能管理模块)
创建场景完后,就需要去创建场景的技能列表
技能分为两大类
对话单元技能和问答单元技能,这两个和此前文章提到的讯飞AIUI的“非问答类技能(自定义技能+开放技能)”与“问答类技能(自定义问答库)”类似
1. 自定义技能-对话单元技能
对话单元代表着产品能够执行的某个特定任务
对话单元分为3部分
1.1 意图
假设用户的每一句对话都有明确的目的(具体来说,就是让系统执行某个操作),而意图(intent)就代表了对话系统对用户对话目的的理解
例如在一个询问天气的场景中,用户目的可以是想知道某个城市某天的刮风状况,那意图就可以是“查询风速”
1.2 词槽
此前在文章《【AI笔记】Chatbot中的填槽(Slot Filling)》中,我们聊过词槽,就是某一类词语的抽象聚类,可以用来当做条件,当词槽填充完整(条件满足)即代表当前的意图匹配上了用户的目的。
1.3 澄清话术
澄清话术即当前词槽如果没有填充的时候,应该如何引导用户补充信息
例如“查询北京的风速情况”,这里只有“位置”的词槽,但是不知道时间,所以澄清,引导用户“什么时间呢?”,用户回复“周二”,那么词槽就填充完整了
“time”=“周二”
“los”=“北京”
1.4 回复方式
当意图满足后,即识别出用户的目的,就要回应用户,响应他的目的
那如何算是满足了条件呢?
1.4.1触发规则
通过设定触发规则来触发回复内容。这里点赞下百度的触发规则设置,通过条件组的或,条件组间条件的与和条件本身可设定为非,组成了一套与或非,具有极大的灵活性。
条件的设定范围,这里给了三个
· 会话过程中:即在整个session过程中,填充进入了就算,适用于多轮对话
· 当前用户输入:指用户输入的上一句,填充进入了才算,此前隔了几个对话说的内容不算
· 上轮对话意图:即之前的对话满足/不满足某个意图后,才能触发符合这个条件
1.4.2回复方式
设定的触发规则匹配上了,这时候需要响应用户的目的,响应的方式有三种
· 直接回复
例如直接回复某个文本,或者执行某个写好的函数
· 引导对话单元
符合条件后,引导用户询问更多的对话单元
例如当用户问了风速的时候,还可以引导用户问是否下雨
这个功能适用于目的相似的对话单元之间互相关联,以展示更多可能意图给用户选择。
或者用于推荐广告,例如询问“瘦脸针是什么”,可以推荐关联的商品问答单元
· 引导问答单元
类似引导到对话单元,引导问答单元是引导到某个固定的问答上,匹配中某个问答,然后回复固定的文本内容。
1.4.3 响应的顺序
这三种响应方式并非单选,可根据需要选择,但是当触发条件都相同,同时符合了三种响应的时候,就按照设定的响应顺序取优先级最高的响应。
2. 自定义技能-问答单元技能
问答技能就是逐字全匹配功能,用户的一类聚类的意图,且是问题是固定的,可以直接创建问答技能匹配用户的问题。
· 优点是,创建快速,只要问题全匹配上了,100%回复;
· 缺点是,呆板,不能变动,只要问题有一个字没有匹配上问题,那么就匹配不上。
3. 预置技能
除了自己创建自定义技能外,还可以使用官方提供的预置技能,不过这个预置技能更像是在演示体验用的,期待后期开放更多的实用技能或其他开发者开源的技能。
(PS:和讯飞的AIUI不同,即使是预置技能,UNIT中也可以再训练)
3)准备对话数据(数据中心模块)
当我们创建好了技能空壳后,接着就要准备讯训练的对话数据了。
好比确定了产品的Fearture List后,就这就是写具体的需求文档,之后才能进行开发。
对话数据统一在数据中心录入和管理
其中 对话单元使用“对话样本集”和“对话模板集”数据训练
问答单元使用“问答集”数据训练
1. 对话样本集
对话样本集是对话样本的集合,可自定义添加,且支持导入功能(nice!)
· 对话样本
对话样本,即需要机器真正进行学习的数据,需要将训练的数据和对应的对话单元关联起来,才能进行监督学习(structured learning)。
进入对话样本集,对所需标注的对话样本进行标注
为进行监督学习,所以每一条对话样本都必须和之前设定好的对话单元(意图)相关联!并设定好语句中哪些命中了词槽。
· 正例和负例
并非每条对话样本都是符合意图的,例如“吃了吗?”和“气象查询”的场景八竿子打不着,如果不告诉机器这两者是没有关系的,机器可能会直接将“吃了吗?”当做某个意图,从而澄清问“你想问的是哪个城市的天气”
所以需要有负反馈,告诉machine哪些内容是无关的,这些和场景无关的样本就称为负例
同理,正例就是和场景相关的对话样本的标注
负例标注时,选择意图为SYS_OTHER
·
2. 对话模板集
对话模板集是对话模板的集合
对话模板实际和问答特别像,只是问答是100%逐字全匹配,而对话模板则是动态匹配。
2.1 词类
先讲讲UNIT新出现的一种词,特征词。
在UNIT中,句子中的词语可以分为三种类型“特征词”、“词槽”、“普通词语”
2.1.1 特征词(槽)
是一类词的聚类集合,用一个命名符号表示这一类词。
· 特征词(槽)和词槽的区别在于
1. 特征词不会被识别到json的结果中,仅用来方便机器进行匹配使用;
2. 特征词的颗粒度可以很粗,例如“我想查询”,“帮我查找下”,“查询”,“查”都可以归为“用户意愿”这个特征词中,但是词槽一般会分的较细
· 特征词创建/编辑
仅能通过批量上传的方式上传,这点不是很友好。
2.1.2 词槽
即在对话单元中设定的词槽
2.1.3 普通词语
除了“特征词”和“词槽”以外的词
2.2 对话模板
对话模板="选择意图"+"设定对应的句子公式"
machine直接拿用户的问题,去匹配这个句子公式,匹配上了就用,匹配不上就不用。
格式即为上述三种类型词之间任意组合。
看一个案例
上面的模板
“[W:0-10][D:user_sys_los][W:0-3][D:user_sys_time][W:0-10]”
是用来匹配“xxx地点xx时间会不会下雨”,其中[W:0-6]是通配符的意思,即可以是0~6个字符,一个汉字算两个字符。
如果用户问“你好,北京这地方明天会下雨吗?”能匹配上模板
但是如果用户问“你好,明天北京这地方会下雨吗?”模板就gg了,因为用户问的内容和模板“
xxx地点xx时间”的语句顺序匹配不上。
所以模板让机器学会语言的匹配规则,规则非常死板,和套用公式相同,难以变动。
但是优势可以快速创建,且通过通配符,能让对话模板具有一定的拓展泛化匹配的能力。
3. 问答集
问答集是的问答对的集合。
问答对就是对问题的文本逐字匹配,100%匹配的时候,回复对应的内容。
1个问答集可创建多个问答对
一个问答对可支持多对多的回答,如果有多个答案的时候,随机回复一个答案
以上就是技能空壳的设定和准备技能训练数据的模块
4)训练技能(训练与验证模块)
技能壳和对话数据准备好了之后,就可以进入训练,生成真正的技能
1. 沙盒与模型
正如前文提到的,模型需要训练,每次训练都是重新开始,新生成一个版本,新生成的模型需要放入沙盒中才能运作。
2. 训练新模型
训练的时候,“问答集”、“对话模板集”和“对话样本集”是分开训练的,其中“对话模板”和“对话样本集”可选择是否新训练。
从这里可以看出,实际这两个是不同的技能,使用的学习的方式也不同,对话模板的训练仅是设置好“匹配的模板”;
而对话样本集,则是真正的使用RNN进行训练,耗时较长,差不多,5-10分钟+100条样本/分钟才能训练好。
通过仅新训练某一技能的方式,可以方便针对不同的调整进行训练,同时对比训练的结果。
数据的来源就是此前准备的各种数据
3. 隐藏技能-生成训练数据
UNIT有一个隐藏的技能——直接帮你生成训练数据,非常强大!
在对话中直接“@UNIT 推荐对话样本”,让机器创建对话样本集(未标注的)
生成需要一定时间,可通过“@UNIT 查询推荐状态”查询进度
5)验证技能(训练与验证模块)
训练好技能后,直接和chatbot瞎聊,看看有没有训练歪了,有“体验模式”和“学习模式”两种
1. 体验模式
体验模式就是和chatbot瞎聊,对话内容不会加入到“对话样本集”中的“默认集”,期间可以@chatbot修改意图,词槽等
2. 学习模式
学习模式,即与chatbot对话内容会加入到“对话样本集”中的“默认集(默认的对话样本集)”的模式,此外,还会直接将chatbot识别的结果作为对话样本的标注结果一同加入到“默认集”中。
6)发布场景(场景发布模块)
场景训练好了之后,可以通过百度云调用,也可以使用DuerOS使用。
1. 百度云调用
在百度云控制台中创建应用,将场景添加到具体的应用中,之后可以调用应用的API使用应用内容的场景功能。
2. DuerOS使用
训练好的自定义技能,还可以发布到DuerOS开放平台中,供用户直接使用通过语音对话的方式,唤起技能和使用技能。
DuerOS技能开放平台,英文全称DuerOS Bots Platform,是DuerOS为第三方开发者提供的一整套技能开发、测试、部署工具的开放平台。第三方开发者可以在平台上,通过可视化界面,简单、高效地开发各类个性化技能。
整体讲完,再回过头看下,百度UNIT的结构还是很清晰的
三、评价下百度UNIT
1)优点
1. “真·Machine Learning”
使用对话样本集训练数据,真正的使用RNN去train,最终表现结果不错,让人欣喜。通过封装和图形化的交互,让不懂人工智能底层技术的用户也能训练出自己想要的模型,大大降低了训练任务型chatbot的入门门槛。
2. 支持多轮对话,操作简单
看过其他平台的多轮对话,需要自己设定复杂的路径,太过繁琐,而UNIT结果清晰,通过响应条件与或非的设定,再加上词槽的澄清,使得创建一个多轮对话变得很简单。
3. 百度全开放的AI能力
在PC时代,大家疯狂的吐槽百度的“恶”,其中的“百度全家桶”臭名远扬,但是在AI上,百度真的诚意满满!
AI几大领域,ASR,TTS,CV,NLP,AR均有开放,同时还开放了开源的数据集,良心!
配合百度的云应用和DuerOS,整个大开放平台上,技能的从生成、训练、上线、调用、维护都可以在平台上完成,这样强大的赋能,为开发者节省了大量的时间。
2)缺点
1. 页面结构功能强大,但较为复杂,不好上手
功能强大,刚看到的时候很懵,不知道如何下手,看了两遍教学视频才弄懂了,感觉页面结构较为混乱。
如果修改为顶部栏一级导航和侧边栏二级导航,可能会更好理解点
· 一级导航,顶部栏代表关键的环节
“技能与数据设定” -》“训练与验证” -》“更多设置” -》“场景发布”
· 二级导航,将该环节的细分步骤列出
例如“技能与数据”设定中,仅放入“技能管理”和“技能数据管理”
再吐槽一点,很多二级页面没有返回,点击进入三级页面要再返回的时候,没有入口,需要再点击一级入口跳转…
2. 标注数据过程耗时耗力,需优化交互
数据标注量太大时,耗时很长,会很痛苦,交互需要优化以提高效率。
例如意图多的时候,下拉交互就很不友好,要么新增查询意图,要么修改为多标签展示,提高标注效率。
再比如训练的时候,@chatbot的方式修改意图,不方便,直接将入口放出来可点击效率更高
3. 无法做批量的Testing
现有的界面只能和chatbot一句话一句话对话,而且没法统计正确率,效率很低且不知道什么时候准确率是符合预期(例如准确率达到95%以上)可以上线了。
之后如果能批量上传Testing的数据(设定好对话文本,意图,词槽),将Testing给chatbot的对话文本识别出的结果和上传的数据进行对比,形成报表,就能知道目前的准确率,这点需要优化。
4. 等待时间较长
每个模型实际都用数据去train,所以训练时间较长…不过也能理解,毕竟是真的在train。
3)总结
虽然UNIT的页面的结构刚开始用容易晕,但熟悉后,整体上从创建场景到最终场景发布,整个流程还是比较顺畅的。
百度决心All in AI,投入了大量的人力打磨,加上百度本身的技术,目前的开放平台功能已经很强大,对比此前体验的讯飞AIUI,拉开讯飞很大的距离。
而平台封装了大量底层机器学习算法,图形化界面的操作,大大降低了AI使用门槛,良心良心良心!
我自己有个判断,再过3年,大厂的AI基础设施也就搭建完毕了,之后就是看谁能利用好大厂的附能,形成强大的节点,收割新一波的流量。
5-10年,随着技术不断成熟,不断的封装接口化,应用层会有一波大爆发,期待ing…
惯例打个分
· 易用性:4星
· 智能性:4星
· 开放性:5星
#推荐阅读
-【AI笔记】讯飞人机智能交互平台(AIUI)的武林秘籍
-【AI笔记】Chatbot中的填槽(Slot Filling)