评估器(交叉编码器)
所有交叉编码器评估器都位于sentence_transformers.cross_encoder.evaluation中。
选择合适的评估器
| 任务 | 评估器 |
|---|---|
| 重排检索结果(BM25 top-N 上的 nDCG@k)——快速默认 | CrossEncoderNanoBEIREvaluator |
| 使用每个查询的自定义候选项重排 | CrossEncoderRerankingEvaluator |
| 二分类 / 多分类成对分类 | CrossEncoderClassificationEvaluator |
| 连续成对打分(STS 风格) | CrossEncoderCorrelationEvaluator |
将多个评估器包装在SequentialEvaluator(来自sentence_transformers.base.evaluation)中,以便一起跟踪:
fromsentence_transformers.base.evaluationimportSequentialEvaluator evaluator=SequentialEvaluator([nano_beir_eval,custom_rerank_eval])默认评估器:CrossEncoderNanoBEIREvaluator
NanoBEIREvaluator对重排器的类比。取每个 NanoBEIR 查询的 BM25 top-100,并衡量交叉编码器对它们的重排效果。
fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderNanoBEIREvaluator evaluator=CrossEncoderNanoBEIREvaluator(dataset_names=["msmarco","nfcorpus","nq"],# 默认:13 个 NanoBEIR 数据集中的 11 个(排除 "arguana"、"touche2020")batch_size=64,rerank_k=100,# 对 BM25 top-K 重排)metric_for_best_model的输出键:eval_NanoBEIR_R100_mean_ndcg@10。R100表示"重排 top-100";如果更改rerank_k,前缀会变化(例如R50)。
每个单独的数据集也会贡献eval_Nano{DatasetName}_R100_ndcg@10(例如eval_NanoMSMARCO_R100_ndcg@10)。
使用你自己的候选进行自定义重排
当你有不属于 NanoBEIR 的查询 + 正例 + 干扰项候选时使用:
fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderRerankingEvaluator samples=[{"query":"...","positive":["the gold answer"],"documents":["...","...",...]}for...]evaluator=CrossEncoderRerankingEvaluator(samples=samples,batch_size=64,name="my-rerank",always_rerank_positives=False,# 默认是 True;为真实评估覆盖为 False)always_rerank_positives=True(库默认值)会强制将正例纳入候选池,即使检索器漏掉了它。重排器只针对它实际能打分的候选被评分,因此该指标反映的是纯重排器质量。always_rerank_positives=False:只有当正例已在documents中时才重排它。如果检索器漏掉了它,排名计为 N+1。这反映的是端到端的检索器+重排器质量。检索器漏掉的正例就丢失了,无论重排器多厉害。
输出键:eval_{name}_ndcg@10、eval_{name}_map、eval_{name}_mrr@10。
分类风格交叉编码器
CrossEncoderClassificationEvaluator
同时适用于二分类(num_labels=1)和多分类(num_labels>=2)交叉编码器。内部有分支:
num_labels=1:二分类模式。扫描阈值以报告准确率、F1、精确率、召回率以及average_precision(主指标)。num_labels>=2:多分类模式(例如 NLI:蕴含 / 中性 / 矛盾)。报告f1_macro(主指标)、f1_micro、f1_weighted 以及每类的精确率 / 召回率。
fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderClassificationEvaluator evaluator=CrossEncoderClassificationEvaluator(sentence_pairs=[(premise,hypothesis),...],labels=[0,1,2,...],batch_size=64,name="nli-dev",)输出键(二分类,num_labels=1):eval_{name}_accuracy、eval_{name}_f1、eval_{name}_average_precision(主指标)。
输出键(多分类,num_labels>=2):eval_{name}_f1_macro(主指标)、eval_{name}_f1_micro、eval_{name}_f1_weighted。
CrossEncoderCorrelationEvaluator
用于连续分数交叉编码器(如输出相似度分数的 STS 交叉编码器)。报告与金标准分数的 Pearson/Spearman 相关性。
fromsentence_transformers.cross_encoder.evaluationimportCrossEncoderCorrelationEvaluator evaluator=CrossEncoderCorrelationEvaluator(sentence_pairs=[(a,b),...],scores=[0.4,0.8,...],name="stsb-dev",)输出键:eval_{name}_spearman、eval_{name}_pearson。
编写metric_for_best_model
模式:f"eval_{evaluator.primary_metric}"。构造后检查:print(evaluator.primary_metric)。常见值:
eval_NanoBEIR_R100_mean_ndcg@10—CrossEncoderNanoBEIREvaluator默认eval_{name}_ndcg@10—CrossEncoderRerankingEvaluatoreval_{name}_average_precision—CrossEncoderClassificationEvaluator(二分类,num_labels=1)eval_{name}_f1_macro—CrossEncoderClassificationEvaluator(多分类,num_labels>=2)eval_{name}_spearman—CrossEncoderCorrelationEvaluator
陷阱
- 训练前务必先运行一次
evaluator(model)—— 预训练基线。训练后增量很小意味着损失/数据/基座有问题。 CrossEncoderClassificationEvaluator同时接受num_labels=1(二分类,主指标average_precision)和num_labels>=2(多分类,主指标f1_macro);CrossEncoderCorrelationEvaluator需要num_labels=1。- 默认的
dataset_names=None排除了arguana和touche2020(论证检索任务与其他不同);传入来自sentence_transformers.cross_encoder.evaluation.nano_beir的list(DATASET_NAME_TO_HUMAN_READABLE)以实际运行全部 13 个。 - 训练期间使用 NanoBEIR 数据集的子集(3–4 个)以保持评估廉价;训练后在更广泛的数据集上运行。