重排序 (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。
相关推荐
岛雨QA9 小时前
查找算法「Java数据结构与算法学习笔记7」
数据结构·算法
Python大数据分析@9 小时前
seedance 2.0牛在哪里?
ai
码农葫芦侠9 小时前
Vercel Labs Skills:AI 编程安装「技能Skills」的工具
人工智能·ai·ai编程
宝贝儿好9 小时前
【强化学习】第十章:连续动作空间强化学习:随机高斯策略、DPG算法
人工智能·python·深度学习·算法·机器人
isyoungboy9 小时前
从图像中提取亚像素边缘点
算法
郝学胜-神的一滴9 小时前
深入理解链表:从基础到实践
开发语言·数据结构·c++·算法·链表·架构
岛雨QA10 小时前
排序算法「Java数据结构与算法学习笔记6」
数据结构·算法
熬夜有啥好10 小时前
Linux软件编程——综合小练习
linux·算法·目录遍历·fgets·strcpy·linux内核与用户交互·strtok
lin_FS10 小时前
Weight Decay 参数含义及作用
ai
民乐团扒谱机10 小时前
【硬核解析】网易云听歌/哼歌识曲底层技术:从算法实现到工程落地(附核心公式/伪代码)
算法