【大厂AI实践】OPPO:大规模知识图谱及其在小布助手中的应用
导读: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模块后就转换为普通话文本输入了。
相关文章:
【大厂AI实践】OPPO:大规模知识图谱及其在小布助手中的应用
导读:OPPO知识图谱是OPPO数智工程系统小布助手团队主导、多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答、电商搜索等场景。 本文主要分享OPPO知识图谱建设过程中算法相关的技…...
SOME/IP--协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…...
为大模型提供webui界面的利器:Open WebUI 完全本地离线部署deepseek r1
为大模型提供webui界面的利器:Open WebUI Open WebUI的官网:🏡 Home | Open WebUI 开源代码:WeTab 新标签页 Open WebUI是一个可扩展、功能丰富、用户友好的自托管AI平台,旨在完全离线运行。它支持各种LLM运行程序&am…...
Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)
了解安全三元组以及常见的安全模型和原则。 任务1:介绍 安全已成为一个流行词;每家公司都想声称其产品或服务是安全的。但事实真的如此吗? 在我们开始讨论不同的安全原则之前,了解我们正在保护资产的对手至关重要。您是否试图阻止蹒跚学步…...
react-native网络调试工具Reactotron保姆级教程
在React Native开发过程中,调试和性能优化是至关重要的环节。今天,就来给大家分享一个非常强大的工具——Reactotron,它就像是一个贴心的助手,能帮助我们更轻松地追踪问题、优化性能。下面就是一份保姆级教程哦! 一、…...
Progressive Pretext Task Learning for Human Trajectory Prediction | 文献翻译
祥龙回首留胜景,金蛇起舞贺新程。 概述 行人轨迹预测是一项旨在预测行人未来位置的任务,它通常涵盖了从短期到长期的整个时间范围内的轨迹。然而,现有的研究试图通过单一、统一的训练范式来解决整个轨迹预测问题,往往忽视了行人轨…...
并发编程基础 - 并发编程的概念(C++)
前言 在当今多核处理器普及的时代,并发编程成为开发高性能应用程序的关键技术之一。无论是服务器端应用,桌面软件,还是移动应用,并发编程都扮演着重要角色。本文将详细介绍并发编程的基本概念,结合C语言特性ÿ…...
ARM嵌入式学习--第十天(UART)
--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控…...
OpenEuler学习笔记(十七):OpenEuler搭建Redis高可用生产环境
在OpenEuler上搭建Redis高可用生产环境,通常可以采用Redis Sentinel或Redis Cluster两种方式,以下分别介绍两种方式的搭建步骤: 基于Redis Sentinel的高可用环境搭建 安装Redis 配置软件源:可以使用OpenEuler的默认软件源&#…...
CTF从入门到精通
文章目录 背景知识CTF赛制 背景知识 CTF赛制 1.web安全:通过浏览器访问题目服务器上的网站,寻找网站漏洞(sql注入,xss(钓鱼链接),文件上传,包含漏洞,xxe,ssrf,命令执行,…...
java入门笔记基础语法篇(4)
变量 在Java中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量 名之前。例如: int days; double salary; long earthPopulation; boolean done; 在Java中,每个声明以分号结束。变量名必须…...
【RocketMQ 存储】- broker 端存储单条消息的逻辑
文章目录 1. 前言2. DefaultMessageStore#asyncPutMessage 添加单条消息2.1 DefaultMessageStore#checkStoreStatus 检查存储服务的状态2.2 DefaultMessageStore#checkMessage 校验消息长度是否合法2.3 CommitLog#asyncPutMessage 核心存储逻辑2.4 MappedFile#appendMessage2.5…...
爬虫基础(四)线程 和 进程 及相关知识点
目录 一、线程和进程 (1)进程 (2)线程 (3)区别 二、串行、并发、并行 (1)串行 (2)并行 (3)并发 三、爬虫中的线程和进程 &am…...
29. C语言 可变参数详解
本章目录: 前言可变参数的基本概念可变参数的工作原理如何使用可变参数 示例:计算多个整数的平均值解析: 更复杂的可变参数示例:打印可变数量的字符串解析: 总结 前言 在C语言中,函数参数的数量通常是固定的ÿ…...
Java CAS操作
通过前面的学习认识到了CPU缓存,Java内存模型,以及线程安全的原子、可见、顺序三大特性。本文则重点认识CAS操作,这是Java并发编程常见的一个操作,AbstractQueuedSynchronizer基于此操作提供了丰富的同步器和各种锁。 CAS&#x…...
KNIME:开源 AI 数据科学
KNIME(Konstanz Information Miner)是一款开源且功能强大的数据科学平台,由德国康斯坦茨大学的软件工程师团队开发,自2004年推出以来,广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…...
超级强大的压缩和解压工具,免费解压
软件介绍 今天要给大家分享一款超厉害的软件 ——ZArchiver,在我心中,它堪称安卓平台目前最为强大的解压软件。 之前,我一直使用 MT 管理器来解压文件。然而,MT 管理器存在一些局限性。比如在处理解压分卷文件时,它有时…...
代码随想录_栈与队列
栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…...
基于STM32的智能停车场管理系统设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 车辆识别与进出管理模块车位检测与引导模块计费与支付模块数据存储与查询模块远程监控与异常报警模块 控制算法 车牌识别与车辆进出管理算法车位检测与引导算法计费与支付处理算法数据存储与远程反馈算法 代码实现 车辆检测与…...
告别重启!Vue CLI 动态代理配置实战:实现热更新与灵活配置
在前端开发中,代理配置是解决跨域问题的常见手段。尤其是在使用 Vue CLI 进行开发时,我们经常需要通过 devServer.proxy 来配置代理。然而,传统的代理配置通常是静态的,修改后需要重启开发服务器,这在频繁调整代理配置…...
Cocos Creator 3.8 2D 游戏开发知识点整理
目录 Cocos Creator 3.8 2D 游戏开发知识点整理 1. Cocos Creator 3.8 概述 2. 2D 游戏核心组件 (1) 节点(Node)与组件(Component) (2) 渲染组件 (3) UI 组件 3. 动画系统 (1) 传统帧动画 (2) 动画编辑器 (3) Spine 和 …...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。 1.28 存储之道:跨平台数据持久化方案 目录 #mermaid-svg-n1z37AP8obEgptkD {f…...
chrome源码剖析—UI架构消息机制
Chrome 浏览器的 UI 架构是高度模块化且基于现代图形技术和用户界面设计理念构建的。它的 UI 架构涵盖了窗口、标签页、控件、通知、菜单等组件的管理和交互。Chrome 的 UI 基本上是通过 views 框架和 Aura(Chrome 自己的 UI 层)构建的,后者又…...
面试经典150题——图的广度优先搜索
文章目录 1、蛇梯棋1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、最小基因变化2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词接龙3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 1、蛇梯棋 1.1 题目链接 点击跳转到题目位置 1.2 题目描述 给你一…...
Day30-【AI思考】-错题分类进阶体系——12维错误定位模型
文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误(根源性缺陷)****二、操作层错误(执行过程偏差)****三、心理层错误(元认知障碍)****四、进阶错误(专业级陷阱)** 错…...
利用Edu邮箱解锁Notion Pro,提升学习与工作效率
摘要: 本文将详细介绍如何通过Edu教育邮箱申请教育订阅,从而免费获得Notion Pro版的所有高级功能。此外,我们还将简要提及Edu邮箱的其他福利,如申请Azure 100免费VPS和OpenAI。通过对比Notion免费版和Pro版的差异,你将…...
剑指 Offer II 010. 和为 k 的子数组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20010.%20%E5%92%8C%E4%B8%BA%20k%20%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 010. 和为 k 的子数组 题目描述 给定一个正整数数组和一个…...
【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用
目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页:Icomi 大家好,我是Icomi,本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出,希望…...
Vue.js组件开发-实现全屏平滑移动、自适应图片全屏滑动切换
使用Vue实现全屏平滑移动、自适应图片全屏滑动切换的功能。使用Vue 3和Vue Router,并结合一些CSS样式来完成这个效果。 步骤 创建Vue项目:使用Vue CLI创建一个新的Vue项目。准备图片:将需要展示的图片放在项目的public目录下。创建组件&…...
openRv1126 AI算法部署实战之——ONNX模型部署实战
在RV1126开发板上部署ONNX算法,实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili 一、准备工作 1.从官网下载YOLOv5-v7.0工程(YOLOv5的第7个版本) 手动在线下载: Releases ultraly…...
实验作业管理系统的设计与实现
标题:实验作业管理系统的设计与实现 内容:1.摘要 本系统旨在解决当前实验作业管理中存在的问题,提高管理效率和质量。通过对现有系统的调研和分析,我们确定了系统的功能需求和性能要求,并采用了先进的技术和架构进行设计和实现。系统实现了实…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》032-组件的Teleport功能
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
leetcode——二叉树的最大深度(java)
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,null,2] 输…...
【PyTorch】3.张量类型转换
个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch࿰…...
自制一个入门STM32 四足机器人具体开发顺序
0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识,包括 GPIO、定时器、串口通信等外设的使用,可通过官方文档、教程和视频课程进行学习。了解舵机控制原理,因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…...
SpringCloud基础二(完结)
HTTP客户端Feign 在SpringCloud基础一中,我们利用RestTemplate结合服务注册与发现来发起远程调用的代码如下: String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class);以上代码就…...
云原生时代,如何构建高效分布式监控系统
文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控…...
WordPress使用(1)
1. 概述 WordPress是一个开源博客框架,配合不同主题,可以有多种展现方式,博客、企业官网、CMS系统等,都可以很好的实现。 官网:博客工具、发布平台和内容管理系统 – WordPress.org China 简体中文,这里可…...
小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)
背景浅谈 小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是decipher网站对request设置的cipher,比如破解一个DES/AES加密拿到key。这篇文章先不去谈…...
Time Constant | RC、RL 和 RLC 电路中的时间常数
注:本文为 “Time Constant” 相关文章合辑。 机翻,未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 💡 Key learnings: 关键学习点: Time Constant Definition: The time constant (τ) is define…...
Python爬虫学习第三弹 —— Xpath 页面解析 实现无广百·度
早上好啊,大佬们。上回使用 Beautiful Soup 进行页面解析的内容是不是已经理解得十分透彻了~ 这回我们再来尝试使用另外一种页面解析,来重构上一期里写的那些代码。 讲完Xpath之后,小白兔会带大家解决上期里百度搜索的代码编写,保…...
JS 正则表达式 -- 分组【详解】含普通分组、命名分组、反向引用
普通分组 使用圆括号 () 来创建分组捕获匹配的内容,通过正则表达式匹配结果的数组来访问这些捕获的内容。 const str "Hello, World!"; const regex /(Hello), (World)!$/; const match str.match(regex);if (match) {console.log("完整匹配结果…...
Leetcode刷题-不定长滑动窗口
分享丨【题单】滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环) - 力扣(LeetCode) 3090 class Solution:def maximumLengthSubstring(self, s: str) -> int:c Counter()res 0rk -1for i in range(len(s)):i…...
【Rust自学】15.6. RefCell与内部可变性:“摆脱”安全性限制
题外话,这篇文章一共4050字,是截止到目前为止最长的文章,如果你能坚持读完并理解,那真的很强! 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以…...
护眼好帮手:Windows显示器调节工具
在长时间使用电脑的过程中,显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐,而且在低亮度下容易导致色彩失真。因此,今天我想为大家介绍一款适用于Windows系统的护眼工具,它可以帮助你轻松调节显…...
使用 OpenResty 构建高效的动态图片水印代理服务20250127
使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代,图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象,动态图片水印功能显得尤为重要。然而,直接在后端服务中集成水印功能,往往会带来代码复杂度增加、…...
36、【OS】【Nuttx】OSTest分析(2):环境变量测试
背景 2025.1.29 蛇年快乐! 接之前wiki 35、【OS】【Nuttx】OSTest分析(1):stdio测试(五) 已经分析完了第一个测试项,输入输出端口测试,接下来分析下环境变量测试,也比较…...
C++并发编程指南04
文章目录 共享数据的问题3.1.1 条件竞争双链表的例子条件竞争示例恶性条件竞争的特点 3.1.2 避免恶性条件竞争1. 使用互斥量保护共享数据结构2. 无锁编程3. 软件事务内存(STM) 总结互斥量与共享数据保护3.2.1 互斥量使用互斥量保护共享数据示例代码&…...
Java实现LRU缓存策略实战
实现LRU模型选择LRU缓存回收算法集成Google Guava(LRU缓存策略)插件Google Guava(LRU策略)缓存示例总结LRU(Least Recently Used,最近最少使用)缓存是一种常见的缓存淘汰策略。它的基本思想是优先保留最近被访问过的数据,淘汰最久未被访问的数据。这种策略的目的是为了…...
三个不推荐使用的线程池
线程池的种类 其实看似这么多的线程池,都离不开ThreadPoolExecutor去创建,只不过他们是简化一些参数 newFixedThreadPool 里面全是核心线程 有资源耗尽的风险,任务队列最大长度为Integer.MAX_VALUE,可能会堆积大量的请求ÿ…...