為什麼 OpenClaw 總是忘記你(為什麼這不是一個錯誤)
遺忘體驗是 OpenClaw 記憶體系統設計的直接結果: memory lives as plain Markdown files on disk,不在資料庫中,不在 RAM 中,不在模型內部。文件是真相的來源。
當這些檔案在壓縮過程中遺失、配置錯誤或無提示地被覆蓋時,代理程式會遺失上下文 - 並且它無法告訴您發生了什麼事。
修復不是你翻轉的設定。它對三層架構有足夠的了解,可以對去哪裡做出深思熟慮的決定。
完整的 OpenClaw 記憶體架構(3 層解釋)
OpenClaw 記憶體跨三個不同的層運行,每個層都有不同的持久性特徵和故障模式。
完整的記憶體生命週期:
Write → Embed/Index → Search → Compact → Recover
↓ ↓ ↓ ↓ ↓
.md file sqlite-vec semantic summary MEMORY.md
created indexes it query replaces re-read at
on save returns context session start
chunks window
該鏈中的每個階段都可能獨立失敗。大多數遺忘問題都可以追溯到一個破碎的階段。
第 1 層 — 活動上下文視窗
這是模型的工作記憶:目前載入到活動對話情境視窗中的所有內容。它包括您的系統提示、對話歷史記錄以及搜尋工具檢索到的任何記憶體區塊。
裡面裝的是什麼:
- 系統提示符號(通常很大)
- 檢索記憶摘錄
- 工具呼叫歷史記錄
- 話鋒一轉
溢出時會發生什麼事: 當上下文視窗接近其令牌限制時,OpenClaw 會觸發壓縮 - 它將現有上下文匯總為壓縮表示並繼續。對話中內聯的指令(而不是固定在持久記憶體檔案中)在此摘要期間經常被刪除。
實際限制:假設在系統提示和記憶體開銷之後,您有大約 60-70% 的模型廣告上下文視窗可用於實際對話。
第 2 層 — 每日筆記(滾動兩天視窗)
每日筆記是以 YYYY-MM-DD 格式命名的僅附加 Markdown 文件,儲存在 memory/ 目錄中。 OpenClaw 載入 今天和昨天的 在每個會話開始時自動產生文件。
- 有關今天工作、做出的決定和活動任務的事實附加在此處
- 它們不應該被編輯——將它們視為日誌
- 兩天后,它們超出了自動加載窗口,只能通過語義搜索進行搜索
關鍵問題: OpenClaw 不會為您建立 memory/ 目錄。如果該目錄不存在,則每日筆記將被靜默刪除,不會引發任何錯誤,並且代理會忘記會話之間的所有內容。這個單一的遺漏導致了大多數「為什麼它總是忘記我」的報道。
第 3 層 — 持久記憶體(MEMORY.md 和 memory-wiki)
跨會話應保留的長期事實(您的姓名、專案情境、編碼偏好、架構決策)屬於 MEMORY.md 或結構化 memory-wiki 外掛程式庫。
記憶體.md
自由格式的 Markdown 文件。代理在會話開始時讀取它。在這裡寫下您總是想要加載的事實。簡單,零配置。
記憶維基
一個結構化插件,具有頁面層級組織、聲明和證據追蹤、矛盾檢測和新鮮度元資料。最適合擁有龐大且不斷發展的知識庫的生產代理商。
壓縮問題-為什麼你的指令在任務中消失
壓縮是 OpenClaw 中記錄最多的故障模式。大多數文章都涉及會話後遺忘。幾乎沒有地址 長時間運作的自主工作流程中的中期任務壓縮 — 當代理執行多步驟任務時,壓縮會在 12 步驟中的第 7 步靜默觸發,而第 1 步驟中的行為指令消失。
壓縮的作用是什麼:
- 檢測上下文視窗接近容量
- 將目前對話總結為壓縮區塊
- 用摘要取代原始上下文
- 繼續執行
The problem: summaries optimize for facts and task state, not behavioral instructions. A system instruction like "always write tests before implementation" or "never overwrite files without confirmation" can survive the first compaction cycle and be gone by the second.
當它觸發時: 預設 memory-core 插件中沒有可設定的閾值。它根據令牌計數而不是任務階段觸發。在 2 小時的自主運作中,您預計會有 3-5 個壓實週期。
如何建構抗壓縮檔案架構
將行為指令固定在 MEMORY.md 中,而不是對話中。 任何必須在多個壓縮週期中生存的內容都需要保存在持久性檔案中,該檔案在每次壓縮後都會重新讀取。
建議的固定模式:
## Agent Behavioral Rules (always active) - Never overwrite files without showing a diff first - Write tests before implementation (TDD mode: on) - Use TypeScript strict mode in all new files ## Project Context - Stack: Node.js 22, Fastify, PostgreSQL 16 - Repo root: /home/user/project - Active sprint goal: migrate auth to Clerk
壓縮後的命名約定:
- 使用
## [PINNED]為關鍵部分添加前綴 - 摘要器將大寫標頭視為高優先級 - 盡可能將每個固定事實保留在一行中 - 總結密集的段落,單行事實往往會逐字保留
- 在
MEMORY.md和今天的每日筆記中重複 3-5 個最關鍵的行為規則 - 冗餘是你的壓縮對沖
10 分鐘內從零到記憶體設定(完整檔案支架)
這是其他地方不存在的設定指南。複製這個結構,填寫你的上下文,然後你就可以運作了。
目錄樹:
memory/
├── MEMORY.md
├── 2026-04-27.md ← today's daily note (create manually)
└── wiki/ ← only if using memory-wiki plugin
├── index.md
├── project-context.md
└── decisions.md
啟動器MEMORY.md:
# Persistent Memory ## Identity & Preferences - Name: [your name] - Role: [your role] - Preferred response style: concise, no preamble ## Project: [Project Name] - Stack: [your stack] - Key constraints: [e.g., no external APIs, TypeScript only] - Current focus: [active task or sprint goal] ## Behavioral Rules - [Rule 1] - [Rule 2] ## Decisions Made - [YYYY-MM-DD] Decided to use X because Y
入門每日筆記 (2026-04-27.md):
# 2026-04-27 ## Session Goals - [ ] Task 1 - [ ] Task 2 ## Notes
插件槽配置(2026語法):
{
"plugins": {
"slots": {
"memory": "memory-core"
}
}
}
要完全禁用記憶體:
{
"plugins": {
"slots": {
"memory": false
}
}
}
驗證步驟:
- 執行一次會話並要求客服人員回憶您在上一次會話中告訴過的內容
- 檢查
memory/YYYY-MM-DD.md是否已寫入(它應該有新內容) - 直接問經紀人:「你對我了解多少?」— 它應該從
MEMORY.md中提取
為生產知識庫配置記憶體維基
透過交換插件插槽來啟用它:
{
"plugins": {
"slots": {
"memory": "memory-wiki"
}
}
}
memory-wiki 在 memory/wiki/ 下產生一個結構化保管庫。每個主題都有自己的頁面。該插件編譯一個 digest.md ,它聚合了高可信度、無矛盾的事實,以便代理在會話開始時加載。
生產代理的實用保險庫結構:
memory/wiki/ ├── index.md ← vault table of contents ├── digest.md ← auto-generated; agent reads this ├── project-context.md ← stack, goals, constraints ├── decisions.md ← architectural decisions log ├── team.md ← stakeholders, contacts └── domain-knowledge.md ← business rules, glossary
在以下情況下使用記憶體維基:
- 您的知識庫超過約 50 個事實
- 你需要矛盾檢測
- 多個代理寫入同一個保管庫
在以下情況下堅持使用原始 MEMORY.md:
- 您是獨立開發者
- 你的背景很穩定
- 您想要零維護費用
語意搜尋與嵌入-SQLite、sqlite-vec 和 JS Fallback
OpenClaw 使用以下方式索引您的記憶體文件 SQLite with the sqlite-vec extension 用於向量相似性搜尋。當您或代理程式發出記憶體搜尋時,它會嵌入查詢並檢索語義上最相關的區塊。
驗證您的向量儲存是否正常:
# Check that the memory index exists ls memory/.index/ # Reset a corrupted index (safe to run — it rebuilds from .md files) rm -rf memory/.index/ && OpenClaw reindex
如果 sqlite-vec 不可用(在 ARM Linux 和某些 Windows 配置上常見),OpenClaw 將回退到純 JS 向量擴充。明確強制回退:
{
"memory": {
"vectorBackend": "js"
}
}
特定於段的記憶體策略
獨立開發人員 - 最小的開銷,最大的召回率
建議設定:memory-core 外掛程式、MEMORY.md + 僅每日筆記,無 wiki 庫。
- 將
MEMORY.md保持在 200 行以下 - 較長的檔案會減慢會話啟動速度 - 積極地添加日常筆記;不要試圖保持它們乾淨
- 每週審查和修剪
MEMORY.md— 過時的事實會降低搜尋質量
多代理管道-跨代理共享內存
當多個代理程式讀取和寫入相同 memory/ 目錄時,您需要明確的所有權規則。
- One agent owns writes to each file — 並發寫入同一個
.md檔案會產生衝突 - 每個代理程式使用子目錄:
memory/agent-a/、memory/agent-b/,以及共享的memory/shared/MEMORY.md - 使用記憶體維基作為共享庫 - 它的摘要編譯比原始文件更好地處理多個編寫者之間的新鮮度
長時間運作的自主任務-存活執行時間
對於運行以小時為單位的任務的代理:
- Force memory writes at checkpoints — 在每個主要任務階段之後,指示代理將其當前狀態附加到今天的每日筆記中
- Pre-load compaction-resistant context — 在執行開始之前將完整的任務規格放入
MEMORY.md中,而不僅僅是在初始訊息中 - Set explicit continuation markers 在日常筆記中:
<!-- RESUME POINT: completed steps 1-4, next: step 5 -->,以便代理人可以在壓實週期後自我定向
為什麼 EasyClaw 在長時間運行的記憶體任務中獲勝
EasyClaw 是桌面原生建構的 - 這表示您的記憶體檔案、向量索引和每日筆記與本機磁碟上的項目一起存在,而不是在逾時時驅逐上下文的雲端會話中。預設情況下,您會獲得抗壓縮內存,而不是通過配置。
- ✅ 重新啟動後仍然存在的持久記憶體 - 無雲會話限制
- ✅ 零網路延遲的本機 sqlite-vec 索引
- ✅ 內建結構化記憶體維基 - 無需配置額外的插件
- ✅ 在每個主要任務階段自動檢查點寫入
- ✅ 壓縮感知固定-行為規則永遠不會被總結掉
OpenClaw 記憶體故障排除 — 在 2 分鐘內診斷任何遺忘問題
按順序完成這些步驟:
步驟 1 — 記憶體/目錄是否存在?
- No → 創建它。這修復了約 40% 的遺忘報告。
- Yes → 繼續步驟 2。
步驟 2 — 是否寫了每日筆記?
- 檢查
memory/中名為今天日期的文件 - No file → 插件插槽可能配置錯誤。驗證
plugins.slots.memory已設置,而不是false。 - File exists but 為空 → 代理正在載入記憶體但未寫入。檢查目錄的寫入權限。
步驟 3 — 壓縮是否觸發並剝奪了您的指令?
- Symptom: 代理記住事實,但在會話中忽略行為規則
- Fix: 將所有行為規則移至
## [PINNED]區段下的MEMORY.md
步驟 4 — 壓縮前上下文視窗是否溢出?
- Symptom: 代理開始忽略長對話的早期部分
- Fix: 減少系統提示大小、修剪
MEMORY.md或將任務拆分為具有明確檢查點註釋的較短會話
步驟 5 — SQLite 向量索引是否已損壞?
- Symptom: 記憶體搜尋未回傳結果或明顯不相關的結果
- Fix:
rm -rf memory/.index/ && OpenClaw reindex - 如果日誌中出現sqlite-vec錯誤:透過
"vectorBackend": "js"切換到JS後端
常見問題
Q:為什麼關閉終端後 OpenClaw 會忘記所有內容?
答:最常見的原因是 memory/ 目錄不存在。當目錄遺失時,OpenClaw 會默默地刪除每日筆記 — 沒有錯誤,沒有警告。在專案根目錄中建立目錄,並驗證下一個會話後是否會出現一個帶有日期的檔案。
Q:我的代理在開始時遵循指示,但後來在長期任務中忽略它們。為什麼?
答:這就是壓實。當上下文視窗填滿時,OpenClaw 會總結先前的內容以騰出空間。摘要保留事實,而不是行為指示。將您的規則移至 ## [PINNED] 部分下的 MEMORY.md 中,以便在每個壓縮週期後重新讀取它們。
Q:我應該使用記憶體核心還是記憶體維基?
答:從 memory-core 開始。它是零配置的,可以很好地處理大多數獨立開發人員的工作負載。只有當您的知識庫超過約 50 個事實、需要矛盾檢測或多個代理正在寫入同一內部庫時,才升級到 memory-wiki。
Q:在 2 小時的自主運作中,我預計可以進行多少次壓實循環?
答:預計 3-5 個壓實週期。此閾值基於令牌計數,而不是經過的時間或任務階段,並且在預設的 memory-core 插件中使用者不可設定。這就是為什麼 MEMORY.md 中的抗壓縮固定對於長時間運行的任務至關重要。
Q:記憶體搜尋傳回不相關的結果。我該如何修復它?
答:SQLite 向量索引可能已損壞或過時。執行 rm -rf memory/.index/ && OpenClaw reindex 以從 .md 檔案重建它。這樣可以隨時安全運作。如果 sqlite-vec 錯誤仍然存在(在 ARM Linux 和某些 Windows 設定上常見),請切換到 JS 回退後端。
Q:我可以針對同一記憶體目錄運行多個代理程式嗎?
答:Yes,但需要明確的所有權規則。對同一個 .md 檔案的並發寫入將產生衝突。將每個代理程式的子目錄(memory/agent-a/、memory/agent-b/)與共享 memory/shared/MEMORY.md 一起使用,並為共享保管庫使用記憶體維基。
Q:每日筆記在自動載入視窗中停留多久?
答:只有今天和昨天的每日筆記會在會話開始時自動載入。較舊的註釋不在自動載入視窗之內,只能透過語義搜尋存取。這是設計使然——加載每個歷史筆記會消耗太多的上下文預算。
最終結論——實際有效的記憶體設置
Recommended baseline 針對大多數使用者: memory-core 插件,在第一次會話之前建立的 memory/ 目錄,MEMORY.md 在明確標記的固定部分中包含行為規則,在每個會話中附加每日註釋。
80% 的遺忘問題背後有個錯誤: 不建立 memory/ 目錄,且在 MEMORY.md 中沒有抗壓縮固定。代理在第一個壓縮週期中丟棄上下文,並且無處可寫回。
您的行動清單:
- 在專案根目錄中建立
memory/目錄 - 複製上面的起始
MEMORY.md範本並填寫您的上下文 - 驗證
plugins.slots.memory設定為"memory-core"(或您選擇的插件) - 在
MEMORY.md中的## [PINNED]下新增 3–5 個最關鍵的行為規則 - 第一次會議後,確認已寫下註明日期的每日筆記
- 如果語意搜尋感覺不太好,請執行
OpenClaw reindex來重建向量索引
一旦你了解它,這個架構就是合理的。大多數遺忘問題會在遵循此清單後 10 分鐘內解決。