重排序 (Re-ranking) 算法详解

重排序 (Re-ranking) 算法详解

1. 核心痛点

在传统的 RAG 流程中,向量检索(Retriever)通常返回 Top K(例如 5 个)文档给 LLM。然而:

  • 向量检索的局限:基于双塔模型(Bi-Encoder),将 Query 和 Document 分别编码。为了速度,牺牲了部分精度,只能捕捉粗粒度的语义相似性。
  • "迷失中间" (Lost in the Middle):如果 Top 5 中包含 2-3 个无关文档(噪音),LLM 很容易被误导,或者忽略掉真正正确的那个文档(特别是当正确文档排在中间时)。

2. 算法原理

重排序(Re-ranking)引入了一个精排阶段

  1. 扩大召回:Retriever 先召回更多的文档(例如 Top 50)。
  2. 精细打分:使用一个更精准但计算量更大的模型(Cross-Encoder 或 LLM),对这 50 个文档与 Query 的相关性进行逐一打分。
  3. 截断:取分数最高的 Top 5 给 LLM。

Cross-Encoder vs Bi-Encoder

  • Bi-Encoder (检索用):快速。Query 和 Doc 独立编码,计算余弦相似度。
  • Cross-Encoder (重排序用) :精准但慢。将 Query 和 Doc 拼在一起输入模型(如 BERT),让 Attention 机制充分交互,直接输出相关性得分。

流程图

Query
向量检索
Top 50 候选
重排序模型
Top 5 精选
大模型生成

3. 常见实现方案

3.1 使用专门的 Rerank 模型 (推荐)

目前业界效果最好的开源 Rerank 模型包括:

  • BGE-Reranker (BAAI/bge-reranker-v2-m3)
  • Cohere Rerank (商业 API,效果极佳)
  • Jina Reranker

这些模型经过大量相关性数据的微调,能精准识别"问题"和"答案"的匹配度。

3.2 使用 LLM 进行重排序 (Listwise / Pointwise)

如果没有专门的模型资源,可以直接 Prompt LLM 来做。

  • Pointwise:让 LLM 给每个文档打分(0-1分)。
  • Listwise:把 10 个文档标题一次性给 LLM,让它排序并输出索引。

Prompt 示例

text 复制代码
你是一个相关性评估专家。
请评估以下文档与用户问题的相关性,并按相关性从高到低排序。
只输出文档的 ID。

问题:{question}

文档列表:
[1] ...
[2] ...

4. 代码实现示例 (Java 伪代码)

java 复制代码
public List<Document> retrieveAndRerank(String query) {
    // 1. 粗排:召回 Top 50
    List<Document> candidates = vectorStore.similaritySearch(query, 50);
    
    // 2. 精排:调用 Rerank API (例如 Cohere 或 本地模型服务)
    List<ScoredDocument> ranked = rerankService.rank(query, candidates);
    
    // 3. 过滤:只取分数 > 0.8 的 Top 5
    return ranked.stream()
        .filter(doc -> doc.getScore() > 0.8)
        .limit(5)
        .map(ScoredDocument::getDocument)
        .collect(Collectors.toList());
}

5. 优缺点分析

  • 优点
    • 大幅提升准确率:是目前提升 RAG 效果最明显的手段。
    • 抗噪能力强:能有效剔除向量检索带来的不相关文档。
  • 缺点
    • 延迟增加:Cross-Encoder 计算慢,通常会增加几百毫秒的延迟。
    • 成本增加:需要额外的 GPU 资源部署模型或调用商业 API。
相关推荐
gihigo19982 小时前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
ctyshr3 小时前
C++编译期数学计算
开发语言·c++·算法
zh_xuan3 小时前
最小跳跃次数
数据结构·算法
yumgpkpm3 小时前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera
孞㐑¥3 小时前
算法—队列+宽搜(bfs)+堆
开发语言·c++·经验分享·笔记·算法
yufuu984 小时前
并行算法在STL中的应用
开发语言·c++·算法
xixixi777774 小时前
今日 AI 、通信、安全行业前沿日报(2026 年 2 月 4 日,星期三)
大数据·人工智能·安全·ai·大模型·通信·卫星通信
zh_xuan4 小时前
单青蛙跳台阶
数据结构·算法
Kx_Triumphs4 小时前
计算几何-旋转卡壳两种实现方案(兼P1452题解
算法·题解