# Agent Memory (エージェントの記憶)

*読んで直せるノートが真実で、索引は捨てられるキャッシュです。*

> **Agent Memory** ＝ **読んで直せるノート** ＋ **いつでも捨てられる索引** です。すべてのノートは出典を示し、索引（全文、ベクトル、グラフ、アウトライン）はノートの派生物にすぎず、バックグラウンドの保守ジョブは編集を **提案** するだけで、生のジャーナルを書き換えることはありません。

**AN-07** · 準拠レベル: L2 Memory · グループ: 知識

## 解決する課題

記憶のフレームワークは、記憶を不透明なデータベースに入れます。中を調べることも、差分を取ることも、移行することも、直すこともできず、確実に消すのは難しく、索引と埋め込みモデルに縛られます。そのうえ、記憶そのものが攻撃面になります。ある [2026 年の研究](https://arxiv.org/abs/2606.04329) では、永続的な記憶への毒入れの攻撃成功率が、2 つのエージェントの平均で 50.46% に達しました。[別の研究](https://arxiv.org/abs/2607.05189) では、巧妙に作った 1 通のメールで、ファイルシステム型とベクトル型の両方の記憶バックエンドに対する攻撃が成功しています。

一方で、「どの記憶アーキテクチャが最良か」は、まったく決着がついていません。ベンチマークは互いに矛盾しています。特定の検索アルゴリズムに賭けない設計こそが、3 年の変化に耐えられます。

## 仕組み

- **ノートが真実です。** YAML フロントマターつきの Markdown。`kind`（エピソード、意味、手続き、好み）、`subject`、`sources`、`confidence`、`valid_from`、`valid_to`、`supersedes`、`origin`、`reviewed`。
- **上書きせず、更新します。** 新しい事実は古い事実を `supersedes` します。事実は変わるのに、一般的なベンチマークがほとんど試さないので、有効な時間と記録した時間は分けて持ちます。
- **索引はキャッシュです。** BM25（たとえば SQLite FTS5）、ベクトル（複数が共存できます）、任意のグラフ。すべての派生物は、その **レシピ** と **入力** を持ちます。埋め込みモデルを変えるのは、バックグラウンドでの再計算で、新しい索引が黄金の想起テストを満たすまで、古い索引を残します。
- **導出は 2 種類。** 決定的なもの（チャンク分割、BM25、固定モデルによる埋め込み）は再現できます。生成的なもの（LLM の要約、抽出した事実）は「再生成して比較する」ことしかできないため、`generated: true` とマークし、唯一のコピーにはしません。
- **書き込みの経路。** `nas_remember` が、（出典つきの）ノートを現在のブランチに書き、汚染は引き継がれます。`external` の汚染を持つセッションのノートは **隔離** に入り、未レビューとマークされます。想起はできますが、**自動読み込みはされず**、`MEMORY.md` にも入りません。
- **読み取りの経路。** `nas_recall` ＝ 検索、候補、予算つきのビューと証拠ポインタ。各ノートの出典とレビュー状態も示します。
- **保守ジョブ**（夜間やアイドル時）：重複の除去、エピソードの意味的な事実への統合、矛盾の指摘、古い事実の退役、索引の再構築。ジョブはブランチに提案を作り、人間かエージェントがレビューします。**生のジャーナルは決して削除しません**。「後悔率」（元に戻された提案の割合）を計測します。
- **黄金の想起テスト。** Home ごとに、「質問と期待するノート」の組を用意し、モデルやインデクサーが変わったときに自動で実行します。

## 小さく始める

- フロントマターつきの `memory/notes/*.md` と、検索のための SQLite FTS5。
- 黄金の質問を 10 個、CI で実行する。
- ベクトル索引と保守ジョブは、あとからで構いません。まず「出どころ」と「レビュー済みのノートだけを自動読み込み」を正しくします。

## インターフェースのスケッチ

説明用の例です。フィールド名は仕様 v0.3 までに変わる可能性があります。

*memory/notes/customer-acme.md*

```markdown
---
id: mem_4kq2
kind: semantic
subject: customer/acme
valid_from: 2026-10-02
valid_to: null
confidence: 0.8
origin: agent
reviewed: true
sources:
  - nas://home-box/agents/cleo/journal/2026-10-02.md@9f2c1de#L12-L18
supersedes: [mem_1xa9]
---
Acme renewed for 24 months; the champion moved from Dana to Luis.
```

## 仕様が求めること

- ノートは、Memory 層なしで読めなければならない（Store の中の普通のファイルである）。
- すべての派生物は、そのレシピと入力を持たなければならない。索引は、捨てられ、再構築できなければならない。
- 汚染されたセッションが書いたノートは、レビューされるまで自動読み込みしてはならない。
- 新しい事実は、上書きではなく `supersedes` で古い事実を置き換えなければならない。
- 保守ジョブは、ブランチの上で動き、提案するだけでなければならない。生のジャーナルを削除してはならない。
- どの Home も、黄金の想起テストを備え、モデルやインデクサーが変わるたびに実行すべきである。

## 借りたものと、新しいもの

以下はすべて確立された考え方で、OpenClaw のメモリアーキテクチャは、すでに出どころのラベル、階層ごとの隔離、統合時の汚染の伝播を行っています。**新しいのは、** OpenClaw が **1 つのランタイムの内側** で行っているのに対し、私たちは **共有ストレージ** で行うことを提案している点です。これでどのランタイムも恩恵を受けられます。さらに、索引を捨てられるキャッシュに格下げすることで、記憶を失わずに検索アルゴリズムを変えられるようにします。

- [Letta Context Repositories](https://www.letta.com/blog/context-repositories/)
- [Letta: is a filesystem all you need?](https://www.letta.com/blog/benchmarking-ai-agent-memory/)
- [OpenClaw memory architecture](https://docs.openclaw.ai/concepts/memory-architecture)
- [Long-term memory security survey](https://arxiv.org/abs/2604.16548)
- [Graphiti](https://github.com/getzep/graphiti)
- [MemGPT](https://arxiv.org/abs/2310.08560)

## 正直な限界

- 生成的な導出物は、ビット単位では決して再現できません。
- 保守ジョブは、誤りを事実として「固めて」しまうことがあります。だから提案するだけで、直接は編集しません。
- どの記憶アーキテクチャが最良かは、まだ決着していません。

## 未解決の問い

- エージェントが自分で記憶を書くべきときと、保守ジョブが書くべきときは、それぞれいつか。
- モデルのバージョンをまたぐ、回帰の基準は何か。

## よくある質問

### なぜベクトルデータベースではなく、ファイルなのですか？

ファイルは、読んで、直して、差分を取って、持ち出せる真実です。ベクトル索引は、複数のバージョンが共存でき、いつでも再構築できる派生キャッシュです。Letta のベンチマークは、`grep` とファイルツールだけのエージェントが十分に張り合えることを示しましたが、ベンチマークは互いに矛盾しているので、この設計は 1 つの検索アルゴリズムに賭けません。

### 記憶への毒入れは、どう防ぐのですか？

悪いものが一切書かれないことは保証できませんが、被害は限定できます。外から来た内容には `external` ラベルがつき、汚染されたセッションが書いたノートは隔離に入って自動読み込みされず、マージはレビューされます。何かがおかしくなったときは、出どころの連鎖をたどって影響を受けたノートを見つけ、ロールバックできます。

### 埋め込みモデルを変えるとき、記憶を移行する必要はありますか？

ありません。ノートは変わらず、新しいレシピで索引をバックグラウンドで再計算するだけです。新しい索引が黄金の想起テストを満たすまで、古い索引は残ります。

## 関連するコンセプト

- [Budgeted Reads (予算つき読み取り)](https://agentnas.com/ja/concepts/budgeted-reads/): ファイルを、アウトライン、節、行範囲、全文のいずれかで読みます。予算に収まるよう、段階的に粗くします。
- [Cascade Forget (カスケード忘却)](https://agentnas.com/ja/concepts/cascade-forget/): 系譜に沿って派生物を削除し、履歴は保持クラスで扱い、できなかったことを報告します。
- [Trust Labels (トラスト・ラベル)](https://agentnas.com/ja/concepts/trust-labels/): 2 つの小さなラベルとセッション汚染で、Rule of Two を実現します。

---

正規 URL: https://agentnas.com/ja/concepts/agent-memory/
更新日: 2026-11-11 · 仕様ドラフト v0.2 · CC BY 4.0
