1. 升级背景
当前 UNIT 平台提供两种类型的口语理解能力,其一是基于模板规则的技术(使用的训练数据为对话模板),其二是基于机器学习的技术(使用的训练数据为对话样本)。
模板规则技术能够使得人们根据领域知识快速构建并随时改进对话机器人,因此在实际场景中应用范围更为广泛,而整体应用效果也更好。然而,两种技术各自均有其明显的优缺点。基于模板规则的技术擅长于词槽识别,而基于机器学习的技术擅长于意图识别。我们期望能够有效整合两种技术的特长,实现更好的口语理解效果。
2. 功能特色
UNIT 平台新上线的PowSLU能力即采用融合模板规则与机器学习的混合策略,能够提供比单纯的模板规则技术和机器学习技术普遍更好的口语理解能力。
PowSLU内部通过具有由高到低不同置信度等级的多级分析机制,实现了比基于规则模板的SmartSLU更好的召回能力,取得了更高的口语理解精度,在多个应用场景上打平并超过原有的SmartSLU系统。PowSLU通过模板规则技术与机器学习技术的整合,能够以远比原有MLSLU更小的成本实现相似的口语理解能力。在合理配置Schema和模板的条件下,通过标注几百到几千条实例,即可实现原有的MLSLU系统在标注几十万条实例的条件下所能达到的效果。
PowSLU提供Level1、Level2和Level3共三个档位的应用接口。Level1档的效果相当于原有的SmartSLU,Level2档和Level3档分别具有更高的召回能力。在具体发挥作用的细节上,较高档相对于较低档多召回的增量部分,在准确率上相对于仅使用较低档时略有下降,但由于相对于较低档能够召回显著更多的情形,所以整体口语理解精度能够取得明显提升。
3. 使用方法
3.1 模型训练方法
单纯训练模板,还是训练样本,或者同时训练模板+样本,✔️表示会在哪个Level生效,具体如下:
对应在UNIT2.0平台上选择的训练参数选择如下:
只训练对话模板,不训练对话样本,对应PowSLU会在leve1、level2生效:
目前UNIT2.0默认每次训练都必须生效全部模板,所以只要在对话样集中选择【重新选择样本】,并选择已经有标注数据的样本集和闲聊负例样本即可使PowSLU在leve1~3个极别都生效。
示例:
3.1.1、自定义技能下新建意图TV
3.1.2、模板和样本配置
对话模板:
对话样本:
3.1.3、训练并生效模型
3.1.4、验证
通过api(https://ai.baidu.com/docs#/UNIT-v2-API/top)进行调用
3.2 模型调用方法:
Level1/Level2/Level3 简写为L1/L2/L3,对应slu_level参数值1,2,3。
目前L2/L3仅支持通过api接口调用,L1支持网页对话窗口、api调用。请求的接口传递参数,较原来多了一个hyper_params
L1调用示例:
{
"bot_session":"",
"log_id":"7758521",
"request": {
"bernard_level":0,
"hyper_params": {
"slu_level":1,
"slu_threshold":1 // level1时slu_threshold不生效
},
"client_session":"{"client_results":"", "candidate_options":[]}",
"query":"今天北京天气",
"query_info": {
"asr_candidates": [
],
"source":"KEYBOARD",
"type":"TEXT"
},
"updates":"",
"user_id":"88888"
},
"bot_id":1057,
"version":"2.0"
}
L2调用示例:
{
"bot_session":"",
"log_id":"7758521",
"request": {
"bernard_level":0,
"hyper_params": {
"slu_level":2,
"slu_threshold":0.6
},
"client_session":"{"client_results":"", "candidate_options":[]}",
"query":"今天北京天气",
"query_info": {
"asr_candidates": [
],
"source":"KEYBOARD",
"type":"TEXT"
},
"updates":"",
"user_id":"88888"
},
"bot_id":1057,
"version":"2.0"
}
L3调用示例:
{
"bot_session":"",
"log_id":"7758521",
"request": {
"bernard_level":0,
"hyper_params": {
"slu_level":3,
"slu_threshold":0.5
},
"client_session":"{"client_results":"", "candidate_options":[]}",
"query":"今天北京天气",
"query_info": {
"asr_candidates": [
],
"source":"KEYBOARD",
"type":"TEXT"
},
"updates":"",
"user_id":"88888"
},
"bot_id":1057,
"version":"2.0"
}
4. 优化技巧
4.1阈值设计
slu_threshold阈值由高到低,PowSLU的泛化召回能力越来越强,同时可能会带来更多的误召回。经验的设置方法如下:
1、标注的训练正例样本(意图不是SYS_OTHER的)少于100条时,阈值应该设置的低一些。
2、场景的意图数较多时,阈值应该设置的低一些。
3、场景较复杂时,阈值应该设置的低一些。
4、场景歧义性较大,容易误召回,阈值应该设置的高一些。
使用PowSLU时,在参考经验设置方法的同时,也需要根据场景的特点进行阈值设置。
示例:
4.2 误召回干预
1、一般情况误召回
(1)如果误召回是单独的一个query,就把这条query标注为负例样本(意图为SYS_OTHER)。重新训练后,query不被召回。
(2)如果误召回是一类query,比如订火车场景会误召回订机票的query
a、如果是被PowSLU的level1阶段召回(from_who=pow_slu_lev1),说明模板配置的不够合理,需要修改模板【参考使用说明中模板配置部分】。
b、如果是被PowSLU的level2或者level3阶段召回(from_who=pow_slu_level2/pow_slu_level3)就把这一类query标注为负例样本。重新训练后,误召回下降。
在订火车票场景,1000条正例样本,加入50条订机票负例样本后,误召回下降了12%。
2、口语化词误召回
如果在level3阶段误召回的query是一个口语化词或者口语化词的组合。可以把口语化词加入口语化词典中(效果优化->训练数据->对话模板->口语化词管理)。加入后,query不被召回。比如误召回的query是 ”度秘“、”度秘!“、”度秘度秘“,把 “度秘” 加入口语化次词典后,”度秘“、”度秘!“、”度秘度秘“ 不被召回。
这样看来是针对每一个意图做一个二分类,取得分最高那个意图为最可能的意图,再利用规则匹配词槽吧
超级棒,希望以后有机会可以加入AI加速器!