# 设计与取舍 评分、赛制与运行策略。每条决定的形式化后果见对应的 ADR。 ## 标尺 二十档,A 是"确凿成功",T 是"确凿失败",等距映射到 `[0,1]`(字母序号 ÷ 19)。进度追踪方向相反:A 是"确定尚未完成",T 是"几乎确定已完成"。 为什么不二元:一次交付的失败有程度差异,而门控需要的是一个可比较的连续量。 ## 分数从哪来 优先读判官回答处的 `top_logprobs` 分布,在 A–T 候选上算加权期望;通道不给概率时降级到模型写出的显式字母。 三点值得记住: 1. 同一字母可能对应多种 token 表面形式(`"A"` 与 `" A"`),它们是同一次采样的互斥结果,概率**相加**。上游取最大值,会系统性低估概率质量被拆开的字母。 2. 能力是**运行时探测**的,不按厂商或模型名预设。探测失败降级,并记 24 小时能力记忆。 3. "推理吃满了输出预算"与"这个模型不支持 logprobs"是两类错误。前者是配置问题,报错并提示调大预算,不写能力记忆——否则一次配置失误会让该路由被误判一天。 显式标签通道每次只采一个字母,单档步长 5.3%,所以进度追踪默认重复 3 轮取平均。 ## 位置偏好 判官对槽位有偏好。成对比较默认跑 2 轮并在偶数轮交换 A/B;`select` 的 ring 本身对称、pivot 轮逐对平衡槽位;自动路由默认 1 轮时按"谁更少坐 A 位"逐对定向,不增加调用。只有 `compare` 会被向上取整到偶数轮——奇数轮等于让第一个候选固定坐在 A 位。 ## 多候选为什么不两两全比 N 个候选全量比对是 O(N²)。改为:随机 Hamilton 环上比一圈,按软胜率挑出 top-k 基准,其余只与基准对决,再按 Bradley–Terry 建模全局排名。成本接近 O(Nk)。 本地变体:**按无序边去重**,每个候选对全程只判一次。上游会把环与完整 pivot 对一起累积,两者的胜率聚合期望不同,`test/scoring/parity.test.ts` 把两侧的值分别锁住。 ## 相对最优不等于够好 锦标赛只回答"哪个更好"。`verifier_best_of_n` 与自动验收因此都要跟一个固定的空工作基线再比一次,拿绝对分。真机上出现过多份草稿全合格、锦标赛全平 0.5 的情况——那时唯一有价值的信息就是绝对分没过阈值。 ## 运行策略 这些是 DSH 宿主约束下的本地选择,不是上游契约: | 取舍 | 选择 | 理由 | | --- | --- | --- | | 解析失败 | 报错 | 上游默认回落 0.5,不适合做门控 | | 逐字节相同的候选 | 直接短路,不送判官 | 上游的多数票短路会返回未评判的候选 | | 判官温度 | 0.2 | 提高复现率;上游为 1 | | 重复轮次 | 自动路由 1 轮,最终验收 2 轮 | 偶数轮才有槽位交换 | | 进度追踪 | 离线打分,只用最新检查点 | 上游逐步在线,每一步一次调用 |