NLP-前沿重器[3] | 平安智能问答系统

 

前沿重器

全新栏目,那么栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

平安在ROCLING 2019上发表了一篇有关智能问答系统的论文,比较全面的讨论了一套智能问答的方案,这篇文章的特点在于详细系统地讲解了FAQ任务的常规方法和体系,对我们构造单论检索式对话、智能问答等任务的建设有很大意义,加之平安本身有非常强的问答需求,文章对智能问答的理解深度也体现的非常明确。

知乎上平安官博给了文章的中文版解释:https://zhuanlan.zhihu.com/p/111380177

懒人目录:

  • 总体框架
  • 预处理模块
  • 检索模块
  • 排序模块
  • 知识库
  • 小结

总体框架

要说到整体方案,最必不可少的就是框架了,整体流程都总结在这张图里面了:

NLP-前沿重器[3] | 平安智能问答系统
img

相比之前提到的小冰的那套方案其实类似(前沿重器[1] | 微软小冰-多轮和情感机器人的先行者),看多几个案例其实大家心里的内容也就明确多了,这样一来在大家的脑海里也对这整个框架有了更加深入的理解。具体再理一下:

  • 问题输入。大部分情况是文本,特定语音助手场景下可能还会经过ASR将语音转文字。
  • 预处理。对query进行预处理,将其关键信息提取或者抽象化。
  • 检索。一方面通过传统的搜索引擎模式,如ES进行;另一方面进行语义召回,一般就是向量召回的方式获取。当然还有通过知识库进行推断的方式,这里面可能还会涉及对话管理的技术。
  • 排序和重排。根据语义等多重信息对召回的结果进行排序,最终获取结果,重排阶段还可能根据dialog policy进行调整和更新。
  • 结果输出。常用的输出一般是文字就完事了,当然还可能会有TTS这种文字转语音的结果。

剩下的就慢慢开始展开讲吧。

预处理模块

但凡做过这个预处理模块,就知道Query预处理工作的繁杂,这里面列举的是非常常见的子模块了:

  • 分词。NLP基操。
  • POS。词性标注,一般使用的是序列标注的方法,也可能和实体抽取一起做。
  • NER。实体识别,从中抽取特定的实体词,其实也是用序列标注的方案,例如CRF系列等。
  • QR。纠错,句子中出现的错误需要被纠回来,否则无法完成后续的检索。
  • 意图。对query进行意图识别,看看用户具体要问的是什么东西,以便进行下游的定制化处理。
  • 句子压缩。NLP对于长句的处理可能不能精准识别关键信息,有的时候还需要拆句,因此会通过缩句的方式抽取关键内容。
  • 指代消解。NLP经典难题,分析“他她它”、“这个那个”之类所指代的内容。
  • 重构改写。有的时候用户的说法会比较多,会有自己的习惯说法,尤其是一些专名,例如英雄联盟里面用户不喜欢说“法外狂徒”、“格雷福斯”,而喜欢说“男枪”,那就需要我们进行改写。
  • 情感分析。这块在小冰那里体现的非常丰富,在平安客服中也有体现,对生气的用户进行一定的安抚。

上述任务几乎都是属于NLP领域的任务,拆解下来或好或坏都已经有非常专业的模型方法和技术手段实现,因此此处就不再展开了~

检索模块

传统搜索模式

之前谈过检索式对话(NLP.TM[38] | 对话系统经典:检索式对话),说过有关思路,这里利用传统搜索的方式来做处理,其实就是把智能客服当做是经典的检索式对话来处理,真可谓是简单快捷,此处文章提到的Elastic Search,即ES其实就是经典的搜索引擎,在对数据构建索引后,对新来的解析好(预处理好)的数据,就可以通过拼ES串(检索语法树),即一种类似SQL的方式完信息检索,把满足条件的根据一定的要求(BM25等相似度计算)返回。

语义召回

这里要详细说的还是语义召回。我最早接触到语义召回的方式来源于推荐系统,在进行协同过滤时用表征用户的向量召回相似用户返回相似用户的历史点击作为一路召回,而在对话系统里面,我们同样可以这么做,主要是两个方案:

  • 第一种是将用户query向量化(例如word2vector,当然含有更复杂的方法),然后召回历史出现过的相似问题,相似问题对应的回答就可以是答案。也就是Q->Q->A的模式。
  • 第二种就是Q->A的方式。直接召回结果。

无论是第一种还是第二种,实质上就是要对句子进行语义表征,然后通过向量召回的方式召回结果,于是解决问题的关键就落在了两个关键点上:

  • 平行数据的构建。
  • 语义相似度建模。

前者是数据集构建的问题,常规方式就是直接从历史对话里面获取,然后根据效果整理、拓展、增强,这就是算法工程师的内功了。后者则是一个学术界已经被很经常谈到的问题了,以DSSM为基础,辅以多种特征抽取层进行处理,平安对LSTM、CNN、Attention、Bert都进行了尝试,虽然BERT不出意外的得到了最好的效果,但是由于耗时的原因最终选择的是cbow(呃呃呃),而在切词粒度上,使用的是词组粒度效果最好,优于简单的字和词语,语义更为丰富,大家可以参考。

KBQA

KBQA是基于知识图谱的一种问答方案,依赖问题上下文,实体类型、实体关系之类的特征和信息挖掘,在线通过实体链接查找附近节点返回候选答案。

排序模块

早期的排序基本都是用的规则,而在可召回内容逐渐变多、提升点逐渐复杂后,逐步升级为以机器学习和深度学习为基础了。

在模型上,选择的是pairwise模型,输入样本则是<query,candidate>的pair对,大概结构就是这样的:

NLP-前沿重器[3] | 平安智能问答系统
img

至于特征,上面的结构图给出了很多,大家真应该好好那小本本记下来,别一天到晚只想着语义特征了:

  • 还是大家熟悉的语义向量,这个可以来自于各种预训练语言模型。
  • 语义向量计算后得到的相似度矩阵。
  • 问答对的共现情况(交集个数、重要度、占比等),如TF-IDF、BM25、编辑距离,属于文本层面的匹配。
  • 抽取关键词和实体后的关键词匹配打分、实体匹配打分。
  • 特定逻辑的匹配,例如“什么时候”、“多少钱”、“怎么优惠”等的特定逻辑匹配。
  • 意图和标签的匹配。用户问的价格那回答就需要是价格回答才行。

输出模块

最终在结果输出之前,还进行了一个阈值的计算,如果阈值不足,会进入问题澄清的策略,要求用户对问题进行澄清,并给出一些问题的推荐,如果阈值一样,那就可以给出最终结果了。

这个策略非常类似多轮对话中的dialog policy,即根据一些情况判断对话策略,而其实在多轮对话中,我们需要有一套完整的对话管理引擎,涉及对话状态追踪、对话策略等模块,此处平安的文章里面没有详细提到,所以此处也不展开说了,有兴趣可以看看我之前讲小冰的文章(前沿重器[1] | 微软小冰-多轮和情感机器人的先行者),你会有个大概的了解。

知识库问题

这里补充讲讲上面提到的知识库,即KG,知识图谱,知识库是一种存储具象知识的一种模式,结构化知识的构建有利于对问答系统上限的提升,平安对这块花了不少的力气,构造出覆盖数据生成、回流、挖掘、标注、存储一系列工作的工作流:

NLP-前沿重器[3] | 平安智能问答系统
img

其中值得关注的是对未应答query的处理,先究其原因,未应答的理由可以被分为知识库未召回或阈值不足和知识缺失,前者只需要将问句补充入库,提升阈值即可,后者则需要对知识进行补充,这依赖新知识的挖掘和补充。

小结

平安虽然并非所谓的大厂,但是其结构化的一些思路,尤其是本篇文章,依旧给我们提供了很多具体方案上的建议,让我们在方案设计时有更多扎实可靠的参考,通读本文下来,我们能够获得的应该是一套完整的智能问答系统方案,非常稳妥可靠。划几个重点吧:

  • 智能团队对话系统的具体框架和流程。尤其是以检索和语义召回为中心的两条线的上下游处理。
  • 预处理模块可能需要涉及的工作,有必要的,也有升级的,可以根据项目进展迭代进程逐步增加新功能。
  • 排序上列举了不少可以使用的特征,让我们在优化效果的时候有更多明确的方向。

NLP-前沿重器[3] | 平安智能问答系统

原文始发于微信公众号(CS的陋室):NLP-前沿重器[3] | 平安智能问答系统

技术

NLP-心法利器[1] | NLP知识蒸馏思考

2022-5-23 8:36:04

技术

NLP-心法利器[7] | 漫谈语义相似度与语义向量表征

2022-5-23 8:36:13

搜索