重排序 (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。
相关推荐
Dlrb12113 小时前
C语言-指针三
c语言·算法·指针·const·命令行参数
Agent产品评测局3 小时前
制造业模具管理AI系统,主流产品能力对比详解:2026年智能制造选型深度洞察
人工智能·ai·chatgpt·制造
Tisfy3 小时前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
IronMurphy3 小时前
【算法四十七】152. 乘积最大子数组
算法
淘矿人4 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar4 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
搬砖的小码农_Sky5 小时前
AI Agent:WebMCP介绍和具体实现方案
人工智能·ai·人机交互·agi
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈7 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl