logo
05

Rerank — 把召回变成选择

⏱️ 25 分钟

Rerank — 把召回变成选择

第 3 章 给了 selection 三段式(filter / rerank / LLM-judge)的形状。这章拆中间——rerank。

为什么 retrieval 用 bi-encoder,rerank 用 cross-encoder

两类 encoder 都算「query/doc 多相关」,实现不同——

Bi-encoder:query/doc 分别过 encoder,得两个独立 embedding,算 cosine similarity。

Query   ──→ Encoder ──→ q_vec  ┐
                                 ├─→ cosine(q_vec, d_vec) → score
Doc     ──→ Encoder ──→ d_vec  ┘

好处:document embedding 离线预算 + 存向量库,查询时只算 query embedding,10M 文档库毫秒返回。

代价:没 cross-attention 看不到具体匹配点。query「澳洲 GST 是 10% 吗」vs doc「澳洲消费税率(GST)目前是 10%」——bi-encoder 知道相似,分辨不清是「税率」还是「国家」相似。

Cross-encoder:query/doc 拼一起过 encoder,输出 0-1 分数。

[Query] [SEP] [Doc] ──→ Encoder ──→ score

好处:cross-attention 看到 token 间关系,精度比 bi-encoder 高 30-50%(Sentence-Transformers 对比)。

代价:每 query × doc 一次 encoder。1 × 10M = 10M 次,只能重排不能初筛。

Selection 工程的标准两段式

Stage A (Retrieval, bi-encoder)
  10M docs → 提前 embed → 向量库
  Query → embed → ANN top-50
  ~50ms, 召回率 90%+

Stage B (Rerank, cross-encoder)
  Top-50 + Query → cross-encoder 逐对打分 → top-10
  ~200-500ms(batch + GPU)

Stage C (LLM-as-judge, optional)
  Top-10 → 便宜 LLM(Haiku/4o-mini)yes/no → top-3
  ~1-2s, $0.001/query

bi-encoder top-N 决定 rerank 上限。N=50 是常见妥协。

主流 rerank 选型

工具类型NDCG@10成本何时选
Cohere rerank-3Managed≈ 0.75$2/1K query无 ML 工程师
BGE-reranker-v2-m3self-host≈ 0.72~10ms/query有 GPU + 中英双语
Anthropic Contextual RetrievalRAG 套件≈ 0.78Anthropic APIAnthropic 生态
Voyage rerank-2Managed≈ 0.74$0.05/1M token小流量
Jina rerankManaged + 开源≈ 0.71免费 1M token/月POC

NDCG@10 来自各家公告 + BEIR benchmark 第三方对比,语料差异 ±10%,业务必须跑自己 eval

  • 月查询 < 10K → Cohere/Voyage
  • 月查询 > 100K → BGE self-host(成本碾压)
  • 全 Anthropic → Contextual Retrieval
  • 中文为主 → BGE / Cohere

Rerank 代码(cross-encoder, BGE)

# tested: 2026-04-26 · sentence-transformers@3.0.1
from sentence_transformers import CrossEncoder

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")  # 首次 ~2GB

def rerank_top_k(query: str, docs: list[str], top_k: int = 10):
    """50 candidates → top_k. GPU batch_size=32 单次 ~200ms."""
    pairs = [(query, doc) for doc in docs]
    scores = reranker.predict(pairs, batch_size=32)
    ranked = sorted(zip(scores, docs), key=lambda x: x[0], reverse=True)
    return ranked[:top_k]

candidates = vector_db.search(query_embedding, top_k=50)
top10 = rerank_top_k(query, [c.text for c in candidates], top_k=10)

CrossEncoder 没 GPU 时 50 pair 要 5 秒——production 必须挂 GPU 或 managed。

LLM-as-judge — Rerank 之上最后一筛

Rerank 漏一类:话题相关但答非所问。例:query「澳洲 GST 注册门槛」,rerank 把 doc「澳洲 GST 历史沿革」排第 3,相关度高但不回答门槛。便宜模型判断:

# tested: 2026-04-26 · anthropic@0.40.0
def judge(query: str, doc: str) -> bool:
    """Haiku 判断 doc 能否回答 query. ~$0.0001/call."""
    prompt = f"""你是检索质量评估员。
Query: {query}
Doc: {doc}

这个 Doc 能直接回答 Query 吗?只回答 yes 或 no。"""
    resp = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=10,
        messages=[{"role": "user", "content": prompt}]
    )
    return resp.content[0].text.strip().lower().startswith("yes")

成本:rerank 后 10 候选 × $0.0001 = $0.001/query。10K/天才 $10。

不用:实时聊天(+1-2s 延迟可感)、retrieval 已稳定(eval 看不出 judge 收益)。

JR 真实案例:daily-jobs 的隐式 rerank

daily-jobs 的「Stage 2: Rerank」不是 cross-encoder model,是结构化标签 + 业务规则的轻量 rerank:

# tested: 2026-04-26 · routine: Daily Jobs - AI Engineer Bootcamp
# 18 候选 job → 3 final pick

Step 1: 打 tier 标签
  - aspirational  → Mid-Senior + brand in {Apple, Google, Canva, Atlassian, ...}
  - actionable    → Junior/Graduate + brand in {AU Big 4 banks, top tech}
  - special       → title 含 {"Intern", "Graduate Program", "2026-27 Start"}

Step 2: tier 内 rerank
  - 优先 posted < 24h
  - 优先 title 含 {"AI Engineer", "ML Engineer", "LLM Engineer"}
  - 优先 location 在 Sydney/Melbourne

Step 3: 每 tier 选 1 → 3 final picks

「业务规则即 rerank」——有清晰 signal(tier、新鲜度、关键词)时规则比 cross-encoder 更可解释。但严肃语义检索(「FastAPI vs Django 哪个适合 AI 后端」)规则做不动,必须 cross。

Managed API vs Self-host — Trade-off

维度Cohere/Voyage ManagedBGE Self-host
接入< 1 天1-2 周
单查询成本$0.001-0.002$0.0001
延迟50-200ms10-50ms
数据离开公司
Custom fine-tune不支持可控
运维01 ML eng 兼职
流量天花板rate limitGPU 决定
适合< 50K query/月> 100K query/月

JR 经验:第一个 RAG 用 Cohere,跑通后看月账单 + 合规决定迁不迁 BGE。managed 验证产品,self-host 优化成本

一句话带走

Bi-encoder 解决「找到候选」,cross-encoder 解决「精筛排序」。两段加起来 90% recall + 80%+ precision。LLM-as-judge 是可选第三段,catch 「相关但答非所问」。Production RAG 选型决策:< 50K/月 用 managed(Cohere),> 100K/月 用 BGE self-host。


引用来源

  1. Reimers, N. & Gurevych, I. Sentence-Transformers: Cross-Encoders documentation — bi vs cross encoder 工程对比.
  2. BGE. BAAI bge-reranker-v2-m3 model card — 中英双语 rerank 模型.
  3. Cohere. Rerank API documentation — managed rerank API.
  4. Anthropic. (2024-09-19). Introducing Contextual Retrieval — Anthropic 自家 RAG 改进方案.
  5. Thakur, N. et al. BEIR benchmark — retrieval / rerank 第三方评测基准.
  6. Voyage AI. Rerank-2 API docs — token 计费 rerank.

Production case: JR Academy omni-report Daily Jobs routines — 用业务规则(tier + freshness + keyword)做 rerank 的轻量模式.

📚 相关资源

❓ 常见问题

关于本章主题最常被搜索的问题,点击展开答案

为什么不直接用 cross-encoder 做 retrieval?

Cross-encoder 慢 bi-encoder 6 个数量级:10M 文档库 = 10M 次 forward。Bi-encoder 把 doc embedding 离线算好存向量库,query 时只算 query embedding + ANN 查找,毫秒返回。组合用:bi-encoder 召回 50 → cross-encoder rerank 10。

Cohere rerank 和 BGE self-host 怎么选?

按 query 量分:< 50K/月用 Cohere(managed,单 query $0.001-0.002),> 100K/月用 BGE-reranker-v2-m3(自托管,GPU 摊销后单 query ~$0.0001),全 Anthropic 栈用 Contextual Retrieval。中文为主选 BGE 或 Cohere。

LLM-as-judge 什么时候加?

Rerank 后漏「话题相关但答非所问」时加,比如 query 问「澳洲 GST 注册门槛」rerank 把「澳洲 GST 历史沿革」排进 top 3。LLM-as-judge 用 Haiku/4o-mini 直接 yes/no 判断 doc 能否回答 query,10K query/天 $10。实时聊天 + 已稳定 RAG 不加。

Rerank 加上后整体延迟会涨多少?

Cohere rerank API 50-150ms(top-50 候选)、BGE 自托管 GPU 上 30-80ms、CPU 跑 BGE-base 200-500ms。加 LLM-as-judge 再加 300-800ms(Haiku)。production 总目标:retrieval 50ms + rerank 100ms + judge 500ms + LLM 主调用 2-3s ≈ 3-4 秒,对话场景可接受。

我已经用 LangChain 了,rerank 怎么接?

LangChain 内建 ContextualCompressionRetriever + 多个 reranker 包装:CohereRerank、JinaRerank、FlashrankRerank(CPU 友好开源)、CrossEncoderReranker(HuggingFace BGE 包装)。原 retriever 不动,套一层包装即可,5-10 行代码上线。

Rerank 上线后效果不如预期,最常见原因?

召回 candidate 数太少。Bi-encoder 只召 top-10 喂 rerank,rerank 没东西可挑。正确做法:bi-encoder 召 50-100,rerank 砍到 top-3 至 top-5。召得不够多 rerank 就是装饰,不创造价值。