AI 會出錯,大家都有心理準備。比較沒有防備的是它把那句錯的話記下來以後的事:讀出來的時候只剩結論,每被讀一次,就更像事實一點。
Day 5 提過,AI 有多篤定跟它對不對是兩條線。今天講那句話被它記下來以後的事。這裡所說的「記憶」,照 OWASP《Top 10 for Agentic Applications》裡記憶污染(Memory & Context Poisoning)的定義:agent 會留住、之後撈回來再用的任何資訊都算,摘要、向量、檢索用的資料庫都在裡面,只用一次的輸入不算。
使用 agent 整理客戶一個月內的三封來信,信裡沒有一句明講付款方式,但從對方關注的主題推測是月結。常見的記憶工具存的時候,它先把對話改寫成一句一句的事實。而改寫就是壓縮,原本是「從本月三封來信中推測對方可能偏好月結」,存完剩下「這個客戶使用月結方式計算」。「推測」不見了,「三封信」不見了,連「這個月」也不見了。
Day 6 講過,整理是重新生成。重新生成時被丟掉的往往是背景,這裡再往下一步:還有時間點和信心水位。有研究實測過:一句隨口帶保留的話,存完變成篤定、有日期的事實句,agent 之後就把它當查證過的事實照做。
有長期記憶的 agent,每次開工按當下的任務撈幾段相關的回來。撈的依據是「跟現在這件事有多像」,不是「這句話對不對」。撈回來以後,一句查證過的事實,和一句它自己推測出來的結論,在檔案裡長得一模一樣。脈絡沒有跟著存,就沒有辦法分辨。
寫進去的時候脈絡掉了,讀回來的時候只剩結論,兩件事合起來就是在洗記憶,帶問號的那句話洗成了沒有問號的一句話。
🤿 深水區
Day 3 講過,跨對話要記得住,就把東西存起來、下次撈回 context。存的那一步把事件抽成事實與偏好,「推測」兩個字就在這裡掉的;撈的依據是相關、新近、重要,沒有一項在判斷對不對。假的那句留在長期那一層,每個新 session 都可能撈回來。
可能沒有人動手,是 AI 自己。它讀回「這個客戶月結」,照著做事,做完再存一次筆記,這次寫的是「已依客戶月結需求對應處理」。OWASP 把這叫 bootstrap poisoning:agent 自己生成的輸出,被當成可信的記憶再吃回去。
也可能有人故意寫進去。OWASP 的例子是有人反覆對訂票助理講一個假的機票價格,助理存成事實,之後就照那個價格核准訂單。記憶污染跟提示注入(Prompt Injection)不同:注入是一次性的輸入,記憶污染是持久的,那個人早就不再出現,它還照著做。不管是它自己推出來存的,還是別人故意餵給它的,存進去之後長得一樣,讀出來的時候同樣分不出來。
還有一種:《Top 10 for LLM Applications》舉過一個情境,叫捏造的任務完成(Fabricated Task Completion)。Agent 回報昨晚的資料庫備份完成了,實際上根本沒有執行。這句是它寫出來的,不是查出來的,兩種句子在紀錄上長得一模一樣。
設想一個顧問案。顧問團隊用 AI 讀客戶的系統資料,整理出一份風險清單,其中一條寫著:這個欄位算錯,會直接影響各家門市的採購數字。兩個星期後開會提起,客戶當場異議:這個系統還在 pilot,只對某區少數門市開放。如果再久一點,這個結論會進週報、月報、甚至結案報告,下一個案子再讀進去當背景。每往下引用一次,那句話就更像事實一點,到最後沒有人記得它是從一個還沒全面上線的系統推出來的。
再往下就不只是紀錄。《Top 10 for LLM Applications》裡有一句話:一個錯的答案,會變成一個錯的動作。它也點名,人和系統都習慣把流暢、有自信、格式漂亮的輸出當成權威。信錯的也可能是下一個 agent:OWASP 的例子是有人把假的退款政策寫進共用記憶,其他 agent 直接拿來用,照著做了幾筆不該做的決定。
還有一種情況,當時空環境改變,資訊就過期了。前面那條風險被駁回之後等級下修,報告改為:僅某區門市受影響。這句話在那個時點完全正確。等到案子全面上線,沒有人知道為什麼這個欄位只對某一區的門市有影響,那條紀錄也不會自己跟著改。資料會被更新,落了檔的結論不會。
Day 12 提到的「把脈絡記錄下來」是機構記憶的解方,同時也是這條路的管道。而滾到最後真的出事那天,簽字的是人,稽核軌跡上完全合規,AI 在裡面的角色是隱形的。
出問題的原因只有一個:脈絡沒有跟著結論一起存。
所以要決定的是一件聽起來很小的事:寫進公司記憶的東西,脈絡要不要跟著一起留。這聽起來像文書規矩,可是真的要做,它是一筆長期成本,所以拍板的是經營層,不是寫檔案的人。怎麼做、誰負責,另一篇談。
這個決定不做,後面不管怎麼留痕、誰來簽字,讀到的都是同一批分不出成色的東西。剩下的問題還有幾個:這些記憶要留多久、誰有權寫進去、寫錯了能不能退回去。
一句話帶走:寫進去的時候脈絡掉了,讀出來的時候只剩結論。推論就這樣變成事實。