登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

reranker 召回评估怎么配置或排查

来源:17golang原创

时间:2026-09-13 04:20:35 388浏览 收藏

reranker 评估最容易误判的地方,是把“模型打分变了”当成“搜索质量变好了”。正确做法是先冻结初筛候选集,再让 reranker 只在这批候选中重排,最后同时比较 base ranking 和 reranked ranking。这样,Recall@candidate_k 反映初筛有没有把答案带进来,MRR@10、nDCG@10 和 MAP 才反映重排是否把答案放到了更前面。

官方地址:https://huggingface.co/docs/transformers/

要点速览
  • reranker 只能重排已经进入候选池的文档,不能补救初筛漏召回。
  • 评估样本优先使用真实初筛结果,明确区分 documentspositivenegative
  • 先看候选池覆盖,再看 MRR@10、nDCG@10、MAP;单条 score 不等于线上相关性。
如果 reranked 指标没有提升,第一步不是调阈值,而是确认正例是否真的在 rerank_k 候选里、文本有没有被截断,以及评估是否把不同规模的候选集混在了一起。

先把候选池和正例格式固定下来

reranker 通常接在向量检索或 BM25 后面。初筛先返回 candidate_k 条结果,CrossEncoder 再为 query-document 对计算相关性分数,并从中取前 rerank_k 条。它的优势是能同时阅读查询和文档,代价是每个文档都要单独计算,因此不适合把全库直接交给它。

评估数据可以用一条查询对应一个正例和一组候选文档表示:

{
  "query": "如何排查 reranker 指标不升",
  "positive": ["记录候选覆盖、重排指标和输入截断的方法"],
  "documents": [
    "记录候选覆盖、重排指标和输入截断的方法",
    "向量数据库的分片扩容说明",
    "文本分类模型的训练参数说明"
  ]
}

这里的 documents 应来自真实初筛排名;如果只想测试模型区分正负样本,也可以使用 negative。不要把初筛没找出来的正例强行补进候选集,否则会高估线上 reranker 的能力。至少同时记录 candidate_krerank_k、正例数量和候选来源。

reranker 召回评估中查询、正例、负例与候选数量的静态关系框图
图1:评估样本结构示意图,查看正例、负例与 candidate_k、rerank_k 候选边界的关系。

指标配置要和线上目标同一层级

Sentence Transformers 提供的 CrossEncoderRerankingEvaluator 会对候选文档重新排序,并计算 MRR@k、nDCG@k 和 MAP。at_k=10 表示只观察前 10 个位置,rerank_k 表示每条查询交给 reranker 的候选数。线上首屏只展示 5 条时,可以另设 at_k=5;不要拿不同的 k 值直接比较。

from sentence_transformers import CrossEncoder
from sentence_transformers.cross_encoder.evaluation import CrossEncoderRerankingEvaluator

# 使用固定的 query、positive 和真实初筛 documents,避免评估时偷偷换候选池。
samples = [
    {
        "query": "如何排查 reranker 指标不升",
        "positive": ["记录候选覆盖、重排指标和输入截断的方法"],
        "documents": [
            "记录候选覆盖、重排指标和输入截断的方法",
            "向量数据库的分片扩容说明",
            "文本分类模型的训练参数说明",
        ],
    }
]

# at_k 对应展示位;batch_size 只影响推理批处理,不改变排名定义。
model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")
evaluator = CrossEncoderRerankingEvaluator(
    samples=samples,
    at_k=10,
    rerank_k=3,
    always_rerank_positives=False,
    name="reranker-dev",
    batch_size=16,
)
metrics = evaluator(model)
print(metrics)  # 重点保存 base 与 reranked 的 MRR、nDCG、MAP 对比。

always_rerank_positives=False 更接近真实线上情况:初筛没有召回的正例不会被评估器凭空加入。若使用的是 negative 而不是 documents,则必须保证样本语义清晰;若需要训练时选最优模型,可把主要指标(通常是 nDCG@k)与 metric_for_best_model 对齐。

CrossEncoderRerankingEvaluator 与 MRR nDCG MAP 以及基线重排结果的静态关系框图
图2:评估器与指标示意图,查看 base ranking、reranked ranking 和展示位指标之间的静态对应。

用固定样本运行一次可复现评估

排查时先不要同时更换模型和数据。固定 tokenizer、最大输入长度、候选数量、at_krerank_k 与数据版本,把一次结果保存成 JSON。模型输出是排序分数,分数绝对值不一定跨模型可比;排序位置和同一评估集上的指标更重要。部分 MS MARCO 模型返回 logits,如果业务只需要排序,保持原始顺序即可;只有需要展示 0 到 1 的概率式分数时,才额外配置 sigmoid,并明确记录这个变换。

建议把下面几项一起落盘:candidate_recallbase_mrr@10reranked_mrr@10base_ndcg@10reranked_ndcg@10map、模型标识和输入截断配置。这样下一次调整 rerank_k 时,能判断是候选覆盖改善,还是排序模型确实改善。

按症状排查召回评估异常

现象优先检查判断
所有 reranked 指标都接近 0positive 是否在 documents、文本是否为空、字段名是否正确候选池或样本格式错误,不是先调模型阈值
nDCG 提升但 MRR 不升多个正例的相关等级与展示位目标整体相关性变好,但第一条答案未前移
单条 score 很高,指标不升是否混用不同模型的分数、是否把 score 当概率分数尺度不能替代排序指标
换长文档后结果突然变差tokenizer 截断长度与 query/document 拼接顺序模型看到的不是完整证据,先做截断统计

最关键的分层判断是:candidate_recall 低,问题在初筛;candidate_recall 足够但 reranked 指标低,才进入模型输入、样本标注或模型能力排查。评估集还要避免把训练查询、同源文档或人工补入的正例泄漏到测试候选中。

相关问题

reranker 的 Recall@k 和 nDCG@k 是一回事吗?

不是。Recall@k 关注答案有没有进入候选范围,nDCG@k 关注前 k 个位置的相关性排序,两者应分开记录。

rerank_k 越大越好吗?

不一定。更大的候选数可能提高覆盖,却增加延迟和推理成本;应在固定评估集上同时观察覆盖、nDCG 和耗时。

为什么评估器的最高分没有到 1?

当正例没有出现在真实 documents 中时,评估结果受初筛覆盖限制。使用真实候选并设置 always_rerank_positives=False 时,这种限制正是需要被看见的线上信号。

参考入口:https://www.sbert.net/docs/cross_encoder/evaluation.html;文本对输入方式可查:https://huggingface.co/docs/transformers/main_classes/pipelines

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>