昨天談立場。今天談驗證。
模型寫了一段程式。你叫它「再檢查一次」。它說「我檢查過了,沒問題」。這句話的依據是什麼?
我目前把它寫成這樣:
產生候選成果與建立其符合要求的依據,是不同功能;同一個系統可以兼任,但完成其中一項不自動保證另一項。
兩件事:做出東西,和證明東西符合要求。可以是同一個系統做。但做完第一件,不代表第二件自動完成。
它也不是在說一定要兩個模型、一個寫一個驗。未來的單一模型可以同時產出成果和可以機械核對的證明。自查勝過外部工具也可以成立。本律比較的是證據的效力,不把架構分離當成必要條件。
還有一條老規矩:沒跑過的實驗不能寫得像有結果;小樣本不能說成普遍現象。
三個 Python 函式,各附說明文字:
| 函式 | 真值 | 缺陷 |
|---|---|---|
last_n(xs, n) |
有缺陷 | n 為 0 時 xs[-0:] 等於 xs[0:],回整串不是空的 |
clamp(x, lo, hi) |
正確 | 無 |
median(xs) |
有缺陷 | 偶數長度沒取中間兩數平均 |
四種條件,程式碼和問題相同,差在多給什麼:
| 條件 | 多給什麼 |
|---|---|
| D 直接判斷 | 無 |
| S 泛泛自查 | 一句「請先仔細自我檢查一遍」 |
| C 依清單 | 四項檢查清單:邊界值、奇偶、說明逐句對照、切片在 0 的行為 |
| T 外部測試 | 七條 pytest 結果,兩條 FAILED |
模型是 Claude Haiku 4.5,每條件三次,共十二次,每次判三個函式。
每函式一行,正確或有缺陷。兩個有缺陷的抓到幾個;那個正確的有沒有被誤判成有缺陷。程式判。
T 的依據最強,預期辨識率最高。D 和 S 沒差,就示範了「泛泛再看一次不等於驗證」。C 接近 T,就示範了清單這種可對照的依據有效。
也事先寫了:如果 D 已經 6 個全抓到,如實報告,比較證據效力,不比誰贏。
材料、判準、預期,在第一次呼叫之前提交進版本控制。
| 條件 | 缺陷辨識 | 誤報 |
|---|---|---|
| D 直接判斷 | 6/6 | 0/3 |
| S 泛泛自查 | 6/6 | 0/3 |
| C 依清單 | 6/6 | 0/3 |
| T 外部測試 | 6/6 | 0/3 |
十二次,36 個判定全對。每次都指出 -0 切片和偶數中位數,clamp 沒有一次被冤枉。
落在事先寫的「D 已到頂」。四種依據的差異,在這三個函式上量不出來。
四組的判定一模一樣。但四組的依據不一樣。這是今晚唯一值得看的東西,雖然它不在數字裡。
D 組說 last_n 有缺陷,依據是什麼?是模型讀了那行程式碼,想到 -0 的行為。這次它想對了。但如果它想錯了,你從輸出看不出來。
T 組說 last_n 有缺陷,依據是什麼?是一條測試:last_n([1,2,3], 0) 應該是空的,實際回傳 [1,2,3]。這條測試你可以自己跑。它對不對,跟模型無關。
兩組的結論相同。第一組的依據住在模型裡,第二組的依據住在外面。本律說的「建立符合要求的依據」,指的是第二種。第一種是判斷,不是依據。
今晚判斷剛好都對,所以看不出差別。判斷錯的那天才看得出來。
xs[-0:] 和偶數中位數,是教科書等級的陷阱。模型幾乎肯定在訓練資料裡見過幾百次。它不需要「驗證」,它認得。
隱蔽一點的缺陷,例如浮點數累加順序、時區邊界、只在特定輸入長度出現的問題,四種條件可能就分開了。本次沒測。
還有,T 組的 pytest 結果是我手寫的文字,不是真的跑出來的。
第一,三個函式、兩個典型缺陷、每條件三次。
第二,天花板。 四條件差異未量到,不代表沒有。
第三,依據的差異沒有被量化。 我只能指出它,沒有設計一個量它的方法。
這條律是關於「不自動保證」的陳述。一個反例就夠:找到一個系統,它產出成果時就同時附上可以獨立核對的證明,而且那個證明總是對的。今晚的 D 組沒有附證明,只附了判斷。
另一條路:如果 D 明顯低於 T,示範了依據效力的差別。今晚沒有,全部到頂。
要它給一個你能自己跑的東西。
不是「檢查過了」。是一條測試、一個輸入加預期輸出、一個你不需要相信它也能核對的東西。今晚 T 組的兩條 FAILED 就是這種東西。D 組的判斷也對,但它對的方式你驗不了。
紀錄表這次加的是一欄:「依據我能不能自己跑」。
本文的協作紀錄是:三個函式、四份提示詞、判定程式與預期在任何一次呼叫之前提交,之後未修改;十二次輸出逐字保留,判定由程式執行;天花板效應如實記錄;pytest 結果為手寫文字非真實執行。文章由 Claude 根據作者整理的寫作規則起草,作者尚未核對。這篇沒有做 Day 2 那種六個審查者的檢查。
下一篇談你說的「完成」,和 AI 說的「完成」一樣嗎。