重排序 (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。
相关推荐
蚂蚁数据AntData1 分钟前
破解AI“机器味“困境:HeartBench评测实践详解
大数据·人工智能·算法·机器学习·语言模型·开源
ZC跨境爬虫2 分钟前
Python异步IO详解:原理、应用场景与实战指南(高并发爬虫首选)
爬虫·python·算法·自动化
倦王15 分钟前
力扣日刷47-补
python·算法·leetcode
-许平安-38 分钟前
MCP项目笔记九(插件 bacio-quote)
c++·笔记·ai·plugin·mcp
沉鱼.441 小时前
第十三届题目
c语言·c++·算法
ZHOU_WUYI1 小时前
ppo算法简单实现
人工智能·pytorch·算法
无限进步_1 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio
程序员鱼皮1 小时前
AI 时代,满分的程序员简历是怎么样的?附简历模板
ai·程序员·编程·求职·简历
小超超爱学习99372 小时前
大数乘法,超级简单模板
开发语言·c++·算法
刘佬GEO2 小时前
【无标题】
网络·人工智能·搜索引擎·ai·语言模型