上一篇處理的是「該忘的,怎麼忘」,收在一個問題上:如果記住的那一句本身就是錯的呢?
先講結論:記錯比不記更糟。 沒記住,它會說不知道,或再問你一次;記錯了,它會很有把握地照做,而且開新對話也甩不掉。
這個實驗用 Claude Code 的自動記憶(auto memory),第 13 篇介紹過它存在哪。
/clear,改口:「規則改了,風格意見要寫,但標成 nit。」/clear,丟一段有命名問題的 diff 請它 review。~/.claude/projects/<專案>/memory/,數 MEMORY.md 裡有幾條 review 規則、資料夾裡有幾個檔案。我預期的是新規則取代舊的,或兩條都在。實際跑了一次(2026-09-29,Claude Code 2.1.284,claude-opus-5-5;非互動模式打不了 /clear,我用三次獨立的 claude -p 代替),結果是第三種:第二步它另寫了一個新檔,把 MEMORY.md 的索引改成只指向新檔,然後交代(節錄):
刪除舊檔
no-style-comments-in-review.md的指令需要你核准,這次沒有執行,所以舊檔還在。它已經不在索引裡,但內容和新規則衝突,建議刪掉。
第三步的 review 照新規則走,風格意見都標了 nit。但 MEMORY.md 只看得到一條規則,資料夾裡卻躺著兩個互相矛盾的檔案。 這次沒出事,是因為每段對話只先載入索引,主題檔用到才讀;舊檔能不能刪掉,卡在一個權限提示上。(只跑一次,是例子不是證據。)
/clear 清掉的是對話,不是記憶第 6 篇對付雪球效應的解法是開新對話,也先寫了前提:開新對話之所以乾淨,是因為上一輪什麼都沒留下來。 記憶打開之後,這個前提就不成立了。
在 Claude Code 裡,開新對話就是 /clear。指令列表的原話是它「開始新任務,同時保留專案記憶」;記憶文件寫明 MEMORY.md 的前 200 行或 25KB 在每段對話開始時載入(2026-09-29 查)。所以 /clear 之後的第一個請求,是系統提示+CLAUDE.md+MEMORY.md+你這一句。錯的那一條,正好在它保留的那一半裡。 雪球效應說的是模型對早期的錯誤過度承諾(Zhang et al., 2023),記憶把這個「早期」提前到了上一個對話。
其他跟記憶有關的指令也一樣(記憶、檢查點,2026-09-29 查):
| 指令 | 對話 | CLAUDE.md 與自動記憶 |
|---|---|---|
/clear |
清空,前一段可以 /resume 回去 |
保留,從磁碟重新載入 |
/compact |
換成摘要 | 保留,從磁碟重新注入 |
/rewind 的「還原對話」 |
倒回你選的那一則 | 不動檔案,寫進去的那條還在 |
/memory |
不動 | 列出記憶檔、開關自動記憶 |
/context |
不動 | 列出這一段實際載入了哪些記憶檔 |
寫入沒有專用指令,你說「記住……」它就寫,介面會出現「Saved 2 memories」這類訊息,但官方也說它會自己判斷值不值得記。要清掉錯誤記憶,只能去改那個檔案。
| 來源 | 怎麼發生的 | 出處 |
|---|---|---|
| 寫錯了 | 還沒驗證就記下來 | Claude 的記憶工具文件 |
| 更新判錯了 | 新規則進來,舊的沒被取代 | Mem0 |
| 別人寫進來的 | 攻擊者只靠跟代理聊天,就寫進一筆惡意紀錄 | MINJA |
寫錯了。 Claude 的記憶工具文件寫明,打開記憶工具時,API 會在系統提示裡加一段話,要它假設隨時會被中斷(ASSUME INTERRUPTION),邊做邊記(2026-09-29 查)。記憶是在事情還沒驗證完的時候寫的。同一份文件的解法是:端到端驗證過才標成完成,不是程式寫完就標。
更新判錯了。 Mem0(Chhikara et al., 2025)每抽出一條新事實,就讓 LLM 對照最像的舊記憶,決定新增、補充、刪除或不動。舊規則刪不刪,是一次模型呼叫的判斷;判成新增,兩條就並存。
別人寫進來的。 第 13 篇講過間接提示詞注入。MINJA(Dong et al., 2025)更進一步:攻擊者不需要能改記憶庫,只靠一般的提問,就能讓代理自己把惡意紀錄寫進去,之後被別的使用者的提問取回來當示範。只要代理會自己寫記憶,任何能跟它說話的人都是潛在的寫入者。
Xiong et al.(2025)量到代理有經驗追隨(experience-following)的傾向:新任務跟取回的記憶越像,輸出就越像那筆記憶當時的輸出。好處和壞處都從這裡來。作者指出的錯誤傳播(error propagation),是過去經驗裡的錯會累積、拖垮之後的表現;另一個發現是看起來正確的執行,當成經驗也可能誤導,沒出錯的不一定值得記。
兩條規則同時被載入,則是第 6 篇講過的知識衝突。Claude Code 的記憶文件講得很直白:兩條規則互相矛盾時,Claude 可能隨便挑一條(2026-09-29 查)。它提供的 /doctor prompt-audit 會找出 CLAUDE.md、規則、技能之間的矛盾,但文件列的範圍不含自動記憶。
污染也可以很少、很安靜。AgentPoison(Chen et al., 2024)在記憶或知識庫裡下毒,毒化比例不到 0.1%,平均攻擊成功率超過 80%,對正常任務的影響不到 1%。看平常的成績,你看不出記憶被動過。
MemEvoBench(Xie et al., 2026)把這整件事叫做記憶錯誤演化(memory misevolution):反覆接觸誤導性資訊後,代理行為逐漸漂移,而且靠提示詞的靜態防禦不夠。在系統提示寫「不要相信可疑的記憶」擋不住,要從結構上擋。
MEXTRA(Wang et al., ACL 2025)證明,代理存進記憶的私人互動,攻擊者在黑箱設定下就能問出來。Claude 的記憶工具文件在安全考量裡寫得很清楚:你的應用程式執行 Claude 要求的每個檔案操作,這些防護是你的責任;Claude 通常會拒絕寫入敏感資訊,要更強的保證,就在 handler 寫檔前自己剝掉。所以 /memories 一定要對應到「這一個使用者」的目錄,共用的記憶就是一個誰都能問的資料庫。
評估方法第 8 篇寫過,這裡只講三件事:
多了什麼能力:你分得出錯的記憶有三個來源,知道它為什麼會越長越多、為什麼平常看不出來,也知道
/clear為什麼救不了它;手上有一個用任務結果回頭標記憶的辦法、一題知識更新題,和五條寫記憶的規則。多付了什麼代價:記憶變成一個要稽核、要隔離、要防注入的資料儲存。從第 11 篇的重送帳單到這裡,第四層收的每一筆代價都落在同一個地方:一個要當資料庫維護、卻不會替你報錯的東西。
到這裡,代理能讀你的文件、記得你講過的事,也知道什麼該忘。但它還不能替你做任何一件事。
模型輸出的只有文字。它要怎麼查資料庫、跑測試、改一個檔案?其實你已經看過一次答案:第 13 篇那個 Claude 的記憶工具,讀和寫都是模型「開口要」、你的程式碼去做。下一篇從那個「開口要」開始,進入第五層:讓它動手。