06 / Evaluation研究

评测:把分数变成可信的训练决策

Pass@k、执行评测、污染、置信区间与 Agent 成本。

构建固定预算、可重放、含误差范围的评估流程,避免将采样和 Harness 变化归因于模型。

READ WITH A QUESTION

读完这一章,你应该能够

  • 正确解释 pass@k 与最佳候选选择
  • 设计按任务的统计比较
  • 追踪污染、预算和基础设施错误
前置理解 概率与抽样 · Agent 环境、Harness 和 grader 边界
本章目录 · 0 个小节

一个百分点的提升,可能来自哪里

换了一版模型后成功率增加一个百分点,可能源于能力,也可能因为解码预算更长、Harness 自动重试、环境修复或抽样噪声。训练决策需要知道提升的来源、代价、误差范围和适用任务,而不是只记录排行榜上的一个数字。

课程分析:评测应与训练相互影响,但不能与训练共享所有反馈。固定开发集用于快速诊断,定期冻结的 holdout 用于验收;当 holdout 反复参与模型选择或任务生成,应承认它已变成开发资产。

Pass@1、Pass@k 与 Best-of-N

对一个任务生成 nn 条候选,其中 cc 条通过检查,在 n≥kn\ge k 时常用:

pass@k^=1−(n−ck)(nk).\widehat{\mathrm{pass@}k}=1-\frac{\binom{n-c}{k}}{\binom{n}{k}}.

它估计从同一采样机制抽取 kk 个候选时至少一个通过的概率。不是 kk 个候选中正确答案占比,也不是部署系统一定能找到那一个正确答案。Best-of-N 还需要选择器;选择器会犯错,且付出额外评估成本。

真实源码:OpenAI HumanEval 固定版本 6d43fb980f9fee3c892a914eda09951f772ad10d 的 human_eval/evaluation.py::estimate_pass_at_k 接收每题候选数、通过数和 k,返回每题估计。上层 evaluate_functional_correctness 按 task 聚合执行结果,再对题目均值求总分,并仅报告所有任务都满足样本数条件的 k。代码依据

例如 n=10,c=2,k=3n=10,c=2,k=3,估计为 1−(83)/(103)≈0.53331-\binom83/\binom{10}3\approx0.5333。这不是对模型未知真实成功率的无条件保证;候选高度相关、采样参数变化、任务间预算不一致都会改变解释。

Agent 成功率必须带着系统配置

控制项必须保存的内容不固定会怎样
模型与解码checkpoint、template、temperature、预算把更多搜索当成模型更强
Harness工具 schema、重试、摘要、终止规则把框架改进归因于权重
环境commit、镜像、依赖、随机状态同题不再是同一个实验
Grader规则、版本、隐藏测试、错误处理尺子变化导致虚假提升
样本task id、来源、拆分、尝试次数删除失败或重复简单任务

SWE-agent 的 DefaultAgent.run 与 step 展示模型调用外的消息处理和轨迹记录,说明 Agent 分数属于完整执行系统。Harness 源码 比较 policy 时固定 Harness;比较整体产品时允许一起变化,但报告应明确评价对象。

当前模型卡如何读:先核对归因与设置

GLM-5.3 官方模型卡称其与 GLM-5.2 使用同一底座,提升来自后训练。这是发布方的归因陈述,可以作为“固定底座继续提升”的研究案例,不能替代独立消融。卡片同时详细记录部分评测的 Harness、token 上限和环境修复,这些信息是复现条件的一部分。官方卡与边界

DeepSeek-V4.1-Flash 官方卡也为不同 Agent benchmark 指定不同 Harness 与上下文设置。课程分析:从这类表格比较两款模型时,应先确认评测协议是否相同;不同 Harness 或搜索预算下的分数可描述各自系统,却不能直接支持“单独权重强多少”的因果结论。设置来源

源码导读:SWE-bench 评测了什么

固定版本 02e7a74ffd0b707aab73d203fe87bdc7c76afc8e 的 swebench/harness/grading.py::get_resolution_status 将目标修复与已有通过测试的保持共同作为完全解决条件。get_eval_report 从预测 patch 和日志生成每个 instance 的报告。源码与输入输出

课程分析:这是一种可执行的软件修复判据。测试覆盖不足的正确结果可能只是“没有发现错误”;测试不稳定的失败也可能不是模型能力问题。因此原始得分、基础设施异常率和人工抽样审计应同时保留,不能把异常任务静默删去再和别人完整集分数比较。

按任务估计不确定性

假设一千个任务,每题采样十次。同一任务的十条候选共享难度与上下文,不是十个独立任务。把一万条候选当成独立样本会低估不确定性。简单办法是以任务为重采样单位做 bootstrap:每次抽取任务索引,保留其内部候选或任务级统计,再计算平均值。

对 A/B 两个模型,应使用相同任务集合,按 task 配对计算差值,再 bootstrap 任务索引。这样保留容易题对两个模型都容易的相关性。仅比较两个单独置信区间是否重叠,不能替代配对差值的检验。

课程分析:Bootstrap 的区间反映给定样本分布下的抽样不确定性,不能覆盖污染、标注错误、隐藏的选择偏差,也不一定代表时间上的新任务分布。对多个 benchmark、多次实验取最高分还会引入模型选择偏差。提前定义主指标、预算和停止条件,有助于避免事后挑结果。

污染检测的证据梯度

精确 hash 能找相同文本,归一化后 hash 可忽略格式差异;MinHash 或局部文本匹配可找近重复;语义检索可提出待核查候选。任何单一检测都不够证明“没有污染”。源码任务还应按仓库、issue 关联和 patch 谱系检查,数学题要警惕答案派生变体。

课程分析:记录三类证据:确认重叠、疑似重叠、未发现重叠。把污染候选与人工判定保留为可复核 artifact。模型答得好不能反推其见过训练数据,模型答得差也不能证明没有见过。对外报告应说明检测范围、阈值与漏检局限。

成本与可靠性是一张曲线

Agent 使用更多 token、工具回合、重试和并行候选通常能改变成功率。应画成功率对总 token、墙钟时间或成本的曲线,并固定环境 CPU 与并发限制。跨配置比较时,至少报告平均与 p95 延迟、每成功任务成本、超时率、无效动作率和回归率。

平均成功率也会掩盖少数类型退化。按任务领域、长度、语言、工具数和难度分桶;训练每阶段评测应保留通用能力、专业能力、格式协议、Agent 任务与成本。数据或 annealing 配比变化后,某项涨分但其他领域遗忘,应回到中训练的能力组合目标分析,而不是立刻换 RL 算法。

可运行实验与预期结果

CODE / 可复制
python3 -m labs.run --experiment evaluation --seed 7
python3 -m unittest discover -s tests -p 'test_*.py' -v

教学实验提供 pass@k、按任务 bootstrap、规范化精确重叠与 3-shingle Jaccard 近重复候选检测。候选需要人工复核,不能直接证明泄漏。检查边界:c=0c=0 得零、c=nc=n 得一、k=1k=1 等于 c/nc/n;上面 n=10,c=2,k=3n=10,c=2,k=3 的例子应接近 0.5333。Bootstrap 随机数受 seed 控制。

生产差异是:实验未实现跨海量语料的近重复搜索、语义污染审计、真实代码容器执行或人工标注。它验证统计量与基础流程,不提供“无污染”的认证。不要为追求一个干净的总分而删除失败样本。

工程验收任务

设计一张结果表,行是模型/训练阶段,列至少包含固定预算 pass@1、pass@k、实际选择器成功率、配对差值区间、token 成本、基础设施异常率。对一个失败样本,提供 task manifest、完整轨迹、grader 证据和重放命令。

然后制造两种误导:增加 A 的采样预算但保持 B 不变;从 A 结果中删除超时任务。解释每种做法为何使对比失去原有含义,再用统一预算与完整任务分母修正。最终交付不是一个高分,而是一份足以让训练团队做下一步决策的证据包。

MAKE IT RUN

把这一章放进实验里

调整变量,观察机制,再运行本地 Python 实验验证。

进入实验

本章证据与源码

引用代表相应来源支持的结论,不意味着公开了完整训练配方。

源码观察HumanEval pass@k estimatorOpenAI · 6d43fb980f9f源码观察SWE-bench:测试结果分组与修复判定SWE-bench · 02e7a74ffd0b源码观察SWE-agent:Harness 的 step 与 run 边界SWE-agent · 3ea751c087f3官方事实GLM-5.3:同一基础模型上的后训练变化zai-org · aca966e4e027官方事实DeepSeek-V4.1-Flash:官方模型卡deepseek-ai · dba1be0a40aa

留下你的工程判断

记录一个还没有解释清楚的现象,或下一次实验要控制的变量。笔记仅保存在当前浏览器。

自动保存在本机 · 可在“我的学习笔记”导出
理解机制,比记住结论更重要。