RRF和Cross-Encoder rerank怎么实现

很好,这两个东西基本就是现代 RAG 检索系统的"标配升级"。我给你直接讲清楚:

  • RRF 是融合算法
  • Cross-Encoder 是重排序模型
  • 两者通常一起用:先召回,再精排

我分开讲,并给你可直接用的实现方式。


一、RRF(Reciprocal Rank Fusion)

🔹 它解决什么问题?

当你有多个检索器,比如:

  • BM25 排名
  • Embedding 排名

它们的分数尺度不同,不能直接相加。

RRF 的思路是:

不看分数,只看"排名"


🔹 RRF 公式

对每个文档:

score = \\sum \\frac{1}{k + rank}

通常:

  • k = 60(常用经验值)

意思是:

  • 排名越靠前 → 得分越高
  • 排名越靠后 → 影响迅速变小

🔹 为什么它好?

优点:

  • 不需要统一分数
  • 非常稳定
  • 工业界常用
  • 对异常值不敏感

🔹 RRF 实现示例

假设你已经有:

python 复制代码
bm25_results = [doc_id1, doc_id2, ...]
emb_results = [doc_id3, doc_id2, ...]

实现:

python 复制代码
from collections import defaultdict

def rrf_fusion(rank_lists, k=60):
    """
    rank_lists: List of ranked lists
    """
    scores = defaultdict(float)

    for rank_list in rank_lists:
        for rank, doc_id in enumerate(rank_list):
            scores[doc_id] += 1 / (k + rank + 1)

    # 按分数排序
    return sorted(scores.items(), key=lambda x: x[1], reverse=True)

使用:

python 复制代码
final_results = rrf_fusion([bm25_top, embedding_top])

二、Cross-Encoder Rerank

这是更高级的。


🔹 它和普通 embedding 有什么区别?

Bi-Encoder(普通 embedding)

text 复制代码
query → 向量
doc   → 向量

然后算相似度。

优点:

  • 可预计算
  • 可扩展

缺点:

  • 语义粗糙

Cross-Encoder

它是:

text 复制代码
[query + doc] 一起输入模型

模型直接输出:

这个文档和 query 的相关性分数

它会:

  • 看到完整上下文
  • 做深度交互
  • 效果远好于 embedding

但:

  • 不能预计算
  • 速度慢
  • 只能用于 rerank

🔹 Cross-Encoder 实现

用 sentence-transformers:

bash 复制代码
pip install sentence-transformers

示例代码:

python 复制代码
from sentence_transformers import CrossEncoder

# 加载模型
model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")

def cross_rerank(query, documents):
    pairs = [(query, doc) for doc in documents]

    scores = model.predict(pairs)

    ranked = sorted(zip(documents, scores),
                    key=lambda x: x[1],
                    reverse=True)

    return ranked

🔹 使用方式(标准流程)

第一步:召回(快)

text 复制代码
BM25 + Embedding
取 Top 50

第二步:Cross-Encoder 精排

python 复制代码
top_candidates = [...]
final_ranked = cross_rerank(query, top_candidates)

三、工业标准架构

现在主流系统是:

text 复制代码
1️⃣ BM25 召回 100
2️⃣ Embedding 召回 100
3️⃣ RRF 融合
4️⃣ 取 Top 20
5️⃣ Cross-Encoder 重排
6️⃣ 取 Top 5
7️⃣ 交给 LLM

这是非常成熟的结构。


四、RRF vs Cross-Encoder 区别

项目 RRF Cross-Encoder
类型 融合算法 深度模型
是否需要训练 不需要 需要预训练
是否慢 很快 较慢
精度 中等 很高
用途 融合多检索器 精排

五、推荐你怎么做?

如果你做:

  • 代码检索
  • Bug 分析
  • RAG 系统

建议结构:

text 复制代码
BM25 + Embedding
        ↓
       RRF
        ↓
 Cross-Encoder
        ↓
       LLM

六、性能建议

  • RRF 用在前面
  • Cross-Encoder 只对少量候选(20~50条)
  • 不要对全库用 Cross-Encoder(太慢)

相关推荐
zzzzzz3103 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐3 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱15 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot16 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海21 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵2 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学