使用UNIT配置训练数据的技巧总结
智能对话系统的搭建,最为核心的部分是模型的搭建与效果的优化,这篇文章将以配置"订票"与"发短信"的需求为例,讲解在百度大脑UNIT平台具体的配置训练数据的过程。
以user开头的是词槽;以kw开头的是特征词。(具体命名不影响最终效果,重要的是配置训练数据的格式)
下面是我配置智能对话机器人总结出的五个注意事项,分享给各位开发者:
1.不要直接将汉字配置到模版片段中
2.避免出现每个模版只有一个模版片段的情况
3.每个模版片段不要包含多条关键信息
4.避免出现某个模版里所有模版片段都为必须匹配或非必须匹配
5.通配符可以用,但是尽量用的少一些
除此之外,这里再给大家安利一下我比较喜欢的对话模板规范(习惯):
1.利用好对话模板里的描述,写清楚这条模板能匹配的句式
2.充分利用平台资源,使用AI Studio检验成果
————————————————————————————————————————————————————
1.不要直接将汉字配置到模版片段中
这里我做一个错误的示范:
给[D:user_receiver][D:kw_send][D:kw_message],内容是[D:user_content]
这是发短信的一条模板片段,句式是:
给小明发短信,内容是我现在开会,不方便接电话
我们知道,"给"是一个动词,"内容是"的后面可以判断出短信的内容,因此他们都属于特征词,所以我们应该把他们变成特征词,而不是直接使用中文
除此之外,既然是片段,那我们就应该把一句话拆开去理解,也就是下面所说的,避免把较长的话当作模板片段
2.避免出现每个模版只有一个模版片段的情况
既然是片段,当然要把长句子拆分
像这样的配置,是不建议的,也是必须要避免的!
不过,这不是说模板片段要多放几个长句子!
3.每个模版片段不要包含多条关键信息
下面的配置方式是糟糕的配置方式:
讲到这里,你应该明白我想要表达的意思了吧?
回到刚刚那个"给某人发短信,内容是xxx"的例子,我们逐一拆解句子,找出句子里的特征词和词槽:
分析一下,不难看出这里的"某人"是我们要找的词槽,短信的内容也是词槽
剩下的信息都是特征词,说白了,就是帮助我们判断句子意图和词槽的词语
因此,这句话就可以拆分成:
给某人 ----确定词槽(短信接受人)
发短信 ----确定意图(意图为发短信,而不是删除短信)
内容是xxx ----确定词槽(短信内容)
一个长句拆分成三个短句,能提高模型的泛化能力,如果用户说:“发短信给小明,内容是xxx”,那么这个对话模板一样能识别出来
4.避免出现某个模版里所有模版片段都为必须匹配或非必须匹配
上面这样的方式是不建议的
在配置对话模板之前,我们一定要明确目标,哪些特征词和词槽是一定要匹配的,哪些特征词可以通过多轮对话取得,没有必要把所有模板片段都设置为必须匹配或者非必须匹配,我们只需要根据我们要配置的句式来决定必须或非必须,下面举个例子:
订一张明天早上从北京出发到广西的Z6列车的学生票
很明显,这句话的意图是订票,我们没有必要一开始就把所有词槽都填充上去,因为用户很有可能会说:“我要订票”
想象自己去到售票大厅,是不是应该先向售票员表达自己的意图,然后再说去哪里,买几等座等等,因此,这里我们只需要把"订票"这个特征词作为必须匹配的模板片段即可:
5.通配符可以用,但是尽量用的少一些
这句话能匹配的句式是:“帮我叫(店名)的外卖”,用上通配符,虽然可以匹配到词槽,但是换个说法:“请帮我叫一份肯德基的全家桶套餐”,那么本来应该匹配的词槽就可能被通配符匹配
——————————————————————————————————————————————————————————————————————————————————
下面是我比较喜欢的配置对话模板的规范(习惯):
1.利用好对话模板里的描述,写清楚这条模板能匹配的句式
对比一下两种方式:
是不是觉得第二种的思路比较清晰?
第一种就像是代码里没有注释一样,看不出这条模板的作用,能匹配哪些语句,因此,描述写的清晰,对开发者来说,能起到事半功倍的作用
2.充分利用平台资源,使用AI Studio检验成果
虽然搭建智能对话机器人不需要任何代码基础,但是在检验效果时,需要用到一些代码,这里用到的是Python2的环境,不会搭建环境,抑或是没有编程基础的同学,可以试一试下面的方式:
打开paddlepaddle,搜索百度unit技能测试或直接打开链接:(https://aistudio.baidu.com/aistudio/projectdetail/284472)
把client_id, client_secret, bot_id改成自己的,另外,query验证集也要改成自己项目的query:
修改后,在终端输入python send_query.py后回车即可查看效果: