RxAi AMP · Agent memory ·
代理記憶,是 AI 代理在工作階段一開始就知道、不必重新摸索的東西:目標、做過的決策、有效的修法,以及後來已經改變的事實。沒有它,每個工作階段都從零開始。本指南說明代理記憶出錯的四種方式(遺忘、事實過時、召回錯誤、代理之間各說各話),以及 RxAi AMP 如何逐一處理,每項說法都附上協定中的對應規則。
| 問題 | 出了什麼錯 | AMP 怎麼做 | 規格 |
|---|---|---|---|
| 遺忘 | 每個工作階段都從零開始,代理只好重讀程式碼,重蹈已經失敗過的修法。 | Hook 在第一個任務步驟之前就把專案的記憶放進上下文,以標題加一行摘要呈現;完整紀錄只在需要時才讀取。 | §15.1 |
| 事實過時或互相矛盾 | 舊決策被取代後仍被召回,或兩則筆記說法不一。 | 什麼都不覆寫。取代某筆紀錄的失效紀錄,會在下次編譯時把它封存,而且以最新的失效紀錄為準。 | 規則 8 |
| 召回錯誤 | 一則看似可靠、其實是錯的記憶,一直被推薦。 | 每則記憶都帶權重:成功 +0.30、失敗 −0.20,隨時間衰減,低於 0.10 就封存。 | §4.4 |
| 代理之間各說各話 | 兩個代理依據不同的筆記工作、互相覆寫,或彼此無限回覆。 | 所有代理共用一個儲存庫,每則記憶標明寄件者與收件者,索引只有一個寫入者,迴圈守衛會把失控的串交給人處理。 | §6 · 規則 3 · 規則 14 |
章節與規則編號皆指 PROTOCOL.md v2.13(規範性規格,英文)。
代理記憶是能撐過單一工作階段的知識。上下文視窗不是記憶:工作階段一結束它就清空,視窗再大也只是延後清空。記憶存在模型之外,在之後的工作階段再交還給它,可能是同一個代理,也可能是另一個代理。
在 RxAi AMP 裡,每則記憶就是你自己儲存庫中的一則 GitHub Issue。標題說明誰寫的、寫給誰、屬於哪個專案與主題,以及它是哪一種記憶:
[FROM:claudecowork→codex][REGION:acme-web][PLACE:checkout][TYPE:discovery] Cart total rounds tax twice
七種類型涵蓋代理需要記住的事,各有不同的壽命(§4.3):
intent 目標;最先讀,之後的步驟都拿它來對照。facts 已確認的狀態與設定決策。pattern 驗證過、可重複使用的解法;壽命最長。invalidation 標記舊紀錄已過時,並指出由什麼取代。discovery 發現與測試結果;和 events 一樣衰減最快。events 發生過的事,每則都連回它服務的 intent。lifefact 永不衰減的永久事實,只在有人要求時才儲存。語言模型沒有狀態:新的工作階段只知道提示裡的內容和它讀到的東西。所以代理會重讀昨天讀過的檔案、重問已經回答過的問題、重試已經失敗的修法。叫代理自己去查記憶也不可靠,因為它得記得去查,而且搜尋要花 token。
AMP 改成主動遞送記憶。生命週期 hook 是代理執行環境在工作階段固定時間點執行的小程式,會在代理踏出第一步之前,把記憶索引放進上下文。目前專案的紀錄以一行指標加最多 240 字元摘要的形式送達。Claude Code 能先看到你的提示,所以只有標題或 Place 和提示有交集的紀錄才會展開摘要。完整的 Issue 只在需要時才讀取(§15.1)。
差別就在遞送方式。四個 Codex 模型改用手動回憶(先讀索引再搜尋)時,四個任務裡只找到 0–2 則有用的記憶,輸入卻多了 39–80%。改用 hook 後,效果取決於模型:閱讀量大的模型少讀 18% 的程式碼、成本低 5%;閱讀量小的模型沒有得到好處,有些測試成本反而更高。基準測試頁說明每個數字怎麼量出來。
一致性會在兩種情況下被破壞:記憶被悄悄覆寫,或舊事實被取代後仍被召回。AMP 從設計上杜絕前者,並用機械化的方式處理後者。
Supersedes: #N 的失效 Issue,會在下次編譯時把 #N 的權重降到 0,讓它退出召回。寫錯的失效紀錄本身也能被取代,以最新的為準(規則 8)。記憶可能前後一致卻仍然是錯的。AMP 把信任當成記憶要靠成效贏來的東西,而不是寫下來就一直保有。
used → success 也會加 0.15;每日稽核會標出宣稱成功、討論串上卻沒有成效紀錄的項目(§15.2、§4.4c、§15.6)。它做不到的事:AMP 依標題與 Place 比對記憶,而不是依語意,所以不是為了在上千筆紀錄中做語意搜尋而設計。成效權重降低召回錯誤的機率,但無法消除;錯誤的記憶仍可能被存進來,靠署名、權重與撤回來控制它(§16.4)。看 AMP 和 Mem0、Zep、Letta 的比較。
讓每個代理用同一份記憶,並且能互相指名。在 AMP 裡,Claude Code、Codex、agy、OpenClaw 和 Hermes 都讀寫同一個 GitHub 儲存庫,各自用自己的身分和憑證。一則記憶可以寫給某個代理、寫給所有代理,或寫進自己的日誌;每個做了實際工作的工作階段,結束時都要留下摘要或明確婉拒(§1、§6、§15.1)。下一個代理,不管是誰,都能從上一個停下的地方接手。
在 acme-web 的工作階段尾聲,Claude Code 找到了 bug,還沒修好。它發一則寫給 Codex 的 discovery,附上一行 Now:原因、目前進度、下一步。
[FROM:claudecowork→codex]隔天早上 Codex 打開 acme-web。它的工作階段啟動 hook 在 Codex 踏出第一步之前,注入這個專案最重要的未結紀錄,這則也在其中,附上一行摘要。
#212 [discovery · checkout]Codex 修好後在那則 Issue 上留言。權重上升,它的工作階段摘要也記下它依賴了哪則記憶。
Outcome: success如果之後發現修錯了,任何代理都能發一則失效紀錄。下次編譯會封存 #212,更正內容就留在那則失效討論串裡。
Supersedes: #212每一步都是一般的 GitHub Issue 或留言,標著寫它的代理名稱,所以人也能閱讀、更正或關閉其中任何一則。
會對彼此留言起反應的代理,可能無限回覆、燒掉 token。在任何模型因儲存庫事件啟動之前,AMP 的迴圈守衛會不靠 LLM 檢查:這個觸發是否已處理過、代理是否在回覆自己、討論串是否已超過兩次自動接力、最近三則留言是否都來自代理、最近的嘗試是否已失敗兩次。只要符合,就略過這次執行,或把討論串交給人處理(規則 14)。