ワークスペースメモリ研究
対象: Clawdスタイルのワークスペース (agents.defaults.workspace, デフォルト ~/.openclaw/workspace)。ここでは「メモリ」が1日1つのMarkdownファイル (memory/YYYY-MM-DD.md) と少数の安定したファイル (例: memory.md, SOUL.md) として保存されます。この文書は、Markdownを人間がレビュー可能な正規の情報源として維持しつつ、派生インデックスを通じて構造化された想起 (検索、エンティティ要約、信頼度更新) を追加するオフラインファーストメモリアーキテクチャを提案します。
なぜ変更するのか?
現在の設定 (1日1ファイル) は以下に優れています:
- 「追加のみ」のジャーナリング
- 人間による編集
- gitによる耐久性 + 監査可能性
- 低摩擦でのキャプチャ (「ただ書き留めるだけ」)
以下には弱いです:
- 高精度な検索 (「Xについて何を決めた?」、「前回Yを試したときは?」)
- エンティティ中心の回答 (多くのファイルを再読せずに「Alice / The Castle / warelayについて教えて」)
- 意見/嗜好の安定性 (およびそれが変化したときの証拠)
- 時間制約 (「2025年11月の時点で何が真実だった?」) と矛盾解決
設計目標
- オフライン: ネットワークなしで動作; ラップトップ/キャッスルで実行可能; クラウド依存なし。
- 説明可能: 取得された項目は帰属可能 (ファイル + 位置) であり、推論から分離可能であるべき。
- 低儀式: 日々のロギングはMarkdownのまま、重いスキーマ作業は不要。
- 漸進的: v1はFTSのみで有用; セマンティック/ベクトルとグラフはオプションのアップグレード。
- エージェントフレンドリー: 「トークン予算内での想起」を容易にする (事実の小さな束を返す)。
理想モデル (Hindsight × Letta)
融合すべき2つの要素:
- Letta/MemGPTスタイルの制御ループ
- 小さな「コア」を常にコンテキスト内に保持 (ペルソナ + 重要なユーザー事実)
- それ以外はすべてコンテキスト外とし、ツール経由で取得
- メモリ書き込みは明示的なツール呼び出し (追加/置換/挿入) であり、永続化され、次のターンで再注入される
- Hindsightスタイルのメモリ基盤
- 観察されたこと vs 信じられていること vs 要約されたことを分離
- 保持/想起/内省をサポート
- 証拠とともに進化する、信頼度付きの意見
- エンティティを意識した取得 + 時間的クエリ (完全な知識グラフがなくても)
提案アーキテクチャ (Markdown情報源 + 派生インデックス)
正規ストア (gitフレンドリー)
~/.openclaw/workspace を正規の人間可読メモリとして維持。提案されるワークスペースレイアウト:
~/.openclaw/workspace/
memory.md # 小規模: 永続的事実 + 嗜好 (コア的)
memory/
YYYY-MM-DD.md # 日次ログ (追加; 物語的)
bank/ # 「型付き」メモリページ (安定、レビュー可能)
world.md # 世界に関する客観的事実
experience.md # エージェントが行ったこと (一人称)
opinions.md # 主観的嗜好/判断 + 信頼度 + 証拠ポインタ
entities/
Peter.md
The-Castle.md
warelay.md
...
注記:
- 日次ログは日次ログのまま。JSONに変換する必要はありません。
bank/内のファイルはキュレーションされたもので、内省ジョブによって生成され、手動で編集することも可能です。memory.mdは「小規模 + コア的」のまま: Clawdに毎セッション見てほしい事柄です。
派生ストア (機械的想起)
ワークスペース配下に派生インデックスを追加 (必ずしもgit追跡対象ではない):
~/.openclaw/workspace/.memory/index.sqlite
以下でバックアップ:
- 事実 + エンティティリンク + 意見メタデータ用のSQLiteスキーマ
- 語彙想起用のSQLite FTS5 (高速、軽量、オフライン)
- セマンティック想起用のオプションの埋め込みテーブル (依然としてオフライン)
インデックスは常にMarkdownから再構築可能です。
保持 / 想起 / 内省 (運用ループ)
保持: 日次ログを「事実」に正規化
ここで重要なHindsightの洞察: 物語的で自己完結した事実を保存し、小さな断片ではない。memory/YYYY-MM-DD.md の実用的ルール:
- 一日の終わり (または途中) に、以下の条件を満たす2〜5個の箇条書きを含む
## Retainセクションを追加:- 物語的 (ターン間の文脈が保持されている)
- 自己完結的 (後で単独でも意味をなす)
- タイプ + エンティティ言及でタグ付けされている
例:
## Retain
- W @Peter: Currently in Marrakech (Nov 27–Dec 1, 2025) for Andy’s birthday.
- B @warelay: I fixed the Baileys WS crash by wrapping connection.update handlers in try/catch (see memory/2025-11-27.md).
- O(c=0.95) @Peter: Prefers concise replies (<1500 chars) on WhatsApp; long content goes into files.
最小限の解析:
- タイプ接頭辞:
W(世界),B(経験/経歴),O(意見),S(観察/要約; 通常生成される) - エンティティ:
@Peter,@warelayなど (スラッグはbank/entities/*.mdにマッピング) - 意見信頼度:
O(c=0.0..1.0)オプション
作成者に考えさせたくない場合: 内省ジョブがログの残りの部分からこれらの箇条書きを推論することも可能ですが、明示的な ## Retain セクションを持つことが最も簡単な「品質レバー」です。
想起: 派生インデックスに対するクエリ
想起は以下をサポートすべき:
- 語彙的: 「正確な用語 / 名前 / コマンドを検索」 (FTS5)
- エンティティ: 「Xについて教えて」 (エンティティページ + エンティティリンクされた事実)
- 時間的: 「11月27日頃に何が起きたか」 / 「先週以降」
- 意見: 「Peterは何を好む?」 (信頼度 + 証拠付き)
返却形式はエージェントフレンドリーで、出典を明記すべき:
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] - 最終更新日
- 証拠リンク (支持 + 矛盾する事実ID)
- 新しい事実が到着したとき:
- エンティティ重複 + 類似性で候補意見を検索 (まずFTS、後で埋め込み)
- 小さなデルタで信頼度を更新; 大きな変化には強い矛盾 + 繰り返しの証拠が必要
CLI統合: スタンドアロン vs 深い統合
推奨: OpenClawへの深い統合、ただし分離可能なコアライブラリを維持。
なぜOpenClawに統合するのか?
- OpenClawはすでに以下を知っている:
- ワークスペースパス (
agents.defaults.workspace) - セッションモデル + ハートビート
- ロギング + トラブルシューティングパターン
- ワークスペースパス (
- エージェント自体にツールを呼び出させたい:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
なぜ依然としてライブラリを分離するのか?
- ゲートウェイ/ランタイムなしでメモリロジックをテスト可能に保つ
- 他のコンテキスト (ローカルスクリプト、将来のデスクトップアプリなど) から再利用可能
形状: メモリツーリングは小さなCLI + ライブラリレイヤーとなることを意図していますが、これは探索的なものに限ります。
「S-Collide」 / SuCo: いつ使うか (研究)
「S-Collide」がSuCo (Subspace Collision) を指す場合: これは学習/構造化された部分空間衝突を使用することで、高い再現率/遅延のトレードオフを目指すANN検索アプローチです (論文: arXiv 2411.14754, 2024)。~/.openclaw/workspace への実用的な見解:
- SuCoで始めない。
- SQLite FTS + (オプション) シンプルな埋め込みから始める; すぐにほとんどのUX上の利点が得られる。
- SuCo/HNSW/ScaNNクラスのソリューションは、以下の場合にのみ検討:
- コーパスが大きい (数万/数十万のチャンク)
- 総当たり埋め込み検索が遅すぎる
- 再現率の品質が語彙検索によって有意にボトルネックになっている
オフラインフレンドリーな代替案 (複雑さの順):
- SQLite FTS5 + メタデータフィルター (MLゼロ)
- 埋め込み + 総当たり (チャンク数が少なければ驚くほど機能する)
- HNSWインデックス (一般的、堅牢; ライブラリバインディングが必要)
- SuCo (研究レベル; 組み込める確実な実装があれば魅力的)
未解決の疑問:
- あなたのマシン (ラップトップ + デスクトップ) 上の「パーソナルアシスタントメモリ」にとって最適なオフライン埋め込みモデルは何か?
- すでにOllamaを持っている場合: ローカルモデルで埋め込み; そうでなければツールチェーンに小さな埋め込みモデルを同梱。
最小限の有用なパイロット
最小限で、それでも有用なバージョンが欲しい場合:
bank/エンティティページと日次ログ内の## Retainセクションを追加。- 出典 (パス + 行番号) 付きの想起にSQLite FTSを使用。
- 想起の品質または規模が要求する場合にのみ埋め込みを追加。
参考文献
- Letta / MemGPT コンセプト: 「コアメモリブロック」 + 「アーカイブメモリ」 + ツール駆動の自己編集メモリ。
- Hindsight テクニカルレポート: 「保持 / 想起 / 内省」、4ネットワークメモリ、物語的事実抽出、意見信頼度進化。
- SuCo: arXiv 2411.14754 (2024): 「Subspace Collision」近似最近傍検索。
セッション バインディング チャネル アグノスティック プランモデル設定の探索