iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
AI Engineering

AI Reliability Lab:30 天用 Python 把「AI 好像很準」變成可以量的工程指標系列 第 23 篇

Day 23|第一次真的驗證失敗了:Gate 抓到 88% 錯誤,但 Coverage 只有 62.5%

  • 分享至 

  • xImage
  •  

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 題,每題:

  • 1 個 primary
  • 7 個 independent samples

所以總共有:

48 × 8 = 384

個 logical requests。

最後:

  • 384 attempted
  • 384 completed
  • 0 failed
  • 0 retries
  • 0 duplicated slots

這次沒有中途失敗,也沒有重新抽任何不喜歡的結果。

最後 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

不是「差一點」,也不是「看起來其實還不錯」。

就是沒有通過。


Gate 其實抓得到錯,但太常叫人來看

這次一共有 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 是:

  • Coverage:87.50%
  • Selective Risk:2.38%
  • Error Capture:83.33%
  • Review Precision:83.33%

到了今天的 prospective holdout:

  • Coverage:62.50%
  • Selective Risk:6.67%
  • Error Capture:88.24%
  • Review Precision:83.33%

差異如下:

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。


這次不能看到結果後再調成 0.7

看到 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。

這次的價值就在這裡:結果不好看也照樣留。


Agreement 還是有訊號,只是不能代表一切

這次 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:

  • 1/7:4
  • 2/7:1
  • 3/7:2
  • 4/7:6
  • 5/7:5
  • 6/7:0
  • 7/7:30

最後:

Agreement < 0.8 的有:

18 題

Agreement >= 0.8:

30 題

所以 Gate 的 review / accept 數量就是 18 / 30。

這也說明一件事:一個 threshold 的效果,不只是看錯誤 case 的 Agreement 低不低,也要看正常 case 有多少一起被擋掉。

這次就有 3 個正確答案被 REVIEW。


Multi-step reasoning 又出問題了

四個 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 的偶然現象了。


兩個 Escaped 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 是完全不同的問題。


為什麼我沒有把「seconds」直接刪掉?

看到這裡其實會很想直接說:

「那 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

這些都不能改。

但它確實告訴我下一步要做什麼。


Reliability 不能只靠一個 Confidence Signal

做到這裡,我開始覺得前面的架構有點太單純。

原本想法是:

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,永遠抓不到。


Wilson Interval 也提醒我不要太興奮

這次 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 Decision 真的在 Gold 之前 Freeze

這次還有一件我很在意的事情:Gate 不能先看到對錯再決定 ACCEPT / REVIEW。

所以所有 48 個 gate decisions 都先:

  • 寫入
  • fsync
  • hash
  • read back

然後才 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 最後結果

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。


上一篇
Day 22|這次先不讓模型作答:我把 48 題 Holdout 全部鎖死,再等明天驗證
下一篇
DAY24替 Reliability Gate 加上 Answer Contract
系列文
AI Reliability Lab:30 天用 Python 把「AI 好像很準」變成可以量的工程指標 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言