在高级 RAG(Retrieval-Augmented Generation,检索增强生成)的应用架构中,检索后处理(Post-Retrieval)是一个至关重要的环节。顾名思义,这是在系统从向量数据库或混合索引中检索出与用户输入问题相关的多个文本块(Chunks)之后,但在将这些内容交给大语言模型(LLM)进行答案合成之前的一个关键处理步骤。在这个环节中,开发者可以实施多种策略,例如基于阈值的相似度过滤、关键词匹配过滤、或者对 Chunk 内容进行摘要替换等。其中,**Rerank(重排序)**技术是目前 RAG 应用优化中最常见且效果显著的一种手段。
简单来说,Rerank 的核心任务是对检索出来的多个 Chunk 列表进行二次打分和重新排序。其目标是使得最终的排名顺序与用户实际查询问题的语义相关性更加紧密匹配,确保最相关、最准确的上下文信息排在列表的前端,从而在 LLM 生成回答时能够被优先考虑,显著提高最终输出内容的准确性和可靠性。
为什么有了向量检索还需要 Rerank?
尽管现代 RAG 系统广泛采用了基于向量索引与语义相似度的检索技术,但引入独立的 Rerank 模型依然具有不可替代的价值,主要原因包括以下几点:
- 多源异构检索的融合需求:RAG 应用中常采用多路混合检索策略,结合关键词搜索(BM25)、向量搜索(Dense Retrieval)等多种索引类型。不同算法返回的结果格式和评分标准不一,需要借助统一的 Rerank 模型进行语义层面的归一化重排。
- 纠正语义偏差:即使是完全基于向量构建的索引,由于嵌入模型(Embedding Model)的差异、相似性算法的选择、语言环境的不同以及特定领域知识的分布特点,初始检索的相关度排序往往存在较大偏差。独立的 Rerank 模型通常采用 Cross-Encoder 架构,能更精细地理解 Query 与 Document 之间的交互关系,从而有效纠正排序错误。
- 提升信噪比:通过 Rerank 筛选掉低相关性的噪声文档,可以在不增加 Token 消耗的前提下,提高进入 LLM 上下文的文档质量,降低幻觉产生的概率。
本文将深入实践并推荐两种被业界广泛使用的优秀 Rerank 模型方案:在线商业模型 Cohere Rerank 和本地开源模型 bge-reranker-large。
Cohere Rerank 模型
Cohere Rerank 是一款商业闭源的 Rerank 模型,由 Cohere 公司开发。它根据与指定查询问题的语义相关性对多个文本输入进行排序,专门用于帮助关键词或向量搜索返回的结果做重新排序与质量提升。该模型在多语言支持上表现优异,尤其适合跨国界或跨语言的 RAG 场景。
1. 接入方式
为了使用 Cohere Rerank,首先需要在官方网站注册账号并申请 API Key(测试阶段通常提供免费额度)。在代码集成方面,LangChain 与 LlamaIndex 等主流框架均已内置了 Cohere 的 SDK 支持,开发者可以直接调用。
以下示例展示了如何在 LlamaIndex 框架中对比 Rerank 前后的节点排序区别。我们构建了一个关于百度文心一言的介绍文档作为知识库上下文:
from llama_index.postprocessor.cohere_rerank import CohereRerank
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, SentenceSplitter, Settings
# 加载数据
loader = SimpleDirectoryReader(input_files=["../../data/yiyan.txt"])
docs = loader.load_data()
# 构建索引
nodes = SentenceSplitter(chunk_size=100, chunk_overlap=0).get_nodes_from_documents(docs)
vector_index = VectorStoreIndex(nodes)
# 配置检索器
retriever = vector_index.as_retriever(similarity_top_k=5)
query_str = "百度文心一言的逻辑推理能力怎么样?"
# 原始检索结果
()
nodes_raw = retriever.retrieve(query_str)
i, node (nodes_raw):
()
cohere_rerank = CohereRerank(
model=,
api_key=,
top_n=
)
rerank_nodes = cohere_rerank.postprocess_nodes(nodes_raw, query_str=query_str)
()
i, node (rerank_nodes):
()


