Workspace Memory v2(離線):研究筆記
目標:Clawd 風格的工作區(agents.defaults.workspace,預設 ~/.openclaw/workspace),其中「記憶」以每日一個 Markdown 檔案(memory/YYYY-MM-DD.md)儲存,並搭配一小組穩定檔案(例如 memory.md、SOUL.md)。
本文件提出一種離線優先(offline-first)的記憶架構,以 Markdown 作為可審閱的正典事實來源,同時透過衍生索引加入結構化檢索(搜尋、實體摘要、信心度更新)。
為什麼要改變?
目前的設定(每天一個檔案)非常適合:- 「只追加」的日誌記錄
- human editing
- 以 git 為後盾的耐久性 + 可稽核性
- 低摩擦的捕捉方式(「就寫下來」)
- 高回憶率的檢索(「我們對 X 做了什麼決定?」、「上次嘗試 Y 是什麼時候?」)
- 以實體為中心的回答(「告訴我 Alice/The Castle/warelay」),而不必重讀許多檔案
- 意見/偏好的一致性(以及其變更時的證據)
- 時間限制(「2025 年 11 月期間什麼是真的?」)與衝突解決 and conflict resolution and conflict resolution
設計目標
- 離線:無需網路即可運作;可在筆電/Castle 上執行;無雲端相依。
- 可解釋:檢索到的項目應可追溯(檔案 + 位置),並可與推論分離。
- 低儀式感:每日記錄維持 Markdown,不需繁重的結構化結構。
- 漸進式:v1 僅用 FTS 即有價值;語意/向量與圖結構為選用升級。
- Agent-friendly: makes “recall within token budgets” easy (return small bundles of facts).
北極星模型(Hindsight × Letta)
融合兩個部分:- Letta/MemGPT 風格的控制迴圈
- 維持一個小型「核心」永遠在上下文中(角色 + 關鍵使用者事實)
- everything else is out-of-context and retrieved via tools
- 記憶寫入為明確的工具呼叫(追加/取代/插入),持久化後於下一回合重新注入
- Hindsight 風格的記憶基底
- separate what’s observed vs what’s believed vs what’s summarized
- 支援保留/回憶/反思
- confidence-bearing opinions that can evolve with evidence
- entity-aware retrieval + temporal queries (even without full knowledge graphs)
提議的架構(Markdown 作為事實來源 + 衍生索引)
正典儲存(git 友善)
保留~/.openclaw/workspace 作為權威的人類可讀記憶。
Suggested workspace layout:
- Daily log stays daily log. No need to turn it into JSON.
bank/檔案是 精選的,由反思工作產生,且仍可手動編輯。memory.md維持「小而核心」:你希望 Clawd 每個工作階段都能看到的內容。
衍生儲存(機器回憶)
在工作區下新增一個衍生索引(不一定納入 git 追蹤):- 用於事實 + 實體連結 + 意見中繼資料的 SQLite schema
- 用於詞彙回憶的 SQLite FTS5(快速、輕量、離線)
- 選用的語意回憶嵌入表(仍然離線)
保留/回憶/反思(操作迴圈)
保留:將每日記錄正規化為「事實」
Hindsight 在此最重要的洞見:儲存 敘事性、可自足的事實,而不是微小片段。 對於memory/YYYY-MM-DD.md 的實務規則:
- 在一天結束時(或期間),新增一個
## Retain區段,包含 2–5 個條列,需具備:- narrative (cross-turn context preserved)
- self-contained (standalone makes sense later)
- 以類型 + 實體提及進行標記
- 類型前綴:
W(世界)、B(經驗/生平)、O(意見)、S(觀察/摘要;通常自動產生) - 實體:
@Peter、@warelay等(slug 對應至bank/entities/*.md) - 意見信心:
O(c=0.0..1.0)(選用)
## Retain 區段是最容易提升品質的「槓桿」。
回憶:對衍生索引進行查詢
回憶應支援:- 詞彙:「尋找精確詞彙/名稱/指令」(FTS5)
- 實體:「告訴我 X」(實體頁 + 與實體連結的事實)
- 時間:「11 月 27 日左右發生了什麼」/「自上週以來」
- 意見:「Peter 偏好什麼?」(附信心 + 證據) (with confidence + evidence) (with confidence + evidence)
kind(world|experience|opinion|observation)timestamp(來源日期,或若存在則為擷取的時間範圍)entities(["Peter","warelay"])content(敘事性事實)source(memory/2025-11-27.md#L12等)
反思:產生穩定頁面 + 更新信念
反思是排程工作(每日或心跳ultrathink),其內容包括:
- 從近期事實更新
bank/entities/*.md(實體摘要) - 根據強化/矛盾更新
bank/opinions.md的信心 - 視需要提議編輯
memory.md(「偏核心」的耐久事實)
- 每個意見包含:
- 陳述
- 信心
c ∈ [0,1] - last_updated
- 證據連結(支持 + 矛盾的事實 ID)
- 當新事實到來時:
- 以實體重疊 + 相似度找出候選意見(先用 FTS,之後再用嵌入)
- 以小幅度更新信心;大幅跳動需要強烈矛盾 + 重複證據
CLI 整合:獨立 vs 深度整合
建議:深度整合於 OpenClaw,但保留可分離的核心函式庫。為什麼要整合進 OpenClaw?
- OpenClaw 已經知道:
- 工作區路徑(
agents.defaults.workspace) - 工作階段模型 + 心跳
- 記錄 + 疑難排解模式
- 工作區路徑(
- 你會希望代理程式本身呼叫工具:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
Why still split a library?
- 讓記憶邏輯在沒有 Gateway 閘道器/執行環境下也可測試
- 可在其他情境重用(本地腳本、未來桌面應用等)
「S-Collide」/SuCo:何時使用(研究)
如果「S-Collide」指的是 SuCo(Subspace Collision):這是一種 ANN 檢索方法,透過在子空間中使用學習/結構化的碰撞,來達成良好的回憶率/延遲取捨(論文:arXiv 2411.14754,2024)。 對於~/.openclaw/workspace 的務實看法:
- 不要一開始就用 SuCo。
- 從 SQLite FTS +(選用)簡單嵌入開始;你會立刻獲得大多數 UX 收益。
- 只有在以下情況才考慮 SuCo/HNSW/ScaNN 類解法:
- corpus is big (tens/hundreds of thousands of chunks)
- 暴力的嵌入搜尋變得太慢
- 回憶品質確實被詞彙搜尋明顯限制
- SQLite FTS5 + 中繼資料過濾(零 ML)
- Embeddings + brute force (works surprisingly far if chunk count is low)
- HNSW 索引(常見、穩健;需要函式庫綁定)
- SuCo(研究等級;若有可嵌入的成熟實作則具吸引力)
- 在你的機器(筆電 + 桌機)上,用於「個人助理記憶」的 最佳 離線嵌入模型是什麼?
- 如果你已經有 Ollama:用本地模型做嵌入;否則在工具鏈中隨附一個小型嵌入模型。
Smallest useful pilot
如果你想要一個最小、但仍然有用的版本:- 新增
bank/實體頁,以及每日記錄中的## Retain區段。 - 使用 SQLite FTS 進行可引用來源的回憶(路徑 + 行號)。
- Add embeddings only if recall quality or scale demands it.
參考資料
- Letta/MemGPT 概念:「核心記憶區塊」+「封存記憶」+ 由工具驅動的自我編輯記憶。
- Hindsight 技術報告:「保留/回憶/反思」、四網路記憶、敘事性事實擷取、意見信心演進。
- SuCo:arXiv 2411.14754(2024):「Subspace Collision」近似最近鄰檢索。