PM Decision Deck · Knowledge Architecture Blueprint
No. 013 · 2026.07
Chapter 013 · 從零到生產

大模型 Agent 長短期記憶 管理

一份以「平台 VP 事故复盘」形式組織的可商業交付產品管理 Deck。
沿著認知建立 → 自研實作 → 生產升級 → 落地治理四條敘事線,
把「為什麼記憶是工程責任」、「短期/長期記憶如何協同」、
「何時該從自研遷徙到 mem0 等中間件」三件事講清楚。

受眾工程 / 產品 / 平台 VP 規模10 章 / 35 頁 範式證據 · 解讀 · 行動
DRAFT · 證據優先 · 不預設立場
「記憶不是模型的內建能力,而是應用層的工程責任。」
02 · 學習地圖
Chapter 013 / OVERVIEW
Overview · 第一階段 / 第二階段

先理解原理,再掌握工具 —— 兩階段閉環

本 Deck 把記憶系統的學習拆成兩個不可省略的階段:第一階段用最基礎的 Python + OpenAI SDK 從零搭建 mini-OpenClaw 自研記憶系統(第二至七章);第二階段引入生產級開源中間件 mem0(第八至十章)。

CH 1
開場:為什麼需要記憶
建立「記憶是工程責任」的核心認知,三層次認知框架,人類記憶類比。
CH 2
技術全景與選型
兩層分離模型,四種記憶層實現路線橫向對比。
CH 3
短期記憶工程實作
JSON 持久化、消息截斷、壓縮摘要三大機制串成 SessionManager。
CH 4
長期記憶架構
向量 / KV / 圖 / 關係型四種存儲選型與組合策略。
CH 5
寫入與檢索機制
LLM 主動判斷、Direct vs RAG 切換、sleep-time agent 整理。
CH 1–5 自研理解原理
「先學會工具在解決什麼問題,再去掌握工具本身。」
CHAPTER ONE
Ch 01 / 10
Chapter One · 開場
01

為什麼 Agent 需要記憶系統

先建立三個不可繞過的認知:記憶是應用層責任、上下文窗口 ≠ 記憶、人類記憶的設計類比。

CH 01 · 認知建立
「Agent 記住的東西,不在模型裡,在你的工程裡。」
04 · Ch1.1
Ch 01 · PAGE 01
Course Map · 認知建立 / 自研實作

課程定位:讓無狀態的 LLM 具備持久化記憶

整條路徑分兩個階段。第一階段(第二至七章)從零搭建 mini-OpenClaw 自研系統;第二階段(第八至十章)用 mem0 生產級中間件取代手工規則。兩階段合起來構成「先理解原理、再掌握工具」的完整閉環。

EVIDENCE · 命題

核心命題

讓天生無狀態的大型語言模型,具備跨對話、跨會話的持久化記憶能力。

  • LLM API 本身不保留上下文(除了一次調用內)
  • 用戶期待「昨天聊過的事今天還記得」
  • 企業部署需要可審計、可解釋的記憶
INTERPRET · 兩階段

閉環哲學

先理解原理,再掌握工具 —— 不學會工具在解決什麼問題之前,先不急著用工具。

階段產物
第二至七章mini-OpenClaw 自研
第八至十章mem0 生產中間件
ACTION · 路徑

四條敘事線

  • 認知建立:記憶是工程責任(第一至二章)
  • 自研實作:短期 + 長期手工搭建(第三至七章)
  • 生產升級:mem0 取代手工規則(第八至九章)
  • 落地治理:企業級部署與避坑(第十章)
CH 01 · P01
「不學會工具在解決什麼問題之前,先不急著用工具。」
05 · Ch1.2
Ch 01 · PAGE 02
Cognitive Anchor · 5-minute demo

認知起點:有記憶 vs 無記憶 Agent 的真實對比

五分鐘代碼演示揭示記憶系統存在的根本動機。兩版代碼唯一差別是後者維護了 messages = [] 列表,第二輪問「我叫什麼名字」時,第二版正確回答「你叫小明,你在學 Python」。

EVIDENCE · 代碼對比

無記憶 vs 有記憶

R1: client.chat.completions.create(
  messages=[{"role":"user","content":"我叫小明"}]
  )
# 第 2 輪:全新請求,沒有上下文
R2: client.chat.completions.create(
  messages=[{"role":"user","content":"我叫什麼名字"}]
  ) → "抱歉,我沒有您之前對話的記錄"

# 有記憶版:維護 messages 列表
R1: messages = [{"role":"user","content":"我叫小明"}]
R2: messages.append(...); messages.append(新提問)
  client.chat.completions.create(messages=messages)
  ) → "你叫小明,你在學 Python"

INTERPRET · 差距的本質

不是模型能力差,是工程差

  • 有記憶 vs 無記憶的差距,不是模型能力差距
  • 而是工程層面是否維護了消息歷史
  • 同一個模型、同樣的 prompt,只是後者多了一個 messages = []
  • 這是記憶系統存在意義的最簡證明

關鍵洞察:記憶系統是應用層的責任,不是 LLM 本身自帶的功能。

ACTION · 第一步

立刻就能做的工程

  • messages = [] 作為記憶系統的最簡實現
  • 每次調用前 messages.append(...) 追加用戶與助手訊息
  • 每次調用後將完整 messages 一起傳給 LLM
  • 接受這是個樸素但完整的起點
CH 01 · P02
「記憶系統是應用層的責任,不是 LLM 內建的能力。」
06 · Ch1.3
Ch 01 · PAGE 03
Three Layers · 上下文窗口 ≠ 記憶系統

三個層次的認知:上下文窗口無法取代持久化記憶

2026 年主流模型上下文窗口已大幅擴展(GPT-5.4 200K、Gemini 3.1 Pro / Claude Opus 4.6 達 1M、Llama 4 Scout 突破 10M tokens)。但上下文窗口存在三個硬限制:Token 上限、成本線性增長、推理延遲退化。

EVIDENCE · 模型窗口現況

2026 模型上下文窗口

模型窗口
GPT-5.4200K tokens
Gemini 3.1 Pro1M tokens
Claude Opus 4.61M tokens
Llama 4 Scout10M tokens

100 輪對話 ≈ 第 1 輪成本的 100×

INTERPRET · 三個硬限制

窗口再大也解不掉的三件事

  • Token 上限:再大的窗口終究有邊界,長對話必然超出
  • 成本線性增長:每次請求都要發送完整歷史,第 100 輪成本 = 第 1 輪 × 100
  • 推理延遲退化:上下文越長用戶體驗從秒級退化為十秒級

致命問題:上下文隨進程結束而消失,無法跨會話保留。

ACTION · 必須建立

跨會話持久化記憶

  • 用戶關閉瀏覽器、明天再打開,Agent 仍記得「你叫小明,上次討論到 sklearn Pipeline」
  • 持久化記憶必須寫入外部存儲介質(文件 / DB / 向量庫)
  • 上下文窗口是計算資源,持久化記憶是狀態資源,兩者正交
  • 忘掉「更大的窗口能解決一切」這條捷徑
CH 01 · P03
「上下文隨進程結束而消失,持久化記憶需要寫入存儲介質。」
07 · Ch1.4
Ch 01 · PAGE 04
Cognitive Anchor · 人類記憶類比

人類記憶類比:貫穿全課的設計哲學框架

把 Agent 記憶系統對應到人類認知結構,建立一套從第一頁用到最後一頁的設計哲學:人腦不會記住每天遇到的所有事,而是選擇性地提煉關鍵信息寫入長期記憶——Agent 也應如此。

EVIDENCE · 對照表

五項人類記憶 ↔ Agent 機制

人類記憶Agent 機制
工作記憶messages[] 短期
長期陳述記憶MEMORY.md 注入
圖書館檢索向量庫 RAG 檢索
通訊錄備註USER.md 用戶畫像
睡前整理筆記compressed_context 摘要
INTERPRET · 設計哲學

選擇性,而非全量

人類不會把每天遇到的所有事都永久記住,而是有選擇地提煉關鍵信息寫入長期記憶。

  • 全量寫入 → 噪音淹沒有效信號
  • 選擇性寫入 → 向量檢索的「精確度」才有意義
  • 由 Agent 主動判斷「這條信息值得長期保留嗎」
  • 這是所有記憶系統設計的底層共識
ACTION · 落地原則

從現在開始的設計約束

  • 寫入觸發必須帶事實性 / 穩定性 / 復用性 三項判斷
  • 臨時性任務信息不寫長期(例:「剛問了 for 循環語法」)
  • 用戶身份、技術棧、項目背景寫長期(例:「小明,Python 開發者,做 sklearn Pipeline」)
  • 寧可漏記,不要濫記
CH 01 · P04
「人類不會把每天遇到的所有事都永久記住。」
CHAPTER TWO
Ch 02 / 10
Chapter Two · 技術全景
02

技術全景與四種記憶路線選型

在動手實作前先建立結構性認知:Agent 系統是執行層與記憶層的雙子系統,四種記憶層路線代表四種哲學。

CH 02 · 技術全景
「執行層決定『下一步做什麼』,記憶層決定『我知道什麼』。」
09 · Ch2.1
Ch 02 · PAGE 01
Architecture · 執行層 vs 記憶層

Agent 系統兩層分離模型:執行層 ↔ 記憶層

Agent 系統內部有兩個職責完全不同的子系統協同運作:執行層回答「下一步該做什麼」,記憶層回答「我知道什麼、該記住什麼」。兩層解耦帶來的工程收益是:修改記憶策略不會影響推理循環,升級執行框架也不會丟失歷史數據。

EVIDENCE · 兩層職責

執行層

核心組件:

  • LLM API 調用
  • 工具註冊與執行
  • ReAct 推理循環(Reason + Act)
  • 流式輸出

回答的問題:下一步該做什麼?

INTERPRET · 工程實現

記憶層

核心組件:

  • 歷史消息存儲
  • 跨會話持久化
  • 記憶檢索與注入
  • 遺忘與壓縮策略

回答的問題:我知道什麼、該記住什麼?

ACTION · 雙向協作

mini-OpenClaw 對應

  • 執行層langchain-deepseekChatDeepSeek + create_agent()
  • 記憶層mini-OpenClaw 文件系統記憶架構
  • 兩層之間雙向箭頭協作:執行層讀取記憶 / 寫入新記憶
  • 工程實踐原則:修改記憶策略不影響推理循環
CH 02 · P01
「修改記憶策略不會影響推理循環,升級執行框架也不會丟失歷史數據。」
10 · Ch2.2
Ch 02 · PAGE 02
Landscape · 四條主流路線

四種記憶層實現路線:透明度 × 自主智能度

工程實踐中記憶層存在四條主流路線,理解這張地圖能幫助快速定位任何開源專案屬於哪條路線。四條路線沒有絕對優劣,選型取決於場景。

EVIDENCE · 四條路線

象限定位

路線代表
文件系統OpenClaw / mini-OpenClaw
多後端存儲LangChain 1.x + LangGraph
多源召回LlamaIndex
分層自管理Letta(原 MemGPT)
INTERPRET · 哲學差異

四種設計哲學

  • 文件系統:Markdown/JSON 透明可控,人機共同維護
  • 多後端:Checkpointer + Store 快速原型到生產
  • 多源召回:多路融合適合 RAG 密集場景
  • 分層自管理:LLM 像 OS 管理內存一樣自主決策讀寫

橫軸:透明度(人可讀 vs 黑盒)
縱軸:自主智能度(手工規則 vs LLM 裁判)

ACTION · 選型決策

mini-OpenClaw 的選擇

本課程採用 文件系統記憶路線,理由:

  • 教學場景需透明可讀(調試必備)
  • 個人 Agent + 本地部署為主
  • 不需要企業級自主管理複雜度
  • 為後續遷徙到 mem0 中間件打基礎
CH 02 · P02
「四條路線沒有絕對優劣,選型取決於場景。」
11 · Ch2.3
Ch 02 · PAGE 03
Comparison · 短期 vs 長期

短期記憶 vs 長期記憶:服務於完全不同目的

很多開發者在此模糊處理導致系統設計混亂。短期記憶是「今天的便籤紙」,用完即扔只服務當前任務;長期記憶是「多年的日記本」,記錄穩定的、值得跨時間保留的信息。

EVIDENCE · 對比表

生命週期與挑戰

維度短期長期
生命週期單次會話跨會話永久
消失條件進程結束顯式刪除
存儲介質messages[] / JSONMEMORY.md / 向量庫
主要挑戰超出長度後截斷何時寫入/更新/刪除
INTERPRET · 模糊的危害

設計混亂的常見徵兆

  • 臨時任務信息塞進長期記憶(明天的午餐訂單)
  • 用戶身份只放在短期記憶(會話結束即丟失)
  • 截斷時把用戶名一起截掉 → 後期對話失憶
  • 不區分通道 → 「記憶」變成單一黑盒,無法定位問題
ACTION · 通道分流

哪類信息走哪條通道

  • 短期:當前對話的上下文、即時任務流程
  • 長期:用戶畫像、項目背景、跨會話偏好
  • 橋接:壓縮摘要(從短期蒸餾到長期)
  • 過濾:寫入判斷決定是否升級到長期
CH 02 · P03
「系統設計的關鍵不是『選哪種記憶』,而是『哪類信息該走哪條通道』。」
12 · Ch2.4
Ch 02 · PAGE 04
Why this route · 三個明確理由

mini-OpenClaw 為什麼走文件系統記憶路線

選擇這條路線有三個明確理由:透明可讀、熱更新、人機共同維護。這條路線的局限也很明確:當記憶文件體積超過上下文容量時,全文注入會失效,需要引入 RAG 機制做語義檢索。

EVIDENCE · 三大理由

選型的工程邏輯

  • 透明可讀:記憶文件是普通 Markdown,任意文本編輯器可打開
  • 熱更新:Agent 運行期間可直接編輯 MEMORY.md,下次對話即生效
  • 人機共同維護:既可由 Agent 自動寫入,也可由用戶手動編輯
INTERPRET · 局限與邊界

什麼時候不夠用

  • MEMORY.md 超過約 2000 tokens(約 1500 中文字),全文注入成本上升
  • 觸碰上下文窗口限制的風險
  • 此時必須引入 RAG 機制做語義檢索(第五章詳述)
  • 這是文件系統路線的自然演進路徑,不是缺陷
ACTION · 場景匹配

適合與不適合

適合

  • 個人 Agent、本地部署、需要審計
  • 教學場景(除錯必備)
  • 記憶量 < 2000 tokens 的中小型應用

不適合

  • 企業級大規模用戶記憶
  • 需要 LLM 自主裁判的複雜場景
CH 02 · P04
「選型沒有最好,只有最適合當前階段。」
CHAPTER THREE
Ch 03 / 10
Chapter Three · 自研實作
03

短期記憶工程實作:SessionManager 三大機制

從「messages = []」開始,三大機制封裝成完整的 SessionManager:JSON 持久化、消息截斷、壓縮摘要。

CH 03 · 短期記憶
「短期記憶不是消息列表的無限堆積,是受控的 Token 經濟。」
14 · Ch3.1
Ch 03 · PAGE 01
Persistence · JSON 文件結構

對話歷史存儲:從 messages 列表到 JSON 持久化

工程化的第一步是加上會話持久化能力:關閉程序後重啟,歷史對話依然存在。mini-OpenClaw 用 JSON 文件存儲每個會話,四個欄位結構清晰。一個容易忽略但至關重要的實現細節:json.dump(..., ensure_ascii=False)

EVIDENCE · 會話結構

四欄位 JSON

{
  "title": "會話標題",
  "created_at": "2026-07-27T10:00:00Z",
  "updated_at": "2026-07-27T10:30:00Z",
  "compressed_context": "",
  "messages": [...]
}

INTERPRET · 兩個關鍵函數

load / save 對稱設計

  • load_session(session_id) 加載會話(不存在則創建新結構)
  • save_session(session_id, session) 持久化
  • 對稱設計讓升級/降級無痛
  • 關鍵陷阱ensure_ascii=False 缺失,中文會被轉義成 \u 序列
ACTION · 落地清單

立刻落地

  • 為每個會話分配 session_id(UUID 或時間戳)
  • 文件命名 sessions/{session_id}.json
  • 每次訊息變更後 save_session
  • 啟動時 load_session 恢復
  • 中文存儲必須 ensure_ascii=False
CH 03 · P01
「ensure_ascii=False 是中文存儲的必要配置,不是可選優化。」
15 · Ch3.2
Ch 03 · PAGE 02
Truncation · Token 成本第一道防線

消息截斷策略:控制 Token 成本的第一道防線

messages 列表會無限增長,第 50 輪對話時可能已累積上百條消息,若全部傳給 LLM,Token 成本是第一輪的百倍,推理延遲也顯著上升。最直接的解法是只保留最近 N 條消息傳給 LLM,mini-OpenClaw 默認 MAX_HISTORY = 20(後續版本調整為 30)。

EVIDENCE · 經驗值

MAX_HISTORY 的取值邏輯

設置效果
MAX_HISTORY = 5Agent 顯得健忘
MAX_HISTORY = 20工程經驗平衡點
MAX_HISTORY = 30後續版本默認
MAX_HISTORY = 100長會話成本失控

DeepSeek-V3.2 支援 128K 窗口,20-30 條僅佔極小比例。

INTERPRET · 截斷的副作用

健忘的 Agent

用戶在第 3 輪說「我叫小明,我在做機器學習項目」,到第 25 輪問「幫我繼續優化上次那個模型」,如果第 3 輪已被截斷:

  • Agent 不知道「小明」是誰
  • 不知道「上次那個模型」是什麼
  • 用戶體驗崩塌:「這個 AI 怎麼每次都要重新自我介紹?」
  • 這正是壓縮摘要機制要解決的問題
ACTION · 雙機制協同

截斷 + 摘要

  • 截斷不是獨立機制,而是和壓縮摘要協同工作
  • 截斷前的早期對話 → 壓縮成摘要 → 保留在 compressed_context
  • 下次對話先注入摘要 + 最近 N 條歷史
  • 兩者形成「短期內精準 + 長期有脈絡」
CH 03 · P02
「截斷是 Token 經濟的必要之惡,但必須有摘要來補位。」
16 · Ch3.3
Ch 03 · PAGE 03
Compression · 用 LLM 總結 LLM

壓縮摘要機制:本章核心 —— 用 LLM 總結 LLM

核心思路:當對話歷史超過閾值,把較早的對話讓 LLM 壓縮成一段自然語言摘要,存入 compressed_context 欄位,下次對話時先注入這段摘要,再接上最近 N 條歷史。

EVIDENCE · 設計細節

比例設計 + 滾動摘要

  • 取消息列表的前 50%(至少 4 條)作為待壓縮部分
  • 按比例而非固定數量 → 自適應對話增長
  • 每次壓縮:舊摘要 + 新消息 → 統一新摘要(防止摘要越積越長)
  • 摘要獨立以 system 角色注入
INTERPRET · Prompt 設計

保留四類信息的硬約束

壓縮 prompt 明確要求保留:

  • 用戶身份(姓名、角色、技術棧)
  • 重要決策(項目方向、技術選型)
  • 技術細節(代碼片段、API 名稱)
  • 未完成的任務(待辦、後續計劃)

第三人稱描述、100-200 字內、固定前綴開頭。

ACTION · 防止誤判

三個工程保障

  • 摘要獨立以 system 角色注入 → 避免 LLM 誤把摘要當成用戶說過的話
  • 滾動合併而非簡單拼接 → 摘要長度受控
  • 低溫度 temperature=0.1 → 摘要穩定可重現
  • 壓縮比例隨對話增長自適應 → 不出現「壓縮後仍超閾值」
CH 03 · P03
「滾動摘要:舊摘要 + 新消息 → 統一新摘要,防止累積失控。」
17 · Ch3.4
Ch 03 · PAGE 04
Encapsulation · 三大機制統一封裝

完整 SessionManager:把三大機制串起來

存儲、截斷、壓縮三個機制最終封裝進一個完整的 SessionManager 類,這是短期記憶層的核心,所有會話操作都通過它完成。四個核心方法各司其職,並內建 v1→v2 向後兼容自動遷移邏輯。

EVIDENCE · 四方法環形圖

核心方法

load(session_id)
加載會話 + 兼容遷移
add_message(...)
觸發壓縮(達到閾值時)
get_messages_for_llm()
摘要 + 最近 N 條
save(session)
刷新時間戳 + 持久化
INTERPRET · 25 輪演示

三機制觸發時機

  • 第 1-19 輪:messages[] 正常增長
  • 第 20 輪:觸發壓縮,早期消息濃縮為摘要
  • 第 21-25 輪:繼續正常追加
  • 關閉重啟後重新加載 → 摘要和消息都完好保留

證明整套機制的持久化可靠性

ACTION · 升級路徑

v1 → v2 向後兼容

  • v1:純 list 格式(舊版)
  • v2dict 結構(新版)
  • 加載時自動判斷版本並遷移
  • 保證升級時歷史數據不丟失
  • 這是生產級記憶系統的必備素質
CH 03 · P04
「三大機制統一封裝,向上提供單一 API,屏蔽實現複雜度。」
18 · Ch3.5
Ch 03 · PAGE 05
Framework Comparison · OpenAI SDK vs LangChain

從原始 API 到 LangChain:與 mini-OpenClaw 源碼對齊

前三節使用 openai SDK 直接調用,幫助理解每一步。mini-OpenClaw 源碼實際用 langchain-deepseekChatDeepSeek。關鍵實驗揭示:InMemorySaver 的兩大局限證明自建 SessionManager 的必要性。

EVIDENCE · 六維度對比

OpenAI SDK vs ChatDeepSeek

維度OpenAI SDKLangChain
調用方式原生封裝
流式輸出支援支援
工具綁定手寫生態齊全
Checkpointer內建
生態集成單點完整
持久化多後端
INTERPRET · 實驗結論

InMemorySaver 兩大局限

實驗create_agent() 不傳 checkpointer → Agent 沒有自動記憶。

  • 每次調用完全獨立無狀態
  • 和最初的「失憶 Agent」本質相同
  • 傳入 checkpointer=InMemorySaver() + thread_id → 記住上下文

但 InMemorySaver 有兩個致命局限

  • 內存存儲 → 進程重啟後數據丟失
  • 無壓縮機制 → 對話越長狀態越大
ACTION · mini-OpenClaw 的選擇

不用 InMemorySaver 的理由

  • JSON 文件實現持久化(勝過內存)
  • 截斷控制成本(勝過無腦堆積)
  • LLM 壓縮保留關鍵信息(勝過無摘要)
  • 結論langchain-deepseek + 自建 SessionManager 取代 InMemorySaver
CH 03 · P05
「框架不是答案,框架提供的 Checkpoint 機制才是答案的起點。」
CHAPTER FOUR
Ch 04 / 10
Chapter Four · 長期記憶
04

長期記憶架構:四種存儲類型與選型邏輯

選擇什麼存儲類型,決定了後續寫入邏輯和檢索邏輯的一切。四種存儲對應四種哲學。

CH 04 · 長期架構
「存儲選錯,後續的寫入邏輯和檢索邏輯都會跟著跑偏。」
20 · Ch4.1
Ch 04 · PAGE 01
Vector Store · 語義相似度檢索

向量資料庫:語義相似度檢索的核心機制

向量資料庫解決的問題:當用戶說「上次我提到的那個 Python 項目」時,Agent 怎麼在幾百條歷史記憶中找到相關片段——即便措辭和原始記憶完全不同。關鍵洞察:向量距離近代表語義相近而非字面相近。

EVIDENCE · 三步工作機制

Embedding + 索引 + 檢索

1. 文本轉向量
text-embedding-3-small (1536 維)
2. 存入索引
向量空間座標點
3. 檢索
餘弦相似度 / L2 距離
Top-K 最近記憶
INTERPRET · 核心洞察

語義 ≠ 字面

「想吃東西」和「有點餓了」在向量空間中距離很近,傳統關鍵詞搜索找不到,向量檢索能找到。

  • LlamaIndexVectorStoreIndex + SentenceSplitter + OpenAIEmbedding
  • LLM 調用走 LangChain,文檔語義檢索走 LlamaIndex ——兩套框架各司其職
  • 致命陷阱:忘記 index.storage_context.persist() 持久化 → 重啟後索引全丟
ACTION · mini-OpenClaw 實踐

向量庫落地清單

  • 選定 Embedding 模型(推薦 text-embedding-3-small
  • 選向量庫(FAISS / Chroma / Pinecone)
  • 設定分塊參數(chunk_size=256, chunk_overlap=32
  • 必須調用 persist()
  • 建立重建索引的腳本以備故障恢復
CH 04 · P01
「語義相近 ≠ 字面相近,這是向量檢索的根本優勢。」
21 · Ch4.2
Ch 04 · PAGE 02
Storage Spectrum · 三種非向量存儲

KV 存儲 / 圖資料庫 / 關係型資料庫

三種非向量存儲各擅勝場。mini-OpenClaw 採用 KV(文件系統輕量實現)作為短期會話的精確存取介質;自然語言文本用 RDB 的 LIKE '%偏好%' 做檢索是典型的工具誤用。

EVIDENCE · KV 存儲

精確 Key → Value

  • 給每條數據一個唯一鍵,O(1) 精確取回
  • 不做語義推斷,只做精確匹配
  • mini-OpenClawsessions/ 目錄本質上就是文件系統級 KV
  • 選文件系統而非 Redis 的核心原因:透明可查
  • 典型工具:Redis / JSON 文件 / RocksDB
INTERPRET · 圖資料庫

多跳關係推理

  • 數據模型:節點 + 邊 + 屬性
  • 典型場景:「小明的導師的研究方向是什麼」需跨越多個節點查詢
  • 典型實現:Neo4j
  • mini-OpenClaw 不採用:對話記憶以「事實陳述」為主,關係相對扁平
  • 引入圖資料庫會帶來額外運維成本而收益微乎其微
ACTION · RDB 邊界

結構化數據的精確查詢

  • 優勢:精確查詢、聚合統計、多表 JOIN
  • 適合:行為日誌、費用帳單等明確 Schema 場景
  • 典型誤用:把自然語言塞進 RDB 用 LIKE '%偏好%'
  • 檢索質量極差、性能急劇下降
  • 結論:RDB 不適合作為長期記憶主存儲
CH 04 · P02
「每種存儲都有自己的適配場景,強行跨界必出 bug。」
22 · Ch4.3
Ch 04 · PAGE 03
Decision Tree · 四種存儲選型

四種存儲類型選型指南

把四種存儲類型放在一張表裡對比,能快速做出工程選型決策。大多數對話 Agent 只需向量庫 + KV 存儲的組合,這也是 mini-OpenClaw 的選擇。

EVIDENCE · 四行對比總表

存儲 × 檢索 × 工具

類型檢索方式
向量語義相似度
KV精確 Key
圖 DB圖遍歷路徑
RDBSQL 精確/聚合

典型工具:FAISS/Chroma/Pinecone · Redis/JSON · Neo4j · PostgreSQL/SQLite

INTERPRET · 決策菱形

快速判斷流程

  • 💎 自然語言 + 語義相關 → 向量資料庫
  • 💎 已知標識符精確取回 → KV 存儲
  • 💎 複雜多跳路徑 → 圖資料庫
  • 💎 結構化數據聚合 → 關係型資料庫

關鍵原則組合而非單選。大多數對話 Agent 只需向量 + KV。

ACTION · mini-OpenClaw 的選擇

向量 + KV 組合

  • KV 存儲sessions/{id}.json(短期會話精確存取)
  • 向量庫MEMORY.md 索引(長期語義檢索)
  • 兩者互補覆蓋對話 Agent 記憶系統的絕大多數需求
  • 不引入圖 / RDB → 保持簡單
CH 04 · P03
「組合而非單選:大多數對話 Agent 只需向量庫 + KV。」
23 · Ch4.4
Ch 04 · PAGE 04
Engineering Principle · 選型 = 一切起點

長期記憶存儲選型的實務啟示

回顧四種存儲類型的選型邏輯,可以提煉出一條核心工程原則:存儲類型選錯,後續的寫入邏輯和檢索邏輯都會跟著跑偏,就像把圖書館的書隨機堆在倉庫裡,查閱效率必然是災難級別的。

EVIDENCE · mini-OpenClaw 選型

文件系統 + 向量庫組合

  • 文件系統(KV 輕量實現):sessions/{id}.json
  • 向量資料庫:底層用內存向量索引
  • LlamaIndexSentenceSplitter + VectorStoreIndex 實現文檔分塊和語義檢索
  • 兩個組件用戶可獨立調優
INTERPRET · 工程邏輯

為什麼這個組合

  • 短期會話用 KV 精確存取 → 速度快、透明可查
  • 長期知識用向量語義檢索 → 能理解「意思」而非「字面」
  • 兩者互補覆蓋對話 Agent 記憶系統的絕大多數需求
  • 選擇背後有清晰的工程邏輯,不是「跟著別人用」
ACTION · 為後續章節奠基

理解「存在哪裡」是前提

  • 下一章節探討「寫入時機」—— 建立何時把短期記憶升級到長期的判斷邏輯
  • 再下一節探討「檢索模式切換」—— Direct 注入 vs RAG 注入的閾值切換
  • 所有這些設計都建立在「存儲已選對」的前提上
CH 04 · P04
「理解了『存在哪裡』,才能合理設計『怎麼存進去、怎麼取出來』。」
CHAPTER FIVE
Ch 05 / 10
Chapter Five · 寫入與檢索
05

長期記憶的寫入與檢索機制

解決了「存在哪裡」之後,下一個問題是「何時寫入」、「如何高效讀取」、「如何避免記憶退化」。四個機制構成自適應長期記憶系統。

CH 05 · 寫入檢索
「記憶系統不是『記住的東西』,而是『該記什麼、該忘什麼』的決策系統。」
25 · Ch5.1
Ch 05 · PAGE 01
Write Trigger · 何時該寫入長期

寫入機制:Agent 何時該寫入長期記憶

寫入觸發是長期記憶系統最關鍵的設計決策之一:寫入太頻繁,記憶庫充滿噪音;寫入太保守,有價值的信息被遺漏。mini-OpenClaw 採用「LLM 主動判斷」策略,判斷標準是事實性、穩定性、跨會話復用性。

EVIDENCE · 三項判斷標準

事實性 × 穩定性 × 復用性

  • 事實性:是否是關於用戶/項目的客觀事實
  • 穩定性:是否跨時間仍然成立
  • 復用性:是否在未來對話中可能用到

值得寫入:用戶叫小明,是 Python 開發者

不寫入:用戶剛問了 for 循環語法

INTERPRET · 常見錯誤

寫入過多的危害

把所有對話都寫入長期記憶 → 100 條對話裡通常只有 5-10 條真正值得長期保留。

  • 噪音條目把有價值條目「壓下去」
  • 向量檢索準確率反而下降
  • Token 成本飆升
  • 正確原則:寧可漏記,不要濫記
ACTION · 判斷函數

低溫度 + JSON 結構

  • 判斷函數用 temperature=0.1 調用 LLM
  • 嚴格以 JSON 格式回覆:
    {"worth_memorizing": true/false, "memory_text": "..."}
  • 降低隨機性 + 便於程序解析
  • 這是 LLM 作為裁判而非工人的典型用法
CH 05 · P01
「寧可漏記,不要濫記。」
26 · Ch5.2
Ch 05 · PAGE 02
Direct Injection · 全文讀取

Direct 注入:全文讀取的簡單模式

最簡單的方式是 Direct 注入:每次對話開始時把 MEMORY.md 全文讀出,直接拼接到 System Prompt 頭部。這種模式實現極簡單、信息完整無遺漏,是 mini-OpenClaw 的默認模式,唯一限制是體積——當 MEMORY.md 超過約 2000 tokens 時需切換到 RAG。

EVIDENCE · MD5 快取

變化檢測避免重讀

計算當前 MD5 → 比對快取 MD5
├─ 相同 → 直接返回快取
└─ 不同 → 重讀磁盤 + 更新快取

性能開銷接近零。寫入後必須主動使快取失效(將 md5 置空)。

INTERPRET · 體積閾值

2000 tokens 的分水嶺

  • MEMORY.md 約 1500 中文字
  • Token 成本開始顯著上升
  • 觸碰上下文窗口限制的風險
  • 必須切換到 RAG 注入

閾值判斷函數 should_use_rag() 估算當前記憶內容的 Token 數。

ACTION · 落地清單

Direct 注入必做項

  • 每次對話開始時讀取 MEMORY.md
  • 用 MD5 快取避免重複讀磁盤
  • 寫入後必須使快取失效
  • 調用 should_use_rag() 判斷是否切換
  • 超閾值 → 自動切換到 RAG 注入
CH 05 · P02
「簡單不廉價:MD5 快取是工程紀律的體現。」
27 · Ch5.3
Ch 05 · PAGE 03
RAG Injection · 語義檢索精準注入

RAG 注入:語義檢索後精準注入

MEMORY.md 體積超過閾值,Direct 注入成本變得不可接受。RAG(Retrieval-Augmented Generation)注入解決的正是這個問題:不再全量讀取,而是根據當前用戶輸入語義檢索最相關的 Top-K 條記憶注入。

EVIDENCE · 兩階段流程

索引階段 + 檢索階段

索引階段(內容變化時觸發)
文件 → 分塊 → 向量化 → VectorStoreIndex
檢索階段(每次對話開始)
query → 向量化 → 相似度匹配 → Top-K → 注入
INTERPRET · 分塊設計

chunk_size=256, chunk_overlap=32

  • chunk_size=256:每塊 256 tokens,平衡精度與檢索效率
  • chunk_overlap=32防止一條記憶被從中間切斷
  • 例:「用戶正在開發一個基於 LangChain 的...」被截斷成兩塊都失去完整語義
  • MEMORY.md 按每行一條記憶的格式天然適合按行分塊
ACTION · 框架一致性

LlamaIndex 全棧

  • 整個 RAG 流程與向量資料庫章節共用同一套 LlamaIndex 技術棧
  • 體現了框架選型的一致性
  • 不引入第二套向量庫 → 維護成本下降
  • Top-K 預設值:3-5 條,依檢索精度調優
CH 05 · P03
「chunk_overlap 不是性能優化,是語義完整性保障。」
28 · Ch5.4
Ch 05 · PAGE 04
Sleep-time Agent · 離線記憶重組

sleep-time agent:解決實時寫入無法處理的記憶質量問題

實時寫入追求速度,沒時間做全局掃描。隨時間累積會出現新的質量問題:同一事實被多次寫入、早期記憶已過時、部分記憶措辭混亂需要整理。sleep-time agent 在對話間隙的空閒期異步運行整理任務。

EVIDENCE · 整理規則

四條硬約束

  • 去重:去除重複信息,合併相似條目
  • 刪除過時:刪除過時或矛盾信息(保留更新更具體的)
  • 精煉:每條精煉為一句話
  • 限數:最多保留 20 條最重要記憶
INTERPRET · 為什麼需要異步

實時寫入的盲區

  • 實時寫入追求速度,沒時間做全局掃描
  • 同一事實被多次寫入(每次對話都重複)
  • 早期記憶已過時(用戶當時在做 A 項目現在已換成 B 項目)
  • 部分記憶措辭混亂需要整理
  • 這些問題無法在實時寫入階段解決
ACTION · 安全第一

寫回前先備份

  • sleep-time 整理是有損操作
  • LLM 可能判斷失誤把重要記憶誤判為重複而刪除
  • 寫回前先備份 .bak 文件
  • 結果不滿意可手動恢復
  • mini-OpenClaw 採用「手動調用為主」策略,不做全自動調度
CH 05 · P04
「有損操作必須有備份,這是生產級系統的容錯鐵律。」
29 · Ch5.5
Ch 05 · PAGE 05
Summary · 四環節齒輪咬合

寫入與檢索機制小結:自適應長期記憶系統

四個機制不是相互獨立的,它們共同構成一個自適應的長期記憶系統。把長期記憶的生命週期拆解為「寫入判斷 → 存儲選型 → 讀取策略 → 質量維護」四個環節,每個環節都有獨立可測試、可調優的機制。

EVIDENCE · 四環節齒輪

生命週期拆解

1. 寫入判斷
事實性 / 穩定性 / 復用性
2. 存儲選型
向量庫 + KV 組合
3. 讀取策略
Direct vs RAG 切換
4. 質量維護
sleep-time 整理
INTERPRET · 模組化的價值

問題可定位、可調優

當你發現 Agent「記錯了」或「忘記了」,可以精確定位是哪個環節出了問題:

  • 記錯了 → 寫入判斷過於寬鬆
  • 該記沒記 → 寫入判斷過於保守
  • 檢索不到 → 檢索閾值設置不當
  • 記憶退化 → 缺少定期整理
ACTION · 下一章節

MemoryManager 串聯

這也為下一章節把短期記憶與長期記憶真正串聯成完整的 MemoryManager 打下了模組化基礎。

  • 短期記憶:SessionManager(Ch 3)
  • 長期記憶:四環節協同(Ch 5)
  • 下一章節:MemoryManager 統籌兩者
CH 05 · P05
「記憶系統不是『記住的東西』,而是『該記什麼、該忘什麼』的決策系統。」
CHAPTER SIX
Ch 06 / 10
Chapter Six · 認知建立 / 自研實作
06

短長期記憶協同 · MemoryManager 完整架構

把短期 SessionManager 與長期四環節串聯為單一抽象層。三原則、三階段主鏈路、去重升級與四個擴展方向。

4 頁E · I · A 三欄介面設計紀律
CH 06 · 短長期協同
「短期的 SessionManager 與長期的四環節,最終需要統一的抽象層。」
31 · Ch6.1
Ch 06 · PAGE 01
Design Principles · 介面設計紀律

Memory Manager 設計三原則:單一入口、對 LLM 透明、可降級

把短期記憶與長期記憶兩個獨立模組串聯成有機整體,需要解決三個問題:調用方只和 MemoryManager 交互、最終輸出對 LLM 透明、底層異常不讓 Agent 崩潰。這三條原則決定了介面設計,而介面一旦確定,實現細節反而不重要。

EVIDENCE · 三條設計原則

介面契約的三條紀律

原則約束
單一入口Agent 主循環只調 MemoryManager,不直接操作 SessionManager 或 MEMORY.md
對 LLM 透明最終輸出是 messages 列表,LLM 不感知背後的記憶管理邏輯
可降級MEMORY.md 不存在、索引構建失敗、網絡超時——任何異常都不讓 Agent 崩潰
INTERPRET · 為何是三條

每一條對應一個失敗模式

  • 單一入口 對應「分散耦合」:避免每次升級都要改 10 個調用點
  • 對 LLM 透明 對應「上下文污染」:防止 LLM 把摘要當用戶說過的話
  • 可降級 對應「單點失敗」:防止一個組件故障拖垮整個對話

關鍵洞察:介面設計是工程紀律,介面一旦確定,實現細節反而不重要——這是良好架構設計的通用智慧。

ACTION · 第一步落地

三張並列卡片設計

  • 設計 MemoryManager 類時嚴格遵守三條原則
  • 每次新增方法前問一句:會不會破壞其中任何一條?
  • 錯誤處理統一走 try/except 包裹寫入邏輯
  • 最終輸出始終是 (messages, metadata) 元組,內部如何構造由 MemoryManager 決定
CH 06 · P01
「介面設計是工程紀律的核心——它決定了團隊擴展和升級的成本。」
32 · Ch6.2
Ch 06 · PAGE 02
Main Chain · 三階段主鏈路

load → get_messages_for_llm → update:完整的請求處理鏈路

MemoryManager 把三個公開方法串成完整的請求處理鏈路。load 加載短期與長期記憶;get_messages_for_llm 按固定順序組裝 LangChain Message 列表;update 追加本輪對話並觸發壓縮與長期寫入。三階段的調用順序不能亂。

EVIDENCE · 三階段方法簽名

公開 API 的最小集

# 階段一:加載
def load(session_id, user_query):
  # 內部透過 _load_long_term() 自適應切換 Direct/RAG
  return (session, long_term_context)

# 階段二:組裝
def get_messages_for_llm(session, lt, sys_base):
  # System Prompt → 壓縮摘要 → 最近 N 條歷史
  return [SystemMessage, ..., HumanMessage, ...]

# 階段三:更新
def update(session_id, session, user_input, asst_resp):
  # 追加、判斷壓縮、判斷長期寫入(try/except)
  # save_session()

INTERPRET · 組裝順序的玄機

為什麼 System 必須排第一

  • LLM 對 System Prompt 開頭注意力最強:長期記憶、全域指令必須放在最前
  • 壓縮摘要在第二層:避免 LLM 把它當作用戶的新訊息,必須以獨立 system 角色注入
  • 最近 N 條歷史在最後:維持對話流暢性的關鍵
  • 任何順序錯亂都會破壞「對 LLM 透明」原則
ACTION · 可降級落地

_is_worth_memorizing 包裹在 try/except 中

  • 寫入邏輯一旦異常,僅記錄 warning,不中斷主流程
  • SessionManager.save_session() 失敗時退回到內存備份
  • LlamaIndex 索引構建失敗時自動降級為全文注入
  • 可降級設計原則在代碼層的具體落地:每一個外部調用都必須能失敗而不拖垮主鏈路
CH 06 · P02
「三階段的調用順序不能亂——順序本身就是可降級設計的語言。」
33 · Ch6.3
Ch 06 · PAGE 03
Deduplication Upgrade · 中文語義去重

去重保護:從關鍵詞交集到 LLM 語義去重的工程升級

_safe_append_memory 在寫入前先做去重檢查,新記憶與已有條目的關鍵詞重疊超過 60% 視為重複。但這個方案在中文場景下完全失效——中文無空格分詞,導致去重機制形同虛設。把判斷邏輯交還給 LLM 的語義理解能力,才能真正解決問題。

EVIDENCE · 為什麼關鍵詞交集失效

中文無空格分詞的天花板

句子對關鍵詞交集
你好 Python0(兩個 token)
你好 Python0(兩個 token)
結論:關鍵詞交集永遠 = 0,去重永遠失效
INTERPRET · LLM 同時回答兩個問題

ImprovedMemoryManager 的升級版

  • 把「已有記憶」一併傳給 LLM,讓模型在同一次調用中同時回答:
  • Q1:這段對話是否包含值得記憶的新信息?
  • Q2:該信息是否已在現有記憶中有語義相同的記錄?
  • 只有「值得記 + 尚未記」時才返回 worth=True
  • 這預告了 mem0 的 LLM 裁判機制設計思路
ACTION · 設計原則

規則失效時交給 LLM

  • 規則式字符匹配在處理自然語言的語義等價性時往往力不從心
  • 把判斷邏輯交還給 LLM 的語義理解能力
  • 接受 LLM 裁判的非確定性,換取語義理解的高保真
  • 這條原則在第八章 mem0 的 ADD/UPDATE/DELETE/NONE 四路決策裡會被推到極致
CH 06 · P03
「規則失效時交給 LLM——接受非確定性,換取語義高保真。」
34 · Ch6.4
Ch 06 · PAGE 04
E2E Validation · 端到端 + 四個擴展

端到端驗證與四個擴展方向:從功能完備到企業級準備

場景一在同一 session 驗證短期記憶、場景二換到新 session 驗證長期記憶跨會話能力。至此雙層記憶系統功能完備,但工程實踐永遠沒有終點,課程提出四個延伸方向。

EVIDENCE · 兩個測試場景

Day1 / Day2 跨會話驗證

Day1 · Session A
用戶:「我在做 ML 項目」
觸發長期記憶寫入
MEMORY.md 追加
Day2 · Session B
「我繼續做項目」→ 認出用戶

場景一 + 場景二 共同驗證了雙層記憶系統的端到端正確性

INTERPRET · 四個擴展方向

從功能完備到企業級準備

  • 框架級 Checkpoint:接入 LangGraph InMemorySaver,支援多線程並發與時間點回溯
  • 多用戶命名空間:每個用戶擁有獨立的長期記憶文件
  • 記憶權限控制:通過 tags 字段實現不同 Agent 只能看到特定類別的記憶
  • Git 版本管理:MEMORY.md 納入 Git,每次寫入自動 commit
ACTION · 通往 mem0 的橋樑

多用戶隔離與權限的預告

  • 「多用戶隔離」與「權限控制」概念,會在 mem0 章節以更成熟的 user_id / agent_id / run_id 三維命名空間形式重新出現
  • Git 版本管理在企業級會演進為審計日誌 + RPO/RTO 策略
  • 現在的代碼結構要為這些演進留好抽象介面
  • 第六章結束了第一階段(自研),第八章開啟第二階段(生產升級)
CH 06 · P04
「雙層記憶系統功能完備,但工程實踐永遠沒有終點。」
CHAPTER SEVEN
Ch 07 / 10
Chapter Seven · 真實工程對照
07

mini-OpenClaw 源碼解析:從課程代碼到真實項目

課程代碼是教學簡化版,真實工程在文件組織、System Prompt 組裝、請求生命週期三個維度更精細。本章回答「課程中設計的記憶機制,在真實系統中是被怎麼對待的?」

2 頁Source Reality Check六層組裝 + 五步鏈路
CH 07 · 真實工程對照
「從『會設計』到『能看懂真實項目』的認知閉環。」
36 · Ch7.1
Ch 07 · PAGE 01
File Skeleton · 三目錄組織

項目文件骨架與 System Prompt 六層組裝

真實工程在文件組織上更精細:graph/ 存放核心邏輯、sessions/ 存放短期記憶、workspace/ + memory/ 存放長期記憶。prompt_builder.py 的 build_system_prompt() 方法把 System Prompt 拆分為 6 個組件按固定順序拼接,每組件有 MAX_COMPONENT_LENGTH = 20000 字符上限。

EVIDENCE · 三目錄組織

真實項目的文件結構

目錄核心文件
graph/session_manager / memory_indexer / prompt_builder / agent
sessions/短期記憶 JSON + archive/ 歸檔
workspace/ + memory/SOUL / IDENTITY / USER / AGENTS 永久人格層
INTERPRET · 六層組裝的順序玄機

為什麼技能快照排最前

  • LLM 對開頭注意力最強,技能快照必須排第一位
  • 順序:技能快照 → Agent 人格 → Agent 身份 → 用戶畫像 → 操作協議 → 長期記憶
  • Direct 模式:長期記憶全文注入;RAG 模式:跳過,改用檢索結果
  • 20000 字符上限:即使最後一層被截斷,前五層已保證 Agent 基本行為正確
ACTION · 永久人格層

workspace/ + memory/ 的設計

  • SOUL.md / IDENTITY.md / USER.md / AGENTS.md 四個文件構成「永久人格層」
  • 每次請求全文注入,不受 RAG 模式影響
  • 這是 Persona + Memory 雙軌 設計——人格穩定、記憶可演化
  • 與課程簡化版相比,永久人格層是企業級部署的關鍵補充
CH 07 · P01
「六層組裝的順序就是 LLM 注意力分配的順序——技能快照排第一。」
37 · Ch7.2
Ch 07 · PAGE 02
Request Lifecycle · 五步鏈路

一條請求的完整生命週期與課程映射總表

把所有組件串起來,一條用戶請求的完整處理鏈路:load → build_system_prompt → ReAct 循環 → write_file_tool 主動寫入 → save_session 持久化。這條鏈路與課程第六章 MemoryManager 的三階段設計高度對應。

EVIDENCE · 五步處理鏈路

一條用戶請求的完整路徑

  1. 1. session_manager.load_session_for_agent() 讀取 JSON 文件
  2. 2. prompt_builder.build_system_prompt() 六層拼接
  3. 3. [SystemMessage]+history+[HumanMessage] → ReAct 循環
  4. 4. Agent 主動調用 write_file_tool 向 MEMORY.md 追加
  5. 5. session_manager.save_session() 持久化本輪對話
INTERPRET · 與課程的對應關係

第六章 MemoryManager 三階段映射

課程第六章真實工程
load(session_id, query)load_session_for_agent()
get_messages_for_llm()build_system_prompt() + 構造歷史
update()write_file_tool + save_session()

多了 Skills 掃描 + 六層 System Prompt 組裝 兩個額外環節

ACTION · 認知閉環完成

從「會設計」到「能看懂真實項目」

  • 短期記憶以 JSON 文件持久化
  • 長期記憶以 Markdown 文件存在,LLM 通過工具調用主動寫入
  • 每次請求通過六層組裝注入給 LLM
  • 理解了這張映射表,學員已具備讀懂任何真實開源 Agent 項目的能力
  • 第八章起開始用 mem0 等中間件進入生產升級
CH 07 · P02
「短期持久化 + 長期工具寫入 + 六層組裝 = 真實工程的最小骨架。」
CHAPTER EIGHT
Ch 08 / 10
Chapter Eight · 生產級躍遷
08

mem0 核心架構 · LLM 裁判機制取代手工規則

mini-OpenClaw 在教學場景表現出色,推向真實生產會依次撞上三個天花板。mem0 用 LLM 做記憶的裁判,自動決定什麼值得記住、什麼需要更新、什麼應該遺忘,而不是用硬編碼規則管理記憶。

4 頁LLM-as-Judge三維命名空間
CH 08 · LLM 裁判
「從『手工規則』到『LLM 裁判』是記憶系統的代際跨越。」
39 · Ch8.1
Ch 08 · PAGE 01
Three Ceilings · 規模 / 質量 / 生態

為什麼需要從自研走向開源:三個天花板

mini-OpenClaw 在教學場景表現出色,推向真實生產——多用戶、高並發、長期運行——會依次撞上規模天花板、質量天花板、生態天花板。mem0 正是為了突破這三重天花板而生。

EVIDENCE · 三重天花板

從下往上的撞頂順序

規模天花板
多用戶並發 / 索引膨脹
質量天花板
實時衝突解決 / 去重
生態天花板
從零設計 LLM Judge
INTERPRET · 每個天花板的真相

為什麼自研撐不住生產

  • 規模天花板:單一 MEMORY.md 在用戶數千 / 條目上千時全文注入擠占窗口,多用戶共享同一文件缺乏隔離機制
  • 質量天花板:去重和整理是「離線批處理」而非「實時衝突解決」,互相矛盾的條目會共存
  • 生態天花板:LLM Judge 邏輯、存儲後端適配、框架集成、多租戶隔離都要從零設計
ACTION · mem0 的承諾

LLM-as-Judge 的代際跨越

  • 用 LLM 做記憶的「裁判」
  • 自動決定:什麼值得記住、什麼需要更新、什麼應該遺忘
  • 而不是用硬編碼規則管理記憶
  • mem0ai==1.0.9 + 雙 API Key(DeepSeek + OpenAI Embedding)
  • 2025 年被 AWS Agent SDK 選為官方唯一記憶提供商
CH 08 · P01
「自研撐不住生產——天花板不是 bug,是結構性限制。」
40 · Ch8.2
Ch 08 · PAGE 02
Replacement Boundary · 替代邊界

mem0 對 mini-OpenClaw 的替代邊界:保留什麼、改造什麼

理解 mem0 之前必須先明確:mem0 替代的是哪些組件、哪些必須保留。短期記憶保留不動、長期記憶整體替代、System Prompt 第六層改造、前五層保留、Memory Write Guide 移除。錯誤地刪除 session_manager.py 會導致 Agent 在同一次會話內「失憶」。

EVIDENCE · 五行替代邊界表

保留 / 改造 / 替代的精確邊界

組件動作理由
session_manager.py保留不動mem0 不管理短期記憶
MEMORY.md + indexer整體替代存儲和檢索均由 mem0 接管
prompt 第 6 層改造從讀文件改為接收 memory.search()
prompt 前 5 層保留不動與記憶無關的組件不受影響
Memory Write Guide移除mem0 自動管理寫入
INTERPRET · 互補而非替代

為什麼不能全替換

  • mem0 是長期記憶解決方案
  • 短期記憶層(SessionManager)必須完整保留
  • 兩者是互補關係,不是替代關係
  • 錯誤地刪除 session_manager.py 會導致 Agent 在同一次會話內「失憶」
  • 這條邊界貫穿了進階課程所有章節的討論核心
ACTION · 遷移紀律

保留抽象層 / 替換內部實現

  • 保留 MemoryManager 抽象(第六章設計的三原則)
  • 內部將長期記憶的讀寫從 MEMORY.md / indexer 改為 mem0 API
  • 短期記憶層(load / save / compress)完全不動
  • 這正是「先理解原理,再掌握工具」的具體落地
CH 08 · P02
「保留抽象層、替換內部實現——這是軟體工程的不變定律。」
41 · Ch8.3
Ch 08 · PAGE 03
LLM-as-Judge · 兩階段裁判

LLM 裁判機制:mem0 最核心的創新(提取 + 更新)

mem0 由 Taranjeet Singh 和 Deshraj Yadav 於 2023 年創立(前身 Embedchain),2025 年發表 arXiv:2504.19413,GitHub Stars 超 51.4K。核心創新是 LLM 裁判機制:提取階段過濾閒聊噪音、更新階段選擇 ADD/UPDATE/DELETE/NONE 四種操作。

EVIDENCE · 兩階段流水線

提取 + 更新

提取階段
最新一輪對話 + 滾動摘要
+ 最近 m 條消息
更新階段
檢索 top-s 條相似記憶
選擇 4 路操作之一

每次 memory.add() 觸發 1-2 次 LLM 調用,延遲約 500-2000ms

INTERPRET · 四路操作的設計哲學

實時進化 vs 批處理

操作語義觸發場景
ADD新增全新信息
UPDATE合併更新細微差異值得精煉
DELETE刪除舊記憶語義衝突
NONE無操作完全冗餘

與批處理式整理不同,mem0 的記憶是實時進化

ACTION · 可審計性

history() API 的工程價值

  • 所有操作記錄在 SQLite history
  • 可通過 memory.history() 追蹤變更軌跡
  • 這給企業級審計日誌提供原生支援
  • 相比手工整理,mem0 把「為什麼刪除」「為什麼更新」變成可追溯的事實
CH 08 · P03
「實時進化的記憶系統——每次寫入都是衝突解決的機會。」
42 · Ch8.4
Ch 08 · PAGE 04
Namespace & Storage · 三維隔離

三維命名空間與向量存儲後端:用戶 / Agent / 會話

mem0 通過 user_id / agent_id / run_id 三個命名空間參數實現邏輯隔離——物理上共享同一個向量資料庫實例,這是需要特別澄清的常見誤區。向量存儲後端支援 12 種,默認 Qdrant 數據存於 /tmp/qdrant,容器重啟會被清空。

EVIDENCE · 三維命名空間

user_id / agent_id / run_id

維度生命週期典型用途
user_id永久(可手動刪除)用戶個人偏好
agent_id與 Agent 生命週期綁定不同 Agent 的專業知識域
run_id會話結束可歸檔單次對話的臨時上下文

三維任意組合,提供從粗粒度到細粒度的靈活隔離

INTERPRET · 常見誤區澄清

物理共享 vs 邏輯隔離

  • 三個 ID 物理上共享同一個向量資料庫實例
  • 透過元數據過濾實現邏輯隔離
  • 比物理隔離成本低,比完全無隔離安全
  • 企業級部署需要評估:物理隔離 vs 邏輯隔離的合規邊界
ACTION · 12 種向量後端

從零配置到全托管

類別工具
零配置本地Qdrant(默認)/ FAISS
自托管服務Chroma / Weaviate / Milvus
全托管雲Pinecone / Zilliz Cloud
圖資料庫(可選)Neo4j / Memgraph

生產陷阱:默認 Qdrant 存於 /tmp/qdrant,重啟後數據丟失——必須配置持久化路徑。

CH 08 · P04
「物理共享、邏輯隔離——命名空間是企業級多租戶的最小代價方案。」
CHAPTER NINE
Ch 09 / 10
Chapter Nine · 選型評估與生產集成
09

mem0 選型評估 · 量化對比 + 局限應對 + 集成實戰

面對實際項目選型,需要清楚 mem0 在整個記憶框架生態中的位置。五框架橫向對比、已知局限與工程應對、LangChain Tool / AsyncMemory / 雙檢索三種集成模式、mini-OpenClaw 遷移 Before / After。

5 頁Decision Framework量化 + 局限 + 實戰
CH 09 · 選型與集成
「中間件的價值不在功能豐富,在工程紀律的標準化。」
44 · Ch9.1
Ch 09 · PAGE 01
Selection Matrix · 六維對比

五框架橫向選型對比與優勢量化

mem0(51.4K Stars)、Letta/MemGPT(21K)、Zep/Graphiti(24K)、Cognee(12K)、LangChain Checkpointer(會話狀態)。選型決策路徑:需要多用戶個性化+快速接入選 mem0;需要 OS 式內存管理選 Letta;需要時序推理選 Zep。

EVIDENCE · 五框架對比

記憶框架生態圖

框架Stars定位
mem051.4K個性化記憶層
Letta/MemGPT21KOS 式內存管理
Zep/Graphiti24K時序知識圖譜
Cognee12K深度知識圖譜
LangChain Checkpointer會話狀態管理
INTERPRET · mem0 的四個量化指標

在 LOCOMO benchmark 上的優勢

  • LOCOMO 得分:mem0 67.13% vs OpenAI Memory 52.9% → 提升 +26%
  • p95 搜索延遲0.200 秒,比全量上下文方案低 91%
  • 每輪 token:mem0 1,764 vs 全量 26,031 → 節省 93%
  • 接入成本:pip install + 3 行初始化,零向量 DB 配置
ACTION · 選型決策樹

從需求到框架的路徑

  • 多用戶個性化對話記憶 + 快速接入 → mem0
  • Agent 自主管理內存 + 透明調試 → Letta/MemGPT
  • 強時序推理 + 時態實體追蹤 → Zep/Graphiti
  • 深度知識推理 → Cognee
  • 僅短期對話狀態 → LangChain Checkpointer + 外部長期記憶
CH 09 · P01
「選型不是『哪個最好』,是『哪個最匹配你團隊的工程成熟度』。」
45 · Ch9.2
Ch 09 · PAGE 02
Known Limitations · 六局限應對

mem0 已知局限與工程應對:誠實評估才能避免生產踩坑

客觀評估框架不僅要看優勢,更要看局限。add() 額外延遲、隱式連接弱、依賴 LLM 質量、圖模式需額外基礎設施、成本非零、開源版無原生 TTL——六局限都有對應的工程應對策略。

EVIDENCE · 六局限速查

問題 / 應對 兩行網格

局限工程應對
add() 延遲 500-2000msasyncio.create_task() 異步化
隱式連接弱深度跨輪場景結合全量上下文
依賴 LLM 質量選 DeepSeek / gpt-4o-mini
圖模式需 Neo4j僅在時序推理需求明確時啟用
成本非零輕量模型提取 + 批次寫入
無原生 TTL定時清理任務或雲平台版
INTERPRET · 延遲是最大的隱形成本

為什麼 500-2000ms 是必須解決的問題

  • 同步等待 add() 意味著用戶每次對話多等 1-2 秒
  • 這在實時對話場景中不可接受
  • 解決方案:用 asyncio.create_task() 放入後台任務
  • FastAPI 的事件循環可在等待 mem0 時同時處理其他用戶
  • 並發壓測驗證了約 2 倍加速比
ACTION · 圖模式的代價

沒有時序推理需求就不啟用

  • p95 延遲:向量模式 0.2s vs 圖模式 2.6s
  • Token 成本:圖模式翻倍
  • 基礎設施:需額外部署 Neo4j / Memgraph
  • 觸發條件:「說不出具體時序推理場景就不啟用」
  • 這條原則比「先啟用以後再說」更省成本
CH 09 · P02
「誠實評估局限比誇大優勢更重要——局限有對策,盲點沒有。」
46 · Ch9.3
Ch 09 · PAGE 03
Integration Patterns · 三模式並列

生產集成三模式:LangChain Tool、AsyncMemory、雙檢索注入

第一種模式用 @tool 裝飾器封裝為 Agent 工具;第二種模式用 asyncio.create_task() 不阻塞事件循環;第三種模式用 asyncio.gather() 並行執行 mem0 與 RAG——三種模式工程價值遞增。

EVIDENCE · 三模式技術棧

從簡單到工程價值最高

模式關鍵技術典型場景
LangChain Tool@tool + create_agent()PoC / 單 Agent
AsyncMemoryasyncio.create_task()Web 服務不阻塞
雙檢索注入asyncio.gather()個 性 化 + 準 確 性 並 行
INTERPRET · 雙檢索注入的工程價值

mem0 + RAG 的並行奧義

  • mem0 回答:「這個用戶是誰、喜歡什麼」(個性化
  • RAG 回答:「這個問題的專業知識是什麼」(準確性
  • asyncio.gather() 並行執行,總耗時 = 較慢那個,而非兩者之和
  • 這正是 prompt_builder.py 同步拼接邏輯的異步升級版
ACTION · 模式選擇矩陣

從場景到模式

  • PoC 階段:LangChain Tool 模式,3 行初始化即可跑通
  • Web 上線:AsyncMemory 模式,避免 500-2000ms 同步等待
  • 生產深水區:雙檢索注入,個性化與準確性同時保障
  • mini-OpenClaw 底層就是 LangChain Tool 模式,遷移時保留這個抽象
CH 09 · P03
「asyncio.gather() 的並行奧義——總耗時 = max,不是 sum。」
47 · Ch9.4
Ch 09 · PAGE 04
Migration Real · Before / After

mini-OpenClaw 遷移實戰:Before / After 數據流對比

遷移前的數據流:MEMORY.md 模式需 LLM 主動標注容易遺漏;遷移後:memory.add() 對話後自動提取無需配合。變化只發生在兩個箭頭上——讀的來源和寫的去向,整體請求處理流程的結構完全不變。

EVIDENCE · Before / After 兩處變化

數據流紅色箭頭對比

階段BeforeAfter
讀的來源MEMORY.md / indexer.retrieve()memory.search()
寫的去向write_file 寫 MEMORY.mdmemory.add() 入庫

整體請求處理流程的結構完全不變

INTERPRET · 變化為何可控

兩個箭頭替換 ≠ 重新設計

  • 變化只發生在讀寫兩個箭頭上
  • 不需要重新設計數據流
  • 只需要替換兩個介面
  • 遷移風險是可控的,這是介面設計紀律的紅利
ACTION · 四維度量化對比

從手工到自動的四個維度

維度MEMORY.md 模式mem0 模式
寫入方式LLM 主動標注易遺漏 20-30%對話後自動提取無需配合
衝突解決離線批處理 / 事後整理寫入時實時 UPDATE / 事中解決
檢索質量全文注入有噪聲條目級語義檢索精煉
可審計性打開文件直接閱讀history() API 程序友好
CH 09 · P04
「遷移風險可控的祕密:介面設計紀律在前,內部實現替換在後。」
48 · Ch9.5
Ch 09 · PAGE 05
Three-Round Test · 衝突實測

衝突更新實測:ADD → DELETE+ADD → NONE/UPDATE 三輪實驗

第一輪「喜歡辣」觸發 ADD;第二輪「不能吃辣」執行 DELETE 舊的辣食偏好 + ADD 新的清淡偏好;第三輪「腸胃不好不能吃辣的」實際觸發 UPDATE 而非 NONE——LLM 裁判捕捉到「去掉最近」「了變的」的細微差異,視為有意義的精煉。

EVIDENCE · 三輪操作結果

每輪的 LLM 裁判決策

R1: 喜歡辣的食物
→ ADD 全新信息
R2: 不能吃辣了
→ DELETE + ADD 衝突解決
R3: 腸胃不好不能吃辣的
→ UPDATE 細微精煉
INTERPRET · 為什麼 UPDATE 而非 NONE

LLM 裁判的非確定性

  • R2 寫入:「最近腸胃不好,不能吃辣
  • R3 輸入:「腸胃不好,不能吃辣
  • 差異 1:去掉「最近」(臨時 → 長期體質)
  • 差異 2:「了」變「的」(語氣變化)
  • LLM 裁判視為有意義的信息精煉,選擇 UPDATE
  • NONE 僅在完全冗餘、零增量時才會觸發
ACTION · 工程啟示

不要依賴 LLM 做精確去重

  • 不要假設「差不多的話」就能觸發 NONE
  • 若業務依賴精確去重行為,建議在 mem0 上層增加基於規則的預過濾
  • 例如:編輯距離閾值、關鍵詞重疊率、向量相似度閾值
  • 而非完全依賴 LLM 裁判的非確定性判斷
  • 這是 LLM-as-Judge 的誠實邊界
CH 09 · P05
「LLM-as-Judge 的誠實邊界——精確去重請用規則,語義去重交給 LLM。」
CHAPTER TEN
Ch 10 / 10
Chapter Ten · 生產部署 + 課程總結
10

生產部署避坑指南 · 從自研到生產的最終一公里

生產部署六要點 + Claude Code 五大記憶質量模式 + 三層升級路徑 + 四個進階方向。把前面九章的所有機制收束為可執行的工程紀律清單。

3 頁Production Pitfalls五模式 + 三升級 + 四方向
CH 10 · 生產部署 + 總結
「企業級記憶不是技術問題,是治理問題。」
50 · Ch10.1
Ch 10 · PAGE 01
Pitfalls Checklist · 六要點

生產部署六要點 + Claude Code 五大記憶質量模式

生產部署六要點速查清單:add() 異步化、/tmp 持久化、LLM 質量選型、圖模式條件啟用、成本控制、TTL 管理。在此基礎上借鑒 Claude Code 源碼驗證過的五個記憶質量模式,全部用 mem0 已有的 metadata/filters 機制落地。

EVIDENCE · 六要點 Checklist

生產部署前必查

要點
1add() 用 asyncio.create_task() 異步化
2/tmp/qdrant → 持久化路徑
3LLM 選 deepseek-chat / gpt-4o-mini
4圖模式僅在時序推理明確時啟用
5成本控制:條件觸發 + 批次寫入
6TTL:開源版需手動清理任務
INTERPRET · Claude Code 五模式

業界最佳實踐的工程化落地

  • 模式一 · 分類標籤:preference / decision / context / reference
  • 模式二 · Why 元數據:附帶為什麼保存、如何應用
  • 模式三 · 防禦性讀取:「N 天前」自然語言新鮮度
  • 模式四 · Dream 整合:get_all() + LLM 檢測矛盾
  • 模式五 · 智能節流:5 次 add() 可降為 1 次,成本直降 80%
ACTION · 五模式的三階段覆蓋

寫入 → 檢索 → 維護 齒輪咬合

  • 寫入階段:模式一(標籤)+ 模式二(Why)+ 模式五(節流)
  • 檢索階段:模式一(按標籤過濾)+ 模式三(新鮮度)
  • 維護階段:模式四(Dream 整合)
  • 全部用 mem0 已有機制落地,不需要更換框架
  • 這是「第三層升級」的核心價值
CH 10 · P01
「六要點是底線,五模式是上限——兩者結合是企業級的標準配置。」
51 · Ch10.2
Ch 10 · PAGE 02
Three Layers · 升級路徑

完整概念映射回顧:從自研到生產的三層升級路徑

第一層升級:離線批處理 → 實時衝突解決;第二層升級:文件手動維護 → 框架自動管理;第三層升級:不需要更換框架,只需善用 mem0 已有的 metadata 機制。理解這張映射表,才能在選型時準確理解每個 API 背後在做什麼。

EVIDENCE · 三層升級階梯

手動 → 自動化 → 自動化 + 結構化

L1: 手動管理
MEMORY.md + LLM 判斷寫入
L2: 自動化
mem0 LLM 裁判 / search()
L3: 自動化 + 結構化 + 防禦性
融合方案(標籤/Why/防禦性讀取)
INTERPRET · 每層的本質差異

從離線批處理到實時衝突解決

  • L1 → L2(寫入機制):「LLM 判斷寫入 + 離線 sleep-time 整理」 → 「LLM 裁判兩階段提取,ADD/UPDATE/DELETE/NONE」
  • L2 → L3(記憶注入):「MEMORY.md 文件全文注入 / LlamaIndex 向量索引」 → 「memory.search() 自動管理」
  • L3 → L3+(質量治理):分類標籤、Why 元數據、防禦性讀取
ACTION · 教學哲學的最終驗證

先理解原理,再掌握工具

  • mem0 沒有發明全新的概念
  • 而是把前七章手動實現的每個機制升級為自動化、框架化、可維護的生產級實現
  • 理解了自研原理,使用 mem0 時就能準確理解每個 API 背後在做什麼
  • 這正是「先理解原理,再掌握工具」教學哲學的最終驗證
CH 10 · P02
「mem0 沒有發明新概念——它把我們手寫的機制升級為生產級。」
52 · Ch10.3
Ch 10 · PAGE 03
Summary · 學習旅程 + 四方向

課程總結:從無狀態 LLM 到企業級記憶治理

回顧整個學習旅程:課程開始時面對無狀態 LLM;完成短期記憶章節後擁有跨進程持久化、自動壓縮的短期記憶層;完成雙層記憶系統後擁有完整自研記憶系統;完成 mem0 章節後掌握了 LLM 裁判驅動的實時記憶演化。四個進階方向等著繼續探索。

EVIDENCE · 成長曲線

五個里程碑

無狀態 LLM
每次調用都失憶
短期記憶
跨進程持久化
雙層記憶系統
自研完整
生產級 mem0
LLM 裁判驅動
質量治理
五模式 + 三升級
INTERPRET · 四個進階方向

從記憶系統到記憶生態

  • 自定義記憶 Schema:電商用戶畫像、醫療健康檔案等結構化字段設計
  • MCP 集成:讓 mem0 作為 MCP Server 為任何支持 MCP 的 AI 應用提供記憶服務
  • 多 Agent 共享記憶:通過 agent_id 共享知識域,user_id 共享偏好
  • 記憶可解釋性:基於 history() API 構建面向終端用戶的「記憶管理面板」
ACTION · 學員能力閉環

完整可驗證的成長路徑

  • 理解記憶系統的第一性原理
  • 讀懂真實開源工程的源碼實現
  • 掌握生產級中間件的選型與部署
  • 這是一條完整且可驗證的成長路徑
  • 下週交付的決策:PoC 用 mini-OpenClaw,企業部署用 mem0,中間用第六章的抽象層做遷移
CH 10 · P03
「從記憶系統到記憶治理——下週交付的不是技術,是工程承諾。」
53 · CLOSING
Chapter 053 / END
下週要交付什麼決策 · 5 個動詞開頭的提案

如果你是平台 VP,下週要交付什麼記憶系統決策?

VER · 01
建立認知
記憶是工程責任,不是模型內建能力。把這條共識寫進團隊 RFC,任何記憶系統 PR 必須引用此條。
VER · 02
選擇路線
根據場景在五種記憶框架中選型(文件系統 / mem0 / Letta / Zep / LangChain Checkpointer)。PoC 用 mini-OpenClaw,企業部署用 mem0。
VER · 03
工程實作
短期三大機制 + 長期四存儲 + 寫入檢索四環節 + MemoryManager 三階段。每一環都有獨立可測試、可調優的介面。
VER · 04
持續優化
定期 sleep-time 整理 + Claude Code 五模式(標籤/Why/防禦性/Dream/節流)。LLM-as-Judge 邊界處補規則預過濾。
VER · 05
升級生產
保留 SessionManager 抽象,內部將長期記憶替換為 mem0 API。落地六要點(異步化/持久化/LLM 選型/圖模式條件啟用/成本/TTL)。
END · VP Decision Deck · No. 053
「下週要交付的不是記憶系統,是對記憶系統的工程承諾——10 章、53 頁、從原理到治理的完整閉環。」
← / → · space · R reset