导读:OPPO 知识图谱是 OPPO 数智工程系统小布助手团队主导、多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答、电商搜索等场景。
本文主要分享 OPPO 知识图谱建设过程中算法相关的技术挑战和对应的解决方案,主要包括实体分类、实体对齐、信息抽取、实体链接和图谱问答 query 解析等相关算法内容。
全文围绕下面四点展开:
首先和大家分享下小布助手和知识图谱的背景。
小布助手是 OPPO 旗下有趣贴心、无处不在的 AI 助手,搭载在 OPPO 手机、OnePlus、Realme 以及如智能手表等 IoT 智能硬件上。它可以为用户提供系统应用、生活服务、影音娱乐、信息查询、智能聊天等服务,进而挖掘潜在的用户价值、营销价值和技术价值。
在 2020 年年底,OPPO 开始着手构建自己的知识图谱。经过一年左右的时间,OPPO 已经构建了数亿实体和数十亿关系的高质量通用知识图谱。目前,OPPO 知识图谱支持了每天线上数百万次的小布问答请求。进一步,OPPO 正将通用知识图谱逐渐扩展到商品图谱、健康图谱、风控图谱等多个垂类。
接下来为大家介绍 OPPO 知识图谱的整体架构。如上图所示,它由三大部分组成。最底层是通用的数据处理平台和图数据库相关框架。我们具体选取 Nebula Graph 来存储图数据。中间层包含数据获取、图谱构建和图谱管理模块。最顶层涵盖了 OPPO 图谱各种应用场景,包括智能问答、搜索推荐、内容理解、安全风控、智慧健康等。
下面介绍应用知识图谱的三个核心算法:实体分类、实体对齐和信息抽取。
实体分类根据图谱预定义的 schema 对实体进行归类,进而可以使我们对实体进行属性、关系的关联。同时,实体分类可以对下游的实体对齐、实体链接和线上的智能问答业务等提供重要的特征。目前,我们采用规则+预训练语言模型文本分类的 pipeline 方案。在第一阶段,我们利用如百科中对实体的描述,使用预定义的规则处理大量半监督的伪标签数据。随后,这些数据会交给标注同事进行校验,整理出有标签的训练集,结合预训练语言模型训练一个多标签的文本分类模型。值得一提的是,我们为业界提供了一个大规模实体分类数据集,组织了 2021 CCKS 通用百科知识图谱竞赛,吸引了数百只队伍参赛。
实体对齐任务是知识图谱构建中比较关键的环节。在互联网的开源数据中,同一实体在多个来源下存在相似或者相同的信息,若将这部分冗余信息全部包含在知识图谱中,那么在下游使用知识图谱进行信息检索时会带来歧义。所以,我们对多源相同的实体进行信息整合,减少信息冗余。
具体地,由于知识图谱中的实体规模达到了上亿的量级,考虑到效率问题,我们提出了 Dedupe+BERT 语义分类的两阶段方案。在第一阶段,我们采用并行处理的方式将名字、别名相同的实体进行分组,输入 Dedupe 数据去重工具,生成第一阶段实体对齐结果。我们要求这一阶段的结果的准确率很高。在第二阶段,我们会训练一个实体相关性匹配模型,其输入是一对候选实体,旨在调整、补充第一阶段的对齐结果。
在实体分类与对齐后,由于数据源存在信息缺失,图谱中存在一些实体缺失部分关键属性。我们将缺失属性的实体分成两类,使用信息抽取的方法对它们进行属性补全。
第一类是常见的实体与属性,如国家的首都、人物的年龄和性别等。我们使用百度 CASREL 模型以及业界常用的开源数据集训练一个关系抽取模型。模型的结构可以看作一个多标签的指针网络,每个标签对应一个关系类型。CASREL 首先抽取句子中的主实体,再将主实体的 embedding 输入指针网络,预测每一个关系下句子中的客体起始位置和终止位置,最后通过设定的阈值来判定 SPO 三元组是否可信。
第二类是长尾属性,它们在开源数据集上标注较少。我们利用阅读理解(MRC)模型抽取长尾属性。如我们想要抽取“某奥特曼的人间体”这一属性,我们就将“某奥特曼的人间体是谁”这一问题作为 query,检索文本结果,使用阅读理解模型判断文本中是否包含“人间体”的客体。
总结来说,在构建知识图谱的过程中,我们应用了实体分类、实体对齐与信息抽取任务,希望通过它们来提升知识图谱的质量和丰富程度。后续建设过程中,我们希望在现有的框架下将实体分类基于迁移学习扩展到商品分类、游戏分类等垂域场景。此外,目前的实体对齐任务还较为基础,我们希望在未来结合多模态、节点表示学习等多策略对齐方案。最后,对于信息抽取任务,我们希望借助大规模预训练语言模型,基于少量标记样本,甚至零标记样本,来抽取实体关系。我们还考虑应用实体抽取算法,使得它可以落地于小布助手的业务场景中。
第三部分重点介绍知识图谱在小布助手业务场景中的应用。
小布助手按照对话领域可以划分为三大类:闲聊、任务对话和知识问答。其中,闲聊类使用检索式、生成式算法;任务对话利用帧语义的算法对 query 进行结构化解析;知识问答进一步细分为两部分,基于知识图谱的 KBQA 的结构化问答和基于阅读理解与向量检索的非结构化问答。
首先介绍知识问答。对于结构化问题,我们采用 KBQA 来解决;对于非结构化问题,我们采用 DeepQA+ 阅读理解的框架来处理。
对于结构化问题,在小布助手的应用中有四大类 query:
我们针对结构化问题设计了一套基于 KBQA 的算法框架。首先,在接收到线上用户的 query 输入后,我们会先对其进行领域识别以及意图分类。若 query 是可以使用 KBQA 解决,那么我们会对 query 进行实体识别、query 解析和答案生成。这三个主要步骤又可以通过在线和离线两方面进行进一步归类。比如,离线 KBQA 会进行别名挖掘、新词发现、属性归一、模板挖掘,最终更新知识图谱和图数据库。在线 KBQA 会进行实体抽取、实体链接、属性识别、约束挂载、模板匹配和长尾模板的语义匹配,最后在图数据中进行知识查询或者根据查询结果进行推理计算。
小布助手的输入以语音为主,所以小布助手场景下实体往往存在别名以及语音识别错误的特点。在语音输入时,用户往往不会说出人物的完整名字,而是采用别名。其次,语音识别的错误率相对较高,导致输入相较于网页上的 query 输入差异较大。针对别名问题,最基础的解决方案是基于知识图谱的实体别名建设一个映射词表;其次,针对复合实体,我们会利用图谱中的上位词挖掘实体复合词。针对语音识别错误问题,我们会采用内部大量搜索点击日志,利用点击网页中 title 包含的标准名和对应的 query 做匹配。匹配时的输入特征有两类:偏旁部首的特征(倩雅集和晴雅集)以及拼音特征(分马奥特曼和风马奥特曼)。我们将候选标准名的特征和 query 的特征进行聚类,最终选取距离最近的标准名。值得一提的是,在生成实体映射词表前,我们还会进行额外的人工校验。
在对用户 query 进行实体识别之后,我们需要进行实体链接任务。以“李白哪个技能最厉害?”这个 query 为例。“李白”这一实体会在知识图谱中对应着多个不同类型的实体,如游戏角色、唐代诗人、李荣浩歌曲、撒贝宁妻子等。此时,我们需要结合 query 的语义来选取真正的实体。
实体链接会经历三个步骤。首先,我们采用 BiLSTM+CRF 进行实体识别;之后,我们会在知识图谱中召回候选实体;最后,我们基于实体消歧模型,对 query 和候选实体的匹配度进行打分,选择最匹配的实体。若所有候选实体的匹配度均低于预设的阈值,我们则会输出一个特殊的空类别。
上图呈现的方案是我们团队在参加百度千言实体链接比赛中提出的。它采用了多任务训练框架(语义匹配+实体类型分类),引入了对抗学习策略,融入了统计类特征(如实体的热度、实体的丰富度等),并加入了多模型集成的方法。最终我们在千言实体链接比赛中斩获第二名。具体地,我们将 query 与实体的相似度匹配任务建模为一个二分类任务,将实体类型分类任务建模为一个多分类任务。经过对比实验,我们证明了多任务学习、对抗学习的思路对实体消歧模型的效果有一定提升。需要指出的是,在实体链接模型真正上线使用的时候,我们会选取一个相对较小规模的模型。
对 query 进行实体链接后,我们需要对 query 基于模板进行属性抽取。业界主要有两种方案:基于语义解析(semantic parsing)类的方法和基于信息检索(information retrieval)类的方法。OPPO 主要选取语义解析类的方案,并且在解析失败的长尾属性采用语义匹配的方法进行兜底。
在语义解析类的方案中,首先我们需要挖掘用于语义解析的常见模板。我们采用远程监督模板挖掘的方式,利用互联网海量的问答数据,将这些语料与我们的知识图谱进行匹配,得到问答库中实体的属性,最后得到问答语料中常见的 query 模板。例如,“q:刘德华多少岁了 ans:59岁”这个问答,经过图谱属性检索,得到 query 实际上在询问某个人的年龄属性。类似的,我们可以得到询问某个人的身高属性、年龄属性、出生地属性的 query,据此生成一系列 query 模板。基于挖掘的模板,我们可以训练一个语义匹配分类模型,其输入是原始 query 和一个候选query 属性。此外,在训练过程中,我们会将实体 mask 掉,旨在使模型学习 query 在实体信息之外的语义与实体属性的相关性。在模型训练完毕后,我们使用小布线上 query 日志,先对它们进行实体抽取,然后将 query 以及图谱中 query 实体所对应的所有候选属性输入模型,进行语义匹配的预测任务,得到一部分较高置信度的候选模板。输出模板会交由标注人员进行校验,最终得到的模板会加入 query 解析的算法模块中。
接下来以一个具体的例子来解释我们如何使用模板来解析在线的 KBQA 问题。比如用户输入 query 为“印度的首都有多大”,即用户的真实意图是询问新德里的面积。首先,我们会对 query 做实体识别,将“印度”映射至图谱中的“国家”,利用模板将“首都”映射至“国家的首都”或者“王朝的首都”,同理将“有多大”归一化至“人的年龄”、“地区的面积”、“公司的面积”、“行星的体积”等属性。此时还不能完全确定对应的属性,所以我们会将所有的候选属性进行排列组合,结合剪枝的方法,选择最有可能的模板,生成中间表示式。在上面的例子中,最佳模板是“国家首都的面积”。这个 query 实际上是个两跳的问题,我们会利用单条模板将其中一部分抽象为一个子查询,如“国家的首都”。具体地,我们会将子查询与剩余的查询模板拼接在一起,生成一个复合查询。在执行知识图谱的查询的时候,我们会首先执行子查询,并将其替换为查询得到的实体,最后按照生成的 query 继续在图谱中搜索最终的结果。
虽然我们离线挖掘了大量的归一化模板,但是这一方法依然对一些极端情况效果不佳。由于用户输入的不确定性,模板存在长尾 query 欠召回的问题。考虑到线上效率问题,我们很难完全将 query 与所有模板进行模型的语义匹配打分。
基于上述问题,我们提出了类似于双塔模型匹配的方案:将模板通过 BERT 模型生成对应的模板向量,建立模板向量索引。当无法得到合适的模板进行 query 解析时,输入 query 会经过 BERT 模型得到 query 向量,随后在模板向量索引中召回一部分相似模板向量,最后通过人工设定的阈值判断是否接受候选模板。在实际业务中,使用这一方法进行应答的占比较小。
用户可能会提出多约束问题,例如“重庆的男演员有哪些?”。我们会利用问句分类模块判断出 query 属于多约束查询,随后将 query 中包含的所有约束识别出来。在使用多约束查询时,我们不会在图数据库中执行查询操作,而是选用 ES 进行多条件查询,这是因为图数据库检索耗时很大。最后,我们将 ES 查询输出进行热度排序,输出相对合理的结果。类似地,对于比较推理问题,我们首先利用问句分类模块识别出 query 属于比较推理查询,随后在图谱中进行多实体查询,根据比较推理中需要查询的属性判断两个实体对应的属性是否可比。若多实体属性是可比的,我们会执行推理计算,最终输出推理查询的结果。
接下来简单介绍一下 OPPO 对于非结构化问答的解决方案。
离线情况下,我们选取了业界流行的海量网页数据 +MRC 模型进行答案抽取的框架。首先,利用搜索 query 中包含的大量 URL 和点击日志,获取 query 对应的网页文本数据;随后,将 query 与网页文本数据输入 MRC 模型,得到 query 在文本中对应的答案;之后,答案会经过一个离线训练好的“答非所问”判别模型,筛选出那些与 query 真正相关的答案;最终离线构建问题-答案的数据库。
此外,基于构建的 QA 库,我们会使用双塔模型构建 QA 数据库的向量索引。在线查询时,query 首先会经过意图识别和文体类型识别的模块。在 OPPO 业务设定中,使用 KBQA 的优先级大于使用非结构化问答框架的优先级。如果 KBQA 无法针对输入 query 返回结果,那么 query 会被输入至非结构化问题的向量检索框架中。Query 会被双塔模型进行语义向量编码,随后在索引库中进行向量召回得到 topK 候选 QA。由于向量召回的方案会丢失 query 与答案的交互信息,所以在得到候选 QA 后,query 向量与候选向量会经过一个精排模型增强语义交互,得到最终的精排排序打分。根据预设的阈值,我们可以选择接受或拒绝候选 QA 结果。
我们针对 MRC 模型进行了一些优化。首先,我们选择 RikiNet 作为 MRC 模型。它的特点是对网页中长文本的数据处理效果最优,其潜在的原因是 RikiNet 会对输入文本进行段落划分,在语言模型 attention 机制中不同段落之间没有信息交互,避免不同段落之间的噪声信息影响答案信息。
最后,对今天分享的内容做一个总结和展望。
虽然 OPPO 着手构建知识图谱的时间相对较晚,但是在构建过程中积累了大量经验。首先,图谱构建算法是建设高质量知识图谱的关键环节,我们会优先保证算法的准确率,对召回率的要求相对较低。其次,针对知识问答算法,在离线时我们会训练用于模板挖掘、阅读理解的大模型,保证离线挖掘的数据质量;在线服务时,我们会选取在线模板+小模型的方案保证服务效率。
在未来,我们可能会尝试以下几类优化方案:
Q:通用百科图谱的实体量级是多少?有什么办法可以降低实体对齐的时间复杂度?
A:OPPO 内部的知识图谱的实体量级为约两亿,关系数为十几亿的量级。由于图谱的规模较大,在尝试降低实体对齐的时间复杂度时,我们首先会对候选实体做类别划分,例如实体类型是人物则在人物类别的条件下做实体对齐,这相当于借鉴了分而治之的思想降低一部分计算复杂度。随后,我们采用两阶段的实体对齐算法。第一阶段不会涉及深度学习模型,而是将实体进行粗粒度的分组(如别名相同的实体),选用 Dedupe 和 Spark 框架执行并行化实体对齐。
Q:知识问答中如何判断 query 的对话领域?
A:小布助手在内部有一套复杂的领域分类和意图识别系统。例如,在闲聊领域,我们会标注大量的闲聊语料。随后,我们会训练 BERT 模型对语料进行分类。
Q:如何辨别语音识别错误与新词的情形?
A:在纠正语音识别错误时,我们使用搜索点击日志对应的网页 title,与 query 一起输入模型进行实体识别。这是因为我们认为网页 title 在大多数情况下都会包含正确的实体名。随后,我们考虑了偏旁部首的特征和拼音特征,当 query 特征和候选实体特征的相似度达到了预设的阈值后,那么我们基本上可以认为这是一个语音识别错误而不是一个新词。
Q:实体消歧模型中会不会加入一些手工特征?
A:我们会加入一些手工特征,例如实体的热度特征、实体在训练数据中真正被标注为正例的比例、实体属性的个数等统计类特征。
Q:RikiNet 对网页长文本数据效果更加的原因是什么?
A:RikiNet设计了一种特殊的 attention 机制。首先,它将长文本按照段落进行切分。一般情况下,短答案只会出现在一个段落中。RikiNet 的 attention 机制使得段落之间不存在注意力交互,这样就可以让不存在答案的段落包含的无关信息无法影响包含答案的段落语义信息。只不过这只是实验中的得到的结论,没有理论支撑。
Q:query 在线模板匹配中,查询路径解析的剪枝是如何实现的?
A:例如“印度的首都有多大”这一例子,我们会使用到实体分类辅助剪枝任务。首先,“印度”是一个国家,虽然“首都”可以映射到“国家的首都”或者“王朝的首都”,但由于前面的实体被识别为“国家”,那么“王朝的首都”的排序就相对靠后。总的来说,我们会根据识别出的实体类型和属性之间的关系进行剪枝。如果属性类型不存在冲突,无法直接进行剪枝操作,那么我们会对候选模板进行热度排序,即若一个模板在训练集出现的频次更高,那么我们优先考虑这一模板。
Q:请问 OPPO 如何应对方言的语音输入?
A:OPPO 目前主要支持粤语方言输入。这一部分的工作是前端 ASR 负责的,所以方言会在 ASR 模块后就转换为普通话文本输入了。
今天的分享就到这里,谢谢大家。