RAG 进阶:使用 Cohere 与 BGE Rerank 模型优化检索排序
本文探讨了 RAG 架构中检索后处理的重要性,重点介绍了 Rerank(重排序)技术。通过对比 Cohere 在线模型与 BGE-Reranker-large 本地模型,详细演示了基于 LlamaIndex 框架的集成方法。内容涵盖 Cohere API 调用、TEI 工具部署本地服务、自定义 Postprocessor 实现以及性能评估建议。旨在帮助开发者提升检索精度,优化大模型生成质量。

本文探讨了 RAG 架构中检索后处理的重要性,重点介绍了 Rerank(重排序)技术。通过对比 Cohere 在线模型与 BGE-Reranker-large 本地模型,详细演示了基于 LlamaIndex 框架的集成方法。内容涵盖 Cohere API 调用、TEI 工具部署本地服务、自定义 Postprocessor 实现以及性能评估建议。旨在帮助开发者提升检索精度,优化大模型生成质量。

在高级 RAG(Retrieval-Augmented Generation,检索增强生成)的应用架构中,检索后处理(Post-Retrieval)是一个至关重要的环节。顾名思义,这是在系统从向量数据库或混合索引中检索出与用户输入问题相关的多个文本块(Chunks)之后,但在将这些内容交给大语言模型(LLM)进行答案合成之前的一个关键处理步骤。在这个环节中,开发者可以实施多种策略,例如基于阈值的相似度过滤、关键词匹配过滤、或者对 Chunk 内容进行摘要替换等。其中,**Rerank(重排序)**技术是目前 RAG 应用优化中最常见且效果显著的一种手段。
简单来说,Rerank 的核心任务是对检索出来的多个 Chunk 列表进行二次打分和重新排序。其目标是使得最终的排名顺序与用户实际查询问题的语义相关性更加紧密匹配,确保最相关、最准确的上下文信息排在列表的前端,从而在 LLM 生成回答时能够被优先考虑,显著提高最终输出内容的准确性和可靠性。
尽管现代 RAG 系统广泛采用了基于向量索引与语义相似度的检索技术,但引入独立的 Rerank 模型依然具有不可替代的价值,主要原因包括以下几点:
本文将深入实践并推荐两种被业界广泛使用的优秀 Rerank 模型方案:在线商业模型 Cohere Rerank 和本地开源模型 bge-reranker-large。
Cohere Rerank 是一款商业闭源的 Rerank 模型,由 Cohere 公司开发。它根据与指定查询问题的语义相关性对多个文本输入进行排序,专门用于帮助关键词或向量搜索返回的结果做重新排序与质量提升。该模型在多语言支持上表现优异,尤其适合跨国界或跨语言的 RAG 场景。
为了使用 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 = "百度文心一言的逻辑推理能力怎么样?"
# 原始检索结果
print('================before rerank================')
nodes_raw = retriever.retrieve(query_str)
for i, node in enumerate(nodes_raw):
print(f"Rank {i+1}: Score={node.score:.4f}, Text={node.text[:50]}...")
# 引入 Cohere Rerank 进行重排
cohere_rerank = CohereRerank(
model='rerank-multilingual-v3.0',
api_key='YOUR_API_KEY',
top_n=2
)
rerank_nodes = cohere_rerank.postprocess_nodes(nodes_raw, query_str=query_str)
# 重排后结果
print('================after rerank================')
for i, node in enumerate(rerank_nodes):
print(f"Rank {i+1}: Score={node.score:.4f}, Text={node.text[:50]}...")
在实际测试中发现,未经过 Rerank 直接向量检索的结果可能将语义相近但非核心的内容排在前面。而调用 Cohere Rerank 之后,节点内容的相关性和对应的评分更加匹配,排序逻辑更符合人类直觉。这种改进一方面有利于 LLM 生成更精准的回复,另一方面也可以帮助降低 top_k 数量,节约宝贵的上下文空间。
如果不使用 LlamaIndex,也可以直接使用官方 Cohere 模块插入到现有代码中:
import cohere
co = cohere.Client(api_key="<YOUR API KEY>")
query = "你的问题..."
docs = ["相关文档 1...", "相关文档 2...", "相关文档 3..."]
results = co.rerank(
model="rerank-multilingual-v3.0",
query=query,
documents=docs,
top_n=5,
return_documents=True
)
注意:如果需要中文支持,必须使用 rerank-multilingual-v3.0 模型版本。
bge-reranker-large 是由北京智源研究院开源的一款高性能 Rerank 模型,在多项权威评测中取得了优异成绩。为了在本地环境中使用该模型,我们推荐使用 HuggingFace 推出的 TEI(Text Embeddings Inference)工具进行部署。TEI 是一个高性能的推理服务器,支持 Embedding 和 Rerank 模型的快速部署。
在安装好 Docker 或 Python 环境后,可以通过命令行自动下载模型并启动服务:
model=BAAI/bge-reranker-large
text-embeddings-router --model-id $model --port 8080
部署完成后,TEI 默认会暴露 FastAPI 接口。访问 http://localhost:8080/docs/ 即可查看当前服务提供的 API 文档,并直接在浏览器中测试 Rerank 接口的连通性。
由于 LlamaIndex 早期版本未直接内置集成该模型组件,我们需要创建一个自定义的检索后处理器来对接 TEI 服务。以下是完整的实现代码:
import requests
from typing import List, Optional
from llama_index.core.bridge.pydantic import Field, PrivateAttr
from llama_index.core.postprocessor.types import BaseNodePostprocessor
from llama_index.core.schema import NodeWithScore, QueryBundle
class BgeRerank(BaseNodePostprocessor):
url: str = Field(description="Rerank server url.")
top_n: int = Field(description="Top N nodes to return.")
def __init__(self, top_n: int, url: str):
super().__init__(url=url, top_n=top_n)
def rerank(self, query, texts):
url = f"{self.url}/rerank"
request_body = {"query": query, "texts": texts, "truncate": False}
response = requests.post(url, json=request_body)
if response.status_code != 200:
raise RuntimeError(f"Failed to rerank, detail: {response.text}")
return response.json()
@classmethod
def class_name(cls) -> str:
return "BgeRerank"
def () -> [NodeWithScore]:
query_bundle :
ValueError()
(nodes) == :
[]
texts = [node.text node nodes]
results = .rerank(
query=query_bundle.query_str,
texts=texts,
)
new_nodes = []
result results[ : .top_n]:
new_node_with_score = NodeWithScore(
node=nodes[(result[])].node,
score=result[],
)
new_nodes.append(new_node_with_score)
new_nodes
构建好自定义处理器后,即可像使用 Cohere 一样调用:
# 创建自定义的检索后处理器
customRerank = BgeRerank(url="http://localhost:8080", top_n=2)
# 测试处理节点
rerank_nodes = customRerank.postprocess_nodes(nodes_raw, query_str='百度文心一言的逻辑推理能力怎么样?')
在相同用例下,本地 BGE 模型的排序结果与 Cohere 非常接近,证明了其在通用场景下的有效性。
在实际落地 RAG 系统时,选择哪种 Rerank 方案需综合考虑成本、延迟和数据隐私:
为了量化 Rerank 带来的收益,建议在测试集上计算以下指标:
此外,建议在生产环境中记录 Rerank 前后的 Top-K 变化日志,定期分析哪些查询场景下 Rerank 修正了错误排序,以便持续优化 Prompt 或调整检索参数。
本文详细介绍了两种出色的 Rerank 模型的使用方案。Cohere Rerank 是一种商业在线的模型方案,适合快速验证和中小规模应用;而 bge-reranker-large 配合 TEI 工具则提供了开源可部署在本地的强大能力,适合对成本和隐私有要求的内部系统。
尽管 Rerank 在 RAG 管道中所处的环节看似没有检索(Retrieval)或者生成(Generation)那么核心,但由于其实现简单、资源要求较低、且不依赖于底层嵌入模型的特性,它能够以较小的代价显著提升最终生成的质量。此外,Rerank 也是融合检索(Hybrid Search)等高级检索范式的必要步骤。有兴趣的开发者不妨尝试将其集成到现有系统中,或许能带来意想不到的惊喜。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online