大模型运行系列 从Ranking到Reranking

每个搜查引擎面前都暗藏着一个至关关键却往往被漠视的组成局部——Reranking(从新排名)。那么,什么是Rerank呢?简而言之,这一环节旨在优化并调整搜查结果的顺序,使之愈加精准地婚配用户的查问需求。值得留意的是,不同状况下驳回的Rerank战略差异极大,由于针对每一个详细疑问都须要量身定制处置打算。以去年问世的一款名为RankGPT的先进模型为例,它应用大型言语模型对搜查结果启动从新排序,不只成果清楚,而且无需事前针对新数据启动额外训练即可成功。

“治学先治史”,这句话雷同实用于技术畛域。深化了解Ranking技术的开展历程关于把握最先进的Rerank方法来说很无心义。经过回忆这些系统随期间演化的环节,咱们能够更深入地理解现今所驳回的各种处置打算是如何设计进去的,以及它们是如何有效处置实践疑问的。

1. 早期的Ranking

早期的搜查引擎,相对便捷且但配置有限。过后的技术,就像 BM25一样,关键集中在准确的术语婚配上。这象征着,假设搜查查问中确实切单词没有出如今文档中,即使它正是你想要的,那么该文档就不会被以为是相关的。

这些早期系统的外围是一个名为“TF-IDF”的公式,它基于三个关键因历来确定文档的相关性,其中TF是搜查术语在文档中发生的频率,DF是有多少其余文档蕴含相反的术语,以及文档的长度。

为了规范化文档长度并比拟文档与搜查的相关性,在余弦距离中经常使用了一种称为“向量空间模型”的技术。只管这种方法为早期的搜查引擎奠定了基础,但是它有一个很大的缺陷,那就是它不能了解单词面前的意思或检测同义词。一切物品都必定齐全婚配。

例如,假设你搜查一个“凄惨的恋情故事”,一个带有短语“命运多舛的恋人”的文档(如罗密欧与朱丽叶)或许不会发生,即使它正是你想要的。这个疑问被称为词汇不婚配疑问,是这些早期搜查系统面临的最大应战之一。随着言语和术语的开展,不同的术语或许指的是同一个概念,但准确婚配系统无法弥合这一差距。

为了克制这个词汇不婚配的疑问,发生了一些技巧:

但是,真正的打破来自神经网络,它反派性地支持语义婚配,即了解单词面前的意思的才干,即使它们不是齐全婚配的搜查。

这种从准确词汇婚配到语义婚配的转变标志着搜查技术的一个转机点。当天的搜查引擎联合了这两种方法来给咱们更准确的结果,即使在措辞不齐全婚配的状况下,也可以提供相关的内容。

2. LTR的兴起

在神经网络时代之前,像 BM25这样的搜查引擎和相似的方法经常使用无监视的方法依据词频等起因对文档启动排序。这些系统可以经过数据启动微调,但它们不足一种更准确的、基于学习的方法。LTR(Learning to Rank)依赖于从文本自身设计的特色,比如词频、文档长度和 BM25得分。例如,Ranking系统如今可以思考特定术语在文档的某个距离内发生的频率,或许它们出如今题目等关键畛域的频率。这些洞见使得搜查结果愈加准确、相关。

LTR 模型通常依据它们处置排序义务的方式启动分类:

在2010年前后,LTR到达了高峰。基于树的模型,特意是梯度增强的决策树,成为优化搜查Ranking的首选处置打算。

LTR 技术为如今更先进的搜查系统铺平了路线。但是,深度学习的来到把事件带到了一个新的水平,提供了更复杂的方法来排序搜查结果,更准确和更深化地理解用户用意。搜查的开展还远未完结,但 LTR 代表着这个环节中的一个关键里程碑。

XGBoost 成功了经过一组目的函数和性能目的口头LTR。它的目的函数是rank:ndcg,基于 LambdaMART 算法,该算法是对 LambdaRank 框架的变革,以顺应梯度优化树。上方的代码片段展现了如何成功LTR模型。

from sklearn.datasets import make_classificationimport numpy as npimport xgboost as xgb# Make a synthetic ranking, lambdarank_num_pair_per_sample=8, objective="rank:ndcg", lambdarank_pair_method="topk")ranker.fit(X, y, qid=qid)

3. 深度学习的来到: 搜查排名的新方式

随着深度学习的兴起,搜查排名向前迈进了一大步。有两个关键的打破,首先,延续向量示意准许模型逾越便捷地准确婚配,并了解词之间更深档次的相关。其次,深度学习缩小了对手工标注特色的需求,而特色标注在早期的LTR系统中是一个严重应战。

在回忆文本Ranking中的深度学习时,可以思考两个不同的阶段:BERT 之前的模型和基于 Transformer 的模型。在2019年,BERT的引入扭转了游戏规定,由于基于 BERT 模型提供了更好的性能。这种区别基本上代表着搜查排名深度学习的两个时代。

3.1 BERT发生之前的神经网络Ranking模型

在 BERT 之前,用于神经排序的模型关键有两种: 基于示意的模型和基于交互的模型。

基于示意的模型区分学习了查问和文档的密集向量示意,并经常使用余弦距离等目的启动比拟。一个早期的例子是深度结构化语义模型(DSSM),它经常使用字符 n-gram 来创立向量示意。起初,诸如基于 CNN 的 DSSM 和双嵌入空间模型(DESM)经过参与高低文和预先训练的词语嵌入启动了改良。

基于交互的模型并重于经过经常使用相似矩阵来捕捉查问和文档中特定术语之间的相关。矩阵反映了嵌入查问术语与文件中查问术语的相似水平。这种方法经过经常使用延续向量来处置词汇不婚配的疑问,而不是依赖于准确的词语婚配。

这些模型通常遵照两个步骤:

3.2 Transformer时代的Reranking

随着像 BERT 这样的Transformer模型的兴起,搜查系统中的Ranking曾经变得愈加复杂,以便提供愈加准确和相关的结果。现代消息检索系统通常遵照两个步骤来平衡速度和准确性,其上班原理如下:

这种两阶段方法由于统筹了效率和准确性而被宽泛经常使用。经过首先检索较小的文档集,系统防止了神经网络的高计算老本,同时依然受益于它们在Reranking中的高精度。

4. Reranking的成功方法

只管有许多方法可以运行于Reranking,但基本上可以分为3类:相关性分类、 提炼查问和文档的示意和浓密式表白。

4.1 基于相关性分类的Reranking

一个最便捷的方法来处置文本排序是把它作为一个文本分类疑问。这个想法是将每个文本分为“相关”和“不相关”两类,而后依据每个文本属于“相关”类别的或许性对结果启动排序。实践上,咱们正在训练一个模型来预计给定文本与用户查问相关的概率,而后依据这些概率对文本启动排序。

关于给定的查问 q 和候选文本 d,该模型计算一个代表相关性的得分 s_i,示意为:

但是这些候选文本是从哪里来的呢?思考到典型文本语料库的大小,将这个环节运行到语料库中的每个文档,这在计算上是无法行的。对每个用户查问的数百万个文档运转神经网络推理,这将十分缓慢而且老本高昂。

大少数搜查系统,包括那些经常使用 BERT 的系统,都遵照检索和Reranking的方法。这象征着系统不会对语料库中的一切文档运转 BERT,而是首先经常使用更快、更传统的方法(比如 BM25,它依赖于关键字婚配)检索一组更小的候选文本。这个初始阶段称为候选生成或第一阶段检索。

一旦检索到候选项,BERT 就会经过计算每个候选项的相关性得分对他们启动从新排序。这个从新排名的步骤为搜查参与了更深档次的内容和了解,与最后的基于关键字的ranking相比,提高了搜查结果的品质。

例如,经常使用monoBert模型对查问和每个候选文本启动结构化剖析来成功关联分类。关于每个查问 q 和一个候选文档 d,输入序列的结构如下:

其中,CLS是BERT 用来示意整个输入的不凡标志;q是用户的查问,已有分词标志;SEP用于分隔段的不凡标志;d _ i: 候选文本的token。这种结构化的输入被称为输入模板,是BERT处置文本的关键局部。BERT而后为该序列中的每个token生成高低文向量示意。

MonoBERT 聚焦于 CLS 令牌的示意,它捕捉查问和候选文本之间的总体相关。该示意方法经过一个单层齐全连通的神经网络生成候选文档的相关分数 s _ i。幽默的是,monoBERT 只经常使用 CLS 令牌的示意来计算相关性得分,而疏忽了其余令牌的示意。这使模型既便捷又有效。

MonBERT 的ranking模型经过输入查问和待评分的候选文本(由适当的不凡标志解围) ,使 BERT 实用于相关性分类。MonoBERT 接受一个文本序列作为输入。这个序列包括不凡的标志和须要比拟的内容。详细来说,它看起来像这样:

[CLS], query, [SEP], document, [SEP]

CLS 和 SEP 是 BERT 经常使用的不凡标志,用于识别输入的不同局部在哪里开局和完结。查问是用户输入的文本,而文档是被评价相关性的候选文本。查问标志齐全依照用户输入的内容失掉。当咱们探求表白搜查的不同方式时,这个细节变得十分关键,比如搜查是一个便捷的题目还是一个更长的形容。查问被标志为段 A,文档被标志为段 B,这有助于模型了解每个段的角色。

一旦这个输入序列预备好了,它就被传递给 BERT,它处置整个序列并为序列中的每个标志或单词生成一个“高低文示意”。BERT 的上班是依据单词发生的高低文来捕捉它们的意思。在 monoBERT 中,[ CLS ]充任整个序列的模型摘要。最后一步是将这个[ CLS ]令牌输入一个便捷的神经网络,以预测文档与查问的相关水平。输入是一个分数,通知咱们该文档婚配的或许性。

这个将查问和文档传递给 BERT 启动比拟的环节,称为交叉编码方法。只管 monoBERT 经常使用[ CLS ]令牌启动相关性评分,但它疏忽了其余token的示意。

要成功交叉编码器reranking,可以参照以下步骤:

 sentence_transformers  CrossEncodercross_encoder  CrossEncoderpairs  query doc doc  retrieved_documentsscores  cross_encoderpredictpairs score  scores:score o  npargsortscores:::o

MonoBERT 的一个局限是它难以处置较长的输入文本。monoBERT有一个固定的输入长度,这象征着它最适宜于较短的文本。因此,只管 monoBERT 可以有效地对段落长度的文本启动排序,但它还是难以处置完整的资讯文章等较长的文档。它只能处置多达512个token的序列。由于它依赖于位置嵌入来了解令牌的顺序,任何善于512个令牌的输入都会失落消息,并被视为一个随机的单词汇合,从而造成模型失去对文本流动的感知。

BERT 的长度限度给长文本排序带来了两大应战——

(1)训练

在训练环节中最大的疑问是,咱们应该将文档的哪一局部输入到模型中?想象一个文档,其中有几个相关的句子扩散在整个文档中,或许整个文档觉得像一个完整的包一样相关。咱们如何训练 monoBERT 来处置这些不同的状况?假构想树立不同档次的相关性模型,就更为辣手。

由于查问通常很短,而文档很长,咱们必定截断文档以顺应模型。但假设咱们切掉最关键的局部呢?只管咱们可以经常使用一些技巧,比如只向 BERT 提供文档中蕴含查问术语的局部,但这依然让咱们猜想咱们向模型提供的训练数据能否实践上是文档中最相关的局部。

(2)推理

在推理环节中,当依据搜查查问对文档启动排序时,咱们面临相反的长度限度。假设一个文档太长,咱们不能便捷地将它所有输入 BERT。咱们必定将文档宰割成块并选择如何处置它们。例如,咱们应该把它分红固定大小的局部,还是像句子一样经常使用人造宰割?这些块应该堆叠多少?

一旦咱们有了块,咱们依然须要一种方法来组合来自文档不同局部的相关性得分。有两种经常出现的方法:

为了处置 BERT 的长度限度,Dai 和 Callan 在2019年提出了一个处置打算,基本想法是这样的:

详细而言,文档被划分为150个单词的片段,每个片段之间有75个单词的堆叠。关于每个段 ,模型像 monoBERT 一样处置它: 查问和段被兼并并输入 BERT,经常使用最终的[ CLS ]标志对段启动评分。在给每篇文章打分之后,咱们可以用三种方法把分数组合起来:

经过将文档宰割成可治理的块,而后聚合结果,咱们可以对整个文档启动排序,同时坚持在 BERT 的输入长度限度内。

在 monoBERT和 BERT-MaxP 等早期模型中,只经常使用[ CLS ]标志作为 BERT 用于汇总输入的不凡标志。它用于计算文档与查问的婚配水平。但是,BERT 为查问和文档中的一切单词生成了高低文嵌入。疏忽这些嵌入看起来像是错失良机,这正是 MacAvaney 在2019在开发 CEDR (Leveraging Contextual Embedding Ranking)所处置的疑问。

CEDR 经过保管和经常使用 BERT 生成的高低文嵌入,这些嵌入可以提供关于文档不同局部与查问相关性的更纤细信号。

为了处置超越 BERT 512 token限度的文档,CEDR 将文档分红更小的、可治理的块。这些块(包括查问和不凡的分隔符标志)由 BERT 一一处置。处置完一切数据块后,CEDR 从每个数据块失掉[ CLS ]示意,并对它们启动平均,以创立文档级[ CLS ]示意(一种称为平均池的技术)。CEDR 不只仅经常使用[ CLS ]令牌,还保管每个块的高低文嵌入,将这些内容衔接起来,构成整个文档的高低文嵌入完整序列。

一旦创立了文档级嵌入,CEDR 经过比拟每个文档项的嵌入和每个查问项的嵌入来结构相似矩阵。这些矩阵捕捉文档不同局部与查问不同局部的婚配水平,比独自经常使用[ CLS ]令牌提供了更深化的相关性了解。

经过将 BERT 弱小的嵌入到现有的神经排序模型中,CEDR 可以一块一块地处置较长的文档,同时依然坚持模型端到端的可训练性。这不只处置了 BERT 的长度限度,而且准许 CEDR 充沛应用 BERT 提供的丰盛高低文消息,使其在文档排序义务中具备好处。

4.2. 提炼查问和文档的示意

消息检索中最大的应战之一是词汇不婚配疑问,即搜查内容和文档经常使用不同的词来形容同一个概念。

依赖于准确婚配的传统ranking模型,如 BM25,假设相关文档不蕴含查问中确实切单词,则无论相关性如何,都不会检索到该文档。基于神经网络的ranking模型,特意是那些经常使用延续向量示意的模型,经过学习“软”婚配提供了一个潜在的处置打算。他们不依赖于准确的词语婚配,而是能够识别词语之间的语义相关。

但是,在这些模型中依然存在一个关键的瓶颈即初始候选项的生成阶段。大少数Ranking系统经常使用多阶段环节,第一阶段检索候选文档(通经常常使用像 BM25这样的准确婚配系统) ,第二阶段经常使用更弱小的模型(如 BERT)对候选文档启动Reranking。但是,假设第一阶段由于不足婚配的术语而无法检索到相关文档,那么无论Reranking如许低劣,都无法检索到一开局没有发生的内容。

只管相关文档与查问没有堆叠的状况并不经常出现,但遗漏关键术语的状况很经常出现。这个疑问的强力处置打算是便捷地参与在第一阶段检索到的候选文档的数量,宿愿相关文档最终会出如今更深化的结果中。但这种处置打算有其自身的缺陷,即提前的参与。随着须要处置的候选文档越来越多,Reranking变得越来越慢。

真正的处置打算是改良或增强查问和文档的示意方式,这样它们就能更严密地与用户的搜查用意坚持分歧。这可以经过诸如查问裁减和文档裁减等技术来成功。文档裁减经过向文档参与额外的术语来更充沛地示意其内容或将其与潜在查问咨询起来。它将同义词或相关术语参与到查问自身,可以参与查找或许经常使用不同单词的相关文档的时机。查问裁减则相反,它将同义词或相关术语参与到查问自身,雷同可以参与找到或许经常使用不同单词的相关文档的时机。

这两种方法都有助于处置词汇表不婚配的疑问,由于它们都参与了查问和相关文档之间婚配的或许性。

在大模型运行中,可以经过揭示词成功Query 变换(详见大模型运行系列:Query 变换的示例浅析)。其中,一个Query改写的示例如下:

rewrite_prompt ChatPromptTemplatefrom_templatedef parse_rewriter_outputmessage: messagecontentstripstriprewriter  rewrite_prompt llm parse_rewriter_outputdef qa_rrrinput:new_query  rewriterinvokeinputdocs  retrieverget_relevant_documentsnew_queryformatted  promptinvoke{: docs : input}answer  llminvokeformatted answerqa_rrrinvoke

请留意,示例中用一个LLM将用户初始查问重写为更明晰的查问,而后被传递给检索器以失掉最相关的文档。这种方法的缺陷是,它在链中引入了额外的提前,须要按顺序口头两个LLM调用。

与query变换相比,经常使用查问预测启动文档裁减提供了一种不同的方法。文档裁减并不新颖,它曾经存在了几十年,但是2019年 Nogueira 等人引入 doc2query 后,经常使用神经网络启动了演进。

Doc2query 经常使用序列到序列模型(一种为言语翻译等义务设计的神经网络) ,失掉一段文本并生成与文档相关的查问。这些查问基于实在环球的数据,这些数据中成对的查问和相关文档被用来训练模型。一旦模型失掉训练,它就可以预测语料库中每个文档的有哪些查问。而后,这些预测的查问将被参与到原始的文档文本中。这些“裁减文档”如今不只蕴含原始内容,还蕴含潜在的搜查查问,这提高了它们在初始搜查阶段被检索到的时机。在对这些裁减文档启动索引和检索时,系统能够更好地检索相关消息。这种技术可以无缝地集成就任何多阶段排序流水线的第一阶段检索中,并且可以与咱们前面探讨的Reranking模型完美地一同上班。

Doc2query的成功示例代码如下所示:

sample_doc   pyterrier_doc2querydoc2query  pyterrier_doc2queryDoc2Querydoc2query{ :   : sample_doc}

Doc2Query 对象有一个 change ()函数,它接受每个文档的文本,并为该文本提出疑问。生成的数据框架将有一个额外的“ querygen”列,其中蕴含生成的查问。有很多方法可以将 Doc2query 引入 PyTerrier 检索环节。咱们可以经过传递另一个huggingface 模型称号(或文件系统上模型的门路)作为第一个参数来加载另一个T5模型。

doc2query  pyterrier_doc2queryDoc2Query pyterrier  ptptinitdataset  ptget_dataset pyterrier_doc2querydoc2query  pyterrier_doc2queryDoc2Queryappend indexer  doc2query  ptIterDictIndexerindex_locindexerdatasetget_corpus_iter

4.3 Reranking的浓密表白

深度学习给文本排名带来的最大打破之一,是从依赖稀疏信号(关键依赖准确的关键词婚配)转向能够捕捉单词面前含意的延续密集示意。这一飞跃使咱们能够更人造、更灵敏地树立相关性模型,处置诸如词汇不婚配这样的应战。

在基于浓密表白的检索技术中,Ranking间接在矢量示意(通常由Transformer生成)上口头。基于浓密表白检索经过比拟语义内容,实质上就是比拟嵌入在这些向量中的“意义”,而不是仅仅婚配出如今查问和文本中的词,这代表了面向基于关键字检索的一个严重转变。

自从词嵌入发生以来,浓密表白曾经显示出它们的后劲,这引发了咱们如今所说的人造言语处置(NLP)中的“神经网络反派”。单词嵌入标明机器能够了解单词之间的相关,证实言语可以用一种捕捉意义的方式来示意,而不只仅是外表量上的婚配。

但是,当咱们把这个概念从单个单词裁减到更大的文本块(如短语、句子或整个文档)时,事件就变得复杂起来,雷同的应战也出如今文本ranking/reranking中。

5. 基于大模型的Reranking成功示例

随着大模型运行的遍及,咱们可以应用 GPT-4或国际的其余大言语模型以更粗疏的方式评价文档的相关性,成功Reranking。基于 LLM 的Reranking上班流程如下:

基于 LLM 的Reranking成功示例如下:

 langchaindocstoredocument  Document langchain_openai  ChatOpenAI typing  List pydantic  BaseModel Field langchain  PromptTemplateclass RatingScoreBaseModel:relevance_score:   Field descriptinotallowdef rerank_documentsquery: str docs: ListDocument top_n:     ListDocument:prompt_template  PromptTemplateinput_variables templatellm  ChatOpenAItemperature model_name max_tokensllm_chain  prompt_template  llmwith_structured_outputRatingScorescored_docs   doc  docs:input_data  {: query : docpage_content}score  llm_chaininvokeinput_datarelevance_scoretry:score  score ValueError:score  scored_docsappenddoc scorereranked_docs  sortedscored_docs lambda x: x reverse doc  doc _  reranked_docs:top_n

在本示例中,LLM 评价每个文档与查问的相关性,对它们启动评分,并依据这些评分选用最高的文档。

6. 小结

经过回忆消息检索的历史,咱们可以了解到从Ranking到Reranking的演进环节。如今,Reranking是大模型运行中RAG 系统的一个十分关键的步骤,其核点是提高最后检索到的文件的相关性和品质。在最后的检索环节之后,对这些文档启动从新排序和从新组织,目的是确定最相关消息的优先秩序,确保在作出回应或决策时经常使用尽或许好的数据。

您可能还会对下面的文章感兴趣: