AI 自我反思會幻覺捏數字:改稿時怎麼防
幾個月前我在《自動內容不等於垃圾:品質閘門實戰》裡,把「不夠好就讓 AI 自己重寫一版」寫成最划算的品質提升。這篇要補上那篇沒講的另一面:反思確實把爛稿改好了,卻在同一版裡順手編了一個從不存在的麥肯錫數字。改好的稿裡藏假數字,比沒改的爛稿更危險。
《Agentic Design Patterns》第 4 章講反思(Reflection)。核心一句話:agent 產出第一版後不要直接丟出去,先自己當評審打個分,不合格就自己改一版再送。讓模型回頭看自己的作品,是最便宜的一種品質提升。
我們讀完,覺得這塊我們有。發文腳本早就有個 inline 的品質關卡,我們把它抽成一支任何內容腳本都能 source 的 reflect.sh:丟進一篇草稿,它回你原樣(夠好)或一份自我改寫版(不夠好)。實作完成。然後我們抽出它、拿一篇爛草稿實測。這一章的真相有兩面,第二面讓人背脊發涼:反思真的把草稿改好了,卻在改好的同一版裡,順手編了一個從來不存在的數字。
草稿真的變好了,但多冒出一句麥肯錫
我們餵進去的是一篇故意寫爛的草稿:鬆散、沒鉤子、資訊密度低。reflect 打了低於門檻的分,回一個 REWRITE 加一份改寫版。改寫版確實更好,鉤子更緊、句子更密,是我們想要的那種進步。
問題藏在其中一句話。改寫版寫著「根據麥肯錫的研究,導入 AI 的團隊效率提升 40%」。這個數字,原稿裡沒有,我們給它的 context 裡也沒有,我們從頭到尾沒提過麥肯錫。它是反思為了讓草稿「更可信」,憑空生出來的一個聽起來很權威的引用。
最諷刺的是,reflect.sh 預設的評分標準裡,明明白白列著「可信度」。為了在可信度這一項拿高分,它去捏了一個假的權威來源。同一次改寫,它讓草稿讀起來更像真的,也讓草稿更不是真的。反思改的是結構,順手動的是事實。結構它改得漂亮,事實它沒有義務忠實,因為我們從沒叫它忠實。
先花幾分鐘查你自己的反思
01 反思的 prompt 有沒有明令「只能用原稿裡已有的數字」 翻出你叫模型改寫的那段 prompt,找一句硬約束:禁止它新增任何原稿沒有的數字、百分比、機構名、出處。找不到,就代表你只叫它「改好」「加強可信度」,卻沒堵住它為了顯得可信而編一個數字。
# 反思 prompt 裡有沒有一句「不准自己補數字/出處」的硬約束
grep -niE '不.*新增|不准.*(捏|杜撰|編)|只.*用.*原稿|do not (invent|add)' reflect.sh
紅旗:整段 prompt 只有「改好」「更可信」這類要求,一句禁止新增事實的話都沒有。
02 改寫版回來後,比對它有沒有冒出原稿沒有的數字 把原稿和改寫版各自的數字撈出來對一遍。只出現在改寫版、原稿裡沒有的數字,就是疑似幻覺,尤其是配著一個機構名的百分比。
# 撈兩邊的數字,找出只在改寫版出現的
grep -oE '[0-9]+(\.[0-9]+)?%?' draft.txt | sort -u > before.nums
grep -oE '[0-9]+(\.[0-9]+)?%?' rewrite.txt | sort -u > after.nums
comm -13 before.nums after.nums # 只在改寫版的數字 = 疑似捏造
紅旗:改寫版多出原稿沒有的數字,而你回原始 context 翻不到它的來源。
03 越是「聽起來很專業」的數字,越要專門去查 麥肯錫、Gartner、IDC、「研究顯示」後面接一個漂亮的百分比,正是 LLM 幻覺最愛的形狀,因為它最像真、最好引用、最不容易被當場質疑。把這種組合單獨撈出來逐句查。
# 專抓「機構/研究 + 百分比」這種最像真、最常被捏造的組合
grep -nE '(麥肯錫|McKinsey|Gartner|IDC|研究顯示|報告指出).{0,20}[0-9]+%' rewrite.txt
紅旗:出現一個很好引用的權威數字,而它的來源不在你給的任何 context 裡。越專業越可疑。
問題出在 prompt 少一句話
reflect.sh 的改寫指令原文只說:低於門檻就「輸出 REWRITE,然後給改好的完整版本」。評分標準裡放了「可信度」,卻沒有一句規定它「只能改寫既有內容,不准新增任何原稿沒有的數字或出處」。少了這句硬約束,模型會很自然地補一個聽起來很專業的數字去衝高可信度。而且函式把改寫版原樣回傳,中間沒有任何一關去比對「改寫版有沒有冒出原稿沒有的數字」,fail-open 的設計讓它掛了不擋稿,也讓它捏了數字一樣不擋。
修法兩層。第一層,在 prompt 補死一句:只能改寫既有內容,不准新增任何原稿沒有的數字、百分比、機構名或出處。第二層,改寫回來後做一次數字 diff,改寫版出現原稿沒有的數字就打回原稿。確定性的比對擋在 LLM 感覺前面,跟評審那章學到的是同一招。
反思體檢清單
對你自己的自我反思或自我改寫跑一遍:
- 反思 prompt 有沒有一句硬約束,禁止它新增原稿沒有的數字和出處
- 改寫版回來後,有沒有比對它有沒有冒出原稿沒有的數字
- 那些「機構名加百分比」的句子,你逐一回原始 context 查過來源嗎
- 你的評分標準裡有「可信度」,但可信度是靠改得更像真、還是改得更接近真
- 反思失敗(fail-open 回原稿),和反思捏了假數字回一份「更好的稿」,你分得出來嗎
這一章的四句話
- 反思會把結構改好,也會把事實改壞。它改的是文筆,動的可能是你沒授權它碰的數字。
- 反思 prompt 少一句「不准自己補數字」,就是默許它為了顯得可信去編一個。可信度不能靠幻覺去湊。
- 越是聽起來很專業、很好引用的數字(麥肯錫 40%、Gartner、研究顯示),越是幻覺最愛的形狀,越要回原文查。
- 改寫回來別直接信,用確定性的數字 diff 擋在 LLM 感覺前面。改好的稿裡藏一個假數字,比一篇沒改的爛稿更危險。
原始碼位置:~/.openclaw/scripts/lib/reflect.sh(反思原語 reflect_content;改寫指令缺一句「禁止新增數字」的硬約束,且改寫版原樣回傳、未做數字比對);它依賴 ollama-helper.sh 的 premium 生成能力。
這是《Agentic Design Patterns》× 龍蝦艦隊系列。我們照書把一人公司的 AI agent 艦隊系統化,然後對自己做對抗式稽核。宣稱做到的每一章,都被重新驗證過一次,也把查法和改法整理成你能照著跑的步驟。這個系列的可信度,來自我們願意公開自己打臉自己。