本笔记主要解析DataFunTalk公众号上发布的文章《李向林:OPPO自研大规模知识图谱及其在小布助手中的应用》中问答系统搭建方面的内容
文章目录
- 1、领域分类
- 2、结构化问答
-
- 2.1、链式查询
-
- 2.1.1、实体抽取与链接
-
- 2.1.1.1、候选实体召回
- 2.1.1.2、实体消歧
- 2.1.2、Query解析
-
- 2.1.2.1、属性和模板的挖掘
- 2.1.2.2、在线模板匹配
- 2.1.3、模板语义匹配–解决长尾属性解析失败
- 2.2、 多变量约束
- 2.3、比较推理查询
- 2.4、实体关系查询
- 3、非结构化问答
- 4、总结
1、领域分类
将对话领域划分为三大类,闲聊、任务对话和知识问答
- 闲聊:使用检索式、生成式算法
- 任务对话:利用帧语义的算法对query进行结构化解析
- 知识问答:分为基于知识图谱的结构化问答和基于阅读理解与向量检索的非结构化问答。(大多数“为什么”、“如何”、“怎么样”等语句结构化方法处理不了,就需要非结构化的方法获取答案)
2、结构化问答
结构化问题采用KBQA的方案解决,最开始对query进行分类,针对不同类型的query会采取不同的技术路线获得答案
2.1、链式查询
基础的链式查询就是正常的单跳、两跳、甚至多跳查询,如下问句所示:
- 单跳:刘德华的年龄
- 两跳:刘德华的老婆的年龄
- 多跳:刘德华的老婆的爸爸的年龄
在基于知识图谱的问答系统中,一般主要解决的是链式查询问题,其主要的技术路线有两三种(模板法、Semantic Parser、Information Retrieval等)
当用户输入的query可以使用KBQA解决,一般会对query进行实体识别/实体链接、query解析和答案生成。比较传统的方法是模板法,需要先离线根据问答历史建立模板库。主要是归纳总结以往回答过的问题,构造出问题模板与对应的查询模板。在线时,先将query匹配的模板库中的问题模板,进而得到对应的查村模板,最后实例化查询模板,即从query中提取语义内容填充到模版本中得到真正的查询语句。
离线时主要会进行别名挖掘、新词发现、属性归一、模板挖掘,最终更新知识图谱和图数据库;而在线时会进行实体抽取、实体链接、属性识别、约束挂载、模板匹配和常委模板的语义匹配等,最后在图数据中进行知识查询或者更具查询结果进行推理计算
2.1.1、实体抽取与链接
OPPO主要将KBQA应用于终端设备的语音助手中,输入是以语音为主,该场景下实体往往存在别名以及语音识别错误的特点。语音输入时,用户往往会对想要查询的实体所别名;其次,语音识别的错误率也相对较高,导致相较于文本的query差异较大。
实体抽取和链接主要包括三个步骤:
- 实体识别:BiLSTM+CRF等常规NER算法
- 候选实体召回:基于实体识别获得的实体提及/mention,从上文中描述的构建的引射表中获取该mention对应的候选实体。映射表主要是通过离线的方式从文本、问答历史记录中挖掘得到。
- 实体消歧:从候选实体中选取真实对应的实体
实体链接目的是因为从query中提取mention在知识图谱中可能对应多个不同类型的实体,需要结合query的语义从候选实体中选取真正的实体。
2.1.1.1、候选实体召回
候选实体召回主要的工作是需要挖掘别名映射表,这一过程主要是离线完成的,同时在系统工作过程中也会积累新的知识,需要定期对其进行更新、补充。
针对别名问题,最基础的解决方案是基于知识图谱的实体别名建设一个映射词表;其次,针对复合实体,利用图谱中的上位词挖掘实体复合词。针对语音识别错误问题,采用内部大量搜索点击日志,利用点击网页中title包含的标准名和对应的query做匹配。匹配时的输入特征有两类:偏旁部首的特征(倩雅集和晴雅集)以及拼音特征(分马奥特曼和风马奥特曼)。将候选标准名的特征和query的特征进行聚类,最终选取距离最近的标准名。
针对用户输入错误、同音字、近音字这类别名挖掘;构建基于特征聚类的别名发现流程。挖掘步骤如下:
- Query筛选:采用领域关键词过滤、搜索点击日志筛选的方式,从用户搜索query和小布助手线上query中筛选出可能包含待挖掘别名的query
- 实体识别:使用实体识别技术,从待挖掘query中识别实体。实体识别模型采用通用实体识别模型+垂域finetune的方式得到
- 领域特征构建:由于实体识别直接得到的实体别名准确率不高,而且没有和实体标准名关联起来,需要构建领域特征,将挖掘的实体别名与实体标准名关联。根据场景特点,选取了部首偏旁特征和拼音特征
- 特征聚类:使用聚类的方式来关联挖掘的实体别名与实体标准名。通过使用这套挖掘方案,得到数十万实体别名,准确率95%+,解决了线上高频的别名问题
2.1.1.2、实体消歧
实体消歧是对query和候选实体的匹配度进行打分,选择最匹配的实体;如果所有候选实体的匹配度均低于预设的阈值,则会输出一个特殊的空类别。主要有以下问题:
- 大多数场景下为短文本,上下文特征缺失,需要额外构造特征帮助消歧
- 消歧时不能仅仅通过语义特征来消歧,还要充分考虑全局消歧特征
- 图谱中存在未对齐实体,导致模型消歧困难,同时容易出现语料标注错误。例如中国和中华人民共和国在有些开源图谱中是两个实体,导致训练集里有些正确标签中国这个实体,有的正确标签为中华人民共和国这个实体。
数据准备:
- query样本:在query中的mention两边添加标识符#,使模型能判断mention在query中的具体位置,如“#李白#所在朝代的皇帝是谁”
- 实体描述样本:需要包含待消歧实体的特征,一般包括mention与实体名称是否一致、实体类型、实体描述和图谱的三元组信息,如“李白,名称相同,非主义项,类型:游戏角色,李白是腾讯手游《王者荣耀》中的一位刺客型英雄角色,原型为唐代诗人李白。”
- 统计特征:为避免消歧模型只关注语义特征,统计以下统计特征,作为模型输入,辅助进行全局消歧
- query和实体样本共现特征:query与实体样本的Jaccard距离
- 流行度:实体描述长度,需进行归一化
- 丰富度:实体属性个数,需进行归一化
- mention共现特征等:与其他mention的共现,需归一化
模型选型:
DeepJoint从排序出发,DeepType从分类出发,都能取得较好的效果,说明分类和排序任务都对消歧有帮助,因为根据任务特点,设置多任务模型架构,同时进行排序和分类(实体类型分类),两个任务共享模型参数,一起训练,损失函数一起优化,通过共享排序任务和分类任务信息,模型有更好的表现,流程如下图所示。
将query样本和实体描述样本拼接输入到RoBERTa预训练模型中,将句首的CLS位置的向量与统计特征embedding拼接后作为特征向量。排序任务将特征向量输入全连接层,再经过tanh输出[-1, 1]区间的得分,分数越高越可能是目标实体;分类任务将特征向量输入全连接层,经过softmax层输出各个类别的可能性。模型优化的损失函数就是两个任务对应损失的加权和。
模型优化方法:
- 置信学习
- 对抗训练
2.1.2、Query解析
- Semantic Parsing类方法
- 基于模板的方法,高准确率低召回率
- 查询图方法(Query Graph)
- Information Retrieval类方法:用户问题和问题中心词在图谱中扩展的子图/Subgraph的相似度
- OPPO的方法
- 模板+查询图+语义匹配pipeline:主要为语义解析类方法,对解析失败的长尾属性采用语义匹配的方法进行兜底
- 高效,badcase修复简单
2.1.2.1、属性和模板的挖掘
首先是离线挖掘用于语义解析的常见模板。采用远程监督模板挖掘的方式,利用互联网中的问答数据,将这些语料与知识图谱进行匹配,得到问答库中实体的属性,最后得到问答语料中常见的query模板。例如,“q:刘德华多少岁了 ans:59岁”这个问答,经过图谱属性检索,得到query实际上在询问某个人的年龄属性。类似的,我们可以得到询问某个人的身高属性、年龄属性、出生地属性的query,据此生成一系列query模板。基于挖掘的模板,训练一个语义匹配分类模型,其输入是原始query和一个候选query属性。此外,在训练过程中,将实体mask掉,旨在使模型学习query在实体信息之外的语义与实体属性的相关性。在模型训练完毕后,使用线上query日志,先对它们进行实体抽取,然后将query以及图谱中query实体所对应的所有候选属性输入模型,进行语义匹配的预测任务,得到一部分较高置信度的候选模板。输出模板会交由标注人员进行校验,最终得到的模板会加入query解析的算法模块中。如下图所示
2.1.2.2、在线模板匹配
离线完成模板挖掘后,在线时就使用其进行query解析获取答案。以一个具体例子解释如何使用模板解析在线的KBQA问题。比如用户输入query为“印度的首都有多大”,即用户的真实意图是询问新德里的面积。首先,我们会对query做实体识别,将“印度”映射至图谱中的“country”,利用模板将“首都”映射至“country_capital”或者“dynasty_capital”,同理将“有多大”归一化至“person_age”、“place_area”、“company_area”、“star_volumn”等属性。此时还不能完全确定对应的属性,会将所有的候选属性进行排列组合,结合剪枝的方法(根据识别出的实体类型和属性之间的关系进行剪枝。如果属性类型不存在冲突,无法直接进行剪枝操作,那么对候选模板进行热度排序,即若一个模板在训练集出现的频次更高,优先考虑这一模板),选择最有可能的模板,生成中间表示式。在上面的例子中,最佳模板是country->country_capital->place_area。这个query实际上是个两跳的问题,利用单条模板将其中一部分抽象为一个子查询,如“country->country_capital”。具体地,将子查询与剩余的查询模板拼接在一起,生成一个复合查询。在执行知识图谱的查询的时候,首先执行子查询,并将其替换为查询得到的实体,最后按照生成的query继续在图谱中搜索最终的结果。如下图所示
2.1.3、模板语义匹配–解决长尾属性解析失败
虽然离线挖掘了大量的归一化模板,但是这一方法依然对一些极端情况效果不佳。由于用户输入的不确定性,模板存在长尾query欠召回的问题。考虑到线上效率问题,很难完全将query与所有模板进行模型的语义匹配打分。基于上述问题,提出类似于双塔模型匹配的方案:将模板通过BERT模型生成对应的模板向量,建立模板向量索引。当无法得到合适的模板进行query解析时,输入query会经过BERT模型得到query向量,随后在模板向量索引中召回一部分相似模板向量,最后通过人工设定的阈值判断是否接受候选模板。在实际业务中,使用这一方法进行应答的占比较小。如下图所示
在确定最终的查询模板后,就可直接在图数据库中执行,获取答案
2.2、 多变量约束
问句示例:
- 刘德华99年演过的电影;其中99年就是约束
- 出生在重庆的男歌手:其中出生地重庆和男都是约束
利用问句分类模型判断query属于多约束查询后,将query中包含的所有约束识别出来;不在图数据库上直接执行查询操作,而是使用ES(ElasticSearch)进行多条件查询,因为图数据库上检索耗时很大;最后将ES查询进行热度排序,输出相对合理的结果
2.3、比较推理查询
问句示例:
- 乌克兰和俄罗斯哪国人口多
- 刘德华和张学友谁的年龄大
分类模型判断query属于比较推理查询问题后,因为是要对多个实体中的某一个属性进行对比,故先将query中的多个实体提取出来,然后判断需要查询的属性在实体中是否可比;若多个实体中该属性是科比的,就执行推理计算,最终输出推理查询的结果。
2.4、实体关系查询
问句示例:
- 刘德华和梁朝伟的关系
- 你的爸爸和你是什么关系
3、非结构化问答
业务设定中,使用KBQA的优先级大于使用非结构化问答框架的优先级。如果KBQA无法针对输入query返回结果,那么query会被输入至非结构化问题的向量检索框架中以求得到答案。非结构的问题使用阅读理解/MRC+DeepQA的框架来处理
- MRC:先使用阅读理解模型构建离线问题-答案的数据库,即QA的数据库。首先,利用搜索query中包含的URL和点击日志,获取query对应的网页文本数据;随后,将query与网页文本数据输入MRC模型,得到query在文本中对应的答案;之后,答案会经过一个离线训练好的“答非所问”判别模型,筛选出那些与query真正相关的答案,完成QA数据库的构建。使用rikinet执行MRC任务,其会对文本进行段落划分,在语言模型attention机制中不同段落之间没有信息交互,避免不同段落之间的噪声信息影响答案信息,对网页中长文本的数据处理效果最优
- DeepQA:基于构建的QA库,使用双塔模型构建QA数据库的向量索引。Query被双塔模型进行语义向量编码,随后在索引库中进行向量召回得到topK候选QA对。由于向量召回的方案会丢失query与答案的交互信息,在得到候选QA后,query向量与候选向量会经过一个精排模型增强语义交互,得到最终的精排排序打分。根据预设的阈值,我们可以选择接受或拒绝候选QA结果
4、总结
本笔记的主题是DataFunTalk公众号上发布的一篇文章,其内容是OPPO如何在搭建语音助手的问答系统,主要讲述了基于知识图谱的KBQA方法。本笔记对整个技术路线进行了梳理,结合OPPO官方发布的一篇实体连接的文章补充了实体链接方面的细节,结合之前一篇关于小米的实体链接的笔记可知,大致的技术路线是一致的,也解答了之前笔记中留下的一下疑惑。有兴趣的读者可以取看一看。本笔记中难免存在错误,若发现也请评论指出,相处学习。