微信扫码
添加专属顾问
无论你是刚刚接触RAG,还是已经在项目中有所应用,这篇文章都将帮助你系统了解ReRanker的原理、常见实现方式及其在实际场景中的优化应用。希望这次总结能为你带来新的启发,助力你的技术提升。
重新排名是根据某些标准对项目列表重新排序的过程。在搜索上下文中,重新排名用于根据某些标准对搜索引擎返回的搜索结果进行重新排序。当搜索结果的初始排名不令人满意或者当用户提供了可用于改进搜索结果的排名的附加信息时,这可能很有用。
下面是几种常见的Reranker的实现方式,具体如下图片所示:
下面,我们通过LanceDB向量数据库来介绍上述Reranker的实现方式。LanceDB 是一个用于人工智能的开源矢量数据库,旨在存储、管理、查询和检索大规模多模式数据的嵌入。
LanceDB 的核心是用 Rust 编写的,并构建在Lance之上,Lance 是一种开源列式数据格式,专为高性能 ML 工作负载和快速随机访问而设计。
对于向量和 FTS 来说,使用重新排序器是可选的。然而,对于混合搜索,需要重新排序。要使用重新排序器,您需要创建重新排序器的实例并将其传递给查询构建器的ReRank方法。
import lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import CohereRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", data)reranker = CohereReranker(api_key="your_api_key")# Run vector search with a rerankerresult = tbl.query("hello").rerank(reranker).to_list()# Run FTS search with a rerankerresult = tbl.query("hello", query_type="fts").rerank(reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text")result = tbl.query("hello", query_type="hybrid").rerank(reranker).to_list()
大多数重新排序器支持基于多个向量的重新排序。要基于多个向量重新排序,您可以将向量列表传递给rerank方法。以下是如何使用CrossEncoderReranker基于多个向量列进行重新排名的示例:
from lancedb.rerankers import CrossEncoderRerankerreranker = CrossEncoderReranker()query = "hello"res1 = table.search(query, vector_column_name="vector").limit(3)res2 = table.search(query, vector_column_name="text_vector").limit(3)res3 = table.search(query, vector_column_name="meta_vector").limit(3)reranked = reranker.rerank_multivector([res1, res2, res3],deduplicate=True)
二、Cohere Reranker 一致性重排序器
支持的查询类型:混合、矢量、FTS(全文检索:Full-text Search)。
Cohere 是一家专注于企业人工智能的加拿大跨国科技公司,专门研究大型语言模型。
Cohere 由 Aidan Gomez、Ivan Zhu 和 Nick Frosst 于 2019 年创立,总部位于多伦多和旧金山,在帕洛阿尔托、伦敦和纽约市设有办事处。
原生的Cohere Rerank实现方式如下:
import cohereco = cohere.Client(api_key="<YOUR API KEY>")query = "What is the capital of the United States?"docs = ["Carson City is the capital city of the American state of Nevada. At the 2010 United States Census, Carson City had a population of 55,274.","The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that are a political division controlled by the United States. Its capital is Saipan.","Charlotte Amalie is the capital and largest city of the United States Virgin Islands. It has about 20,000 people. The city is on the island of Saint Thomas.","Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district. The President of the USA and many major national government offices are in the territory. This makes it the political center of the United States of America.","Capital punishment (the death penalty) has existed in the United States since before the United States was a country. As of 2017, capital punishment is legal in 30 of the 50 states. The federal government (including the United States military) also uses capital punishment."]results = co.rerank(model="rerank-english-v3.0", query=query, documents=docs, top_n=5, return_documents=True)
LanceDB中,通过将CohereReranker()传递给rerank()方法来使用此重新排序器。请注意,您需要设置COHERE_API_KEY环境变量或传递api_key参数才能使用此重新排序器。
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import CohereRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = CohereReranker(api_key="key")# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
三、Cross Encoder Reranker 交叉编码器重排序
在交叉编码器架构中,模型的输入始终由编码器联合处理的数据对(例如,两个句子或文档)组成。这使得模型能够更有效地捕获输入序列之间的交互和关系。编码器通常由多层神经网络单元组成,例如变压器或循环神经网络 (RNN),它们将输入序列中的信息编码为固定大小的表示。
此重新排序器使用句子转换器中的交叉编码器模型对搜索结果进行重新排序。您可以通过将CrossEncoderReranker()传递给rerank()方法来使用此重新排序器。
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import CrossEncoderRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = CrossEncoderReranker()# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
四、ColBERT Reranker ColBERT 重排序器
ColBERT(https://github.com/stanford-futuredata/ColBERT)是一种快速、准确的检索模型,可在数十毫秒内对大型文本集合进行基于 BERT 的可扩展搜索。尤其是最后一部分非常重要。
RAG 本身并不是一项快速技术。所有LLM调用都会引入延迟。由于再次重新排序需要调用重新排序模型,因此引入了额外的延迟。 ColBERT 是可用的最快的重新排名模型之一,可以减少这种摩擦点。
ColBERT 依赖于细粒度的上下文后期交互:它将每个段落编码为令牌级嵌入矩阵(如上图蓝色所示)。然后在搜索时,它将每个查询嵌入到另一个矩阵中(以绿色显示),并使用可扩展向量相似度 ( MaxSim ) 运算符有效地查找与查询上下文匹配的段落。
此重新排序器使用 ColBERT 模型对搜索结果进行重新排序。您可以通过将ColbertReranker()传递给rerank()方法来使用此重新排序器。
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import ColbertRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = ColbertReranker()# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
五、OpenAI Reranker OpenAI 重新排序器
此重新排序器使用 OpenAI 聊天模型对搜索结果进行重新排序。您可以通过将OpenAI()传递给rerank()方法来使用此重新排序器。
此重新排序器是实验性的。 OpenAI 没有专门的重新排名模型,因此我们使用聊天模型进行重新排名。
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import OpenaiRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = OpenaiReranker()# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
六、Linear Combination Reranker 线性组合重排序器
这是 LanceDB 混合搜索使用的默认重新排序器。它使用分数的线性组合来组合语义和全文搜索的结果。可以指定线性组合的权重。默认为0.7,即语义搜索权重为70%,全文搜索权重为30%。
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import LinearCombinationRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = LinearCombinationReranker()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
七、Jina Reranker 吉娜·重新排序
Jina 重新排序器 v2 ( jina-reranker-v2-base-multilingual )是一个基于变压器的模型,已针对文本重新排序任务进行了微调,文本重新排序任务是许多信息检索系统中的关键组成部分。它是一个交叉编码器模型,将查询和文档对作为输入,并输出指示文档与查询的相关性的分数。该模型在大型查询文档对数据集上进行训练,能够高精度地对多种语言的文档进行重新排名。
与最先进的 reranker 模型(包括之前发布的jina-reranker-v1-base-en相比, Jina Reranker v2模型在一系列针对文本检索、多语言能力、功能的基准测试中表现出了竞争力。调用感知和文本到 SQL 感知的重新排序以及代码检索任务。
此重新排序器使用Jina API 对搜索结果进行重新排序。您可以通过将JinaReranker()传递给rerank()方法来使用此重新排序器。请注意,您需要设置JINA_API_KEY环境变量或传递api_key参数才能使用此重新排序器。
import osimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import JinaRerankeros.environ['JINA_API_KEY'] = "jina_*"embedder = get_registry().get("jina").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = JinaReranker(api_key="key")# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
八、AnswerDotAI Rerankers AnswerDotAI 重新排名
此集成允许使用answersdotai 的重新排名器对搜索结果重新排名。 Rerankers一个轻量级、低依赖性、统一的 API,可使用所有常见的重新排名和交叉编码器模型。
请阅读之前文章了解Rerankers的应用:RAG优化神器:rerankers重新排名模型的终极方案,提供轻量级统一API
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import AnswerdotaiRerankersembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = AnswerdotaiRerankers()# Run vector search with a rerankerresult = tbl.search("hello").rerank(reranker=reranker).to_list()# Run FTS search with a rerankerresult = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
九、Reciprocal Rank Fusion Reranker 倒数排名融合重排名器
前面的文章介绍过RRF的应用,感兴趣可以看一下这篇文章:RAG混合检索:掌握倒数秩融合RRF多维度提升检索结果评分的秘诀
倒数排名融合 (RRF) 是一种算法,用于评估多个先前排名结果的搜索分数,以生成统一的结果集。每当有两个或多个查询并行执行时,就会使用 RRF。每个查询都会生成一个排名结果集,并且 RRF 用于将排名合并并同质化为单个结果集,并在查询响应中返回。始终使用 RRF 的场景示例包括混合搜索和同时执行的多个向量查询。
参考论文:https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
Lancedb使用倒数排名融合 (RRF) 是一种通过利用文档的位置/排名来评估搜索分数的算法,代码示例如下:
import numpyimport lancedbfrom lancedb.embeddings import get_registryfrom lancedb.pydantic import LanceModel, Vectorfrom lancedb.rerankers import RRFRerankerembedder = get_registry().get("sentence-transformers").create()db = lancedb.connect("~/.lancedb")class Schema(LanceModel):text: str = embedder.SourceField()vector: Vector(embedder.ndims()) = embedder.VectorField()data = [{"text": "hello world"},{"text": "goodbye world"}]tbl = db.create_table("test", schema=Schema, mode="overwrite")tbl.add(data)reranker = RRFReranker()# Run hybrid search with a rerankertbl.create_fts_index("text", replace=True)result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
以上便是多种Reranker在Lancedb中的应用,其实不局限在Lancedb,这些方法不依赖任何向量数据库,只要在RAG应用中,都可以使用。
以上便是多种 Reranker 在 Lancedb 中的应用介绍,实际上这些方法并不仅限于 Lancedb。
Reranker 的原理和实现方式并不依赖于任何特定的向量数据库,因而无论你使用的是哪种数据库或检索系统,在任何 RAG 应用场景中,都可以灵活地集成和使用这些优化技术。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-04
大模型支持的上下文已超 1M, RAG 是不是没有意义了?
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-06-30
本体论语义建设新思路,另类RAG来解决检索问题
2026-06-30
别把RAG当架构:Ontology(本体)才是Agent的业务世界
2026-04-06
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-07-04
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。