Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
9.3 KiB
9.3 KiB
PROGRESS · 生时校正打分方法研究:似然比权重 / 缺席证据 / 精度追问(2026-09-29 脚手架,2026-09-30 v5 判定)
- 任务书:
docs/tasks/TASK-rectification-scoring-research-20260929.md - 执行:Claude(直接执行模式,fork 子代理),分支
codex/rectification-scoring-research-20260929。脚手架阶段基线origin/staging@6e393780,已合入 staging(84aaeadf);判定阶段git rebase origin/staging到0120765f(v5 已合入,分支无额外提交后再开新提交)。未推送。 - 研究报告:
docs/research/rectification_scoring_research_2026_09_29.md+scoring_research_{lr,absence,precision_followup}_2026_09_29.json(v4)与…_v5_2026_09_29.json(v5,判定用)。
阶段一(2026-09-29)· 脚手架与 v4 流水线
- 环境:本机没有
.venv,全部用系统python33.13.5(swisseph 9.1.1)。快速门的前端步需要 Node 22:frontend/node_modules软链到主检出(未入库),npm用/exec-daemon/node+/exec-daemon/lib/node_modules/npm的 shim。PYTHONHASHSEED=0(ERR-111)。 - 交付:
scripts/research/scoring_research_lib.py(特征记录 provider、逐分对账、似然比估计 α = 1、案例级 bootstrap、加权 provider、leave-one-case-out、缩放答案、Platt 温度、缺席年 / 精度升降辅助)、scripts/research/scoring_research.py(R-A / R-B / R-C 流水线)、tests/test_scoring_research.py(10 条,含 v4 公开案例 ±10 对账 0 差)。 - 对账:20 例 × 3 档 = 60 个 case-radius 分数差 0、规则 id 差 0。两次复跑 JSON 逐字节一致。所有判定字段
pending_v5。 - 生产代码、
sealed_holdout_rerun.py::PRODUCTION_FILES的 10 个冻结文件、任何常数零改动。 - 已由 Claude 验收合入 staging(README 状态板记录)。
阶段二(2026-09-30)· v5 判定
脚本改动(本次提交,scripts/research/scoring_research.py)
main改为一次只驻留一个半径:77 例 × 3 档的静态 context 同时驻留会 OOM(两次被系统 kill,anon-rss 3.2 GB),按半径加载 → 跑 R-A / R-B / R-C → 释放。JSON 结构不变。fit_prior的训练折计分改用线性代理CaseData.proxy_rows(特征权重 × 精度权重,不含事件类型系数 / 大运边界邻近项),把每折 O(n) 次矩阵构建降为字典求和;留出例的分数仍走线上矩阵。--probes-per-variant:留一法方案用自己的矩阵重新出六题再回放(缺口 3)。hard_line_1字段:每格真值在区间例数与头名 vs 基线;R-C 增加同一子集的subset_C0/subset_B0与gate_verdict_vs_subset_C0(子集方案对全集 C0 比是不公平的,改为同子集比)。per_case行(R-A 各方案与基线、R-C 各臂)写进 JSON,供验收逐例核对。verdict字段:v4 仍pending_v5;v5 文件 header 写see_report,方案级gate_verdict/hard_line_1.pass是机器判定,正式判定见研究报告 §1。
对账与复跑
- v5 对账:77 例 × 3 档 = 231 个 case-radius 差异 0(
reconciliation.unreconciled = 0,三份 JSON 均记录)。 - 复跑:
PYTHONHASHSEED=0 … --dataset-label v5 --probes-per-variant连跑两次(2918 s / 2818 s),三份 JSONcmp逐字节一致(lr407,129 B、absence53,227 B、precision_followup48,521 B);R-C 加同子集基线后单独再跑两次(--parts rc),同样逐字节一致;_v5_rerun副本比对后删除,不入库。 - 基线自检:本脚本的 v5 基线(六题后
raw)头名 0.675 / 0.494 / 0.325、真值在区间 76 / 76 / 75、宽度 15 / 35 / 63,与扩集单发布的 v5 成绩单逐格一致。
判定(raw 主判口径,理由见报告 §2.1;truth = opposite,D1 之后六题后不再注入)
| 项 | 六格硬红线 1(真值在区间例数 / 头名 vs 基线 76 / 0.675、76 / 0.494、75 / 0.325) | gate_verdict |
判定 |
|---|---|---|---|
| R-A A1 | 76 / 0.571、77 / 0.455、72 / 0.247 | no_benefit ×3 | 不过(头名三档降;±60 丢 3 例) |
| R-A A2 | 75 / 0.545、76 / 0.416、72 / 0.247 | no_benefit ×3 | 不过 |
| R-A A3 | 77 / 0.597、77 / 0.468、75 / 0.221 | no_benefit ×3 | 不过(覆盖不降但头名三档降) |
| R-B @0.5 分 | 77 / 0.662、75 / 0.442、75 / 0.221 | no_benefit ×3 | 不过(头名降、宽度不降) |
| R-B @1.0 分 | 73 / 0.649、71 / 0.429、70 / 0.195 | no_benefit ×3 | 不过 |
| R-B @2.0 分(卡片强度) | 55 / 0.481、33 / 0.169、19 / 0.091 | no_benefit ×3 | 不过(真值大量挤出) |
| R-C(与同子集 C0 比) | C1_prior:20/20 头名 0.70 vs 0.75、34/34 0.47 vs 0.47(宽度 36 vs 37)、44/44 0.36 vs 0.42;C1_probe:0.60 vs 0.75、0.41 vs 0.47、0.38 vs 0.42;C2_prior:0.70 vs 0.80、0.42 vs 0.50、0.48 vs 0.52 | 只有 ±30 C1_prior 一格 benefit,其余 no_benefit | 不过(无一致收益,不立实现单) |
percent 口径六格同样全部不过(R-A A1 76 / 77 / 77、A2 71 / 76 / 77、A3 66 / 75 / 76,头名全低于基线 0.79 / 0.81 / 0.77;R-B @2.0 分 54 / 33 / 20)。
- 稳健性(R-A 留一法
raw,真值在区间):±7 天 0.94–1.00、±1–3 月 0.94–1.00、答错 1 题 0.90–1.00、答错 2 题 0.82–0.98;没有一项补回头名损失。 - 缺口 3:按方案矩阵重出六题的回放与共用题目逐格相同(出题器按代表候选与静态 context 判定分边,不读矩阵分数;每例题数 4.9 / 7.1 / 7.3)。对判定方向无影响,关闭。
- 后验标定(缺口 2):主判
raw(scale 只从训练折估,进unionStillValidRange,与三轮既有研究同口径);percent口径的 Platt 温度在 v5 上拟合到 4–32,校准曲线在 ±30 / ±60 几乎全落在 [0,0.1) 桶且预测≈实际——过自信消失的代价是后验≈均匀,即先验不携带信息。两口径判定方向一致。 - 特征:42 个里 36 / 38 / 39 个 bootstrap 5–95% 区间跨 0;剩余 |log LR| ≤ 0.15(D60 命中 −0.15、Shadbala 支持 −0.06 / 压力 +0.05、KP 星主 +0.06–0.09、KP 上升 AD 子主 −0.11);v4 与 v5 都不跨 0 且同号的特征:0 个。
文档
- 研究报告改写为 v5 判定版(§1 结论表、§2.1 标定口径、§2.2 / §3.1 六格表、§2.4 特征表、§4 R-C、§6 v4 数字保留)。
docs/BUG_HISTORY.mdBUG-1091 →closed_by_design(附数字);定论页 §9 追加 v5 结论;docs/research/ACTIVE_FRONTS.md索引已指向报告;docs/tasks/README.md状态行更新。
快速门
- 阶段一:基线(
6e393780)与改后各一次:Python 1001 passed / 1 skipped 两次相同;前端 4357 / pass 4302 / fail 24 / cancelled 0(基线 4301 / 25,改后失败清单是基线的子集,24 条全是 Docker / PostgreSQL / 部署环境套件)。 - 阶段二(
0120765f之上,改动只在scripts/research/scoring_research.py与文档):python3 scripts/run_quality_gate.py --profile quick(PATH 带 Node 22 shim)——Python 1001 passed / 1 skipped(与阶段一两次相同;定向tests/test_scoring_research.py10 passed);前端 4391 / pass 4336 / fail 24 / cancelled 0(staging 在6e393780→0120765f间新增 34 条测试,全部通过),24 条失败清单与阶段一逐条相同(Docker / PostgreSQL / 部署环境套件),门禁整体 exit 1 由此导致;无新增失败。
缺口与说明
- R-A / R-B 判定为负,不立实现单;BUG-560 维持 blocked。
- R-C 与同子集基线比无一致收益,不立实现单;产品若仍想做"只追问一件落在候选分歧点的经历",是交互层面的决定(额度按 09-26「定向追问 2 条」),本研究给不出精度理由。
- 六道题由线上矩阵出一次、各方案共用;已验证按方案矩阵重出题结果相同。
- 大运边界邻近项按线上原样附加、未重加权(R-A 判负后无需再测)。
- 本机无
.venv,用系统 python3;frontend/node_modules为软链,未入库。
Claude 验收(2026-09-30,判定阶段)
- 我在子代理写文档前先从原始 JSON 独立读数:R-A 三变体留一法头名三档全低于基线、A3 percent ±10 覆盖 0.857;R-B 0.5 分覆盖不丢但头名降、2 分把 ±30 覆盖压到 0.43;R-C 只有 15/25/37 例可追问、±10 微利 n=15。与执行方报告一致。
- 复跑:三份 v5 JSON 与
_rerun副本我自己cmp逐字节一致(21:11 / 21:58 两次运行)。 - 范围:
scripts/rectification/、事件引擎、frontend/零改动;完整性门禁、隐私守卫、研究测试 22 passed。 - 备注:结果 JSON 的
verdict字段保留see_report,判定以hard_line_1字段与报告 §2.2 / §3.1 / §4 为准,可接受。 - 结论:三项 no_benefit 成立,BUG-1091
closed_by_design,BUG-560 维持 blocked。打分层研究到此关闭;后续方向是产品口径(以分盘上升为目标的「盘型选择」),另立单。 - 补充测量(Claude 09-30,scratchpad
chart_configs.py/v5_intervals.py,未入库):v5 六题后 ±10 交付区间内 D1 单一 75/77;D9 ≤2 种 68/77、多数=真值 68/77;D10 ≤2 种 63/77、多数=真值 65/77;±30 起 D9/D10 ≤2 种仅 24/22 例。数字将随「盘型口径」任务书入库。