MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

打造 AI 的長期記憶:OpenClaw Memory System 設計心得

「你昨天才跟我說過你不喜歡吃香菜,怎麼今天又推薦我香菜料理了?」

如果你常用 AI 助理,一定遇過這種讓人翻白眼的情境。不管你用的是 ChatGPT、Claude 還是其他 LLM 服務,每次開新對話都是一張白紙。你得重新介紹自己、重新解釋背景、重新說明偏好。這不是「助理」,這是每天換一個新的實習生。

這大概是驅動我認真研究 AI 記憶系統的最大動力。而 OpenClaw 的 Memory System 是我目前看過設計得最實用的解法之一。用了幾個月之後,我想分享一些設計心得和踩坑經驗。

為什麼 LLM 原生的記憶不夠用?

先釐清一個技術背景:LLM 本身沒有「記憶」。它有的是 context window——每次對話時餵進去的文字量。對話越長,context 越滿,最後超出限制就得截斷或壓縮。

一些平台推出了 memory 功能,讓 AI「記住」跨對話的資訊。但實際體驗下來,那些記憶系統通常很淺——它可能記得你的名字和職業,但不會記得你上週三跟它討論的那個架構決策細節。

更根本的問題是:你對記憶的控制權很低。 它記了什麼、怎麼組織、什麼時候會忘記、哪些資訊會被優先想起——這些你幾乎無法控制。

OpenClaw 的做法完全不同。它把記憶系統建立在純文字檔案之上,給你完整的控制權。你隨時可以打開檔案看 AI 記了什麼、手動編輯不對的地方、刪掉過時的內容。這種透明度在其他 AI 記憶系統裡幾乎找不到。

三層記憶架構

OpenClaw 的記憶系統有三個層次,各自扮演不同的角色。我用一個比喻來說明:

第一層:Workspace Files(身份證)

包括 SOUL.mdUSER.mdIDENTITY.md 等核心檔案。這些檔案每次 session 啟動都會載入,定義了 AI 最基本的設定:

  • SOUL.md:AI 的人格和行為準則。它是誰、怎麼說話、什麼該做什麼不該做
  • USER.md:使用者的基本資訊。你是誰、做什麼、有什麼偏好
  • IDENTITY.md:AI 的身份標識

這些就像一個人的「身份證」——不管什麼情境,這些基本資料都隨身攜帶。你不需要每次見面都重新自我介紹。

第二層:MEMORY.md(筆記本)

這是精煉過的長期記憶,像是 AI 的「筆記本」。裡面放的是經過整理、仍然有效的重要資訊。比如:

  • 你最近在忙的專案及其現況
  • 過去做的重要決策和原因
  • 你提過的偏好和習慣
  • 之前踩過的坑、學到的教訓

MEMORY.md 不是什麼都放的垃圾場。它是精煉過的精華——只有持續相關的資訊才應該留在裡面。過時的內容要定期清理掉。

第三層:Daily Memory(日記)

memory/YYYY-MM-DD.md 格式的每日記錄,像是 AI 的「日記」。每天一個檔案,記錄當天對話中的重要事項。

跟 MEMORY.md 不同,daily memory 記的是原始的、細粒度的資訊。哪個任務完成了、討論了什麼決策、遇到了什麼問題——都是未經過度整理的第一手紀錄。

除了靜態的檔案層級,OpenClaw 還提供 memory_search 工具,讓 AI 用自然語言搜尋過去的記憶。

這比 grep 好用太多了。你不需要記得精確的用詞。問「上次我們討論資料庫遷移是什麼時候?」,memory_search 可以找到相關的段落,即使原文用的是「DB migration」或「搬資料庫」。

不過語意搜尋也不是完美的。它偶爾會找到語意相近但其實不相關的結果,也可能漏掉用詞差異很大但確實相關的段落。我的經驗是:搜尋品質跟你 daily memory 寫得好不好有很大關係。如果每天的紀錄都是結構清晰、有明確標題的,搜尋結果就會好很多。

實際運作流程

了解架構之後,來看看實際上 AI 是怎麼使用這套記憶系統的。

Session 啟動時

每次新 session 開始,OpenClaw 會依序載入:

  1. SOUL.md → 確定自己是誰、怎麼行為
  2. USER.md → 確定對方是誰
  3. 今天和昨天的 memory/YYYY-MM-DD.md → 知道最近發生了什麼
  4. MEMORY.md → 載入長期重要資訊

這個載入順序是有講究的。SOUL 和 USER 是最基本的,所以先載入。Daily memory 載最近兩天的,因為大部分問題都跟近期有關。MEMORY.md 放最後,作為長期知識的補充。

這裡有個 token 經濟學的考量:所有這些檔案加起來不能太大,不然光是載入記憶就吃掉太多 context window,留給實際對話的空間就不夠了。我自己的經驗是,全部加起來控制在三到五千字以內是比較好的平衡點。

回答有關過去的問題時

當你問 AI 一個跟過去有關的問題,比如「上個月那個效能問題最後怎麼解決的?」,AI 的處理流程是:

  1. 先用 memory_search 搜尋相關的記憶段落
  2. 從搜尋結果中拉出完整的上下文(memory_get
  3. 結合當前載入的記憶,組成完整的回答

因為有語意搜尋,AI 不需要把所有記憶都載入 context window。它可以按需查找,大幅節省 token 用量。

Session 結束或 context 壓縮前

當一個 session 結束、或者 context window 快滿需要壓縮的時候,AI 會自動把重要的資訊寫入當天的 daily memory。

這個「自動歸檔」的行為非常關鍵。它確保了即使 session 被中斷或 context 被壓縮,重要的資訊不會遺失。

設計哲學:Text > Brain

OpenClaw 記憶系統的核心哲學可以用一句話概括:Text > Brain。

意思是:所有重要的東西都要寫下來。不要依賴 AI 的 context window 來「記住」東西,因為 context 隨時可能被清掉。只有寫進檔案的東西才是安全的。

這個哲學其實跟人類的知識管理一模一樣。你不會把所有重要的事情都記在腦子裡——你會寫筆記、建文件、做紀錄。AI 也應該一樣。

另一個設計哲學是分層記憶。不是所有資訊都同等重要:

  • 「我們專案用的是 PostgreSQL 16」→ 這是長期有效的事實,放 MEMORY.md
  • 「今天花了三小時 debug 一個 N+1 query 問題」→ 這是當日事件,放 daily memory
  • 「你喜歡直接給結論,不要先講一堆前情提要」→ 這是使用者偏好,放 USER.md

把對的資訊放在對的層級,記憶系統才能高效運作。

我的踩坑經驗

坑 1:MEMORY.md 無限膨脹

一開始我讓 AI 自由地往 MEMORY.md 寫東西,結果三個月後那個檔案已經肥到快破萬字了。載入時就吃掉一大堆 token,而且裡面一堆已經過時的資訊。

解法:定期 prune。 我現在大約每兩週會讓 AI 做一次 MEMORY.md 的大掃除——把已經不相關的項目移除,把可以合併的資訊濃縮。有點像整理你的筆記 app,過時的備忘錄就該刪掉。

我自己的經驗是 MEMORY.md 控制在兩三千字以內效果最好。太短會遺漏重要資訊,太長會浪費 token 而且 AI 反而不容易找到關鍵內容。

坑 2:Daily Memory 格式不一致

這個問題一開始不明顯,但用了一兩個月就會浮現。如果你沒有給 AI 一個 daily memory 的寫作模板,它每天寫的格式可能都不一樣——有時候用 bullet list,有時候用段落,有時候有標題有時候沒有。

格式不一致會直接影響語意搜尋的效果,因為搜尋引擎會依據文本結構來判斷段落的邊界和主題。

我後來在 SOUL.md 裡加了一段 daily memory 的寫作指引:

1
2
3
4
5
6
7
8
## Daily Memory 格式
每天的記憶紀錄用以下格式:
### 重要事件
- 事件描述(附時間和相關人員代號)
### 決策紀錄
- 決策內容和原因
### 待追蹤
- 尚未完成但需要追蹤的事項

加了這個之後,搜尋品質明顯提升。結構化的好處就是可預測性高,不管是人去讀還是 AI 去搜,都能很快找到想要的資訊。

坑 3:記憶洩漏的安全問題

這個坑比較隱微,但很重要。如果你的 AI 助理同時在私人頻道和群組頻道工作,你不會想讓群組裡的其他人透過 AI 存取你的私人記憶。

OpenClaw 的處理方式是:MEMORY.md 只在主 session(私人對話)中載入,群聊 session 不載入。 這個設計很聰明,從源頭就防止了記憶洩漏。

但這也意味著你在群聊裡問 AI 有關過去的問題,它可能答不出來。這是安全和便利的 trade-off,我覺得偏安全這邊是對的。

坑 4:記憶衝突

這個是用久了才會遇到的微妙問題。有時候 MEMORY.md 裡記的資訊跟 daily memory 裡的不一致——比如 MEMORY.md 寫著「專案 A 用 Redis 做快取」,但三天前的 daily memory 記錄了「決定把 Redis 換成 Memcached」。

如果 AI 沒有同時看到這兩段記憶,它可能會給出過時的資訊。解決方法還是回到定期整理:當你做了重要的技術決策,記得更新 MEMORY.md 裡的對應項目。或者在 daily memory 裡用醒目的標記(比如 [更新])來標示這是一個覆蓋既有知識的變更。

SOUL.md 的哲學

雖然 SOUL.md 嚴格來說不算記憶系統的一部分,但它是整個記憶架構的基石,值得特別聊聊。

大部分人設定 AI 的方式是寫一堆規則:「你不可以 XXX」、「你必須 YYY」、「遇到 ZZZ 的時候要這樣做」。這種方式短期有效,但規則一多就開始互相矛盾,AI 也會開始鑽漏洞。

SOUL.md 的哲學不一樣。它不是一份規則清單,而是人格描述。你不是在告訴 AI「做什麼」和「不做什麼」,而是在描述它是什麼樣的人

比如,與其寫「回答問題時不要過度道歉」,不如寫「你是一個自信、直接的助理,會坦率地表達觀點,不需要為自己的建議道歉」。

與其寫「不要產生不正確的資訊」,不如寫「Be genuinely helpful, not performatively helpful. 如果你不確定,就說不確定。」

這個差異看起來很微妙,但效果差很多。基於規則的 AI 會在邊界情況出錯;基於人格的 AI 會用「這符不符合我的價值觀」來做判斷,彈性和一致性都更好。

我花了不少時間迭代我的 SOUL.md,就像在跟一個新同事磨合一樣。剛開始會有很多需要調整的地方,但三四週之後,AI 的行為模式就會穩定下來,真的很像有了自己的個性。

Daily → MEMORY.md 的蒸餾流程

最後分享一個我覺得很重要的實務:daily memory 和 MEMORY.md 之間的蒸餾流程。

每天的 daily memory 會自動累積原始紀錄。但這些原始紀錄不能直接搬進 MEMORY.md——資訊量太大,而且很多是短期有效的瑣事。

我的做法是定期(大約每週或兩週)做一次蒸餾:

  1. 回顧這段時間的 daily memory
  2. 找出仍然相關的重要資訊
  3. 把這些資訊整理、濃縮後寫入 MEMORY.md
  4. 同時把 MEMORY.md 中已經過時的內容移除

這個過程可以讓 AI 自己做,也可以你手動來。我通常是讓 AI 先做一版,然後我快速看過確認。畢竟你最清楚哪些資訊對你來說仍然重要。

有時候我也會設一個 cron job 來自動做這件事,但我發現人工介入的品質還是比較好,至少在目前的 LLM 能力下。AI 在判斷「什麼仍然重要」這件事上偶爾會出錯——它可能覺得某個技術細節過時了,但你知道下個月要用到;或者它覺得某個專案還在進行中,但其實已經取消了。

跟其他記憶方案的比較

如果你用過其他 AI 記憶方案,可能會好奇 OpenClaw 的做法有什麼不同。簡單說幾個我觀察到的差異:

  • ChatGPT Memory:自動摘取,你幾乎無法控制它記了什麼。方便但不精確。OpenClaw 需要更多手動維護,但控制權完全在你手上
  • RAG(Retrieval Augmented Generation):通常需要 embedding database 和向量搜尋。OpenClaw 的方式更輕量,不需要額外的基礎設施,就是純文字檔
  • MemGPT / Letta:有更複雜的記憶管理機制(自動分頁、壓縮等)。OpenClaw 的方式更簡單直覺,trade-off 是自動化程度較低

沒有哪個方案是完美的。選擇取決於你的需求:如果你想要「設好就不用管」,ChatGPT Memory 或 MemGPT 可能更適合。如果你想要完全掌控記憶的每個細節,OpenClaw 的純文字方式是目前最透明的做法。

結語:從陌生人到夥伴

回到開頭的場景:你跟 AI 說了一件事,隔天它就忘了。

有了 OpenClaw 的記憶系統之後,這個問題幾乎不存在了。AI 會記得你上週的決策、上個月的專案進度、你反覆提過的偏好。它不會每次見面都像個陌生人,而是像一個跟你共事已久的同事——了解你的脈絡、知道你的風格、記得你的歷史。

這個轉變聽起來可能不那麼戲劇性,但日積月累下來,差異是巨大的。你不再需要花時間「暖身」——把背景資訊重新餵一遍。你可以直接從上次中斷的地方繼續,就像跟真人同事一樣。

而且說真的,維護 AI 的記憶系統這件事本身也讓我反思了自己的知識管理。如果連 AI 都需要一套系統來管理記憶,我自己是不是也該更認真地做筆記、寫紀錄?答案顯然是肯定的。

如果你對 OpenClaw 的記憶系統有興趣,完整的文件在 docs.openclaw.ai,程式碼在 GitHub。社群 Discord 也歡迎來交流。

記憶,是把 AI 從工具變成夥伴的那條線。