免费POC, 零成本试错
AI知识库

AI知识库

学习大模型的前沿技术与行业落地应用


收藏

RAG系统中的“幕后英雄”:重排器如何提升信息检索的精准度?

发布日期:2025-04-14 14:15:21 浏览次数: 2654
作者:Halo咯咯

微信搜一搜,关注“Halo咯咯”

推荐语

探索RAG系统中重排器如何提升信息检索精准度,深入了解其在海量数据中筛选高质量信息的关键作用。

核心内容:
1. RAG系统中重排器的定义和作用
2. 使用重排器减少“幻觉”现象和节省成本
3. 重排器如何弥补嵌入向量的局限性,提高检索质量

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

在信息爆炸的时代,我们每天都在海量的数据中穿梭,试图找到真正有价值的信息。而Retrieval Augmented Generation(RAG)系统的出现,就像是一盏明灯,照亮了我们在信息海洋中的前行之路。但你有没有想过,RAG系统之所以能够精准地为我们提供有用的信息,背后其实有一个关键的“把关人”——重排器(Reranker)。今天,就让我们一起深入探索重排器的世界,看看它是如何在RAG系统中发挥着不可或缺的作用。

一、什么是RAG中的重排器?

想象一下,当你在搜索引擎中输入一个关键词,系统会在瞬间从庞大的数据库中检索出成千上万条相关信息。但这些信息的质量参差不齐,有的可能与你的需求高度相关,有的则可能完全不沾边。这就需要重排器登场了。

重排器就像是一个严格的质检员,它会对初步检索出来的文档进行二次筛选和排序。在初步检索阶段,系统可能通过语义搜索或关键词搜索等方法,快速地找到一批与查询内容有一定关联的文档。但这些文档就像是未经筛选的原材料,其中可能夹杂着许多无关紧要的信息。而重排器的任务,就是从这些文档中挑选出最符合用户查询意图的那部分,将它们放在最前面,从而提高搜索结果的质量。

举个简单的例子,假设你正在写一篇关于“人工智能在医疗领域的应用”的论文,你通过RAG系统检索相关资料。初步检索可能给你找到了几十篇论文、新闻报道和研究报告,这些内容可能涵盖了人工智能在医疗影像诊断、疾病预测、药物研发等多个方面的应用。但有些内容可能只是简单地提到了人工智能和医疗这两个词,而并没有深入探讨它们之间的关系。重排器就会对这些文档进行仔细分析,将那些真正详细阐述了人工智能在医疗领域具体应用案例、技术原理和效果评估的文档排在前面,让你能够更快地找到对你最有帮助的信息。

二、为什么要在RAG中使用重排器?

(一)减少“幻觉”现象

在RAG系统中,有一个常见的问题叫做“幻觉”(Hallucination)。简单来说,就是系统生成了一些与事实不符或者毫无意义的回答。这通常是由于检索到的文档中包含了大量无关的信息,导致系统在生成回答时被误导。而重排器可以有效地过滤掉这些无关文档,就像在食材中挑出坏掉的部分一样,从而减少“幻觉”现象的发生。

(二)节省成本

你可能会觉得,RAG系统检索文档的速度这么快,多检索一些文档也没什么大不了的。但实际上,处理这些文档需要消耗大量的计算资源和API调用费用。如果能够通过重排器精准地筛选出最相关的文档,就可以减少系统需要处理的信息量,从而节省成本。这就好比你在购物时,如果能够精准地找到自己想要的商品,就不需要浪费时间和精力去浏览大量的无关商品,同时也减少了购物成本。

(三)弥补嵌入向量的局限性

在RAG系统中,嵌入向量(Embedding)是一种常用的信息表示方法。它将文档和查询内容映射到一个低维的向量空间中,通过计算向量之间的相似度来判断文档与查询的相关性。但这种方法也存在一些局限性。首先,嵌入向量可能无法准确捕捉到语义的细微差别。比如,“我喜欢吃苹果”和“我喜欢吃苹果派”这两个句子在语义上虽然有联系,但也有明显的区别,但嵌入向量可能无法很好地区分它们。其次,将复杂的信息压缩到低维空间中,可能会导致信息丢失。最后,嵌入向量在处理超出其训练数据范围的信息时,可能会出现泛化能力不足的问题。而重排器可以弥补这些不足,它通过更复杂的匹配技术,对文档进行更细致的分析和排序。

三、重排器的优势

(一)“词袋嵌入”方法

重排器不会像嵌入向量那样,将整个文档简单地映射到一个单一的向量上。而是将文档分解成更小的、具有上下文信息的单元,比如句子或短语。这样,它就可以更准确地理解文档的语义。就像在阅读一篇文章时,我们不会只看文章的标题就下结论,而是会仔细阅读文章中的每一个段落、每一句话,从而更好地理解文章的主旨。

(二)语义关键词匹配

重排器结合了强大的编码器模型(如BERT)和基于关键词的技术,既能够捕捉到文档的语义含义,又能够关注到关键词的相关性。这就像是在寻找一本书时,我们不仅会看书的标题和内容简介,还会查看书中的关键词索引,从而更准确地判断这本书是否符合我们的需求。

(三)更好的泛化能力

由于重排器关注的是文档中的小单元和上下文信息,它在处理未见过的文档和查询时,表现得更加出色。这就像是一个经验丰富的侦探,他可以根据现场的细微线索,推断出案件的真相,即使他以前从未遇到过类似的案件。

四、重排器的类型

重排器的世界是丰富多彩的,不断有新的技术和方法涌现。下面我们就来了解一下几种常见的重排器类型。

(一)交叉编码器(Cross-Encoder)

交叉编码器是一种深度学习模型,它会对查询和文档这对数据进行分类分析,深入理解它们之间的关系。这就像是一个专业的翻译人员,他不仅能够理解两种语言的字面意思,还能够准确地把握它们之间的语义联系。交叉编码器在精确的相关性评分方面表现出色,但它的缺点是需要大量的计算资源,不太适合实时应用。

举个例子,假设我们使用FlashrankRerank作为重排器,结合ContextualCompressionRetriever来提高检索文档的相关性。代码如下:

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(temperature=0)
compressor = FlashrankRerank()
compression_retriever = ContextualCompressionRetriever(
   base_compressor=compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
   "What did the president say about Ketanji Jackson Brown"
)
print([doc.metadata["id"] for doc in compressed_docs])
pretty_print_docs(compressed_docs)

这段代码利用FlashrankRerank对基础检索器(retriever)检索到的文档进行重排,根据它们与查询“总统对Ketanji Jackson Brown说了些什么”的相关性进行排序。最终,它会打印出文档的ID和经过压缩、重排后的文档内容。

(二)多向量重排器(Multi-Vector Reranker)

多向量模型,如ColBERT,采用了一种延迟交互的方法。查询和文档的表示是独立编码的,它们的交互发生在处理过程的后期。这种方法允许预先计算文档的表示,从而加快检索速度,减少计算需求。

使用ColBERT重排器的代码如下:

pip install -U ragatouille
from ragatouille import RAGPretrainedModel
from langchain.retrievers import ContextualCompressionRetriever
RAG = RAGPretrainedModel.from_pretrained("colbert-ir/colbertv2.0")
compression_retriever = ContextualCompressionRetriever(
    base_compressor=RAG.as_langchain_document_compressor(), base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
    "What animation studio did Miyazaki found"
)
print(compressed_docs[0])

这段代码通过ColBERT重排器,对检索到的文档进行压缩和重排,以回答“宫崎骏创立了哪家动画工作室”这个问题。输出的文档内容中包含了宫崎骏创立吉卜力工作室的相关信息,以及该工作室的背景和第一部电影的相关内容。

(三)微调大型语言模型(Fine-tuned LLM)重排器

对大型语言模型(LLM)进行微调,是提高其在重排任务中表现的关键。预训练的LLM本身并不擅长衡量查询与文档之间的相关性。通过对它们在特定的排名数据集(如MS MARCO段落排名数据集)上进行微调,我们可以增强它们在文档排名方面的性能。

根据模型结构的不同,监督式重排器主要有两种类型:

  1. 编码器 - 解码器模型:这些模型将文档排名视为一个生成任务,使用编码器 - 解码器框架来优化重排过程。例如,RankT5模型被训练成生成标记,以将查询 - 文档对分类为相关或不相关。
  2. 仅解码器模型:这种方法侧重于微调仅使用解码器的模型,如LLaMA。RankZephyr和RankGPT等模型探索了在这种情况下计算相关性的不同方法。

通过应用这些微调技术,我们可以提高LLM在重排任务中的性能,使它们更有效地理解和优先考虑相关文档。

使用RankZephyr的代码如下:

pip install --upgrade --quiet  rank_llm
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_community.document_compressors.rankllm_rerank import RankLLMRerank
compressor = RankLLMRerank(top_n=3, model="zephyr")
compression_retriever = ContextualCompressionRetriever(
   base_compressor=compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(query)
pretty_print_docs(compressed_docs)

这段代码利用RankZephyr对检索到的文档进行重排,根据查询的相关性选择最相关的3个文档。输出的文档内容中包含了与查询相关的各种信息,如对俄罗斯实施经济制裁、关闭美国领空对俄罗斯航班等内容。

(四)将LLM作为“裁判”的重排方法

大型语言模型可以通过提示策略(如逐点、逐列表和成对方法)自主地改进文档重排。这些方法利用LLM的推理能力(将LLM作为“裁判”),直接评估文档与查询的相关性。虽然这些方法在有效性方面具有竞争力,但与LLM相关的高计算成本和延迟可能会阻碍实际应用。

  1. 逐点方法:逐点方法评估单个文档与查询的相关性。它包括两个子类别:相关性生成和查询生成。这两种方法都适用于零样本文档重排,即在没有特定示例的先验训练的情况下对文档进行排名。
  2. 逐列表方法:逐列表方法通过将查询和文档列表包含在提示中来对文档列表进行排名。然后指示LLM输出重排文档的标识符。由于LLM的输入长度有限,通常不可能一次性包含所有候选文档。为了管理这种情况,逐列表方法采用滑动窗口策略。这种方法一次对文档的一个子集进行排名,从后向前移动窗口,并且只对当前窗口内的文档进行重排。
  3. 成对方法:在成对方法中,LLM接收一个提示,其中包含查询和一对文档。模型的任务是确定哪个文档更相关。为了聚合结果,可以使用如AllPairs等方法。AllPairs生成所有可能的文档对,并为每个文档计算最终的相关性得分。高效的排序算法,如堆排序和冒泡排序,有助于加快排名过程。

使用OpenAI的GPT-4-turbo模型进行逐点、逐列表和成对重排的代码如下:

import openai
# Set your OpenAI API key
openai.api_key = 'YOUR_API_KEY'
def pointwise_rerank(query, document):
   prompt = f"Rate the relevance of the following document to the query on a scale from 1 to 10:\n\nQuery: {query}\nDocument: {document}\n\nRelevance Score:"
   response = openai.ChatCompletion.create(
       model="gpt-4-turbo",
       messages=[{"role": "user", "content": prompt}]
   )
   return response['choices'][0]['message']['content'].strip()
def listwise_rerank(query, documents):
   # Use a sliding window approach to rerank documents
   window_size = 5
   reranked_docs = []
   for i in range(0, len(documents), window_size):
       window = documents[i:i + window_size]
       prompt = f"Given the query, please rank the following documents:\n\nQuery: {query}\nDocuments: {', '.join(window)}\n\nRanked Document Identifiers:"
       response = openai.ChatCompletion.create(
           model="gpt-4-turbo",
           messages=[{"role": "user", "content": prompt}]
       )
       ranked_ids = response['choices'][0]['message']['content'].strip().split(', ')
       reranked_docs.extend(ranked_ids)
   return reranked_docs
def pairwise_rerank(query, documents):
   scores = {}
   for i in range(len(documents)):
       for j in range(i + 1, len(documents)):
           doc1 = documents[i]
           doc2 = documents[j]
           prompt = f"Which document is more relevant to the query?\n\nQuery: {query}\nDocument 1: {doc1}\nDocument 2: {doc2}\n\nAnswer with '1' for Document 1, '2' for Document 2:"
           response = openai.ChatCompletion.create(
               model="gpt-4-turbo",
               messages=[{"role": "user", "content": prompt}]
           )
           winner = response['choices'][0]['message']['content'].strip()
           if winner == '1':
               scores[doc1] = scores.get(doc1, 0) + 1
               scores[doc2] = scores.get(doc2, 0)
           elif winner == '2':
               scores[doc2] = scores.get(doc2, 0) + 1
               scores[doc1] = scores.get(doc1, 0)
   # Sort documents based on scores
   ranked_docs = sorted(scores.items(), key=lambda item: item[1], reverse=True)
   return [doc for doc, score in ranked_docs]
# Example usage
query = "What are the benefits of using LLMs for document reranking?"
documents = [
   "LLMs can process large amounts of text quickly.",
   "They require extensive fine-tuning for specific tasks.",
   "LLMs can generate human-like text responses.",
   "They are limited by their training data and may produce biased results."
]
# Pointwise Reranking
for doc in documents:
   score = pointwise_rerank(query, doc)
   print(f"Document: {doc} - Relevance Score: {score}")
# Listwise Reranking
reranked_listwise = listwise_rerank(query, documents)
print(f"Listwise Reranked Documents: {reranked_listwise}")
# Pairwise Reranking
reranked_pairwise = pairwise_rerank(query, documents)
print(f"Pairwise Reranked Documents: {reranked_pairwise}")

这段代码分别使用逐点、逐列表和成对方法对一组文档进行重排。输出结果显示了每个文档的相关性评分以及通过不同方法重排后的文档顺序。

(五)重排API

私有的重排API为希望在不进行大量基础设施投资的情况下,增强搜索系统语义相关性的组织提供了一个便捷的解决方案。像Cohere、Jina和Mixedbread等公司提供了这些服务。

Cohere:为英语和多语言文档提供定制模型,自动对文档进行分块,并将相关性得分标准化在0到1之间。

Jina:专注于通过语义理解增强搜索结果,并提供更长的上下文长度。

Mixedbread:提供一系列开源的重排模型,为集成到现有搜索基础设施中提供了灵活性。

使用Cohere的代码如下:

pip install --upgrade --quiet  cohere
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
from langchain_community.llms import Cohere
from langchain.chains import RetrievalQA
llm = Cohere(temperature=0)
compressor = CohereRerank(model="rerank-english-v3.0")
compression_retriever = ContextualCompressionRetriever(
   base_compressor=compressor, base_retriever=retriever
)
chain = RetrievalQA.from_chain_type(
   llm=Cohere(temperature=0), retriever=compression_retriever
)

这段代码通过Cohere的重排模型,对检索到的文档进行重排,以回答关于Ketanji Brown Jackson的查询。输出结果中包含了总统对Ketanji Brown Jackson的高度评价,以及她获得的支持等内容。

五、如何选择适合RAG的重排器?

选择最适合RAG系统的重排器需要综合考虑多个因素:

(一)相关性提升

重排器的主要目标是提高搜索结果的相关性。可以使用诸如归一化折损累积增益(NDCG)或归因等指标来评估重排器对相关性的提升效果。就像在评价一个厨师的手艺时,要看他做出来的菜肴是否符合客人的口味一样,我们也要看重排器是否能够真正提高搜索结果的质量。

(二)延迟

延迟是指重排器给搜索过程增加的额外时间。要确保这个时间在你的应用要求的可接受范围内。如果一个重排器虽然能够提高相关性,但需要花费过多的时间,那么在一些对实时性要求较高的场景中,它可能就不太适用了。就像在一场紧张的比赛中,你需要在短时间内做出正确的决策,如果一个工具需要花费太多时间来提供帮助,那么它可能就不是最佳选择。

(三)上下文理解能力

要考虑重排器对不同长度上下文的处理能力。在一些复杂的查询中,可能需要考虑较长的上下文信息,而有些重排器可能在这方面表现得更好。这就像是在阅读一篇文章时,有些读者能够更好地理解文章中的长难句和复杂的上下文关系,而有些读者则可能只能理解简单的句子。

(四)泛化能力

要确保重排器在不同的领域和数据集上都能有良好的表现,避免出现过拟合的情况。如果一个重排器只在特定的领域或数据集上表现良好,而在其他情况下表现不佳,那么它可能就不太可靠。这就像是一个学生,如果他只在某一个科目的考试中表现出色,但在其他科目的考试中成绩很差,那么他可能就不是一个全面发展的学生。

六、最新研究进展

(一)交叉编码器崭露头角

最近的研究表明,交叉编码器在与强大的检索器结合使用时,展现出了高效性和有效性。虽然在领域内的性能差异可能不太明显,但在领域外的场景中,重排器的影响则更加显著。交叉编码器在重排任务中通常能够超越大多数LLM(除了在某些情况下的GPT-4),并且效率更高。

七、结语

选择合适的RAG重排器对于提升系统的性能和确保准确的搜索结果至关重要。随着RAG领域的发展,清晰地了解整个流程对于团队构建有效的系统至关重要。通过应对过程中的挑战,团队可以提高性能。了解不同类型的重排器及其优缺点是必不可少的。仔细选择和评估RAG的重排器可以增强RAG应用的准确性和效率。这种深思熟虑的方法将带来更好的结果和更可靠的系统。

在RAG的世界里,重排器就像是一个默默无闻的英雄,虽然它不直接与用户交互,但却在背后为用户提供着精准、高效的信息服务。希望通过对重排器的深入了解,我们能够更好地利用RAG系统,在信息的海洋中畅游无阻,找到那些真正有价值的知识宝藏。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅