OpenClaw があなたを忘れ続ける理由 (そしてそれがバグではない理由)
あなたが経験する物忘れは、OpenClaw の記憶システムの設計方法の直接の結果です。 memory lives as plain Markdown files on disk、データベース、RAM、モデル内ではありません。ファイルは真実の情報源です。
これらのファイルが欠落していたり、設定が間違っていたり、圧縮中にサイレントに上書きされたりすると、エージェントはコンテキストを失い、それが起こったことを通知する方法がありません。
修正は設定を切り替えることではありません。 3 層アーキテクチャを十分に理解して、何がどこに配置されるかについて慎重に決定できるようになります。
完全な OpenClaw メモリ アーキテクチャ (3 層の説明)
OpenClaw メモリは、それぞれ異なる永続特性と障害モードを持つ 3 つの異なる層にわたって動作します。
メモリの完全なライフサイクル:
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 つの壊れた段階にまで遡ります。
Layer 1 — アクティブ コンテキスト ウィンドウ
これはモデルの作業メモリです。アクティブな会話のコンテキスト ウィンドウに現在読み込まれているすべてのものです。これには、システム プロンプト、会話履歴、検索ツールによって取得されたメモリ チャンクが含まれます。
それを埋めるもの:
- システムプロンプト (多くの場合、大きい)
- 取り出した記憶の抜粋
- ツール呼び出し履歴
- 会話のターン
オーバーフロー時に何が起こるか: コンテキスト ウィンドウがトークン制限に近づくと、OpenClaw が圧縮をトリガーします。圧縮は、既存のコンテキストを圧縮表現に要約して続行します。 (永続メモリ ファイルに固定されているのではなく) 会話内にインラインであった命令は、この概要中に頻繁に削除されます。
実際の制限: システム プロンプトとメモリ オーバーヘッドを除いた後、実際の会話に使用できるモデルのアドバタイズされたコンテキスト ウィンドウの約 60 ~ 70% があると仮定します。
Layer 2 — 毎日のメモ (ローリング 2 日ウィンドウ)
毎日のメモは、memory/ ディレクトリ内に保存される、YYYY-MM-DD 形式で名前が付けられた追加専用の Markdown ファイルです。 OpenClaw の読み込み 今日と昨日の 各セッションの開始時にファイルが自動的に作成されます。
- 今日の仕事、下された決定、およびアクティブなタスクに関する事実がここに追加されます
- これらは編集することを意図したものではありません。ログとして扱ってください。
- 2 日後、それらは自動読み込みウィンドウの範囲外となり、セマンティック検索経由でのみ検索可能になります。
重要な落とし穴: OpenClaw は、memory/ ディレクトリを作成しません。ディレクトリが存在しない場合、毎日のメモはサイレントに削除され、エラーはスローされず、エージェントはセッション間ですべてを忘れます。このたった 1 つの省略が、「なぜ私を忘れ続けるのか」という報告の大部分を引き起こします。
レイヤ 3 — 耐久性のあるメモリ (MEMORY.md およびmemory-wiki)
複数のセッションにわたって存続する必要がある長期的な事実 (名前、プロジェクトのコンテキスト、コーディング設定、アーキテクチャ上の決定事項) は、MEMORY.md または構造化された memory-wiki プラグイン ボールトに属します。
メモリー.md
自由形式の Markdown ファイル。エージェントはセッション開始時にそれを読み取ります。常に読み込んでおきたい事実をここに書きます。シンプルで構成は不要です。
メモリーウィキ
ページレベルの構成、主張と証拠の追跡、矛盾検出、鮮度メタデータを備えた構造化プラグイン。大規模で進化するナレッジ ベースを持つ運用エージェントに最適です。
圧縮の問題 — タスクの途中で指示が消える理由
圧縮は、OpenClaw で最も文書化されていない障害モードです。ほとんどの記事ではセッション後の物忘れについて取り上げています。住所がほとんどない 長時間実行される自律型ワークフローにおけるタスクの途中での圧縮 — エージェントが複数ステップのタスクを実行している場合、圧縮はステップ 7/12 でサイレントに起動され、ステップ 1 からの動作指示は失われます。
圧縮の内容:
- コンテキスト ウィンドウが容量に近づいていることを検出します
- 現在の会話を凝縮されたブロックに要約します。
- 元のコンテキストを概要に置き換えます
- 実行を継続します
問題: サマリーは、行動の指示ではなく、事実とタスクの状態に合わせて最適化されます。 「実装前に常にテストを作成する」または「確認なしにファイルを上書きしない」などのシステム命令は、最初の圧縮サイクルでは存続し、2 番目の圧縮サイクルでは失われる可能性があります。
それがトリガーされると、次のようになります。 デフォルトの 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]を付けます — サマライザは大文字のヘッダーを高優先度として扱います - 固定された各事実は可能な限り 1 行にまとめます。密集した段落は要約され、単一行の事実はそのまま残る傾向があります。
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から取得する必要があります
本番ナレッジベース用のメモリ Wiki の構成
プラグイン スロットを交換して有効にします。
{
"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 フォールバック
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"
}
}
セグメント固有のメモリ戦略
Solo Developer — 最小限のオーバーヘッド、最大限のリコール
推奨設定: 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 - 共有ボールトには Memory-Wiki を使用します。そのダイジェスト コンパイルは、生のファイルよりも複数のライターにわたる鮮度を適切に処理します。
長時間実行される自律タスク - 実行時間の存続
時間単位で測定されるタスクを実行するエージェントの場合:
- 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 インデックス作成
- ✅ 構造化されたメモリ Wiki が組み込まれているため、追加のプラグインを設定する必要はありません
- ✅ 主要なタスクの各段階での自動チェックポイント書き込み
- ✅ 圧縮を意識した固定 — 動作ルールが要約されることはありません
OpenClaw メモリのトラブルシューティング - メモリ忘れの問題を 2 分で診断
次の手順を順番に実行してください。
ステップ 1 — メモリ/ディレクトリは存在しますか?
- No →作成します。これにより、すべての忘れレポートの最大 40% が修正されます。
- Yes → 手順 2 に進みます。
Step 2 — 毎日のメモは書かれていますか?
memory/で今日の日付という名前のファイルを確認します- No file → プラグインスロットの設定が間違っている可能性があります。
falseではなく、plugins.slots.memoryが設定されていることを確認してください。 - File exists but は空です → エージェントはメモリをロードしていますが、書き込みはしていません。ディレクトリの書き込み権限を確認してください。
Step 3 — 圧縮が実行され、命令が削除されましたか?
- Symptom: エージェントは事実を覚えているが、セッション中の行動ルールを無視する
- Fix: すべての動作ルールを
## [PINNED]セクションのMEMORY.mdに移動します
Step 4 — 圧縮前にコンテキスト ウィンドウがオーバーフローしていませんか?
- Symptom: エージェントが長い会話の前半部分を無視し始める
- Fix: システム プロンプト サイズを減らす、
MEMORY.mdをトリミングする、または明示的なチェックポイント メモを使用してタスクを短いセッションに分割する
ステップ 5 — SQLite ベクター インデックスが破損していますか?
- Symptom: メモリ検索では結果が返されないか、明らかに無関係な結果が返されません
- Fix:
rm -rf memory/.index/ && openclaw reindex - sqlite-vec エラーがログに表示される場合:
"vectorBackend": "js"経由で JS バックエンドに切り替えます。
よくある質問
質問: ターミナルを閉じると OpenClaw がすべてを忘れてしまうのはなぜですか?
A: 最も一般的な原因は、memory/ ディレクトリが存在しないことです。 OpenClaw は、ディレクトリが見つからない場合に毎日のメモを静かに削除します。エラーや警告はありません。プロジェクトのルートにディレクトリを作成し、次回のセッション後に日付付きのファイルが表示されることを確認します。
質問: 私のエージェントは最初は指示に従いますが、長いタスクの後半では指示を無視します。なぜ?
A: それは圧縮です。コンテキスト ウィンドウがいっぱいになると、OpenClaw はスペースを空けるために以前のコンテンツを要約します。概要は事実を保持するものであり、行動の指示を保持するものではありません。ルールを ## [PINNED] セクションの下の MEMORY.md に移動して、各圧縮サイクル後に再読み込まれるようにします。
質問: メモリコアまたはメモリウィキを使用する必要がありますか?
A: memory-core から始めます。設定不要で、ほとんどの個人開発者のワークロードを適切に処理します。ナレッジ ベースのファクト数が ~50 を超える場合、矛盾検出が必要な場合、または複数のエージェントが同じメモリ ボールトに書き込みを行っている場合にのみ、memory-wiki にアップグレードしてください。
質問: 2 時間の自律走行では何回の圧縮サイクルが予想されますか?
A: 3 ~ 5 回の圧縮サイクルが予想されます。しきい値は、経過時間やタスクのステージではなく、トークン数に基づいており、デフォルトの memory-core プラグインではユーザーが構成できません。このため、MEMORY.md の圧縮耐性のあるピン留めが、長時間実行されるタスクには不可欠です。
質問: メモリ検索では無関係な結果が返されます。どうすれば修正できますか?
A: SQLite ベクトル インデックスが破損しているか、古くなっている可能性があります。 rm -rf memory/.index/ && openclaw reindex を実行して、.md ファイルから再構築します。これでいつでも安全に実行できます。 sqlite-vec エラーが続く場合 (ARM Linux および一部の Windows セットアップで一般的)、JS フォールバック バックエンドに切り替えます。
質問: 同じメモリ ディレクトリに対して複数のエージェントを実行できますか?
A: Yes ですが、明示的な所有権ルールが必要です。同じ .md ファイルに同時書き込みを行うと、競合が発生します。共有 memory/shared/MEMORY.md でエージェントごとのサブディレクトリ (memory/agent-a/、memory/agent-b/) を使用し、共有コンテナーにはメモリ wiki を使用します。
質問: 毎日のメモは自動読み込みウィンドウにどのくらいの時間表示されますか?
A: 今日と昨日の日次メモのみがセッション開始時に自動的にロードされます。古いメモは自動ロード ウィンドウの範囲外にあるため、セマンティック検索を介してのみアクセスできます。これは仕様です。すべての履歴メモを読み込むと、コンテキスト バジェットが大量に消費されます。
最終評決 — 実際に定着するメモリ設定
ほとんどのユーザーの Recommended baseline: memory-core プラグイン、最初のセッションの前に作成された memory/ ディレクトリ、明確にラベル付けされた固定セクションの行動ルールを含む MEMORY.md、各セッションを通じて毎日のメモが追加されます。
物忘れの 80% の背後にある 1 つの間違い: memory/ ディレクトリを作成しないことと、MEMORY.md で圧縮耐性のある固定を行わないことです。エージェントは最初の圧縮サイクルでコンテキストを削除し、それを書き戻す場所がありません。
あなたの行動チェックリスト:
- プロジェクトのルートに
memory/ディレクトリを作成します - 上記のスターター
MEMORY.mdテンプレートをコピーし、コンテキストを入力します。 plugins.slots.memoryが"memory-core"(または選択したプラグイン) に設定されていることを確認します。MEMORY.mdの## [PINNED]の下に 3 ~ 5 つの最も重要な行動ルールを追加します。- 最初のセッションの後、日付の付いた毎日のメモが書かれていることを確認してください
- セマンティック検索に違和感がある場合は、
openclaw reindexを実行してベクトル インデックスを再構築してください
一度理解すれば、アーキテクチャは健全なものになります。ほとんどの物忘れの問題は、このチェックリストに従えば 10 分以内に解決します。