Skip to content
🔗 分享本题
查看我的学习进度 →
Bi-encoder 召回与 Cross-encoder 重排图解

🧠 图解记忆: Bi-encoder 负责“找得到”,Cross-encoder 负责“排得准”;没召回的证据无法靠重排救回。

💡 答案要点

两阶段检索架构:

用户查询

① 向量检索(BiEncoder,快速召回)
    → 从百万文档中快速召回 Top-100 候选
    → 用 cosine similarity 排序

② Rerank(CrossEncoder,精排)
    → 对 Top-100 候选逐一打分
    → 输出最终 Top-10

BiEncoder vs CrossEncoder:

维度BiEncoder(向量检索)CrossEncoder(重排序)
速度快(一次 embedding)慢(需逐个计算注意力)
精度中等高(考虑query-doc交互)
适用阶段粗召回(Top-100)精排序(Top-10)
硬件需求

Rerank 模型示例:

python
from sentence_transformers import CrossEncoder

# 使用交叉编码器重排序
cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

def rerank(query, documents, top_k=10):
    # 输入:[query, doc] 对
    pairs = [[query, doc] for doc in documents]

    # 获取相关性分数
    scores = cross_encoder.predict(pairs)

    # 按分数排序
    ranked_indices = np.argsort(scores)[::-1][:top_k]

    return [documents[i] for i in ranked_indices]

为什么需要 Rerank?

python
# 向量检索的问题:语义相似 ≠ 相关
query = "如何减肥"
doc1 = "减肥药广告:神奇减肥,一周瘦10斤"  # 向量相似度高,但质量差
doc2 = "健康饮食与运动减肥的科学方法"       # 向量相似度一般,但更相关

# CrossEncoder 能捕捉细粒度相关性问题
# 它会注意:"减肥"和"健康饮食"虽然字不相似,但实际高度相关

面试话术:

"向量检索是 BiEncoder,能快速从海量文档里召回候选,但精度有限。Rerank 用 CrossEncoder,对每个 query-doc 对计算交叉注意力,打分更精准。生产级 RAG 系统通常是两阶段:向量检索 Top-100 → CrossEncoder 重排 Top-10。BiEncoder 快但粗,CrossEncoder 慢但准,两者结合是工程最优解。"

📚 参考:BGE Reranker(bge-reranker-v2-m3 模型卡) · Cohere:Rerank 官方文档