【大厂AI实践】OPPO:大规模知识图谱及其在小布助手中的应用

news2025/1/31 23:20:36

导读:OPPO知识图谱是OPPO数智工程系统小布助手团队主导、多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答、电商搜索等场景。

本文主要分享OPPO知识图谱建设过程中算法相关的技术挑战和对应的解决方案,主要包括实体分类、实体对齐、信息抽取、实体链接和图谱问答query解析等相关算法内容。

全文围绕下面四点展开:

  • 背景
  • OPPO知识图谱
  • 知识图谱在小布助手中的应用
  • 总结与展望

01 背景

首先和大家分享下小布助手和知识图谱的背景。

1. 背景——小布助手

小布助手是OPPO旗下有趣贴心、无处不在的AI助手,搭载在OPPO手机、OnePlus、Realme以及如智能手表等IoT智能硬件上。它可以为用户提供系统应用、生活服务、影音娱乐、信息查询、智能聊天等服务,进而挖掘潜在的用户价值、营销价值和技术价值。

2. 背景——oppo知识图谱

在2020年年底,OPPO开始着手构建自己的知识图谱。经过一年左右的时间,OPPO已经构建了数亿实体和数十亿关系的高质量通用知识图谱。目前,OPPO知识图谱支持了每天线上数百万次的小布问答请求。进一步,OPPO正将通用知识图谱逐渐扩展到商品图谱、健康图谱、风控图谱等多个垂类。


02 OPPO知识图谱

接下来为大家介绍OPPO知识图谱的整体架构。如上图所示,它由三大部分组成。最底层是通用的数据处理平台和图数据库相关框架。我们具体选取NebulaGraph来存储图数据。中间层包含数据获取、图谱构建和图谱管理模块。最顶层涵盖了OPPO图谱各种应用场景,包括智能问答、搜索推荐、内容理解、安全风控、智慧健康等。

下面介绍应用知识图谱的三个核心算法:实体分类、实体对齐和信息抽取。

实体分类根据图谱预定义的schema对实体进行归类,进而可以使我们对实体进行属性、关系的关联。同时,实体分类可以对下游的实体对齐、实体链接和线上的智能问答业务等提供重要的特征。目前,我们采用规则+预训练语言模型文本分类的pipeline方案。在第一阶段,我们利用如百科中对实体的描述,使用预定义的规则处理大量半监督的伪标签数据。随后,这些数据会交给标注同事进行校验,整理出有标签的训练集,结合预训练语言模型训练一个多标签的文本分类模型。值得一提的是,我们为业界提供了一个大规模实体分类数据集,组织了2021CCKS通用百科知识图谱竞赛,吸引了数百只队伍参赛。

实体对齐任务是知识图谱构建中比较关键的环节。在互联网的开源数据中,同一实体在多个来源下存在相似或者相同的信息,若将这部分冗余信息全部包含在知识图谱中,那么在下游使用知识图谱进行信息检索时会带来歧义。所以,我们对多源相同的实体进行信息整合,减少信息冗余。

具体地,由于知识图谱中的实体规模达到了上亿的量级,考虑到效率问题,我们提出了Dedupe+BERT语义分类的两阶段方案。在第一阶段,我们采用并行处理的方式将名字、别名相同的实体进行分组,输入Dedupe数据去重工具,生成第一阶段实体对齐结果。我们要求这一阶段的结果的准确率很高。在第二阶段,我们会训练一个实体相关性匹配模型,其输入是一对候选实体,旨在调整、补充第一阶段的对齐结果。

在实体分类与对齐后,由于数据源存在信息缺失,图谱中存在一些实体缺失部分关键属性。我们将缺失属性的实体分成两类,使用信息抽取的方法对它们进行属性补全。

第一类是常见的实体与属性,如国家的首都、人物的年龄和性别等。我们使用百度CASREL模型以及业界常用的开源数据集训练一个关系抽取模型。模型的结构可以看作一个多标签的指针网络,每个标签对应一个关系类型。CASREL首先抽取句子中的主实体,再将主实体的embedding输入指针网络,预测每一个关系下句子中的客体起始位置和终止位置,最后通过设定的阈值来判定SPO三元组是否可信。

第二类是长尾属性,它们在开源数据集上标注较少。我们利用阅读理解(MRC)模型抽取长尾属性。如我们想要抽取“某奥特曼的人间体”这一属性,我们就将“某奥特曼的人间体是谁”这一问题作为query,检索文本结果,使用阅读理解模型判断文本中是否包含“人间体”的客体。

总结来说,在构建知识图谱的过程中,我们应用了实体分类、实体对齐与信息抽取任务,希望通过它们来提升知识图谱的质量和丰富程度。后续建设过程中,我们希望在现有的框架下将实体分类基于迁移学习扩展到商品分类、游戏分类等垂域场景。此外,目前的实体对齐任务还较为基础,我们希望在未来结合多模态、节点表示学习等多策略对齐方案。最后,对于信息抽取任务,我们希望借助大规模预训练语言模型,基于少量标记样本,甚至零标记样本,来抽取实体关系。我们还考虑应用实体抽取算法,使得它可以落地于小布助手的业务场景中。


03 知识图谱在小布助手中的应用

第三部分重点介绍知识图谱在小布助手业务场景中的应用。

小布助手按照对话领域可以划分为三大类:闲聊、任务对话和知识问答。其中,闲聊类使用检索式、生成式算法;任务对话利用帧语义的算法对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机制中不同段落之间没有信息交互,避免不同段落之间的噪声信息影响答案信息。


04 总结与展望

最后,对今天分享的内容做一个总结和展望。

虽然OPPO着手构建知识图谱的时间相对较晚,但是在构建过程中积累了大量经验。首先,图谱构建算法是建设高质量知识图谱的关键环节,我们会优先保证算法的准确率,对召回率的要求相对较低。其次,针对知识问答算法,在离线时我们会训练用于模板挖掘、阅读理解的大模型,保证离线挖掘的数据质量;在线服务时,我们会选取在线模板+小模型的方案保证服务效率。

在未来,我们可能会尝试以下几类优化方案:

  • 常识推理图谱+常识问答
  • 多模态图谱+多模态问答
  • 用户图谱+个性化推荐
  • 知识图谱+大规模预训练语言模型
  • 低资源条件的信息抽取

05 Q&A

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模块后就转换为普通话文本输入了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2288089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 添加、替换、提取、或删除Excel中的图片

在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观。此外,对于已有图片,你有事可能需要更新图片以确保信息的准确性,或者将Excel 中的图片单独保存,用于资料归档、备…

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。

佬们过年好呀~新年第一篇博客让我们来场赛博算命吧! 更多文章:个人主页 系列文章:JAVA专栏 欢迎各位大佬来访哦~互三必回!!! 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…

iperf 测 TCP 和 UDP 网络吞吐量

注:本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具,iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…

内外网文件摆渡企业常见应用场景和对应方案

在如今的企业环境中,内外网文件摆渡的需求越来越常见,也变得越来越重要。随着信息化的不断推进,企业内部和外部之间的数据交换越来越频繁,如何安全、高效地进行文件传输成了一个关键问题。今天,咱就来聊聊内外网文件摆…

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接:Latent Variable Models for Analyzing DNA Methylation 摘要: 脱氧核糖核酸(DNA)甲基化与细胞分化密切相关。例如,已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此,通过研究DNA…

Android View 的事件分发机制解析

前言:当一个事件发生时(例如触摸屏幕),事件会从根View(通常是Activity的布局中的最顶层View)开始,通过一个特定的路径传递到具体的View,这个过程涉及到三个关键的阶段:事…

内容检索(2025.01.30)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 博客域名:http://my-signal.blog.cs…

【25美赛A题-F题全题目解析】2025年美国大学生数学建模竞赛(MCM/ICM)解题思路|完整代码论文集合

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天,开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型,就在刚刚,凭一己之力让英伟达大跌18%,纳斯达克大跌3.7%,足足是给中国AI产…

H264原始码流格式分析

1.H264码流结构组成 H.264裸码流(Raw Bitstream)数据主要由一系列的NALU(网络抽象层单元)组成。每个NALU包含一个NAL头和一个RBSP(原始字节序列载荷)。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…

【PyTorch】6.张量形状操作:在深度学习的 “魔方” 里,玩转张量形状

目录 1. reshape 函数的用法 2. transpose 和 permute 函数的使用 4. squeeze 和 unsqueeze 函数的用法 5. 小节 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架&am…

实现基础的shell程序

1. 实现一个基础的 shell 程序,主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现: ⽂件复制⽬录复制 1.1.2. ls 命令主要实现: ls -l 命令的功能 1.1. 在框架设计上,采⽤模块化设计思想,并具备⼀定的可扩…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则

1.18 逻辑运算引擎:数组条件判断的智能法则 1.18.1 目录 #mermaid-svg-QAFjJvNdJ5P4IVbV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QAFjJvNdJ5P4IVbV .error-icon{fill:#552222;}#mermaid-svg-QAF…

知识库管理系统助力企业实现知识共享与创新价值的转型之道

内容概要 知识库管理系统(KMS)作为现代企业知识管理的重要组成部分,其定义涵盖了系统化捕捉、存储、共享和应用知识的过程。这类系统通过集成各种信息来源,不仅为员工提供了一个集中式的知识平台,还以其结构化的方式提…

SpringBoot 日志与配置文件

SpringBoot 配置文件格式 Properties 格式 Component ConfigurationProperties(prefix "person") //和配置文件person前缀的所有配置进行绑定 Data public class Person {private String name;private Integer age;private Date birthDay;private Boolean like;pr…

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期:2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题:请看上图,我们想要实现的效果是控件黄色的Widge(m_infobarWidget)t随着可视化窗口(m_glWidge…

【Node.js】Koa2 整合接口文档

部分学习来源:https://blog.csdn.net/qq_38734862/article/details/107715579 依赖 // koa2-swagger-ui UI视图组件 swagger-jsdoc 识别写的 /***/ 转 json npm install koa2-swagger-ui swagger-jsdoc --save配置 config\swaggerConfig.js const Router requir…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…

leetcode——排序链表(java)

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …

基于springboot的校园部门资料管理系统

博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…