- 智能问答与知识库广泛应用于寿险智能客服、对话机器人、个人助手等产品里。该论文提出一种基于深度语义匹配和深度学习排序的问答系统,用于保险领域的专业问答在线系统上,支持较高的QPS,同时问答准确率满足业务需求。
- ROCLING 2019是由计算语言学和中文处理协会(ACLCLP)赞助的第31届中国台湾计算语言学和语音处理年会。该会议每年举行, 旨在为研究人员和行业从业者提供一个国际论坛,以分享他们在NLP领域的新想法、原创研究成果和实践发展经验。
论文动机
- 现有的问答系统主要是根据用户问题,基于知识库已有知识进行检索,往往忽略一些上下文信息,用户语音输入转文本后,由于文本较长,导致与知识库里的较短问题匹配难度加大。
- 很多学术上提出的问答模型,在一些数据集上能取得很好的效果,但通常会忽视对运行效率上的优化。而在工业界,面对海量数据和请求,支持高并发、高可用和优化效果同等重要。
因此我们提出一种具有上下文理解能力的基于信息检索的深度语义匹配和深度学习排序的问答系统,用于保险领域的专业问答在线系统,并且支持较高的QPS,同时问答准确率满足业务需求。我们通过上下文指代消解、主语补全、长难句压缩,增强系统对问题的理解能力。通过ES,Siamese CBOW,知识图谱的KBQA对匹配问进行召回,再由实体对齐等策略过滤一些明显不合理答案,经考虑共现词的语义交互深度学习模型排序后,最后根据需要做话术澄清或答案输出。针对无法回答的问题,我们打造了智能知识库,高效的将应答问题回流并分发标注,完成问答知识的全生命流程管理和优化。1 论文背景问答系统被广泛应用于寿险智能客服、个人助手、对话机器人里。2018年,基于海量语料预训练的动态词向量在多项NLP任务包括Semantic Match上取得突破,代表性模型如Elmo,GPT,BERT,其中BERT提供了中文预训练模型,通过BERT对下游任务做fine tune,可以得到比Siamese CBOW检索准确率略高的模型,但模型做推断的时间较长,运行效率不满足我们线上产品的要求,但我们可以通过后面的ReRank模块提升问答匹配准确率。
在检索模块里更注重效率和召回率。现有的一些问答系统大多是单轮的问与答,没有考虑上下文的信息,我们提出一种基于句法分析的高效上下文指代消解方案,解决保险领域问答场景里主语缺失、代词消解等问题,取得了很好的应用效果。语音输入给用户带来了便捷,转文本处理后也引入了很多错别字,我们通过保险专用名词字典配合Transformer的纠错模型来提升对用户问题的理解能力。为解决用户输入较长语句与知识库里短文本的匹配准确率问题,我们采用了高效的句子压缩算法,能过滤一些无关紧要的内容,保留一些保险领域核心内容,从而提高检索模块的匹配准确率。AskBob问答系统主要服务于平安寿险AI产品的专业问答功能。在保险领域,用户咨询保险条款或是产品价格等问题时,只能从知识库里找答案,这些专业问答不适合用生成式模型给出答案。闲聊和一些非专业性的问答可以采用检索模型为主、生成式模型兜底的方式。据统计,在保险业务领域,基于知识图谱的问答能解决的问题约10%,适合解决一些有句法关系或者带有推理的问题,我们通过KBQA召回一路答案跟检索模块召回的答案一起排序。
智能知识库是问答系统中的幕后角色,除了给FAQ引擎提供原始材料外,还围绕问答知识的全生命流程进行管理和优化。实际工业应用中,问答系统每天都会产生大量的对话日志和用户行为日志,这些数据对于提升问答系统的知识质量至关重要,而当前学术界和工业界均鲜有提及。面对海量的问答日志,如何去过滤筛选、分配标注人员、提炼知识属性,都是非常值得解决的问题。
2 总体框架
整体系统架构如下图所示,用户的问题作为输入,如果是语音会先转成文本。获取上下文信息传入预处理模块,经过纠错、指代消解等处理后传入检索模块,基于ElasticSearch的字面检索、基于Siamese CBOW的语义检索和基于知识图谱的KBQA分别返回与用户问最匹配的问句列表一起传入排序模块,将多路匹配列表去重归并,通过实体对齐去掉一些不合理匹配问,再经过深度学习排序输出最终的相关问列表,最后以业务格式根据匹配问查找答案返回给用户。
2.1 预处理模块分词、词性标注、实体识别使用的是加入了保险专用名词词典的NLP现成工具。多意图判断用的是先通过标点符号拆分句子再进行分类的方法,问句改写主要针对保险名,情感分析则是对用户的肯定、否定、双重否定等意图进行判断。下面详细介绍长难句压缩、纠错 和指代消解功能。2.1.1 长难句压缩
语法树分析配合关键词典:
- Step1: 通过标点或空格分割长句成若干个短句,然后对短句分类,去掉口水语句。
- Step2: 基于概率和句法分析的句子压缩方案,只保留主谓宾等核心句子成分。配合保险关键词典,确保关键词被保留。
举例说明:“嗯你好,我之前06年的时候买了一个保险,嗯,一年只交了518元,然后后面我就再也没有买了,是06年的事情,然后现在我打电话给那个服务热线吧,我想续保就是。”
压缩结果:“我之前06年的时候买了保险,我想续保。”
2.1.2 纠错
两套方案供业务选择,简易方案是基于保险名词词典的纠错,根据前期分词和句法分析的结果,把可能的名词转成拼音,与词典里专有名词的拼音进行比较来实现纠错。
通用方案则是Transformer模型配合专用名词词典,训练参数使用的是默认的搜狗新闻3200万通用语料和与拼音字典匹配后的智慧客服业务文本集合,模型Encoder端输入是非词典词汉字拼音和词典词汉字,Decoder端输出为纯汉字,其中输入端词典里的汉字不参与预测,直接到输出端。
2.1.3 指代消解
实现思路:分词,词性标注,依存句法分析,主谓宾提取,实体替换/指代消解。举例说明:输入1:感冒/nhd 可以/v 投保/vn x保险/nbx 吗/y?输入2:那/rzv 癌症/nhd 呢/y?
输出:癌症可以投保x保险吗?
SBV(subject-verb):主谓关系,ADV(adverbial):状中结构,HED(head):核心,VOB(verb-object):动宾关系, nhd:疾病,v:动词,vn:名动词 ,nbx:自定义专有名词。
用户先问“感冒可以投保x保险吗?”,再问“那癌症呢?”,第二次问的时候省略了动词和宾语,我们用癌症替换第一问的感冒得到被消解过的问句输出。更多例子,数词消解,代词消解:输入1:x保险很好输入2:这个产品比y保险好在哪?输出:x保险比y保险好在哪?输入1:x保险、y保险都是医疗险吗输入2:第一种能报销啥 -> x保险能报销啥输出:第二种呢 -> y保险能报销啥2.2 检索模块
检索模块包含字面检索、深度语义匹配和KBQA召回,利用这三种检索方式各自的优势,增加召回答案的数量与多样性。对多路检索召回的答案进行合并,提供给排序模块,进行最终决策。
其中,字面检索使用ElasticSearch(ES)检索,ES是基于lucene分布式开源搜索引擎,采用BM25算法,高效实用。
深度语义检索方面,使用深度语义模型对用户query以及知识库里的知识(标准问与扩展问)进行语义向量表示,使用annoy算法来进行语义向量的快速查找与匹配。深度语义模型使用孪生网络(siamese network)进行建模,对于每个query,使用标注的相似说法作为正样本,负样本使用随机采样的方式产生,且每次迭代都进行随机采样,大大增加训练数据的随机性,提升模型的泛化能力。
在loss函数的选择方面,我们对比了Cross Entropy Loss与hinge loss,hinge loss在最大化正样本的相关性的同时,能够更直接地抑制负样本的相关性,且避免陷入对单个样本的过分优化,取得了更好的整体效果;同时我们借鉴了人脸识别的loss定义,引入了AMSoftmax作为loss函数,取得了最佳的效果。
在特征提取方面,为了更好的提取局部语序关系以及上下文信息,我们使用了LSTM、CNN、Attention、BERT等网络来提取特征,其中BERT的效果最好,但耗时较长,由于大规模工业语料标注质量有限,存在部分数据噪声,越复杂的模型拟合的噪声越多,泛化能力反而不如简单模型,因此,我们选择了cbow模型来进行特征提取。
考虑到中文分词在特定领域效果有限,为了降低分词错误的影响,我们同时使用了多个维度的预训练向量来进行建模,包括:字向量、词向量、高频短语向量,其中字向量可以解决字面匹配,词向量可以解决词语的语义,短语向量能够捕获局部范围内的语序关系,取得了最佳的效果。
我们在保险业务数据集上对相关模型的实验结果如表1所示:
表1:深度语义模型召回率对比
KBQA方面接收预处理后的问题信息,以问题上下文、实体类型以及实体关系为特征,通过问题识别模型预测要查询的主题实体,从KG中将以该实体为中心的相邻几跳范围内的节点和边抽取得到一个KG子图,子图中的每一个节点或边都可以作为候选答案,我们会根据不同的值类型和特点过滤得到最终的答案候选集。
三个召回模块各有优势,分别解决字面匹配、深度语义匹配和带有逻辑推理的问答,三者结合效果好于任何一个单独模块的效果。2.3 排序模块
排序模块包含了深度排序模型以及规则排序,其中深度排序模型主要用于对多路召回的答案进行归并、打分,规则排序则主要用于对排序后的答案进行再次规则验证,保证输出答案的合理性及稳定性。
在深度排序模型的选择上,我们使用了常用的PairWise的排序模型,考虑到该模型对于数据收集的难度较低。在模型的建模层面上,模型输入样本的格式为<用户query,候选答案>的pair对,通过构造打分器,使得正确匹配的样本打分尽量高(归一化后趋近于1),错误匹配的样本打分尽量低(归一化后趋近于0),通过不断输入样本,学习得到最终的用于排序的打分器。
深度排序模型在特征选择方面,较语义检索模型使用了更加丰富的特征。在语义匹配特征的构造上,语义检索模型使用的是表示模型,用户query与答案分别计算语义向量,而深度排序模型使用的是语义交互模型,不仅考虑了这两部分的语义向量,同时还考虑了这两部分的交互信息计算,能够进行更高精度的匹配。除了语义特征,我们的模型使用了<用户query,候选答案>中的共现词来进行字面特征的建模。为了更好的匹配用户的意图,我们构建了保险领域的意图分类器,对用户query以及候选答案分别进行意图特征抽取,作为排序模型的输入。除此之外,句式特征我们也做了一些尝试,也取得了不错的效果。
如下图所示我们采用运行效率较高的CNN网络,将用户问每个词对应的词向量拼在一起形成sentence matrix, 然后采用不同的filter对矩阵分别提取feature map,经过一层max pooling层后将所有特征拼接得到向量x,匹配问也经过同样的操作得到向量y,M为相似度矩阵,里面的参数通过训练来调整,xMy得到sim特征,然后我们把tfidf特征,共现词特征等和sim特征拼接,最后经过全连接层和softmax层,输出得分向量和预测得分。我们根据模型的预测得分对匹配问句列表进行排序。2.4 输出****模块
获取排序匹配问列表,如果置信度低于预先设置好的阈值,则做问句澄清,让用户确认他要问的问题并做关联问推荐。如果置信度高,则根据业务需求返回top1匹配问对应的答案或者推荐问。
2.5 智能知识库
我们的智能知识库承载着问答知识的全流程管理,可以随时随地地给FAQ引擎提供最新最全的知识内容。与普通的知识库相比,我们的知识库智能之处体现在FAQ问答日志的回流和挖掘处理。
一个问题未应答可能由于以下两个原因,一个是知识库中有对应的知识,但是FAQ引擎召回的候选问题score没有超过threshold所以不作回答,另外一个原因就是由于知识缺失,整个知识库就没有对应的知识。如果这两个问题可以得到比较好的解决,FAQ的问答效果就可以得到很好的提升。对于一个没有被应答的用户问,如果是由于前者造成的,只需要找到知识库中对应的知识条目,将这个用户问作为这个知识条目的一个问题问法加入。这样,等下一次类似的问题请求道FAQ引擎的时候,对应问题的score就会大大提升,从而可以返回正确的答案。对知识缺失引起的未应答问题,就需要补充问题的一些属性,以及答案,下次类似的请求过来就可以返回新增的知识条目给用户,从而提升问答能力。
针对平安的背景,我们在挖掘和标注环节做了大量的优化,但是对于别的有一定日志体量的问答系统,我们这套方案也具有普适性。具体流程如下图所示:
3 评价指标
问答评估指标主要包含有效问数量、Top1应答准确率、Top3准确率、有效问题响应准确率和知识覆盖率。
测试集分为5类,分别是线上日志抽样评估模型线上效果,badcase收集,高频问挖掘用以算法回归测试,根据需求编写的语义测试集全面覆盖需求点,对语料进行删除非关键词、增加噪音、同义词转写等十余种方法进行生成的字面测试集,用以评估模型的鲁棒性。通过人工标注问答Top10答案里是否有能正确答案来判断该问题是否是知识缺失,如果是知识缺失则请业务专家补充答案到知识库。
4 总结
本文提出一种带上下文理解,纠错,长难句压缩,ElasticSearch和Siamese CBOW深度语义匹配检索,深度学习排序的问答系统。在工程效率和模型准确率上均有不错的表现,符合工业届高并发、高可用上线标准。上线了基于该问答系统的智慧客服、AI助理、慧小安等人机交互AI产品。
我们期望未来我们的问答系统能支持除文本、语音外的图片、音视频等多媒体交互,从而更好地理解用户,解决用户更多的问题。
REFERENCES :
[1] Yunqi Qiu, Manling Li, Yuanzhuo Wang, Yantao Jia, Xiaolong Jin,2018, Hierarchical Types Constrained Topic Entity Detection for Knowledge Base Question Answering,ACM 2018, April 23–27, 2018 , Lyon, France.
[2] Minghui Qiu, Feng-Lin Li, Siyu Wang, Xing Gao, Yan Chen, Weipeng Zhao, Haiqing Chen, Jun Huang, Wei Chu, 2017, AliMe Chat: A Sequence to Sequence and Rerank based Chatbot Engine, ACL 2017 pages 498-503
[3] Kim Y. Convolutional Neural Networks for Sentence Classification[C] Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP). 2014: 1746-1751.
[4] Tom Kenter,Alexey Borisov,Maarten de Rijke, 2016, Siamese CBOW- Optimizing Word Embeddings for Sentence Representations, ACL 2016
[5] Paul Neculoiu,Maarten Versteegh,Mihai Rotaru, 2016, Learning Text Similarity with Siamese Recurrent Networks, ACL 2016 Proceedings of the 1st Workshop on Representation Learning for NLP, pages 148-157
[6] Aliaksei Severyn,Alessandro Moschitti, 2015, Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks, Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information Retrieval pages 373-382
[7] Ashish Vaswani, Noam Shazeer, Niki Parmar, 2017, Attention Is All You Need, NIPS 2017
[8] Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova,2018, BERT: Pretraining of Deep Bidirectional Transformers for Language Understanding, Computation and Language 2018
[9] Matthew E. Peters, Mark Neumann, Mohit Iyyer, Matt Gardner,Christopher Clark, Kenton Lee, Luke Zettlemoyer, 2018, Deep contextualized word representations, NAACL 2018
[10] Alec Radford, Karthik Narasimhan, Tim Salimans, and Ilya Sutskever. 2018. Improving language understanding with unsupervised learning. Technical report, OpenAI.