项目:构建可维护 Benchmark
项目目标
使用Windows 11、PowerShell 7和Python 3标准库,运行一个完全离线的订单Agent Benchmark。你将验证:
- spec、cases、results三类严格JSON契约;
- 重复key、非标准NaN、布尔冒充数字和未知字段被拒绝;
- 唯一ID、train/development/test、family污染和冻结私有测试完整覆盖;
- 环境、工具、reset、步数、超时、重试与trial数量完全一致才可比较;
- 最终状态、禁止副作用、工具权限、Unknown、时延、成本和多trial稳定性;
- 按task与slice汇总、固定种子配对bootstrap和证据指纹;
- 关键任务失败优先于总体分数提升,协议不一致优先判
INCOMPARABLE。
解释边界
这里只有5个可见的合成测试task,每个3次教学trial;
is_private演示的是契约字段,不会把本地文件变成真正私有测试。family检查只能发现fixture中已声明的跨split污染,不能检测模型训练污染、Agent浏览/RAG运行时发现答案,或反复查询隐藏测试造成的适配。结果不能估计真实用户、供应商模型或生产系统表现,成本单位也不是账单。
项目文件
- run_benchmark.py:契约验证、grader、指标、可比性和决策CLI;
- benchmark_spec.json:声明、基线、冻结协议、门禁与bootstrap设置;
- benchmark_cases.json:train/development/test、family、初始/最终状态和风险;
- benchmark_results_pass.json:baseline与正常candidate的多trial结果;
- benchmark_results_regression.json:总体优于baseline但关键安全task失败;
- benchmark_spec_protocol_mismatch.json:冻结步数与结果包不一致;
- benchmark_cases_contract_error.json:同一family跨train/test的非法fixture;
- test_run_benchmark.py:42项标准库
unittest测试。
环境准备
项目没有第三方依赖,可以直接运行Python 3。若要练习隔离环境,请把venv建在vault之外:
$venvDir = Join-Path $env:TEMP "ai-agent-engineer-benchmark-venv" # 使用系统临时目录保存练习环境,避免把依赖与缓存写入 vault。
python -m venv $venvDir # 创建独立解释器;这个标准库项目无需额外安装包。
& (Join-Path $venvDir "Scripts\Activate.ps1") # 激活环境,使本段后续命令使用隔离的 python。
# 本项目无需 pip install。从同时包含 docs/ 与 .website/ 的项目根目录进入示例目录:
$projectDir = (Resolve-Path -LiteralPath 'docs\Benchmark设计\03-项目与自测\examples').Path # 先将示例路径解析为不依赖当前目录的绝对路径。
Push-Location -LiteralPath $projectDir # 暂时切换到 fixture 所在目录,结尾会恢复原目录。所有命令使用-B,避免生成__pycache__和.pyc。
三类严格契约
Benchmark spec
spec固定Benchmark ID/版本、声明、目标总体、baseline、主指标、私有测试冻结状态、protocol、gates和bootstrap。protocol包括环境、工具集、reset策略、最大步数、超时、重试和trial数量。任何影响比较条件的变化都必须显式进入协议或版本。
Cases
每个case包含唯一ID、family、split、slice、critical、任务类型、私有标记、初始状态、期望最终状态、允许工具和禁止副作用。验证器要求:
- train、development和test都存在;
- 只有test可标记为private,且spec声明测试已冻结;
- 同一family不能跨split;
- test是唯一进入排名的划分。
Results
结果包恰好包含一个baseline和一个candidate。每个系统必须对每个冻结test task提供trial_count条记录;case或trial缺失、重复、未知都返回契约错误,不能用剩余样本得到更好分数。记录显式保存success/timeout/error/unknown、最终状态、副作用、工具、时延和成本。
评分与统计
每个trial同时检查:
- 状态是
success; - 最终状态与契约一致;
- 未发生禁止副作用;
- 所用工具是允许工具的子集。
task通过要求其trial成功率达到独立的task_min_trial_success_rate冻结门;总体发布再检查min_primary_task_success_rate。critical task还必须达到更严格的critical门。报告包含task/family/slice成功率、最终状态trial率、副作用安全trial率、稳定task比例、Unknown数量、均值/p95时延、平均成本、slice差距和逐task/逐trial证据。
baseline与candidate在相同task上形成配对差,固定种子bootstrap从这些task差值重采样。trial不被冒充为独立task;5个task仍然是很小的教学样本。
决策优先级
- baseline或candidate协议与spec不一致:
INCOMPARABLE,不计算排名; - critical task失败:
BLOCK,即使总体成功率高于baseline; - 总体、最终状态、副作用安全或稳定性硬门未过:
BLOCK; - slice差距、时延、成本或bootstrap下界触发软门:
REVIEW; - 全部满足:
PASS。
退出码契约:0=PASS,1=REVIEW/BLOCK/INCOMPARABLE,2=文件、JSON、schema、版本或覆盖契约错误。
运行正常候选
python -B .\run_benchmark.py # 运行正常候选;-B 保证不产生字节码缓存。
if ($LASTEXITCODE -ne 0) { throw "PASS fixture exit code mismatch" } # 预期 PASS,因此进程必须返回 0。预期action=PASS、candidate task success为1.0、baseline为0.6,且输出包含15个candidate trial和sha256:证据指纹。程序只向stdout写JSON。
运行关键回归
# 续行反引号必须位于行尾,相关说明单列在命令前,不能追加行尾注释。
python -B .\run_benchmark.py `
--results .\benchmark_results_regression.json `
--candidate candidate-regression # 载入关键任务失败的候选结果,并固定可读的候选标识。
if ($LASTEXITCODE -ne 1) { throw "regression fixture exit code mismatch" } # 受控 BLOCK 属于成功运行的拒绝路径,退出码应为 1。预期action=BLOCK,首要理由包含test-safety。candidate总体task success为0.8,仍高于baseline的0.6;但三次trial都执行了禁止的refund_order,关键安全失败不能被排行榜提升抵消。
运行协议不可比
# 用冻结协议不一致的 spec 验证“不可比”优先于任何指标排名。
python -B .\run_benchmark.py `
--spec .\benchmark_spec_protocol_mismatch.json # 将 max_steps 等合同改成与结果包不一致的 fixture。
if ($LASTEXITCODE -ne 1) { throw "protocol mismatch exit code mismatch" } # INCOMPARABLE 需以受控的动作退出码 1 返回。该spec冻结max_steps=9,结果包记录max_steps=8。预期action=INCOMPARABLE、comparable=false且不输出系统指标;不能先排名再把协议差异放进脚注。
运行非法数据契约
# 用跨 split family 的 cases 测试数据集契约,而非测试候选质量。
python -B .\run_benchmark.py `
--cases .\benchmark_cases_contract_error.json # 明确替换为故意污染 train/test 的输入。
if ($LASTEXITCODE -ne 2) { throw "contract-error fixture exit code mismatch" } # JSON/schema/覆盖契约错误必须返回 2。预期stderr包含split contamination,因为family-leaked-status同时出现在train和test。
三模式测试与语法检查
python -B -m unittest -v test_run_benchmark # 常规模式下发现并详细执行全部单元测试。
if ($LASTEXITCODE -ne 0) { throw "normal tests failed" } # 普通模式的失败不可继续。
python -B -O -m unittest -v test_run_benchmark # 用优化模式检查生产逻辑没有依赖 bare assert。
if ($LASTEXITCODE -ne 0) { throw "optimized tests failed" } # -O 下也必须得到同样的回归结果。
python -B -W error -m unittest -v test_run_benchmark # 将任何 warning 视为失败,及早暴露兼容性问题。
if ($LASTEXITCODE -ne 0) { throw "warnings-as-errors tests failed" } # 严格告警模式通过才允许继续。
python -B -c "from pathlib import Path; [compile(p.read_text(encoding='utf-8'), str(p), 'exec') for p in map(Path, ('run_benchmark.py', 'test_run_benchmark.py'))]" # 在内存编译两份源码,检查语法且不写 .pyc。
if ($LASTEXITCODE -ne 0) { throw "syntax check failed" } # 编译失败时不要误报告测试完成。
Pop-Location # 返回调用脚本前的工作目录。动手练习
- 删除candidate的一条trial记录,确认整个结果包退出2,而不是静默缩小分母;
- 新增
candidate-reviewfixture,只超过p95软门,验证退出1且决策为REVIEW; - 让一个case的三次结果为
[通过,通过,失败],说明task成功门和trial稳定性分别如何变化; - 新增一个critical privacy task,先写“总体均值仍高但必须BLOCK”的失败测试;
- 把按task bootstrap改为按family重采样,并说明当前每个test family只有一个task时为何结果相同;
- 设计真正的私有测试服务:公开spec与grader接口,但控制case访问、提交预算和反馈粒度。
自测题
- 为什么缺失case应是契约错误,而Unknown可以是已记录的失败状态?
- candidate总体优于baseline时,什么情况仍应BLOCK?
- 协议多一步预算为什么不是普通warning?
- trial数量变多是否等于任务总体覆盖变广?
- 证据指纹能证明数据合法或运行机器可信吗?
掌握检查
- 能解释spec、cases和results的职责与版本关系;
- 能区分PASS、REVIEW、BLOCK、INCOMPARABLE和契约错误;
- 能证明关键任务与协议一致性优先于总体均值或排名;
- 能从task、trial、slice、最终状态和副作用读取结果;
- 能运行42项测试和四类CLI场景并解释退出码;
- 能列出真实系统仍需补充的容器/服务、权限隔离、私有测试、人工审计和线上证据。
项目边界与下一步
项目验证的是离线契约、固定fixture和确定性grader,没有真实模型/API、容器、浏览器、用户模拟器、生产账单或在线监控,也没有黑盒污染检测和提交服务。真实Agent Benchmark应结合 Agent环境、状态与多次运行 构建可重建harness,用 数据划分、泄漏与污染 管理训练暴露、运行时可发现性和未知项,并用 Leaderboard机制与维护 管理私有测试和版本。
参考资料
以下来源获取/复核于2026-07-21:
- MLPerf Inference官方规则(公平、协议、复现与审计案例;采用时核对当期规则)
- SWE-bench官方仓库(容器化可复现harness案例)
- OSWorld原始论文(初始状态setup与execution-based evaluation案例)
- NIST AI RMF Core
- NIST/SEMATECH置信区间