循环评测、重复采样与稳定性¶
100 条题目的数据集不意味着框架会自动重复评测。默认每个 Dataset 只运行一次;只有配置中的 n、CLI 的 --dataset-num-runs 或专门的重复采样配置才会产生多次预测。
在配置文件中设置重复次数¶
在数据集 dict 的顶层直接写入 n,声明每个样本的独立运行次数;计算 pass@k 类指标时通常同时设置 k。仓库内 humaneval-plus 的重复采样配置就是这种写法:
humaneval_plus_datasets = [
dict(
abbr='humaneval_plus',
type=HumanevalDataset,
path='opencompass/humaneval',
reader_cfg=humaneval_plus_reader_cfg,
infer_cfg=humaneval_plus_infer_cfg,
eval_cfg=humaneval_plus_eval_cfg,
n=5, # 每个样本独立运行 5 次(默认 1)
k=3, # 传给评测器的 pass@k 档位,仅评测器支持时有意义
)
]
两个字段的语义:
n:重复次数。评测任务会把n连同预测一起交给evaluator.evaluate(k, n, ...),由评测器解释;BaseEvaluator的默认实现是把 n 份预测逐份评分后取平均(n>1时指标名带(5 runs average)后缀),并把同一样本的多次结果聚成一组,用于计算 pass@k、多次一致率等跨次指标。k:透传给评测器的 pass@k 档位,单个整数或列表(如k=[1, 10, 100]),具体含义由 Evaluator 决定。
设置 n 有两个前提:
推理侧要真的产生 n 倍预测。
n只在评测阶段生效,不会自动让模型多采样:模型支持多回复时,在generation_kwargs中设num_return_sequences=n;模型不支持时,用数据集加载器的num_repeats把每个样本复制 n 次(humaneval、apps 等数据集支持)。两种方式的完整配置见代码评测的 pass@k 一节。评测器要能解释
n/k(如HumanEvalPlusEvaluator、MBPPPassKEvaluator)。普通 accuracy 类评测器即使接受n,输出也只是多次平均,未必是需要的口径。
用命令行批量覆盖¶
opencompass my_eval.py --dataset-num-runs 5
等价于把配置里每个数据集的 n 和 k 批量改写为 5,适合临时对比;需要固定口径的正式评测应把 n / k 直接写进配置文件。注意该开关要求每个数据集都已定义 n 字段,否则会报错;且不能假设所有指标都输出同一种 pass@k 口径。
什么时候需要重复¶
生成使用非零温度或其他随机采样;
API 服务存在不可控波动;
代码 pass@k、G-Pass@k 等指标明确要求多个候选;
研究 Prompt 或 Judge 的稳定性。
贪心解码且后端确定时,重复运行通常只增加成本。报告时至少给出运行次数、随机参数、每次分数、均值以及离散程度。
重复输出分析¶
正式运行时可增加:
opencompass my_eval.py --analysis-repeat
也可以分析已有时间戳目录:
python tools/analyze_repeat.py outputs/my_eval/20260903_120000 \
--model model-abbr \
--tokenizer gpt-4o
分析报告会写入 summary/ 目录,主要包含:
每个 benchmark 的样本数、平均 / p75 / p90 token 长度,以及用于筛选长回答的重复分析阈值;
repeat_pattern:周期性重复片段、重复次数和重复片段占比,用于定位回答内部反复循环的内容;gzip_high_compression:gzip 压缩率异常高的样本,用于发现大段重复或高度模板化输出;missing_prediction_files:配置中存在但未找到 prediction 文件的模型 / 数据集组合;abnormal_samples:异常样本清单,包括模型、benchmark、样本 ID、prediction 路径、触发指标和原始 prediction。
该工具分析回复内部异常重复模式,不等同于“多次评测的一致性分析”。tokenizer 会影响重复片段统计,应记录其名称。