RunResult 应同时记录执行状态和 Benchmark 判定;所有任务完成后,再将任务级结果汇总为合法的 MetricResult。
不要混淆状态与分数
测试没有通过不一定是
EVAL_ERROR。例如验证器约定退出码 1 表示合法测试失败时,它是一个正常零分;只有验证器无法完成评分时才是评测错误。必须以固定版本的官方验证器契约为准。
保留已有执行结果
评测时优先使用dataclasses.replace(),以免遗漏 Harness 已写入的轨迹、产物、Model 输出或 meta:
COMPLETED,也不要用非空 error 表示普通错误答案。评测证据过大时,应保存截断后的摘要或文件产物,避免在多个字段中重复写入完整的验证器日志。
使用默认二元聚合
BaseBenchmark.aggregate_metrics() 默认调用 aggregate_binary_metrics(),适合每次尝试都给出布尔 correct 的 Benchmark。它生成 accuracy,并根据配置处理类别、k 以及 avg@k 或 pass@k。
普通二元 Benchmark 不需要覆盖该方法:
RunResult 对象。自定义实现不要假定字段总在顶层;包含多次尝试的结果可能位于 result["attempts"] 中。
聚合连续分数
如果官方主指标是连续值,请使用共享辅助函数,并明确指标名称和缺失分数的处理方式:missing_score_value=0.0 会把缺失分数计为零。如果官方规则排除基础设施错误或使用不同分母,就不能直接采用这个默认值;应先按官方规则选择尝试和分母,再构造 MetricResult,并在 counts 中保留总数、已评测数和错误数。
合并多个主指标
如果需要同时报告准确率和平均分,可以组合多个共享辅助函数:details 中说明。
MetricResult 的最低要求
自定义聚合必须返回 MetricResult:
自定义逻辑应通过
attempt_payload() 读取尝试数据,并返回新的字典或结果,避免直接修改 runtime 传入的持久化结构。共享辅助函数的实现位于 runtime/metrics。
聚合前检查
- 正确答案、错误答案、合法零分、执行失败和评测失败分别生成预期状态。
correct、score与官方主指标含义一致,不用score == 0推断评测器崩溃。- 多次尝试的选择规则、
k语义和失败分母与官方实现一致。 - 类别汇总不会丢失无分数任务或把一个任务重复计入多个互斥类别。
MetricResult可以序列化,所有指标为有限数字,计数满足边界约束。
