语义索引(可通俗理解为向量索引)技术是搜索引擎、推荐系统、广告系统在召回阶段的核心技术之一。语义索引模型的目标是:给定输入文本,模型可以从海量候选召回库中快速、准确地召回一批语义相关文本。语义索引模型的效果直接决定了语义相关的物料能否被成功召回进入系统参与上层排序,从基础层面影响整个系统的效果。
- 尽管有无数的变量在起作用,但是语义搜索的原理,为什么需要它,以及它如何被影响,是很容易理解的。
- 用户使用的语言往往与所需内容不一样
- 很多搜索都在无意中产生歧义
- 了解词汇层级和实体关系的需要
- 反映个人兴趣和趋势的需要
0.1.1用户使用的语言往往与所需内容不一样:
更糟糕的是,我们有时甚至不知道如何正确表达我们想搜索的是什么。比方说,你在电台里听到了一首陌生的歌曲。你喜欢它,于是开始在Google上随机搜索歌词,直到你终于找到它为止。再增加一点复杂程度的话,将你在Google中输入的内容与对Siri,Alexa或Google智能助理的输入内容进行比较。 现在,关键字就变成了对话。表达同一个想法的方式太多了,搜索引擎需要处理所有这些方式。 搜索引擎需要能够根据两者的意义,将其索引中的内容与你的搜索查询进行匹配。
0.1.2 很多搜索都在无意中产生歧义,
大约40%的英语单词是多义词——它们有两个或更多的含义。这可以说是语义搜索要解决的最重大的挑战。例如,仅在美国,关键词 “python “的月搜索量就有53.3万次:
如果我曾经搜索过 “python”,我很可能指的是编程语言。但科技行业以外的人很可能会想到真正的蟒蛇,或者是传奇的英国喜剧团。这里的问题是,如果没有上下文,单词很少有明确的含义。在多义词的基础上,有无数的名词也可以同时是形容词,动词,或者两者兼而有之。而且我们还只是在谈论字面意思的范畴。如果我们深入研究其推论的话(譬如讽刺的时候),就会变得更加有趣。在语义学中,语境就是一切,这将为我们引出了接下来的两点。
0.1.3 了解词汇层级和实体关系的需要
让我们来看看以下的搜索查询和热门搜索结果:
这确实非常厉害了。 以下是Google理解此查询必须要做的:
- 它要知道“伴侣 “是指妻子/女友/丈夫/男友/配偶。
- 了解到欧比王出现在多部电影和连续剧中,由不同的演员扮演。
- 建立联系。
- 以反映“欧比王”有歧义的方式来显示搜索结果。
词汇层级说明了单词之间的关系。 伴侣这个词对妻子,男友,配偶和其他词来说是上一级的(上位词)。
如前所述,我们的查询通常与所需内容的确切词组不匹配。 知道“负担得起”是介于便宜,中档和合理价格之间的任何事物,这一点至关重要。在此示例中,实体是电影和连续剧中的角色(欧比王),具有特定工作的人(演员)以及与之相关联的人(伴侣)。 通常,实体是可以明确识别的对象或概念-通常是人,地点和事物。
如果所有的这些语言的复杂性还不够的话,我们还必须再深入一些。
0.1.4 反映个人兴趣和趋势的需要
让我们回到“python”的例子。如果我搜索这个词,确实会得到所有与编程语言相关的结果。
无论我们多么不喜欢任何使用我们个人数据的方式,至少这对搜索引擎来说是有用的。Google结合了有限的数据和你的搜索历史,以提供更准确和个性化的搜索结果。我们都知道这一点。只要在搜索栏中输入任何类型的服务,你就会得到本地化的结果。
但更吸引人的是,谷歌能够根据动态变化的搜索意图临时调整搜索结果。
例如,冠状不是一个新名词。 它一直是一组的名称。 但众所周知,搜索意图在2020年初迅速改变。人们开始寻找有关特定冠状(SARS-CoV‑2)的信息,因此必须对SERP进行相应的调整。
在召回阶段,最常见的方式是通过双塔模型,学习document(简写为Doc)的向量表示,对Doc端建立索引,用ANN召回。我们在这种方式的基础上,引入语义索引策略 In-batch Negatives,以如下Batch size=4的训练数据为例:
In-batch Negatives 策略的训练数据为语义相似的 Pair 对,策略核心是在 1 个 Batch 内同时基于 N 个负例进行梯度更新,将Batch 内除自身之外其它所有 Source Text 的相似文本 Target Text 作为负例,例如: 上例中“我手机丢了,我想换个手机” 有 1 个正例(”我想买个新手机,求推荐“),2 个负例(1.手机学日语的软件,2.侠盗飞车罪恶都市怎么改车)。
- 知识图谱
- 蜂鸟算法
- RankBrain算法
- BERT模型(大模型)
- chatgpt
0.2.1 知识图谱
Google的知识图谱于2012年发布,是实体及实体之间关系的知识库。你可以想象它的样子大概是这样的-——但实际上有50亿个实体:
简而言之,这是一项启动并实现了从关键字匹配到语义匹配转变的技术。向知识图谱提供信息的方法主要有两种:
- 结构化数据(稍后详述)
- 从文本中提取实体
对于第二点,搜索引擎需要理解自然语言。这时候,下面三个算法的更新就会发挥作用。
0.2.2 蜂鸟算法
早在2013年,Google推出了一个名为Hummingbird(蜂鸟)的搜索算法,以返回更好的搜索结果。 这个算法尤其有助于应对复杂的搜索查询。蜂鸟算法是第一个重大更新,它更加强调搜索请求背后的意图,而非单个关键词。 它极速催化了“为话题而创作内容”的热潮,而不是“为单个关键词而写作”。
0.2.3 RankBrain算法
如果你曾经遇到过“潜在语义索引”或LSI关键词这一短语,可以忽略这个了。 Google用RankBrain算法解决了LSI产生的问题。而我们前面已经讨论过这个问题。是关于搜索请求中所使用的语言和所需内容之间的不匹配。Google的RankBrain采用了优于LSI的技术。通俗地说,通过使用复杂的机器学习算法,RankBrain甚至可以理解不熟悉的单词和短语的含义。而考虑到15%的搜索请求都是新的,这可是一项巨大的工程。我们可以认为RankBrain是蜂鸟算法的升级版,而不是一个独立的搜索算法。它是最强的排名信号之一,但你能主动为其做出的优化,也就只有满足搜索意图了。
0.2.4 BERT模型(大模型)
基于Transformer的双向编码器表示(BERT)这一自然语言表示模型,是对语义搜索运作方式的最新的重大升级。自2019年底以来,它影响了大约10%的查询。BERT可以提高对长而复杂的句子以及查询的理解。它是一种处理歧义和细微差别的解决方案,因为它力图更好地理解单词的上下文。
0.2.5 chatgpt
ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具,使用了Transformer神经网络架构,也是GPT-3.5架构,这是一种用于处理序列数据的模型,拥有语言理解和文本生成能力,尤其是它会通过连接大量的语料库来训练模型,这些语料库包含了真实世界中的对话,使得ChatGPT具备上知天文下知地理,还能根据聊天的上下文进行互动的能力,做到与真正人类几乎无异的聊天场景进行交流。ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
结合ChatGPT的底层技术逻辑,有媒体曾列出了中短期内ChatGPT的潜在产业化方向:归纳性的文字类工作、代码开发相关工作、图像生成领域、智能客服类工作。
- 核心竞争力
ChatGPT受到关注的重要原因是引入新技术RLHF (Reinforcement Learning with Human Feedback,即基于人类反馈的强化学习)。RLHF 解决了生成模型的一个核心问题,即如何让人工智能模型的产出和人类的常识、认知、需求、价值观保持一致。ChatGPT是AIGC(AI- Generated Content,人工智能生成内容)技术进展的成果。**该模型能够促进利用人工智能进行内容创作、提升内容生产效率与丰富度。 **
- 技术局限性
ChatGPT 的使用上还有局限性,模型仍有优化空间。ChatGPT模型的能力上限是由奖励模型决定,该模型需要巨量的语料来拟合真实世界,对标注员的工作量以及综合素质要求较高。ChatGPT可能会出现创造不存在的知识,或者主观猜测提问者的意图等问题,模型的优化将是一个持续的过程。若AI技术迭代不及预期,NLP模型优化受限,则相关产业发展进度会受到影响。此外,ChatGPT盈利模式尚处于探索阶段,后续商业化落地进展有待观察。
“SEO是指搜索引擎优化。全称为(Search Engine Optimization),是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名的方式。目的是让其在行业内占据领先地位,获得品牌收益。
0.3.1 目标主题,而非关键词
在过去的SEO时代,你可以用关于同一主题的独立内容来获得高排名,但这里面定位的关键词会略有不同,如关键词:
- open graph tags
- open graph meta tags
- og meta tags
- open graph tag
- what is open graph
- facebook open graph tags
现在的情况已经不是这样了。Google现在明白,所有这些关键词搜索的意思都大同小异,并为所有这些搜索去排名基本相同的页面。在创建内容时要牢记这一点。我们的目的不再是只为一个关键词排名,而是要深入地探讨一个主题,这样Google才会为你的页面排名很多类似的长尾关键词。例如,我们关于Open Graph(开放图谱)元标签的文章在好几百个关键词中排名很好。其中很多是搜索同一事物的不同方式,但有些是 “og:title”、“og url “和 “og:image “这样的子话题。我们之所以能够在这些关键词下获得排名,是因为我们写了一篇关于这个主题的深度文章,而不仅仅是关于一个关键词。
想知道可以写些什么子话题的话,这里有个不错的办法:在这份报告里找到这个话题下的热门页面。例如,假设您想写一篇有关种植芦笋的文章。 如果将“种植芦笋”的排名靠前页面放到Ahrefs的网站分析并查看其自然搜索关键词报告,就会看到这个页面在这些关键词下都获得了排名,其中包括:
- 芦笋需要种植多深
- 芦笋种植条件
- 什么时候种植芦笋
- 芦笋的最佳种植地
- 如何收割芦笋
- 如何护理芦笋
如果你想通过创作一篇深度的贴文来获取尽可能多的自然流量,那么所有这些子话题都会是你应该提及的。不过要小心。 针对特定主题并不意味着你应该涵盖与该主题相关的所有内容,也不必太深入。
0.3.2评估搜索意图
你还是可以围绕某个主题来发布内容,即使这个主题是不符合搜索意图的。
假设你是一名营销数据极客,发现了“SEO报告”这个不错的话题。 自然地,你会希望分享制作最佳SEO报告所需要的东西。 因此,你会想到“利用搜索请求来创建最佳SEO报告”之类的内容。 确实,这可能是最终能造就最佳SEO报告的内容。 但是,大多数搜索此主题的人不熟悉许多Google表格功能。 他们只是想找到一些可以帮助他们完成工作的工具:
参考文章:搜索意图: 一个十分重要又经常被忽略的“排名要素”
在我们还没法用上语义搜索的时候,我们不得已要转向语义网(Sematic Web)。 万维网(www)的原始概念可以解释为没有明确含义的、标准化的、互相链接的文档。 然而现在,显然我们需要“含义”。 这得从你的基本HTML开始说起。我们先来比较以下的HTML元素:
语义HTML为代码增加了含义,因此机器可以识别导航模块,页眉,页脚,表格或视频。HTML5则提供了最多的语义元素,大多数现代CMS主题都会使用这些元素。如果你还没有的话,通常一个插件就可以添加好。但是语义HTML仍然非常有限。 虽然它有指示出来:“这是一个表格,这是一个页脚”,但它没办法实际内容的含义。这就是为什么我们需要把这些标记结构化(schema)。
0.3.4. 使用Scheme标记
Schema标记是标记你的网页的另一种方式。它也被称为结构化数据,可以说是网络的一个通用语义框架。Schema.org.cn词汇表包含与属性相关联的数百种schema标记类型。 你可以使用这些来标记你的内容,让Google无需复杂的算法即可轻松理解。
例如,Google会更容易从这样的结构化内容中提取含义:
这样一来,当用户想知道做一块煎饼需要多长时间,或者它有多少卡路里时,Google可以以最佳的方式提供信息。
参考文章:https://ahrefs.com/blog/rich-snippets/
文章参考:https://ahrefs.com/blog/zh/?p=1670
-
语义搜索系列文章全流程教学:
- [语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse:]
- [语义检索系统:基于in-batch Negatives策略的有监督训练语义召回:]
- [语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引:]
- [语义检索系统:基于ERNIE-Gram /RocketQA实现数据精排序:]
- [基于Milvus+ERNIE+SimCSE+IBN实现学术文献语义检索系统完整版:]
-
更多文本匹配方案参考:
- [特定领域知识图谱融合方案:技术知识前置【一】-文本匹配算法:]
- [特定领域知识图谱融合方案:文本匹配算法Simnet、Diffcse【二】:]
- [特定领域知识图谱融合方案:文本匹配算法ERNIE-Gram单塔等诸多模型【三】:]
- [基于文心大模型套件ERNIEKit实现文本匹配算法:]
- [特定领域知识图谱融合方案:学以致用-问题匹配鲁棒性评测比赛验证【四】:]
-
效果预览:
性能对比:
- 场景概述
检索系统存在于我们日常使用的很多产品中,比如商品搜索系统、学术文献检索系等等,本方案提供了检索系统完整实现。限定场景是用户通过输入检索词 Query,快速在海量数据中查找相似文档。
所谓语义检索(也称基于向量的检索,如上图所示),是指检索系统不再拘泥于用户 Query 字面本身,而是能精准捕捉到用户 Query 后面的真正意图并以此来搜索,从而更准确地向用户返回最符合的结果。通过使用最先进的语义索引模型找到文本的向量表示,在高维向量空间中对它们进行索引,并度量查询向量与索引文档的相似程度,从而解决了关键词索引带来的缺陷。
例如下面两组文本 Pair,如果基于关键词去计算相似度,两组的相似度是相同的。而从实际语义上看,第一组相似度高于第二组。
语义检索系统的关键就在于,采用语义而非关键词方式进行召回,达到更精准、更广泛得召回相似结果的目的。想快速体验搜索的效果,请参考Pipelines的语义检索实现
<div align="center"> <img src="https://user-images.githubusercontent.com/12107462/190302765-663ba441-9dd3-470a-8fee-f7a6f81da615.gif" width="500px"> </div>
通常检索业务的数据都比较庞大,都会分为召回(索引)、排序两个环节。召回阶段主要是从至少千万级别的候选集合里面,筛选出相关的文档,这样候选集合的数目就会大大降低,在之后的排序阶段就可以使用一些复杂的模型做精细化或者个性化的排序。一般采用多路召回策略(例如关键词召回、热点召回、语义召回结合等),多路召回结果聚合后,经过统一的打分以后选出最优的 TopK 的结果。
-
低门槛
- 手把手搭建起检索系统
- 无需标注数据也能构建检索系统
- 提供 训练、预测、ANN 引擎一站式能力
- Pipelines 快速实现语义检索系统
-
效果好
- 针对多种数据场景的专业方案
- 仅有无监督数据: SimCSE
- 仅有有监督数据: InBatchNegative
- 兼具无监督数据 和 有监督数据:融合模型
- 进一步优化方案: 面向领域的预训练 Domain-adaptive Pretraining
- 针对多种数据场景的专业方案
-
性能快
- Paddle Inference 快速抽取向量
- Milvus 快速查询和高性能建库
- Paddle Serving服务化部署
索引环节有两类方法:基于字面的关键词索引;语义索引。语义索引能够较好地表征语义信息,解决字面不相似但语义相似的情形。本系统给出的是语义索引方案,实际业务中可融合其他方案使用。下面就详细介绍整个方案的架构和功能。
以上是nerual_search的系统流程图,其中左侧为召回环节,核心是语义向量抽取模块;右侧是排序环节,核心是排序模型。召回环节需要用户通过自己的语料构建向量索引库,用户发起query了之后,就可以检索出相似度最高的向量,然后找出该向量对应的文本;排序环节主要是对召回的文本进行重新排序。下面我们分别介绍召回中的语义向量抽取模块,以及排序模型。
1.2.1 召回模块
召回模块需要从千万量级数据中快速召回候选数据。首先需要抽取语料库中文本的 Embedding,然后借助向量搜索引擎实现高效 ANN,从而实现候选集召回。
我们针对不同的数据情况推出三种语义索引方案,如下图所示,您可以参照此方案,快速建立语义索引:
最基本的情况是只有无监督数据,我们推荐您使用 SimCSE 进行无监督训练;另一种方案是只有有监督数据,我们推荐您使用 In-batch Negatives 的方法进行有监督训练。
如果想进一步提升模型效果:还可以使用大规模业务数据,对预训练模型进行 Domain-adaptive Pretraining,训练完以后得到预训练模型,再进行无监督的 SimCSE。
此外,如果您同时拥有监督数据和无监督数据,我们推荐将两种方案结合使用,这样能训练出更加强大的语义索引模型。
1.2.2 排序模块
召回模型负责从海量(千万级)候选文本中快速(毫秒级)筛选出与 Query 相关性较高的 TopK Doc,排序模型会在召回模型筛选出的 TopK Doc 结果基础之上针对每一个 (Query, Doc) Pair 对进行两两匹配计算相关性,排序效果更精准。
排序模块有2种选择,第一种基于前沿的预训练模型 ERNIE,训练 Pair-wise 语义匹配模型;第二种是基于RocketQA模型训练的Cross Encoder模形。第一种是Pair-wise的排序算法,基本思路是对样本构建偏序文档对,两两比较,从比较中学习顺序,第二种是Poinet-Wise的算法,只考虑当前Query和每个文档的绝对相关度,并没有考虑其他文档与Query的相关度,但是建模方式比较简单。第一种Pair-wise模型可以说是第二种point-wise模型的改进版本,但对于噪声数据更为敏感,即一个错误的标注会导致多个pair对的错误,用户可以先使用基于Point-wise的Cross Encoder构建一个基础模型,需要进一步优化可以使用Pair-wise的方法优化。
2.1.1 技术方案
语义索引:由于我们既有无监督数据,又有有监督数据,所以结合 SimCSE 和 In-batch Negatives 方案,并采取 Domain-adaptive Pretraining 优化模型效果。
首先是利用 ERNIE模型进行 Domain-adaptive Pretraining,在得到的预训练模型基础上,进行无监督的 SimCSE 训练,最后利用 In-batch Negatives 方法进行微调,得到最终的语义索引模型,把建库的文本放入模型中抽取特征向量,然后把抽取后的向量放到语义索引引擎 milvus 中,利用 milvus 就可以很方便得实现召回了。
排序:使用 ERNIE-Gram 的单塔结构/RocketQA的Cross Encoder对召回后的数据精排序。
2.1.2 评估指标
模型效果指标
-
在语义索引召回阶段使用的指标是 Recall@K,表示的是预测的前topK(从最后的按得分排序的召回列表中返回前K个结果)结果和语料库中真实的前 K 个相关结果的重叠率,衡量的是检索系统的查全率。
-
在排序阶段使用的指标为AUC,AUC反映的是分类器对样本的排序能力,如果完全随机得对样本分类,那么AUC应该接近0.5。分类器越可能把真正的正样本排在前面,AUC越大,分类性能越好。
性能指标
-
基于 Paddle Inference 快速抽取向量
-
建库性能和 ANN 查询性能快
数据集来源于某文献检索系统,既有大量无监督数据,又有有监督数据。
(1)采用文献的 query, title,keywords,abstract 四个字段内容,构建无标签数据集进行 Domain-adaptive Pretraining;
(2)采用文献的 query,title,keywords 三个字段内容,构造无标签数据集,进行无监督召回训练SimCSE;
(3)使用文献的query, title, keywords,构造带正标签的数据集,不包含负标签样本,基于 In-batch Negatives 策略进行训练;
(4)在排序阶段,使用点击(作为正样本)和展现未点击(作为负样本)数据构造排序阶段的训练集,进行精排训练。
- 对于无监督SimCSE的训练方法,格式参考,即一行条文本即可,无需任何标注。对于召回模型训练需要规定格式的本地数据集,需要准备训练集文件,验证集,召回集文件。
训练数据集的格式如下:
训练集合的文件样例:
验证集的格式如下:
验证集合的文件样例:
召回集合主要作用是检验测试集合的句子对能否被正确召回,它的构造主要是提取验证集的第二列的句子,然后加入很多无关的句子,用来检验模型能够正确的从这些文本中找出测试集合对应的第二列的句子,格式如下:
- 对于排序模型的训练,排序模型目前提供了2种,第一种是Pairwise训练的方式,第二种是RocketQA的排序模型,对于第一种排序模型,需要准备训练集,验证集两个文件,除此之外还可以准备测试集文件或者。
训练数据集的格式如下:
训练数据集的示例如下:
验证数据集的格式如下:
验证数据集的示例如下:
训练数据集的格式如下,其中这个score得分是召回算出来的相似度或者距离,仅供参考,可以忽略:
训练数据集的示例如下:
对于第二种基于RocketQA的排序模型。
训练数据集,验证集的格式如下:
训练数据集,验证集的示例如下:
训练数据集的格式如下,其中这个score得分是召回算出来的相似度或者距离,仅供参考,可以忽略:
训练数据集的示例如下:
(1)运行环境
本实验采用了以下的运行环境进行,详细说明如下,用户也可以在自己 GPU 硬件环境进行:
a. 软件环境:
- python >= 3.6
- paddlenlp >= 2.2.1
- paddlepaddle-gpu >=2.2
- CUDA Version: 10.2
- NVIDIA Driver Version: 440.64.00
- Ubuntu 16.04.6 LTS (Docker)
b. 硬件环境:
- NVIDIA Tesla V100 16GB x4卡
- Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
c. 依赖安装:
PaddleNLP已经基于ERNIE 1.0训练了一个基线模型,如果想快速搭建Neural Search的完整系统,有两种方法,第一种是请参考下面的实现,包含了服务化的完整流程,另一种是使用Pipelines加载,Pipelines已经支持Neural Search训练的模型的载入,可以使用Pipelines的快速的基于Neural Search模型实现检索系统。
-
召回向量抽取服务的搭建请参考:In-batch Negatives, 只需要下载基于ERNIE 1.0的预训练模型,导出成Paddle Serving的格式,然后启动Pipeline Server服务即可
-
召回向量检索服务的搭建请参考:Milvus, 需要搭建Milvus并且插入检索数据的向量
【注意】如果使用Neural Search训练好的模型,由于该模型是基于ERNIE 1.0训练的,所以需要把 指定为,向量抽取结果才能正常。
排序服务的搭建请参考 ernie_matching,只需要下载基于ERNIE Gram的预训练模型,导出成Paddle Serving的格式,最后需要启动 Pipeline Serving服务
【注意】如果使用Neural Search训练好的模型,由于该模型是基于ERNIE Gram训练的,所以需要把 指定为,向量抽取结果才能正常。
以上召回和排序模型都经过Paddle Serving服务化以后,就可以直接使用下面的命令运行体验:
这里需要对run_system.py代码进行优化一下,不然会出现
输出的结果为:
会输出2个文件 是召回检索的结果, 是排序的结果。csv的示例输出下。
官方结果如下:
- 召回的结果:
- 排序的结果:
本人结果:
更多涉及内容见:issue,欢迎大家一起共建解决问题
[Bug]: 手把手搭建一个语义检索系统BUG,run.system.py在rank时出错,个人进行了修复,不过返回结果超级小和官方提供的有点出路
这里进行优化记录:
- top k 返回控制 通过修改milvus下config文件
- 先启动milvus 再开其他两个服务端,不然会报错
- 附上案例效果
这里展示了能够从头至尾跑通的完整代码,您使用自己的业务数据,照着跑,能搭建出一个给定 Query,返回 topK 相关文档的小型检索系统。您可以参照我们给出的效果和性能数据来检查自己的运行过程是否正确。
召回模型训练
我们进行了多组实践,用来对比说明召回阶段各方案的效果:
从上述表格可以看出,首先利用 ERNIE 3.0 做 Domain-adaptive Pretraining ,然后把训练好的模型加载到 SimCSE 上进行无监督训练,最后利用 In-batch Negatives 在有监督数据上进行训练能够获得最佳的性能。模型下载,模型的使用方式参考In-batch Negatives 。
这里采用 Domain-adaptive Pretraining + SimCSE + In-batch Negatives 方案:
第一步:无监督训练 Domain-adaptive Pretraining
训练用时 16hour55min,可参考:ERNIE 1.0
第二步:无监督训练 SimCSE
训练用时 16hour53min,可参考:SimCSE
第三步:有监督训练
几分钟内训练完成,可参考 In-batch Negatives
召回系统搭建
召回系统使用索引引擎 Milvus,可参考 milvus_system。
下面是召回的部分结果,第一个是召回的title,第二个数字是计算的相似度距离
排序阶段有2种方案,第一种是ernie_matching使用的模型是 ERNIE-3.0-Medium-zh,用时 20h;第二种是基于RocketQA的排序模型cross_encoder,训练用时也是20h左右。
排序阶段的效果评估:
同样输入文本:
排序阶段的结果展示如下,第一个是 Title ,第二个数字是计算的概率,显然经排序阶段筛选的文档与 Query 更相关:
语义索引(可通俗理解为向量索引)技术是搜索引擎、推荐系统、广告系统在召回阶段的核心技术之一。语义索引模型的目标是:给定输入文本,模型可以从海量候选召回库中快速、准确地召回一批语义相关文本。语义索引模型的效果直接决定了语义相关的物料能否被成功召回进入系统参与上层排序,从基础层面影响整个系统的效果。
本项目从无监督训练 Domain-adaptive Pretraining+无监督训练 SimCSE+有监督训练In-batch Negatives结合,使用 Milvus 搭建召回系统,然后使用训练好的语义索引模型,抽取向量,插入到 Milvus 中,然后进行检索。排序阶段采用ernie_matching和基于RocketQA的排序模型cross_encoder实现全流程自己的检索系统,欢迎大家尝试
- 性能对比
-
语义搜索系列文章全流程教学:
- [语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse:]
- [语义检索系统:基于in-batch Negatives策略的有监督训练语义召回:]
- [语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引:]
- [语义检索系统:基于ERNIE-Gram /RocketQA实现数据精排序:]
- [基于Milvus+ERNIE+SimCSE+IBN实现学术文献语义检索系统完整版:]
-
更多文本匹配方案参考:
- 特定领域知识图谱融合方案:技术知识前置【一】-文本匹配算法:
- 特定领域知识图谱融合方案:文本匹配算法Simnet、Diffcse【二】:
- 特定领域知识图谱融合方案:文本匹配算法ERNIE-Gram单塔等诸多模型【三】:
- 基于文心大模型套件ERNIEKit实现文本匹配算法:
- 特定领域知识图谱融合方案:学以致用-问题匹配鲁棒性评测比赛验证【四】:
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
[1] Tianyu Gao, Xingcheng Yao, Danqi Chen: SimCSE: Simple Contrastive Learning of Sentence Embeddings. EMNLP (1) 2021: 6894-6910
[2] Vladimir Karpukhin, Barlas Oğuz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, Wen-tau Yih, Dense Passage Retrieval for Open-Domain Question Answering. Preprint 2020.
[3] Dongling Xiao, Yu-Kun Li, Han Zhang, Yu Sun, Hao Tian, Hua Wu, Haifeng Wang: ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding. NAACL-HLT 2021: 1702-1715
本文地址:http://sjzytwl.xhstdz.com/quote/70064.html 物流园资讯网 http://sjzytwl.xhstdz.com/ , 查看更多