Agent Memory 系統:短期/長期記憶、向量記憶與記憶腐化更新策略¶
整理自 MemGPT 論文、Cognitive Architectures for Language Agents(CoALA)等學術論文與業界框架文件,2026-06-21。本頁聚焦在「agent 怎麼記東西」:記憶的分類、向量記憶的架構,以及最容易被忽略的「記憶怎麼壞、怎麼修」。
實證標記:〔論文〕= 出自學術論文;〔框架〕= 出自框架文件(LangGraph / mem0 等);〔實務〕= 業界慣例或本人整理。
為什麼 Agent 需要記憶系統¶
單輪 LLM 沒有記憶問題——每次呼叫都是新的。Agent 不一樣:它跨多步執行任務,橫跨多輪對話,甚至多個 session。幾個根本限制讓「記憶」變成工程問題:〔實務〕
- Context window 有限:全部歷史不可能都塞進去,長對話必然有資訊被截斷。
- Session 間狀態不持久:除非主動儲存,每次對話重啟都是全新狀態。
- 跨任務共享知識:使用者偏好、領域事實、過去的決策,應該在不同任務間都能取用。
記憶系統要解的問題是:哪些資訊在哪個時機、以什麼形式、存在哪裡、怎麼取回來。
四種記憶類型¶
CoALA 框架(Cognitive Architectures for Language Agents)把 agent 記憶對應到認知科學的分類:〔論文〕
| 類型 | 存什麼 | 存在哪裡 | 類比 |
|---|---|---|---|
| Working memory(工作記憶) | 當前任務的即時狀態、最近訊息 | Context window | 桌上的便條紙 |
| Episodic memory(情節記憶) | 過去發生了什麼(對話記錄、執行日誌) | 外部儲存 | 日記 |
| Semantic memory(語意記憶) | 長效事實、使用者偏好、領域知識 | 外部儲存 | 知識庫 |
| Procedural memory(程序記憶) | 怎麼做事(tools、skills、system prompt) | 程式碼 / prompt 本身 | 肌肉記憶 |
〔論文〕CoALA 指出,大多數現有 LLM agent 框架只真正實作了 working memory(context window)和 procedural memory(tools),而 episodic 與 semantic 記憶常靠開發者手動拼湊。這是 agent 可靠性的主要缺口之一。
短期記憶 = Working Memory¶
短期記憶就是 context window 裡目前有的東西:system prompt、當前對話、工具呼叫結果。
主要限制: - 容量有限,即使 128K+ context 仍是有限的 - Session 啟動後若無主動填充,context 是空的 - 「lost in the middle」問題:模型對 context 中間段落的注意力系統性偏低,最近與最早的資訊被記得最清楚〔論文〕
長期記憶 = 外部儲存¶
長期記憶存在 context window 外,需要明確的讀寫操作。MemGPT 的核心創新之一就是讓 agent 自己管理「哪些東西要存進 / 取出外部記憶」,把這件事做成 tool call 而非隱式行為。〔論文〕
向量記憶¶
語意記憶和情節記憶最常用向量資料庫實作,因為「你想取什麼」通常是語意查詢而非精確比對。〔框架〕
基本架構¶
[寫入]
原始文字 → Embedding 模型 → 向量 + metadata → 向量 DB
[讀取]
查詢文字 → Embedding → ANN search → Top-k 相似片段 → 注入 context
關鍵設計決策¶
| 決策點 | 選項 | 注意事項 |
|---|---|---|
| 存什麼單元 | 整段對話 vs 蒸餾後的事實 vs 摘要 | 原始對話雜訊多;蒸餾更精確但多一次 LLM 成本 |
| Embedding 模型 | OpenAI text-embedding-3 / local Sentence-BERT | 寫入與查詢必須用同一個模型 |
| Top-k 數量 | 通常 3–10 | 太多稀釋 signal;太少可能漏關鍵記憶 |
| Hybrid retrieval | 向量 + BM25 關鍵字混合 | 純向量在精確名詞(人名、日期)上偏弱 |
| Reranking | Cross-encoder reranker | 精度提升,但多一次模型呼叫 |
〔實務〕常見陷阱:agent 把每次對話的原始文字全量存進向量 DB,幾十次對話後 retrieval 品質下降——相似的舊記憶互相競爭,真正相關的記憶被淹沒。這就是下節要處理的記憶腐化問題。
記憶腐化:三種壞法¶
記憶腐化(memory degradation / staleness)是長期運行 agent 最常見也最難察覺的問題。〔實務〕
1. 事實腐化(Staleness)¶
儲存的事實過期了:用戶換了工作、偏好改變、外部環境更新。Agent 帶著過期記憶回答,不只無用,還主動誤導。
症狀:用戶明明改了偏好,但 agent 還是用舊的設定回應。
2. 衝突記憶(Contradiction)¶
同一主題有多條矛盾的記憶同時存在:「用戶喜歡簡短回答」和「用戶說過想要完整說明」都在 DB 裡。Agent 不知道信哪一條,行為變得不一致。〔實務〕
常見成因:只有 append-only 的寫入,沒有更新機制——每次寫入往上疊,新的進來形成衝突而舊的不刪。
3. 記憶氾濫(Memory Pollution)¶
累積太多記憶後,retrieval 的 precision 下降: - 相似記憶重複(同一件事的五種說法都存著) - 低品質記憶(raw tool 結果、對話原文)稀釋高品質記憶 - Retrieved 記憶佔滿 context,壓縮了當前 input 的空間
更新策略¶
策略 1:蒸餾寫入,不存原始文字¶
原則:寫進記憶的應是「蒸餾後的事實」,不是原始對話。〔實務〕
寫入前先過一道 LLM summarize / extract 步驟:
效果:記憶密度高、雜訊低、retrieval precision 提升,且明確過濾掉沒有記憶價值的回合。
策略 2:Upsert 而非 Append¶
原則:寫入新記憶前,先查詢有沒有衝突的舊記憶,有則更新,沒有才新增。〔框架〕
mem0 / OpenMemory 框架就是用這個邏輯:用一個 LLM 判斷「新記憶和現有記憶是什麼關係(新增 / 更新 / 衝突刪除 / 忽略)」再決定操作。〔框架〕
策略 3:TTL 與 Recency 加權¶
給記憶加上時間戳,retrieval 時用 recency 加權:〔實務〕
也可設 TTL:超過 N 天未被命中的記憶,降到「待確認」狀態,下次相關對話時詢問用戶是否仍有效。
策略 4:定期 Compaction(記憶壓縮)¶
累積到一定量後,跑一個批次任務:〔實務〕
- 把相似的記憶群集(embedding clustering)
- 每個群集用 LLM 摘要成一條精煉記憶
- 刪掉被摘要掉的原始記憶
這類似 MemGPT 的記憶搬移概念——把工作記憶裡的東西壓縮後搬到長期記憶,避免單一 context 長度無限增長。〔論文〕
實務架構選擇¶
| 需求情境 | 推薦方案 | 說明 |
|---|---|---|
| 快速原型 | LangGraph + in-memory store | 最簡單,session 結束即丟 |
| 單一用戶長期對話 | mem0 / OpenMemory | 內建 upsert 邏輯,適合個人 assistant |
| 多用戶 SaaS | Pinecone / Qdrant + 自訂 upsert 邏輯 | 需要 user_id 隔離,自行控制記憶生命週期 |
| 複雜 agent 多記憶層 | MemGPT (Letta) | 完整的 in-context / 外部記憶搬移機制 |
〔實務〕多數應用不需要 MemGPT 的複雜度。先問:「這個 agent 需要跨 session 記住什麼?」——如果答案是「用戶偏好 + 最近幾次對話摘要」,用 mem0 或一個簡單的向量 DB + upsert 就夠了。過早引入複雜框架會讓除錯更難。
延伸閱讀(本站)¶
- Context Engineering 實作篇:Context Budget、Memory、Retrieval 與 Tool Result 壓縮 — 記憶作為 context 四大槓桿之一的整體視角
- Embeddings 與向量資料庫實務 — 向量記憶的底層技術
- Agent Observability:用 Trace 看清 Agent 在做什麼 — 觀測記憶讀寫行為的工具
- Multi-Agent 協作:模式與失敗隔離 — 多 agent 間共享記憶的架構考量
來源¶
- MemGPT: Towards LLMs as Operating Systems(Packer et al., 2023,arXiv 2310.08560)
- Cognitive Architectures for Language Agents(Sumers et al., 2023,arXiv 2309.02427)
- Lost in the Middle: How Language Models Use Long Contexts(Liu et al., 2023,arXiv 2307.03172)
- mem0:The Memory Layer for AI(mem0.ai 官方文件)
- LangGraph Memory(LangGraph 官方文件)