很好,这两个东西基本就是现代 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(太慢)