AIエージェントにおける永続メモリと状態のための5つのアーキテクチャパターン
本記事では、AIエージェントの永続的なメモリと状態を管理するための5つのアーキテクチャパターンを紹介します。コンテキスト作業バッファ、実行チェックポイント、セマンティックメモリ、エピソードイベントログ、マルチスコープ分離です。これらのパターンは、短期実行、フォールトトレランス、セッション間知識、履歴の振り返り、マルチテナントのデータプライバシーそれぞれに対処します。
AIエージェントを長期にわたって運用する際、状態と記憶の管理は重要な課題です。LLMは本質的にステートレスであり、毎回の呼び出しがゼロから始まるため、初期の開発者は会話履歴すべてをコンテキストウィンドウに詰め込んでいましたが、この方法はレイテンシの増加、関連事実の埋没、コスト増大を招きます。正しいアプローチは、メモリと状態を意図的なアーキテクチャ設計として扱うことです。
状態は、エージェントが現在のタスクについて知っているすべてのスナップショットであり、タスク中に常に更新され、セッション終了時に消えます(明示的に永続化しない限り)。記憶は、次のターンやセッションなど、境界を越えて情報を伝達するメカニズムです。ワーキングメモリはターン間、セマンティックメモリとエピソードメモリはセッション間をまたぎます。タスク開始時にエージェントは記憶から読み込み初期状態を構築し、タスク中に状態を更新し、タスク終了時に状態の一部を記憶に書き込みます。
以下が5つのパターンです。
- コンテキスト作業バッファ(短期実行):現在のセッションの即時的な推論ステップとツール出力を保持するスライディングウィンドウ。トークン制限に近づくと、古いターンを要約して圧縮し、論理的結論を残して生の出力を捨てます。セッション終了時にバッファはフラッシュされ、価値のあるものは長期ストレージに抽出されます。注意点:途中の要約がプロンプトプリフィックスを書き換える可能性があり、KVキャッシュが無効化されレイテンシスパイクが発生します。
- 実行チェックポイント(フォールトトレランスと一時停止):長時間タスクはタイムアウトやレート制限などで中断することがあります。チェックポイントはワークフロー状態(変数、履歴、現在位置)をPostgreSQLやSQLiteなどの耐久ストレージに保存します。エージェントがクラッシュした場合、最後のチェックポイントから再開します。ただし、再開は正確に一回のセマンティクスを保証しないため、副作用のあるノードは冪等である必要があります。また、ファイルハンドルやクライアントオブジェクトはチェックポイントできません。
- セマンティックメモリ(セッション間知識):事実、ユーザー設定、ドメイン知識を保存します。情報は非同期的に抽出され、外部データベース(通常はベクターストア+メタデータフィルタリング、場合によってはナレッジグラフと併用)に格納されます。クエリ時に最も関連性の高い事実が検索され、プロンプトに注入されます。事実の無効化(時間的重み付け、置換ロジック、TTLなど)が重要です。資格情報やシークレットはセマンティックメモリに保存してはいけません。また、信頼できないコンテンツが「事実」として抽出されると永続的にエージェントを誤った方向に導くリスクがあるため、出典タグによる影響範囲の制御が必要です。
- エピソードイベントログ(履歴の振り返り):エージェントの実行軌跡(目標、計画、ツール呼び出し、結果)を時系列で記録します。ワークフロー終了時にバックグラウンドでログに記録され、類似タスクの前にこのログをクエリして過去の失敗を繰り返さないようにします。ただし、取得された失敗トレースは助言であり制約ではないため、モデルは無視できます。また、環境の一回限りの障害が戦略の失敗として誤って記録されるリスクもあります。
- マルチスコープ分離(エンタープライズプライバシー):マルチユーザー環境では、記憶はユーザー、セッション、組織ごとに分離されなければなりません。すべての書き込みにアイデンティティスコープ(user_id, session_id, org_id)をタグ付けし、取得時にはアクティブユーザーの認証トークンに基づいて厳密にフィルタリングします。ストレージ層で強制するのが理想的です。データ削除時には、生データだけでなく、埋め込み、要約、抽出された事実も削除する必要があります。
まとめ:これらのパターン単独では成長境界をカバーしません。長期運用では、セマンティックストアとエピソードストアに重複や古いエントリが蓄積され、検索品質が低下しコストが増加します。TTL、統合ジョブ、トリミングポリシーは必須です。コンテキストウィンドウはデータベースではありません。メモリを短期バッファ、エピソードログ、セマンティックストアに分離することで、学習し、データ境界を守り、本番環境に耐えるシステムが構築できます。