powered by TechFeed
表示モード
Deep Dive

AIエージェントに「記憶」を持たせる方法 — 4種のメモリ型・失敗パターン・主要フレームワーク比較

11月2日、Machine Learning Masteryが「The AI Agent Memory Stack: Building Blocks, Patterns, and Frameworks」と題した記事を公開した。LLM(大規模言語モデル)はそれ自体、呼び出しをまたいで情報を保持しない。各呼び出しはそのリクエスト内のテキストだけを処理し、以前のやりとりは一切参照できない。単発の質問にはそれで十分だが、複数ステップのタスクをこなすAIエージェントには「メモリ」が不可欠だ。本記事はそのメモリアーキテクチャ全体を、型・設計パターン・フレームワークの3層に分けて体系的に解説する。実装者が直接使える内容になっている。

11月2日、Machine Learning Masteryが「The AI Agent Memory Stack: Building Blocks, Patterns, and Frameworks」と題した記事を公開した。

LLM(大規模言語モデル)はそれ自体、呼び出しをまたいで情報を保持しない。各呼び出しはそのリクエスト内のテキストだけを処理し、以前のやりとりは一切参照できない。単発の質問にはそれで十分だが、複数ステップのタスクをこなすAIエージェントには「メモリ」が不可欠だ。

本記事はそのメモリアーキテクチャ全体を、型・設計パターン・フレームワークの3層に分けて体系的に解説する。実装者が直接使える内容になっている。


エージェントメモリの4つの型

エージェントが必要とする情報は目的によって異なる。記事では以下の4種類に分類している。

メモリ型 何を保持するか 主なストレージ 取得方法
Working(作業) 中間結果、スクラッチパッド値などの現在のタスク状態 インメモリ or 短命なKVストア キーによる直接参照
Episodic(エピソード) 過去のインタラクション、タスク実行記録、意思決定履歴 時系列ログ or ベクターストア セマンティック類似検索
Semantic(セマンティック) ユーザーの好みや事実など、随時上書き更新される情報 KVストア or エンティティストア 属性による完全一致検索(+ セマンティック検索の組み合わせも)
Procedural(手続き) 成功した行動パターン、既知の失敗パターン プロンプトテンプレート or ファインチューニング パターンマッチ or 直接注入

EpisodicメモリとSemanticメモリの違いは重要だ。Episodicは「いつ何があったか」という出来事の記録を時系列に積み上げていくのに対し、Semanticは「ユーザーの好みは◯◯だ」「この事実は△△だ」といった現在の状態を保持するために、古い情報を新しい情報で上書き更新する性質を持つ。前者は追記専用のログ、後者は常に最新状態を維持するエンティティストアとイメージするとわかりやすい。

Working memoryはコンテキストウィンドウ内の情報そのものであり、他の3型は「何をコンテキストに持ち込むか」を決める役割を担う。この区別を明確にしておくことが、設計・実装・デバッグの土台になる。


設計パターン:何が効いて、何が壊れるか

記事の核心部分の一つが「失敗するアンチパターン」の整理だ。

よくある失敗パターン

アプローチ なぜ壊れるか
すべてをひとつのベクターストアに格納 意味的に似ているが無関係な情報が取得され、事実間の関係表現も難しい
自由形式の要約でメモリを圧縮 数値や制約条件が削除される。誤情報がそのまま「確認済み」として保存されるリスクもある
上限なしにメモリを増やし続ける 不要なエントリが有用な情報と競合し、取得精度が落ちる
すべての書き込みを同等に信頼する メモリポイズニングのリスク。信頼できないコンテンツが後で信頼済み情報として扱われる

共通の問題はメモリを用途で分離せず、一枚岩のストアとして扱うことだ。

効果的な設計戦略

記事が挙げる実践的なプラクティスは以下の4点。

  • 書き込み前に重要度をスコアリング:一時的な観察や低品質なツール出力を除外し、ストアを有用な情報に絞る
  • エージェントロールでスコープを分離:マルチエージェント構成では、各エージェントのメモリをその責務に限定する
  • 決定ポイントで都度取得:タスク開始時だけでなく、ワークフロー全体を通じてコンテキストを更新する
  • 出所(provenance)を記録:どのエージェント・ツール・ユーザー入力・タイムスタンプから来た情報かを保存する。デバッグと監査に直結する

フレームワーク比較:4つのアプローチ

記事では代表的な4つのメモリフレームワークを比較している。

フレームワーク メモリモデル 事実の変化への対応
Letta エージェント自身が直接書き換えられるテキストブロック モデルが矛盾を検出してブロックを更新
Mem0 ベクターベース + エンティティ認識型取得 新しいメモリを既存と並べて追加・取得
Graphiti 双時制(bi-temporal)ナレッジグラフ+型付きリレーション 古いリレーションを無効化しつつ履歴は保持
Cognee ソースデータからグラフ・ベクター・リレーショナル層を構築する抽出パイプライン メモリ表現を再構築(時系列モードで変化追跡も可)

Graphitiが採用する双時制(bi-temporal)とは、「情報が現実世界でいつ有効だったか(valid time)」と「システムがいつその情報を記録したか(transaction time)」の2つの時間軸を独立して管理する設計手法だ。これにより、ある時点における世界の状態を正確に再現できる。事実の変化を追跡しつつ過去の状態も参照できるため、情報が頻繁に更新されるユースケースで特に有効になる。

選択の基準は明快だ。エージェントが必要とするのが関連事実や直近のコンテキスト取得のみであれば、シンプルなメモリ層で十分。エンティティ間のリレーション追跡、複数事実の横断推論、情報変化の履歴保持が必要になるほど、構造化されたシステムが有効になる。


マルチエージェント環境の評価指標

複数のエージェントが同一メモリを共有・更新する構成では、単一エージェントの評価軸だけでは不十分になる。メモリの正確性・鮮度・競合への耐性を測るため、以下の4つの指標が追加で必要になる。

  • Retrieval recall:関連するメモリが存在するとき、それが正しく取得されているか
  • Retrieval precision:取得された情報の中に無関係なものがどれだけ含まれるか
  • Faithfulness:取得した情報をエージェントが推論に正しく使えているか
  • Staleness:取得された情報が既に古くなっていないか

マルチエージェントの書き込み競合への対応として、記事は「書き込み制御付きの中央メモリサービス」「エージェントごとの名前空間分離」「追記専用ログ+取得時の競合解決」の3パターンを挙げている。


詳細はThe AI Agent Memory Stack: Building Blocks, Patterns, and Frameworksを参照していただきたい。