如何评测 reranker

评测 · 约 8 分钟阅读 ·

公开 BEIR 分数只是起点,不是定论。英文新闻上领先的 reranker 在你的客服工单上可能翻车。你需要一小套真实查询的标注集和两个指标:NDCG@k(排序质量)与 MRR(最佳答案是否靠前)。

构建标注查询集

从日志抽取 30–100 条真实查询(脱敏)。每条标记哪些文档 ID 相关(二值标注即可起步)。存为 JSON:

{
  "q-001": {
    "query": "How do I reset my API key?",
    "relevant": ["doc-42", "doc-108"]
  }
}

每条一个金标文档的 30 条查询,就足以判断 rerank 是否优于纯检索 —— 你量的是相对提升,不是发排行榜。

关键指标

指标含义常用 k
NDCG@k奖励把高相关文档排在前面;有分级标注时更完整5 或 10
MRR第一条相关文档排多靠前 —— 适合单答案 RAG
Recall@k正确文档是否在短名单里?诊断检索,不是 reranker50–100

同一批召回候选上,分别计算重排前后指标。若 NDCG@5 大涨但 Recall@50 很低,问题在检索 —— rerank 变不出缺失的 chunk。

评测流程

  1. 固定检索流水线(纯向量或 混合),每条查询记录 top-50 候选。
  2. 基线:按检索顺序(或 bi-encoder 分数)打分。
  3. 应用 reranker A,测 NDCG@5 与 MRR。
  4. 换 reranker B(不同模型或托管 API),重复。
  5. 质量与延迟 p50/p95 一起看 —— NDCG 涨 2 分未必值得多 400 ms。

用 ranx 的 Python 示例

from ranx import Qrels, Run, evaluate

qrels = Qrels.from_file("qrels.json")      # ground truth
run_before = Run.from_file("retrieve.json")
run_after = Run.from_file("rerank.json")

for name, run in [("retrieve", run_before), ("rerank", run_after)]:
    print(name, evaluate(qrels, run, ["ndcg@5", "mrr@10"]))

ir-measures 与 BEIR 评测器也行。关键是 qrels 一致、候选池相同 —— 用哪个库次要。

对比 reranker

模型对比表 看 BEIR 大致区间,再在你的标注集上验证。托管 API(Cohere、Jina、Voyage)A/B 最快;开源模型(bge、mxbai)需 GPU 才公平比延迟。

回归测试:把评测指标纳入 CI。改分块大小、嵌入模型或 reranker 版本时,用同一 JSON qrels 重跑 —— 质量下滑应阻止发布。

先建立直觉再跑基准

用在线 Demo 看 cross-encoder 如何重排手选短名单 —— 再用标注查询放大规模。

试用 Demo →

继续阅读