幻覺與驗證:不要照單全收
AI 有時會編出不存在的套件、用過時的寫法,或寫出只在一般情況下正確的程式。這堂課給你一套五關檢查法,讓你放心使用 AI 的產出。
第一堂課我們說過:AI 是在預測「最像正確答案」的文字,所以它寫錯的程式,看起來和寫對的一樣專業。這種自信地產生不正確內容的現象,通常稱為「幻覺」(hallucination)。
上一堂的除錯,處理的是「會報錯」的問題。這一堂要處理更麻煩的:不會報錯,但其實是錯的。
先說清楚:這不是要你不信任 AI,而是要建立一個習慣。就像你請朋友幫忙算帳,算完也會大概看一下總數合不合理。
幻覺在程式裡長什麼樣子
編造的套件或函式
你請 AI 寫一個取得即時匯率的腳本,它可能寫出:
import twrate # 這個套件可能根本不存在
rate = twrate.get_rate("TWD", "JPY")
名字很合理,用法很直覺,但這個套件可能根本不存在。更常見的是套件存在、函式不存在:真實的套件,搭配一個 AI 想像出來的方法或參數。
過時的寫法
套件會改版,舊的寫法可能被移除或改名。AI 的訓練資料有截止時間,可能還在用幾年前的語法。執行時看到 DeprecationWarning(「這個用法即將淘汰」的警告),或是錯誤訊息說某個屬性不存在,就要懷疑是這個原因。
只在一般情況下正確
這是最難發現的一種。例如一個計算「本月花費」的函式,平常都對,但遇到這些情況就出錯:
- 這個月還沒有任何紀錄(空資料)
- 有一筆退款是負數
- 日期跨年,從 12 月到 1 月
程式沒有報錯,只是默默算出錯的數字。
驗證五關
不是每段程式都要過完五關。越重要的程式,就走得越深。
第 1 關:真的存在嗎?
看到不熟悉的套件、函式或參數,花一分鐘去官方文件查。搜尋「套件名稱 + documentation」,確認它存在、用法相符。
第 2 關:跑得起來嗎?
一定要實際執行。看起來沒問題的程式,執行時才發現少了某個匯入,是非常常見的事。
第 3 關:結果對嗎?
用你自己算得出答案的例子去測。例如:
輸入:300 台幣,匯率 4.7
預期:1410 日圓
實際:(執行看看)
如果連簡單的例子都算錯,複雜情況就更不用說了。
第 4 關:邊界情況呢?
刻意餵它「奇怪」的資料:0、負數、空字串、超大的數字、有逗號的 1,000、全形數字。看它是正確處理、給出清楚的錯誤訊息,還是默默算錯。
第 5 關:請 AI 自我檢查
AI 寫程式時是「一路往下寫」,但請它回頭審查時,常常能發現自己的錯。關鍵是要求它用挑毛病的角度看:
請扮演一位嚴格的程式審查者,檢查你剛才寫的程式:
- 有沒有用到不存在、或已經過時的套件、函式、參數?如果不確定,請直接說「不確定」。
- 列出至少五個可能讓它出錯或算錯的輸入。
- 針對每個輸入,說明目前的程式會怎麼反應。
先不要修改程式,只列出問題。
「如果不確定,請直接說不確定」這句很重要。它讓 AI 比較願意承認自己沒把握的地方,而不是硬掰一個答案。
什麼時候要更小心
| 情況 | 為什麼風險較高 |
|---|---|
| 冷門套件、公司內部工具 | AI 幾乎沒看過,最容易亂猜 |
| 最近才改版的工具 | 訓練資料可能還是舊版 |
| 牽涉金錢、日期、時區 | 小錯誤會造成大問題 |
| 會刪除或修改檔案的程式 | 錯了可能無法復原 |
遇到這些情況,請 AI 附上它參考的官方文件連結,然後你親自點進去看。AI 也可能給出不存在的網址,所以看連結本身也是一種驗證。
- 請 Claude 或其他 AI 寫一個函式:輸入一串記帳金額,回傳平均每筆花費。
- 先自己想三個你算得出答案的例子,執行驗證。
- 再試試邊界情況:空清單、包含負數、包含
0。記下哪些情況出錯。 - 用上面的審查提示詞請 AI 自我檢查,比較它找到的問題和你找到的有什麼不同。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。