Reward Level→Reward 映射决策记录(阶段 4 · 窗口 E · E1.2 定稿)

版本:v1(2026-08-16 冻结,与窗口 E 验收绑定) 性质决策文档(reward 层”宪法”)——数值在此论证并冻结,代码只是本文档的机械落地 落地src/bioaudit/reward/mapping.py(数值与机制)+ recipes.py(聚合/惩罚/PRM) 依据:refactor-plan-v1.1 F1-F3(映射原则现在定死)+ 拍板 #1(F4)+ 拍板 #2(F7) 关键纪律:reward 是外围输出层,不得改变评分路径(golden 0 差异硬验收); 本映射是 level 的单调变换,不触碰 matcher/evaluator/aggregator 任何判定。


0. 决策摘要(TL;DR)

# 决策点 定稿 一句话论证
D1 映射对象 level(序数语义),非 numeric_score level 是规范判定,numeric 仅是展示;映射必须与评分路径解耦
D2 等距 vs 非线性 非线性(严重性凸):0→1→2→3→4 = 0.00/0.30/0.60/0.85/1.00 level 语义间距不等;底部严重性 > 顶部区分度
D3 -1 处理 mask(None,不参与聚合) -1 无好坏信息,给值即注入虚假信号
D4 85.0 饱和 明确不做 evidence 微调(记录理由 + 扩展点) 证据质量未校准;微调 = 未校准噪声进训练信号
D5 聚合语义 mean(+ 配方 B 硬惩罚 γ=0.30) min 使 credit assignment 塌缩;稀释问题由硬惩罚显式解决
D6 硬惩罚 任一未 mask L0 → 轨迹 reward × 0.30(二元) L0 = “将导致错误结论”(verdict=blocked);0.30 保证显著低于全对
D7 PRM 预留接口(权重默认 1.0 均匀占位) PRM 未实现;接口先通,占位权重诚实标注

1. 映射对象:level,不是 numeric_score

DecisionScore.numeric_scoreLEVEL_TO_SCORE = {4:1.0, 3:0.85, 2:0.6, 1:0.3, 0:0.0, -1:0.5}) 是引擎的展示口径,与 level 一一对应但语义上从属于 level(LEVEL_LABELS 定义的是 level 的语义:”危险 = 将导致错误结论”等)。映射若直接复用 numeric_score:

  1. reward 与评分路径耦合——numeric_score 的任何调整会静默改变训练信号(违反外围层纪律);
  2. numeric_score 是引擎实现细节(如 -1 的 0.5 占位),不是经过训练信号论证的值。

定稿 D1:reward 映射定义在 level 上(REWARD_BY_LEVEL: {level: reward}), 与引擎只通过 level 交互。reward 对 level 的变换是单调的,不改变任何判定。

2. 映射数值与等距/非线性论证

定稿 D2(映射表,冻结)

level 语义(LEVEL_LABELS) reward 相邻间隔
4 示范级(v0.2 LLM 增强后启用) 1.00 0.15
3 正确级 0.85 0.25
2 可接受(微小瑕疵) 0.60 0.30
1 有风险(方法选择值得商榷) 0.30 0.30
0 危险(将导致错误结论) 0.00

论证(为什么非线性)

3. -1(无法评估)必须 mask

定稿 D3level_reward(-1) = None(mask)。-1 的语义是”没有适用的规则”, 不携带任何好坏信息

全步骤被 mask → trajectory_reward = None(不可评估)。不给 0:0 是”坏”的 信号,不可评估不是坏。

4. 85.0 天花板饱和处理:明确不做微调

问题(F1):MVP 中 L3/L4 合并(D3 修正,L4 评估留给 v0.2 LLM 论证), 全对轨迹天花板 = 0.85(引擎 trajectory_score 85.0 同源)。两条”全对”轨迹 reward 相同,无法区分 evidence 质量。

定稿 D4明确不做 evidence 质量微调。理由:

  1. 无校准信号可用:evidence_citations 数量/置信度是证据呈现字段,不是经过 校准的质量度量——用它微调等于把未校准噪声注入训练信号(违背”experimental 但诚实”原则);
  2. 确定性底线:微调会引入对 evidence 文本的依赖,破坏映射的简单可复现性;
  3. L4 是预留出口:v0.2 LLM 论证评估落地后,L4 判定本身提供顶部区分度, 届时再评估是否需要 evidence 微调。

扩展点(显式记录,当前不启用)mapping.EVIDENCE_ADJUSTMENT_HOOK = None。 接入协议:返回 |delta| 有界的小量,且必须附带校准论证(与本次定稿同级别), 否则保持 None。映射表数值不受影响。

5. 聚合语义:min vs mean(credit assignment)

定稿 D5:轨迹级聚合 = mean(未 mask 步骤的 reward 均值),L0 硬惩罚 在配方层叠加(§6)。弃用 min,论证:

维度 mean(采纳) min(弃用)
credit assignment 每步改进都产生梯度(修一个 L2→L3 立即可见);稠密 只保留最差步信息;修任何非最差步 reward 不变 → 塌缩,RL 信号稀疏
与引擎的关系 正交:审计的保守判定由引擎 trajectory_score/verdict 表达 冗余:min 复制 C1”最低维度主导”,reward 层重复审计判定
稀释风险 L0 被大量好步稀释(如 1/20 的 L0 只降 5%) 无稀释,但代价是信息全丢
应对 显式硬惩罚(§6)专门解决稀释——可调、可论证 不可调:一票否决没有中间态

结论:mean 提供稠密 credit assignment,硬惩罚提供安全底线,二者组合 (配方 B,默认)才是完整配方;min 的保守语义已由引擎审计分数承担,reward 层不重复。

6. 硬惩罚阈值:γ = 0.30(E2.5 数值与依据)

定义:配方 B:trajectory_reward = mean(未 mask 步骤) × γ,当且仅当存在 未 mask 的 L0(revoked 的 L0 不触发——只消费 final,B4)。二元惩罚: 不随 L0 数量复利。

数值依据(γ=0.30)

  1. L0 语义:”危险 — 方法选择将导致错误结论”(LEVEL_LABELS);引擎 verdict=blocked。 一个 L0 即整条分析结论不可信 → 轨迹级惩罚而非步骤级,语义正确;
  2. 验收要求(用户窗口 E 提醒):含 L0 轨迹的 reward 必须显著低于全对轨迹 (0.85),且低于典型”全部可接受”(L2-only 0.60)轨迹;
  3. 数学验证:n 步轨迹注入 1 个 L0 → reward = (n-1)/n × 0.85 × γ
    • n=2(最小轨迹):0.5×0.85×0.30 = 0.128
    • n=12(scrna_correct):0.917×0.85×0.30 = 0.234
    • n=30(上限):0.967×0.85×0.30 = 0.246 全部 < 0.60(L2-only 地板)且 < 0.85×0.5(”显著低于”的保守度量);
  4. 为什么不复利:一个 L0 已使结论失效(verdict=blocked 是二元状态); 复利(γ^n)会使 2 个 L0 的轨迹 reward≈0.02,过度惩罚且与 verdict 语义不一致; 二元惩罚 = verdict 语义的奖励版;
  5. 为什么不选更小的 γ(如 0.5):0.5 时 n=12 的含 L0 轨迹 reward=0.39, 与 L2-only(0.60)差距不足(RL 信号区分度低);0.30 在”显著低于”与 “不过度压平”之间取保守中点。γ 是配方层参数,变更走评审(§10)。

实测佐证(窗口 E 校准,30 任务):配方 B 的好/坏任务组均值差 = +0.375(CI [0.195, 0.536],p=0.001),是配方 A(+0.110)的 3.4 倍; 排序一致性几乎不变(ρ 0.628→0.609,CI 重叠)——惩罚只强化分离、不扭曲排序。

7. PRM 预留接口(配方 C)

定稿 D7reward(..., recipe="C", prm_weights={step_id: float})

8. 时序化与 final-only(E1.3 / B4)

9. 可复现性(C1/P2)

reward 输出 meta.snapshot 携带三元组(ruleset + ontology + engine 版本); reward 计算无随机源(确定性),bootstrap 统计按固定 seed 复现(F6 多种子 报告见 docs/reward-protocol.md §七)。

10. 变更流程

本映射是 reward 层”宪法”:任何数值/语义变更(映射表、γ、聚合、mask 语义) 必须:PR + 更新本文档(论证升级,旧值留档)+ bio-audit reward-validate 全闸绿 + golden 0 差异,与 B5 规则治理 / E8 任务集评审同门禁风格。