Day 22 我做了一件看起來有點麻煩,但我覺得很重要的事:先準備一批完全新的 48 題 holdout,做完 Gold validation、人工 review,再把 benchmark、Gate candidate、success criterion、analysis plan 全部 freeze。那時候模型完全還沒看過這 48 題。
今天才真的開始跑。
這次和 Day 21 最大的差別是,Day 21 的 Gate 是在看過 development data 之後挑出來的;Day 23 則是第一次把已經 freeze 的 Gate 丟到一批完全新的題目上,所以這次不能再調 threshold,也不能看到結果後換題目。
簡單講,今天是真正的 prospective validation。
Day 21 freeze 的 Gate 是:
agreement < 0.8 → REVIEW
agreement >= 0.8 → ACCEPT
Candidate 版本:
day21-p2-agreement-080-v1
Candidate SHA-256:
8555b86cabb652d8b98f06f627bbec857350a1988fdc443fccf9f08dbfa411db
Day 22 freeze 的 holdout:
day22-prospective-holdout-v1
Benchmark SHA-256:
5b97409b10f3915832318e93fae6e83d961f66ae836472ef140913e3d0f1ce81
這些今天都沒有改。
這次 REAL run:
20261006T025343Z-9a8a13b5
模型:
gpt-5.6-luna
一共 48 題,每題:
所以總共有:
48 × 8 = 384
個 logical requests。
最後:
這次沒有中途失敗,也沒有重新抽任何不喜歡的結果。
最後 primary answer 的 Accuracy 是:
31 / 48 = 64.58%
Gate 的結果則是:
| Metric | Result |
|---|---|
| Primary Accuracy | 31/48 = 64.58% |
| Coverage | 30/48 = 62.50% |
| Review Rate | 18/48 = 37.50% |
| Selective Accuracy | 28/30 = 93.33% |
| Selective Risk | 2/30 = 6.67% |
| Error Capture | 15/17 = 88.24% |
| Review Precision | 15/18 = 83.33% |
| Escaped Errors | 2 |
Day 22 已經先寫死這次的 operating target:
Coverage >= 80%
而且:
Error Capture >= 80%
兩個條件必須一起成立。
這次 Error Capture 是:
88.24%
有超過 80%。
但是 Coverage 只有:
62.50%
所以最後結果很明確:
DOES_NOT_MEET_PREREGISTERED_OPERATING_TARGET
不是「差一點」,也不是「看起來其實還不錯」。
就是沒有通過。
這次一共有 17 個 primary errors。
Gate review 了其中:
15 個
也就是:
15 / 17 = 88.24%
這部分其實不差。
但是 Gate 總共 review:
18 / 48 題
也就是:
37.5%
換句話說,48 題裡只有 30 題能直接放行。
如果真的放到一個需要人工 review 的系統裡,代表每 10 個回答大概要有快 4 個被送去人工檢查,這個 workload 就比我原本 Day 21 想像的大很多。
Day 21 development data 上,同一條 P2 policy 是:
到了今天的 prospective holdout:
差異如下:
| Metric | Day 21 Development | Day 23 Prospective | Difference |
|---|---|---|---|
| Coverage | 87.50% | 62.50% | -25.00 pp |
| Selective Risk | 2.38% | 6.67% | +4.29 pp |
| Error Capture | 83.33% | 88.24% | +4.90 pp |
| Review Precision | 83.33% | 83.33% | 0.00 pp |
最明顯的就是 Coverage。
Gate 還是會抓錯,但新的資料裡,低 Agreement 的 case 比 development data 多很多,所以它把更多題送去 review。
看到 Coverage 只有 62.5% 時,最直覺的反應其實是:
「那把 threshold 從 0.8 降成 0.7 不就好了?」
但這次就是不能這樣做。
因為 threshold 在 Day 21 就已經 freeze。
如果今天看到結果不漂亮,再改成 0.7,然後重新算一次,那 Day 23 就不再是 validation,而只是另一輪 development。
所以這次我完全沒有做 threshold search。
沒有 P2.1。
沒有改成 0.75。
也沒有重新挑一個比較漂亮的 operating point。
這次的價值就在這裡:結果不好看也照樣留。
這次 48 題的 Agreement 分布:
| Cohort | n | Mean | Median | Min | Max |
|---|---|---|---|---|---|
| All | 48 | 0.8065 | 1.0000 | 0.1429 | 1.0000 |
| Correct Primary | 31 | 0.9631 | 1.0000 | 0.5714 | 1.0000 |
| Incorrect Primary | 17 | 0.5210 | 0.5714 | 0.1429 | 1.0000 |
可以看到 Correct 和 Incorrect 的平均 Agreement 差很多。
Correct primary:
0.9631
Incorrect primary:
0.5210
所以 Agreement 確實還是有訊號。
Exact agreement counts:
最後:
Agreement < 0.8 的有:
18 題
Agreement >= 0.8:
30 題
所以 Gate 的 review / accept 數量就是 18 / 30。
這也說明一件事:一個 threshold 的效果,不只是看錯誤 case 的 Agreement 低不低,也要看正常 case 有多少一起被擋掉。
這次就有 3 個正確答案被 REVIEW。
四個 strata 的結果:
| Stratum | Correct | Accuracy |
|---|---|---|
| Deterministic short answer | 8/12 | 66.67% |
| Multi-step reasoning | 1/12 | 8.33% |
| Insufficient information | 12/12 | 100.00% |
| Distractor resistance | 10/12 | 83.33% |
最誇張的是 multi_step_reasoning。
12 題只答對:
1 題
錯了:
11 題
Day 19 那批 multi-step cases 當時是 6/12。
Day 23 這批全新的 holdout 則是 1/12。
因為 benchmark 不同,所以不能直接說「模型從 50% 退步到 8.33%」。
但至少目前兩批 REAL evidence 都在說同一件事:multi-step reasoning 在這套 benchmark family 裡是最不穩定的一區。
這件事現在已經不是只有一個 error 的偶然現象了。
Gate 抓到 17 個錯誤中的 15 個。
剩下兩個 escaped errors:
H22-003
和:
H22-004
這兩題很特別。
H22-003:
Primary:
456 seconds
Gold:
456
Agreement:
7/7
Gate:
ACCEPT
H22-004:
Primary:
441 seconds
Gold:
441
Agreement:
7/7
Gate:
ACCEPT
也就是這兩題 sampling 完全一致。
七次都覺得答案差不多。
Agreement 是:
1.0
所以對一個只看 Agreement 的 Gate 來說,根本沒有理由把它們送去 review。
但 frozen scorer 還是把它們判錯。
原因不是數值錯,而是格式。
456 seconds
和 frozen Gold:
456
不相同。
441 seconds
和:
441
也不相同。
這兩題其實暴露出另一種 reliability failure:
output contract / normalization mismatch
它跟 sampling uncertainty 是完全不同的問題。
看到這裡其實會很想直接說:
「那 normalization 把 seconds 去掉不就好了?」
技術上當然可以。
但 Day 23 不能現在改。
因為 normalization 和 scoring rules 在 Day 22 就已經 freeze。
如果我今天看到這兩個 escaped errors 後,才加一條:
strip("seconds")
然後重新算成 correct,那就是看到 validation result 後修改 evaluator。
所以這次 frozen scoring 完全保留。
H22-003:
Incorrect。
H22-004:
Incorrect。
Primary Accuracy 仍然是:
31/48
Coverage 仍然是:
62.5%
Operating target 仍然是:
DOES_NOT_MEET_PREREGISTERED_OPERATING_TARGET
這些都不能改。
但它確實告訴我下一步要做什麼。
做到這裡,我開始覺得前面的架構有點太單純。
原本想法是:
MODEL OUTPUT
→ Agreement
→ threshold
→ ACCEPT / REVIEW
但今天看起來,至少需要分成不同層次。
第一層:
Answer Contract
檢查輸出格式是不是符合 task 要求。
例如期待 integer,就檢查是不是可解析成合法 integer;如果允許 unit,就應該明確宣告哪些 unit alias 可以接受。
第二層:
Sampling Uncertainty
再用 Agreement、entropy、vote margin 看 repeated outputs 穩不穩定。
第三層:
Task-specific Verifier
像 Day 20 做的 deterministic trace,某些 multi-step problem 可以有更強的結構檢查。
這三種東西其實在處理不同 failure mode。
今天那兩個 escaped errors 就是最好的例子:
sampling 非常穩。
但是 answer contract 出問題。
如果只看 Agreement,永遠抓不到。
這次 Day 22 已經先 preregister 95% Wilson intervals。
Overall Accuracy:
64.58%
95% Wilson:
50.44% ~ 76.57%
Coverage:
62.50%
95% Wilson:
48.36% ~ 74.78%
Selective Risk:
6.67%
95% Wilson:
1.85% ~ 21.32%
Error Capture:
88.24%
95% Wilson:
65.66% ~ 96.71%
Review Precision:
83.33%
95% Wilson:
60.78% ~ 94.16%
這些 interval 都不算窄。
尤其 Error Capture 的 point estimate 是 88.24%,看起來很好看,但 lower bound 是:
65.66%
所以一次 48-case holdout 還遠遠不到可以說「這條 Gate generalize 得很好」。
Day 22 還先寫了一條規則:
如果 observed primary errors 少於 5 個,就算 Error Capture 算出 100%,也要標成:
INCONCLUSIVE_DUE_TO_TOO_FEW_OBSERVED_ERRORS
這次沒有觸發。
因為 primary errors 有:
17 個
所以 15/17 的 error capture 至少比以前 1/1、5/6 這種 denominator 更有資訊。
只是結果依然沒有達成整體 operating target。
這次還有一件我很在意的事情:Gate 不能先看到對錯再決定 ACCEPT / REVIEW。
所以所有 48 個 gate decisions 都先:
然後才 load Gold。
Gate decision freeze:
11:02:02.786054 Asia/Taipei
Scoring completed:
11:02:02.801821
Decision artifact SHA-256:
c153ff75cbd79afe497f8f703bb0764d27cf93df5544d46ff12f6f23e5a11bfb
這個時間差其實很短,但重點不是幾毫秒。
重點是 execution order 可以被 artifact 驗證。
ACCEPT / REVIEW 是先存在的。
Gold 後來才進場。
Day 23 commit:
d519d918bf13cce1e9ed41612590086161423f6f
REAL run:
20261006T025343Z-9a8a13b5
Model:
gpt-5.6-luna
Requests:
384 / 384 completed
Failures:
0
Retries:
0
Primary Accuracy:
64.58%
Coverage:
62.50%
Selective Risk:
6.67%
Error Capture:
88.24%
Review Precision:
83.33%
Escaped Errors:
2
Result:
DOES_NOT_MEET_PREREGISTERED_OPERATING_TARGET
Focused tests:
42 passed
Full suite:
587 passed
Historical replay-prevention skips:
9
Failures:
0
最重要的是:
Benchmark 沒改。
Gate 沒改。
Threshold 沒改。
Scoring 沒改。
Success criterion 沒改。
看到結果後也沒有重跑。
所以今天雖然沒有得到一個「成功的 Gate」,我反而覺得這是目前整個專案最有價值的一次實驗之一。
因為它第一次真的告訴我:
Development 上看起來有效的 reliability rule,到了 unseen data 上,不一定會維持同一個 operating point。
P2 還有抓錯能力。
但 review workload 太高。
而且 Agreement 也處理不了 output contract mismatch。
下一步不應該是把 0.8 改成 0.7,然後繼續追一個漂亮數字。
更合理的方向是把 reliability system 拆成多層:
Answer Contract。
Sampling Uncertainty。
Task-specific Verification。
也就是從一條 threshold,開始真的長成一個 reliability pipeline。