RAG重排序Rerank策略
引言 在RAG系统中,向量检索通常返回Top-K候选文档,但这些文档的排序精度往往不够理想——原因在于向量检索使用的是双塔模型(Bi-Encoder),查询和文档独立编码,无法捕获细粒度的交互特征。重排序(Rerank)通过使用更精细的交叉编码器(Cross-Encoder)对候选文档重新打分,显著提升排序质量。本文深入Rerank策略的原理、模型选择和工程实践。 为什么需要Rerank 双塔模型的局限 向量检索使用双塔模型:查询和文档分别编码为向量,通过点积或余弦相似度计算相关性。这种方式的优势是速度快(可以预计算文档向量),但局限在于: 缺乏交互:查询和文档在编码时没有交互,无法捕获词级别的匹配关系 语义粗粒度:向量相似度高不等于真正相关,可能存在"语义假阳性" 排序精度有限:Top-1的准确率通常只有60-70%,存在改进空间 Cross-Encoder的优势 重排序模型使用Cross-Encoder:将查询和文档拼接在一起输入模型,模型可以捕获两者的细粒度交互特征。这相当于让模型"逐字对比"查询和文档,排序精度远高于双塔模型。 两阶段检索架构 查询 → 向量检索(召回阶段)→ Top-20候选 → Rerank(精排阶段)→ Top-5最终结果 两阶段架构平衡了效率和精度:向量检索负责高效召回,Rerank负责精确排序。 Rerank模型选择 通用Rerank模型 Cohere Rerank:商业API,效果优秀,使用简单: import cohere co = cohere.Client('your-api-key') def cohere_rerank(query, documents, top_n=5): results = co.rerank( model='rerank-multilingual-v3.0', query=query, documents=documents, top_n=top_n ) return [documents[r.index] for r in results.results] BGE-Reranker:开源模型,支持本地部署: from FlagEmbedding import FlagReranker reranker = FlagReranker('BAAI/bge-reranker-large', use_fp16=True) def bge_rerank(query, documents, top_n=5): pairs = [[query, doc] for doc in documents] scores = reranker.compute_score(pairs) # 按分数排序 ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True) return [doc for doc, _ in ranked[:top_n]] bge-reranker-v2-m3:多语言支持,轻量高效: from sentence_transformers import CrossEncoder model = CrossEncoder('BAAI/bge-reranker-v2-m3', max_length=512) def rerank(query, documents, top_n=5): pairs = [[query, doc] for doc in documents] scores = model.predict(pairs) ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True) return [doc for doc, _ in ranked[:top_n]] 模型选择对比 模型 类型 语言支持 延迟 效果 成本 Cohere Rerank API 多语言 中 优秀 按量付费 bge-reranker-large 本地 中英 中 优秀 免费(需GPU) bge-reranker-v2-m3 本地 多语言 低 良好 免费(轻量) ms-marco-MiniLM 本地 英文 低 良好 免费 GPT-4 Rerank API 多语言 高 优秀 高(按token) LLM作为Rerank器 使用LLM对候选文档进行重排序: ...