問題
給一個 AI 角色做的即時照片產線,加了一道「送出前打開圖看一眼,跟情境對不對得上」的驗收。判準寫得很清楚:
判準只有一條:這張照片會不會讓看的人得出錯誤的結論。
地點不是該在的地點、身上穿的跟該穿的差很多、畫面裡的事跟她說在做的事對不上
——這幾種要退。
回這幾個欄位:
seen: 用中文寫你在這張照片裡實際看到什麼
ok: true 表示可以送出去,false 表示要重拍
reason: ok 為 false 時寫哪裡對不上
拿一張已知拍錯的照片去測——角色設定上她在辦公室上班,圖畫成了她家臥室——驗收回 ok: true。
而它寫的 seen 是對的:
室內書桌前自拍,窗邊有多肉植物盆栽,桌上有筆電、一杯珍珠奶茶、
化妝用的眼影盤和刷具。她頭髮隨意綁成丸子頭……
盆栽、化妝盤、飲料,全部看到了。它就是沒說這裡是誰家。
原因
情境那段寫的是「上班,整理明天要交的簡報」。模型讀到「整理簡報」,看到畫面裡有筆電和簡報,判定「她正在整理簡報」——這個判斷完全正確,而且完全沒有幫助。
沒有人問它她人在哪。
證據在同一次實測的對照組:把情境改成「19:30 在家」,同一張圖它退件了,理由是「窗外是明亮日光,但情境是晚上 19:30,時間對不上」。
它對時間敏感得不得了,對地點視而不見。差別不在能力——地點的線索(居家窗簾、化妝品收納盒)它明明都寫進 seen 了。差別在於時間是它被要求交出的東西,地點不是。ok 這個欄位讓它可以挑一個最好回答的維度來回答,然後就收工。
解法
把要比對的兩端各自變成一個非答不可的欄位,而且排在結論前面:
先回答她人在哪,再回答對不對。
活動本身就決定了地點:上班在辦公室不在家、通勤在路上或車廂裡、
午休在店裡、健身在健身房、下班回家之後才在家。
回這幾個欄位(照順序想):
seen: 你在這張照片裡實際看到什麼
place_seen: 這張照片看起來在哪裡拍的。
看家具、牆面、地板、窗外,不要看她在做什麼。
place_expected: 照那段情境,她這一刻應該在哪裡。
ok: 這兩個地方是不是同一個地方,其餘該對的也都對得上。
reason: ok 為 false 時寫哪裡對不上
同一張圖,同一個模型:
ok False
seen 她自己的房間/套房書桌:……窗台有幾盆小盆栽,背景是居家臥室風格的牆面和窗簾
reason 場景是家裡書桌(窗台盆栽、居家窗簾、化妝盤),不是辦公室,
跟「上班整理簡報」對不上
情境換成「晚上在家」則照樣放行——不是變成一個永遠說不的東西。
place_seen 那句「看家具、牆面、地板、窗外,不要看她在做什麼」是關鍵的一半。少了它,模型會從「她在打簡報」推回「所以在辦公室」,兩個欄位就變成同一個答案的兩次複述,比對永遠成立。
關鍵洞察
「A 跟 B 對不對得上」是一個讓模型可以合法閃避的問題。 它會挑 A 跟 B 之間最容易連起來的那條線回答你,而那條線通常不是你在擔心的那條。
要它比對兩件事,就讓它先分別寫下這兩件事,再下結論——欄位順序就是思考順序,結論欄放最後。先下結論再找理由,跟先寫下事實再比對,是兩種準確度。
同一個形狀的兩個推論:
- 每一個判準都要有自己的欄位。 判準只活在 system prompt 的散文裡、輸出只有一個
ok,等於讓模型自己決定這次要驗哪一條。它會選最好答的那條。 - 要模型觀察的東西,要指定它看什麼、不看什麼。 「這是在哪裡拍的」會被它用劇情回答;「看家具、牆面、窗外,不要看她在做什麼」才會被它用畫面回答。
還有一條跟工具權限有關的:驗收要真的打開檔案時,沒給讀檔權限的失敗是靜默的。模型打不開圖,就照著你給的期待複述一遍然後回 ok——那比沒有這道驗收更糟,因為它看起來像驗過了。這種呼叫一定要在程式碼裡斷言權限有傳(我補了一條測試專門釘 allow_read is True)。