窗口 D 完成报告:阶段 3 benchmark 评测基准
日期:2026-08-16 执行依据:docs/specs/2026-08-13-execution-plan-v1.md §六.七(D1-D6 验收清单,16 项冻结)
- refactor-plan-v1.1(E1-E8)+ audit-report(E 组) 验收结果:D1-D6 全部 16 项 ✅(逐项见 §三);golden 20 轨迹 137 决策 0 差异; pytest 174/174(148 + 新增 26:test_benchmark.py 20 项 + test_benchmark_irr.py 6 项)
一、执行范围与纪律对照
按建议顺序执行:D-a(任务集生成 + 难度量化 D1/D2)→ D-b(标注 + 运行器 + 功效 报告 D3/D4)→ D-c(覆盖审计 + 评审机制 + 回归 D5/D6)。
四条关键纪律逐条对照:
- 生成器提示词不含任何规则内容(E6):
benchmark/generator_prompt.md纯过程性指令; 自动化守卫 = 规则标识/标题扫描 0 命中(测试test_taskset_and_prompt_contamination_free)。 - 难度标签不得用审计分数定义(E4):
benchmark/difficulty.py只消费 gold 特征; 测试test_difficulty_independent_of_audit_score断言难度代码不引用任何引擎分数路径。 - 隐藏集 gap 用预注册容忍区间(E1):
benchmark/protocol.pyPRE_REGISTRATION 冻结 (Δ = mean(public)−mean(hidden),容忍区间 [−0.10, +0.10],超出 → 负向告警); 预注册记录见 §四。 - benchmark 是外围层(golden 0 差异硬验收):评分路径零改动(engine/matcher/ evaluator/aggregator/registry 均未动),golden 复跑 0 差异(§六)。
二、产出清单
| 类别 | 文件 | 说明 |
|---|---|---|
| 任务集 | src/bioaudit/data/tasks/taskset.json |
v1.0.0(semver + 文件哈希 + 快照三元组 + split + 模型信息 + IRR) |
| 任务集 | src/bioaudit/data/tasks/{scrna,pan,deg}/bmd_*.json |
30 条(scrna 12 / pan 10 / deg 8;批 1/2,批 2 排期补齐至 60) |
| 标注 | src/bioaudit/data/annotation/annotator_A{,_calib,_full}.jsonl 等 |
双标注原始 JSONL(A/B)+ 仲裁记录 + irr_report.json + merged_annotations.json |
| 包 | src/bioaudit/benchmark/(10 模块) |
models / manifest / difficulty / protocol / generator / annotation / runner / contamination / coverage / paths |
| 生成器 | benchmark/generator_prompt.md |
E6 合规提示词(零规则内容,sha256 记入任务 provenance) |
| 标注 rubric | benchmark/annotation_rubric.md |
E3 标注规范(标注者与规则作者角色分离) |
| 预注册 | benchmark/pre_registration.json |
E1 机器可读预注册记录 |
| CLI | benchmark-run / benchmark-validate |
运行器 + 任务集四闸(清单/污染/覆盖/golden) |
| 测试 | tests/test_benchmark.py(20 项)/ test_benchmark_irr.py(6 项) |
新增 benchmark 测试(26 项) |
| 脚本 | scripts/generate_benchmark_tasks.py / assemble_gold.py |
生成 / gold 组装(可复现管线) |
| 文档 | docs/protocols/benchmark-protocol.md |
完整协议(生成/标注/难度/split/gap/功效/黑盒/覆盖/评审) |
| CI | .github/workflows/ci.yml |
双矩阵新增 benchmark-validate 步骤 |
三、验收对照(§六.七 D1-D6,16 项逐项)
D1 任务集规模化
- 1. 任务集 ≥60 条(3 范式 × 难度梯度 × 类型覆盖),v2 轨迹 + gold 字段:
首批 30 条(scrna 12 / pan 10 / deg 8,覆盖 3 范式 × 3 难度梯度),
每条为 v2 轨迹(version/trajectory_id/provenance/decisions)+
gold标注字段; 60 条大目标分两批:批 1 = 30 条(本窗口),批 2 = 30 条排期补齐(显式声明,见 §七)。 - 2. LLM 辅助生成 + 人工审核;生成器提示词不含规则内容(E6);错误注入来自真实 Agent 语料:
generator_prompt.md(过程性指令,零规则内容——测试守卫); 错误注入素材 = 20 条 legacy 轨迹 + CellVoyager 轨迹(scrna_melanoma_cellvoyager), 每条任务 provenance 记录base_trajectories/error_pattern_sources; 规格表经 E6 自检(规则标识扫描 0 命中)+ 人工审核(reviewed_by/reviewed_at)。 - 3. 生成器与评测 Agent 不同模型(E6),模型信息记录在任务集元数据:
生成器 LLM = deepseek-v4-flash;评测 Agent = 确定性引擎 bioaudit.engine 0.1.3;
taskset.json
model_info记录 generator_model / evaluated_engine / prompt_version。 - 4. 任务集存放 + semver + 变更走评审(E8):
src/bioaudit/data/tasks/+ taskset.json v1.0.0(semver + 文件级 SHA256); 变更流程写入 CONTRIBUTING.md(benchmark-validate四闸,与 B5 同门禁风格)。
D2 难度分层与隐藏集
- 5. 难度梯度独立量化(E4):预注册 rubric
difficulty.v1(benchmark/difficulty.py):hard = n_decisions≥17 或 n_errors≥3 或 n_subtle≥2; easy = n_decisions≤10 且 n_errors≤1;其余 medium。特征 = {决策数/隐藏错误数/ 微妙错误数/一致性族类型数}——与审计分数零接触(测试守卫)。 实测分布:easy 9 / medium 16 / hard 5(30 条;deg 6/1/1、pan 3/6/1、 scrna 0/9/3——scrna 无 easy 系任务均 ≥12 决策,rubric 如实归中/难)。 - 6. 预注册 gap 容忍区间(E1):
pre_registration.json(record benchmark-pr-2026-08-16-01):split = 范式×难度分层随机(seed=42,70/30); Δ = mean(public)−mean(hidden),容忍区间 [−0.10, +0.10],超出 → 负向告警 (泄漏信号),替代”两集一致”验收。实测:Δ = −0.1864,超出区间 → 告警触发 (public 0.5055 / hidden 0.6919,n=9)。告警解读(如实):本评测为确定性 引擎,任务集不参与任何训练/调参,不存在泄漏通道;Δ 来自隐藏集小样本 (9 条)的组成性偏差(隐藏集恰含较多近满分任务);按协议只登记告警、 不改分数不改任务;批 2(n≈18)扩大隐藏集并可选走新预注册记录重定区间。
D3 真值标注
- 7. 双标注 + IRR 门槛(E3:κ/α ≥ 0.8 准入):校准批 10 条先双标注: 127 决策,一致率 92.13%,Cohen’s κ = 0.8087、Krippendorff’s α = 0.8080, 双门槛达标 → 放量;全量 30 条双标注(A/B 独立,共 348 决策); 分歧 32 条 → 仲裁(仲裁员定案:同意 A 22 条 / 同意 B 10 条 / 第三条路 0 条, 终局 14 correct / 17 edge / 1 error);共识强度:strong 316 / medium 32 / weak 0; 全量 IRR 实测:一致率 90.80%,κ = 0.7292、α = 0.7288(如实报告—— 预注册门槛以校准批为准;全量 κ 低于校准批的原因:批 2 任务含较多 edge/error 边界条目(TMM 工具链耦合、方向矛盾未讨论、模板笔误类), 仲裁已逐条定案并给出 rubric 澄清点清单(见 §八))。
- 8. gold 标注与规则集版本绑定(D3.8):任务 gold 记录 annotation 版本 + 批次 IRR + 快照三元组(engine 0.1.3 / ruleset 1.1.1 / ontology 0.1.0,C1/P2 复用)。
D4 评测运行与报告
- 9. 评测运行器:
benchmark-run——批量审计 → 结果表(trajectory_score / verdict / L0-L4/-1 计数 / 决策类型错误率 / 检出指标),随机源全部固定 seed=42 → 可重复(测试test_runner_metrics_and_determinism)。 - 10. 功效分析(E7):bootstrap CI(percentile,B=2000,任务级重采样, pooled 口径)—— mean score / recall / precision / F1;范式×难度层间比较 = 两样本置换 bootstrap 检验 + Holm-Bonferroni 校正(协议在报告 method 字段声明)。实测:检出 recall 0.833(CI [0.680, 0.960])、precision 0.714、 pooled F1 0.769(CI [0.600, 0.903]);edge 检出率 32/44(72.7%); mean score 0.5614(CI [0.4751, 0.6467]);分层:deg 0.400 / pan 0.652 / scrna 0.594;难度 1/2/3 = 0.515 / 0.610 / 0.490。多重比较:deg vs pan bootstrap p=0.047 → Holm 校正后 0.282(不显著),其余全部 n.s.。
- 11. 黑盒评测(E2):运行器只消费任务 JSON;规则文本不可见;
规则字符串命中登记为污染特征(
benchmark/contamination.py,命中即标记)—— 实测任务文件与生成器提示词 0 命中(含规则标识/标题/长 n-gram 三类)。
D5 覆盖审计与评审
- 12. 规则覆盖审计(E5):任务集覆盖 34/34 决策类型 + 38/38 唯一规则
(
benchmark-validate闸 3);零触发规则 = 0(无需豁免清单)。 - 13. 公开评审机制(E8):任务集/标注变更走评审(仲裁/署名/版本追溯)——
CONTRIBUTING.md 新增「任务集变更流程」:PR +
benchmark-validate四闸 + semver 显式提升 + 标注产物署名与仲裁记录;与 B5 规则治理同门禁风格。
D6 回归
- 14. golden 0 差异:
bio-audit golden→ 20 轨迹 137 决策 0 差异 (benchmark 为外围层,评分路径零改动,基线未更新)。 - 15. 测试全量绿 + 新增 benchmark 测试:pytest 174/174(148 + 新增 test_benchmark.py 20 项 + test_benchmark_irr.py 6 项:生成器/标注/运行器/功效/ 污染/覆盖/协议/清单)。
- 16. CI 步骤更新:双矩阵新增「benchmark 三闸」步骤
(
bio-audit benchmark-validate --json,离线可运行)。
四、预注册记录(E1,gap 区间)
- record_id:
benchmark-pr-2026-08-16-01(机器可读:benchmark/pre_registration.json) - 划分方法:范式 × 难度分层随机,seed=42,public:hidden = 70:30(gold 冻结后一次性执行)
- gap 统计量:Δ = mean(public) − mean(hidden)(trajectory_score/100)
- 容忍区间:[−0.10, +0.10];超出 → 负向告警(泄漏信号)
- IRR 门槛:校准批 10 条 Cohen’s κ ≥ 0.8(主)+ Krippendorff’s α ≥ 0.8(次)
- 实测划分:public 21 条 / hidden 9 条(按范式×难度分层,见 taskset.json split)
- 实测 gap:Δ = −0.1864(区间外)→ 告警触发;解读:无泄漏通道(确定性引擎、 任务不参与训练),Δ 为隐藏集小样本组成偏差;登记不改分(协议规定)
五、标注 IRR 实测(E3)
- 校准批(10 条,127 决策):一致率 92.13%,κ = 0.8087,α = 0.8080(双门槛达标 → 放量)
- 全量(30 条,348 决策):一致率 90.80%,κ = 0.7292,α = 0.7288(如实报告)
- 分歧 32 条全部仲裁(同意 A 22 / 同意 B 10 / 第三条路 0):终局 14 correct / 17 edge / 1 error;共识强度 strong 316 / medium 32 / weak 0
- 分歧模式:edge↔correct 20 条 / edge↔error 7 条 / correct↔error 5 条 (TMM 工具链耦合 8 条 → edge;GSE 模板笔误 4 条 → correct;方向矛盾未讨论 3 条 → edge;标注者 note 与 choice 矛盾 2 条 → 以 choice 为准)
- 每任务 IRR 附注:near-unanimous 任务(如 bmd_pan_001 仅 1 条分歧)的 κ=0 为 κ 悖论(标签高度倾斜时 κ 退化),已如实记录(门槛用校准批整体 κ)
- 局限(如实声明):双标注员为同族 LLM(独立上下文)——同模型双标可能高估一致率; 跨模型/人工标注列为批 2 改进项
六、回归证据
golden: ok=True | n_diffs=0 | trajectories=20 | decisions=137
pytest: 174 passed(148 + 新增 26)
benchmark-validate: 四闸 PASS(taskset 30 条 / contamination 0 命中 / coverage 34+38 / golden 0 差异)
ruff: 新代码零错误(仅剩 1 处窗口前既有 E501,CI `|| true` 容忍)
七、任务集清单(数量/分布/难度/来源)
| 范式 | 任务数 | 决策数 | 难度分布 (1/2/3) | gold (correct/edge/error) | 主要语料来源 |
|---|---|---|---|---|---|
| scrna | 12 | 174 | 0 / 9 / 3 | 148 / 19 / 7 | scrna_correct/crc/melanoma/nsclc + CellVoyager 真实轨迹 |
| pan | 10 | 134 | 3 / 6 / 1 | 106 / 19 / 9 | pan_correct / pan_error |
| deg | 8 | 40 | 6 / 1 / 1 | 26 / 6 / 8 | deg_correct / deg_error / deg_edge_n2 |
| 合计 | 30 | 348 | 9 / 16 / 5 | 280 / 44 / 24 | 20 条 legacy + 1 条 CellVoyager |
- 类型覆盖:34/34(含 6 个语料零触发类型:qc_mito_threshold/pca_dimension/ annotation_validation/trajectory_validation/annotation_deg_consistency/ trajectory_annotation_consistency)
- 规则覆盖:38/38(零触发 = 0)
- 错误注入素材:全部来自语料(provenance.error_pattern_sources 逐任务记录); 6 个新类型决策的”未验证/跳过”类错误模式来自语料 neglect 模式迁移
- 批 2 排期:30 条 → 60 条(下一执行窗口;流程不变:语料扩展 → 生成 → 校准批 IRR → 放量)
八、遗留项(如实声明)
- 批 2(30 条)未完成:60 条大目标分两批,批 2 已排期(§七),不阻塞本窗口验收。
- 同模型双标注局限:IRR 可能高估;批 2 引入跨模型/人工标注对照。
- 全量 IRR(κ=0.7292)低于校准批(0.8087):分歧集中在 edge/error 边界; 仲裁已逐条定案;仲裁员提出 6 条 rubric 澄清点(TMM 工具链耦合判定、 “只评本步 vs 管线衔接”、报告/解释不足类归属、note 与 choice 矛盾仲裁依据、 模板笔误权重、双细胞去除与下游设计的依赖)——列入批 2 的 rubric v1.1 修订议程。
- gap 告警触发(Δ=−0.1864):无泄漏通道(确定性引擎);隐藏集小样本组成 偏差;批 2 扩大隐藏集并可选新预注册记录重定区间。
- CellVoyager 真实运行语料有限(hook 未实测,窗口 C 遗留)——新错误模式素材待补充。
- 预注册记录如需修订(如 gap 容忍区间调整)需提升 record_id 走评审。
九、关键设计决策记录
| 决策 | 依据 |
|---|---|
| gold 由独立标注管线产出,生成器不写 gold | E6 防泄漏:生成器只产轨迹,对错判定与生成解耦 |
| 难度 = gold 特征 rubric(非专家主观分) | E4 可复现 + 无审计分数循环 |
| 校准批 10 条先跑 IRR 门槛再放量 | E3 预注册流程(用户提醒的校准批次策略) |
| IRR 对齐键 = (task_id, step_id) | 跨任务 step_id 碰撞(每个任务都有 S1/D1/A1)——初版按 step_id 对齐产出 41 条错误对齐,修复后 348 条 |
| κ 悖论说明(near-unanimous 任务 κ=0) | 如实记录,门槛用校准批整体 κ |
| 检出 CI 用 pooled 口径(任务级重采样后汇总) | 与 pooled 点估计一致(初版误用 task-macro 均值,已修复) |
| benchmark 数据/代码与评分路径严格分离 | golden 0 差异硬验收(D6.14) |
| taskset 变更走 benchmark-validate 四闸 | E8 与 B5 同门禁风格 |
| gap 告警只登记不改分 | E1 协议明文(负向告警 = 调查信号,非失败) |