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_score(LEVEL_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:
- reward 与评分路径耦合——numeric_score 的任何调整会静默改变训练信号(违反外围层纪律);
- 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 | — |
论证(为什么非线性):
- level 是序数类别,不是等距刻度。科学后果差距:L0→L1(”错误结论” vs “值得商榷”) 与 L3→L4(”正确” vs “示范”)显然不对等——等距映射(0/0.25/0.5/0.75/1.0)会 高估顶部区分度、低估底部严重性;
- 训练信号语境(RLHF/奖励建模):惩罚错误方法的边际价值 > 奖励锦上添花。 “将导致错误结论”的决策必须产生最大梯度(0.00),”有风险”保持强负信号(0.30), “可接受”(0.60)与”正确”(0.85)之间给出温和的改进梯度;
- 与引擎的保守哲学(A3 取最严 / C1 最低维度主导)一致:严重性凸映射 + 底层惩罚 是同一哲学的奖励版表达;
- 数值选择保持与引擎同值的唯一一点:L3 = 0.85(天花板同源,见 §4); 其余值独立论证(L4=1.00 为 v0.2 预留;L2/L1/L0 间隔按严重性递减原则取 0.30/0.30/0.00)。
3. -1(无法评估)必须 mask
定稿 D3:level_reward(-1) = None(mask)。-1 的语义是”没有适用的规则”,
不携带任何好坏信息:
- 给固定值(如 0.5)= 声称”无法评估 ≈ 中性偏好”,注入虚假先验;
- 给 0 = 惩罚方法学空白(规则覆盖不足是规则库问题,不是 Agent 过错,不应进训练信号);
- mask 后不参与分子也不参与分母(”不参与聚合”的严格语义),meta 记录
mask_reasons.level_minus_one计数供审计。
全步骤被 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 质量微调。理由:
- 无校准信号可用:evidence_citations 数量/置信度是证据呈现字段,不是经过 校准的质量度量——用它微调等于把未校准噪声注入训练信号(违背”experimental 但诚实”原则);
- 确定性底线:微调会引入对 evidence 文本的依赖,破坏映射的简单可复现性;
- 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):
- L0 语义:”危险 — 方法选择将导致错误结论”(LEVEL_LABELS);引擎 verdict=blocked。 一个 L0 即整条分析结论不可信 → 轨迹级惩罚而非步骤级,语义正确;
- 验收要求(用户窗口 E 提醒):含 L0 轨迹的 reward 必须显著低于全对轨迹 (0.85),且低于典型”全部可接受”(L2-only 0.60)轨迹;
- 数学验证: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(”显著低于”的保守度量);
- 为什么不复利:一个 L0 已使结论失效(verdict=blocked 是二元状态); 复利(γ^n)会使 2 个 L0 的轨迹 reward≈0.02,过度惩罚且与 verdict 语义不一致; 二元惩罚 = verdict 语义的奖励版;
- 为什么不选更小的 γ(如 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)
定稿 D7:reward(..., recipe="C", prm_weights={step_id: float})。
- PRM(Process Reward Model)未实现:默认权重 = 1.0(均匀占位)→ 默认下 C ≡ A(诚实声明:占位权重下 C 无额外信息);
- 接入点:未来 PRM 提供 per-step 质量分
w(s)时,将其归一化后传入prm_weights即接入(mask 先于加权:被 mask 步骤即使有权重也不参与); - 接口可用性由测试证明(非均匀权重改变输出),非死代码;
- 组合说明:A/B/C 正交隔离(B−A = 硬惩罚效应;C−A = PRM 加权效应); 惩罚+权重的组合配方未冻结(留给 PRM 落地后评审)。
8. 时序化与 final-only(E1.3 / B4)
- 时序:step_rewards 按 M1 声明顺序编号(order 0-based);M3 补漏条目
在轨迹文件中位于阶段末尾(聚合语义 = “按阶段末尾聚合”,F2),source 标注
backfilled;无 M1/M3 区分的轨迹(legacy/benchmark)全部标declared; - 只消费 final(B4/P3):提供 verdict 会话时——revoked → mask(revoked)、 provisional → mask(provisional_not_final)、无记录 → mask(no_verdict_record); 不提供会话(legacy/benchmark)= 无采集信息,全部视为 final(meta.verdict_mode 如实标注两种模式);交叉验证四类判定(虚报/漏报/未验证)不进 reward (拍板 #1/F4,只进报告——代码与测试双守卫)。
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 任务集评审同门禁风格。