跳轉到

Agent Memory 系統:短期/長期記憶、向量記憶與記憶腐化更新策略

整理自 MemGPT 論文、Cognitive Architectures for Language Agents(CoALA)等學術論文與業界框架文件,2026-06-21。本頁聚焦在「agent 怎麼記東西」:記憶的分類、向量記憶的架構,以及最容易被忽略的「記憶怎麼壞、怎麼修」。

實證標記:〔論文〕= 出自學術論文;〔框架〕= 出自框架文件(LangGraph / mem0 等);〔實務〕= 業界慣例或本人整理。

為什麼 Agent 需要記憶系統

單輪 LLM 沒有記憶問題——每次呼叫都是新的。Agent 不一樣:它跨多步執行任務,橫跨多輪對話,甚至多個 session。幾個根本限制讓「記憶」變成工程問題:〔實務〕

  1. Context window 有限:全部歷史不可能都塞進去,長對話必然有資訊被截斷。
  2. Session 間狀態不持久:除非主動儲存,每次對話重啟都是全新狀態。
  3. 跨任務共享知識:使用者偏好、領域事實、過去的決策,應該在不同任務間都能取用。

記憶系統要解的問題是:哪些資訊在哪個時機、以什麼形式、存在哪裡、怎麼取回來。


四種記憶類型

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 步驟:

「從這段對話中,有什麼值得長期記住的事實或偏好?用 1–3 條 bullet 列出。
 如果沒有任何值得長期記憶的內容,回覆『無』。」

效果:記憶密度高、雜訊低、retrieval precision 提升,且明確過濾掉沒有記憶價值的回合。

策略 2:Upsert 而非 Append

原則:寫入新記憶前,先查詢有沒有衝突的舊記憶,有則更新,沒有才新增。〔框架〕

新記憶 → 查詢相似記憶(top-3)
→ 有高相似 + 衝突 → 刪舊 + 寫新(附 timestamp)
→ 有高相似 + 相容 → merge 或保留舊的(避免重複)
→ 無相似 → 直接寫入

mem0 / OpenMemory 框架就是用這個邏輯:用一個 LLM 判斷「新記憶和現有記憶是什麼關係(新增 / 更新 / 衝突刪除 / 忽略)」再決定操作。〔框架〕

策略 3:TTL 與 Recency 加權

給記憶加上時間戳,retrieval 時用 recency 加權:〔實務〕

final_score = similarity_score × decay(age)
decay(age) = e^(-λ × days_old)   # 可調 λ 控制遺忘速率

也可設 TTL:超過 N 天未被命中的記憶,降到「待確認」狀態,下次相關對話時詢問用戶是否仍有效。

策略 4:定期 Compaction(記憶壓縮)

累積到一定量後,跑一個批次任務:〔實務〕

  1. 把相似的記憶群集(embedding clustering)
  2. 每個群集用 LLM 摘要成一條精煉記憶
  3. 刪掉被摘要掉的原始記憶

這類似 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 就夠了。過早引入複雜框架會讓除錯更難。


延伸閱讀(本站)

來源