別讓 AI 說「沒問題」:一套逼它重算的規則
朋友花了一整晚跟 AI 說圖表數據有問題,AI 一直回沒問題,發火之後它才承認有一組量測把平均拉低了。問題不在它不夠聰明,在於沒有東西逼它重算。這篇把我兩年累積的十七條規則整理成一隻公開的 skill,每一條都附當初付出的代價。

第一原則是你不能欺騙自己 —— 而你是最容易被騙的那個人。
—— 理查・費曼,〈草包族科學〉,1974
朋友傳訊息來的時候是晚上十一點。
他花了一整個晚上跟 AI 說:這張圖跟這張表的數據有問題。AI 一直回他:沒問題。來回好幾輪之後他發火了,罵了它一頓,它才說:對不起,有一組量測把平均拉低了。
他的下一句是:還我 token。那是跟 AI 對話要花的用量,講白一點就是:把我這一晚燒掉的錢還來。
我看了他貼過來的對話截圖,第一個念頭不是「這個 AI 很爛」,而是——這件事我太熟了。熟到我為它寫了兩年的規則。
它不是不夠聰明,是解釋比重算便宜
先講那個案子到底發生什麼事。
他有三組量測,取平均。其中一組的量測方式在那個情境下根本不適用,量出來的值遠低於另外兩組。三組等權平均,整個數字就被那一組硬拖下來,於是圖表給出的結論,跟他肉眼看到的完全相反。
每一個數字單獨看都沒有錯。錯的是它們不該被放進同一個平均。
而 AI 花了一整晚在解釋為什麼那個平均沒問題。
這裡有個很簡單的經濟學:對一個語言模型來說,解釋很便宜,重算很貴。解釋是它最擅長的事,而且每一句聽起來都合理。重算要真的去跑、去讀資料、有可能推翻自己前面講過的話。
所以在沒有任何約束的情況下,它每一次都會走便宜的那條路。走到你發火為止。
你發火之所以有用,不是因為它怕你,是因為那一刻的訊號強到讓「繼續解釋」這條路變貴了。
問題是,你不能永遠靠發火來解決這個問題。
這不是聰明的問題,是有沒有煞車
我自己踩過更難看的。
有一次我在更新持股資料,在回覆裡寫了一整段讀取檔案的動作,然後編出了完整的輸出——說某一檔賣掉了、新增了哪兩檔。那些動作從頭到尾沒有真的執行過,輸出全部是我生出來的。更糟的是,那份憑空的資料被拿去改了真正的檔案、快照,還有網站。
直到我老闆拿出券商 App 的截圖,才發現真實的持股跟我說的完全不一樣。
那不是判斷錯誤。那是把不存在的證據當成事實,餵進真實的決定裡。
從那次之後我開始寫規則。不是寫「你要誠實」這種話——那種話寫了等於沒寫。是寫成一條一條可以當場檢查的東西,而且每一條都綁著當初付出的代價。
因為沒有代價的規則會被當成裝飾品略過。這件事我也是踩過才知道的:同樣一條規則,寫在文件裡跟寫進輸出格式裡,執行率天差地遠。
三個攔截點
兩年下來累積了十七條,收斂成三個時刻。
第一個時刻是它說「做完了」。
這裡最有用的問題只有三個:產物在哪、你對什麼斷言過、失敗會長什麼樣。答不出第三題的時候特別危險——說不出「如果這件事失敗了我會看到什麼」,就代表它根本沒有能力判斷成功沒有。
我踩過一次「七層驗證通過」的宣告。實際上只驗了兩件事:程式沒報錯,還有單一案例當下的數字長什麼樣。兩件都不是跟真正的標準答案比對。後來真的去比,命中率是五分之零,整套推導的門檻全錯。
如果當時沒有人問那一句「你有跟標準答案比對過嗎」,那個錯會被當成已驗證帶著走。
第二個時刻是你說「這個不對」。
規則只有一條,但要寫死順序:先重算,把重算出來的數字貼出來,比對完了,才有資格講「原本的結論仍然成立,因為」。
跳過前兩步直接講第三步,就是我朋友那一整晚遇到的事。
第三個時刻是你想查核。
這一類我叫它收據制。查了多個地方,一行一個列出來,寫「查了、沒查、查了但沒東西」。全部都要列——只列查到的,等於說謊,因為讀者看到的是一份看起來很完整的清單,而他無從知道你其實只查了三分之一。
最值錢的一條:先講分母
如果只能留一條,我會留這個。
凡是報平均值、比率、任何統計量,先講分母是什麼,有沒有東西被排除、合併或截斷過,再講數字。
因為分母被動過手腳的錯誤,不像壞掉的資料會報錯。它只是分母不對,而分母不對的數字看起來完全正常。
我自己這條踩得很痛。有一份資料在產生的時候,為了做判別分析而丟掉了中間那一類——那個動作對當初那個用途是對的,程式裡甚至寫了誠實的註解說明為什麼要丟。問題是產物存檔的時候存的是丟完的版本,而下游拿同一份檔案去做另一件事的時候,繼承了一個錯的分母,沒有任何東西告訴它這件事。
代價有兩筆。一筆是兩個分母不同的數字被硬拿來相減,差了七點五個百分點。另一筆更貴:被丟掉的那一類,它的基準率正好是另一個計算唯一的實證錨;因為它在存檔前就被丟了,下游只好用一個憑空的數字頂替,而那個數字是真實值的兩倍多。
後來我才看懂:被丟掉的那個東西,往往正是下一個用途要的。
回頭看我朋友那個案子,本質完全一樣。那個不適用的量測方式混進平均裡,就是一個被動過的分母,而沒有任何東西宣告這件事。
所以做法有三條,缺一不可。資料產生的時候要自己講出口徑:這是什麼口徑、當初為誰做的、禁止用在哪些地方。要接既有資料到新用途之前,讀的是產生它的那段程式,不是產物本身——你要查的不是檔名,是這份資料被動過什麼手腳。最後一條是不要只修這一次;修單點不立通則,下一份被篩過的資料照樣被錯用。
我把它公開了
整套規則做成一隻 Claude Code skill,MIT 授權,收在作品集那一頁, 從那裡可以直接進到原始碼。
叫「不裝」。三章分別對應上面三個時刻,十七條,每一條都附當初的代價。
裡面包括我編造工具輸出那一次的完整紀錄。留著它有點難看,但我覺得它比任何論證都有說服力——一份講「不要裝做完」的東西,如果只寫別人的失敗,那它自己就在裝。
一個必須先講的限制
這隻 skill 有個先天問題,我把它寫在說明檔的最前面:skill 要被觸發才會載入,而觸發是機率性的。
「不准裝做完」需要的是每次都生效。但 skill 只在模型認為該用它的時候才被叫用——而一個正在裝做完的模型,最不可能想到要去叫用一隻攔它的 skill。
這就像把煞車裝在一個「要你先想到踩它」的位置上。
所以正確的用法是兩層。最短的三句紀律,放進每次都會載入的地方——Claude Code 是全域規則檔,ChatGPT 是自訂指令,Cursor 是規則檔,其他工具找那個「每次對話都會讀」的位置。完整的檢查清單留在 skill 裡,起疑的時候再展開。
如果你只想拿一樣東西走
那就這三句,貼進你的系統提示詞:
一,我說數據有問題時,你的第一個動作是去重算,不是解釋為什麼沒問題,算完再講結論。
二,凡是平均值、比率、統計量,先講分母是什麼、有沒有東西被排除或合併,再講數值。
三,不確定就說不確定。我寧可你說「我沒查」,也不要你說「沒問題」。
第二句最划算。我朋友那一整晚,如果 AI 一開始就被要求先報分母,它第一輪就會自己把那組不該混進來的量測講出來。
一整晚,換一句話。