エージェントメモリとは
Memory / メモリ
AIエージェントが過去のやり取りや学習内容を保持し、後続の判断に活用する仕組み
ひとことで言うと
AIエージェントが過去のやり取りを覚えておき、次の判断に活かす仕組み。
概要
エージェントメモリ(Memory)とは、AIエージェントが会話やタスク遂行の過程で得た情報を保持し、後続の判断や応答に活用する仕組み。 1回のセッション内での直近のやり取りを保持する短期記憶(多くはコンテキストウィンドウ内に保持)と、セッションをまたいで長期的にユーザーの好みや過去の作業内容を保持する長期記憶に大別されることが多い。 長期記憶の実装には、埋め込みベクトルとして保存しセマンティック検索で必要な情報を呼び出す、ベクトルデータベースを用いた方式がよく使われる。 メモリ管理の設計を誤ると、コンテキストウィンドウの上限を超えて過去の重要な情報が失われたり、逆に無関係な情報まで詰め込まれて応答精度が下がったりするため、何を・どこまで記憶させるかの設計がエージェントの実用性を左右する。
背景
LLM自体はステートレスであり、コンテキストウィンドウに含まれない情報は原理的に参照できない。 しかし実用的なエージェントには、過去のやり取りやユーザー固有の情報を踏まえた一貫性のある対応が求められるため、コンテキストウィンドウの外側で情報を保持・検索する仕組みとしてエージェントメモリが必要とされるようになった。
アーキテクチャ
短期記憶は、直近の会話履歴やタスクの進行状況をそのままプロンプトに含める形で実装されることが多い。 長期記憶は、重要な情報を要約・抽出して埋め込みベクトル化し、ベクトルデータベースへ保存したうえで、必要なタイミングでセマンティック検索により関連する記憶を取り出しプロンプトへ差し込む形で実装されることが多い。
ワークフロー
会話・タスク実行中に得た情報を要約・抽出 → 重要な情報を埋め込みベクトル化しベクトルデータベースへ保存 → 新たな入力時に関連する記憶をセマンティック検索で取得 → プロンプトへ差し込み次の応答生成に利用する。
コード例
ベクトルデータベースを使った長期記憶の保存・検索の骨格
def remember(text: str, vector_db, embed):
vector_db.add(embed(text), metadata={"text": text})
def recall(query: str, vector_db, embed, k: int = 3) -> list[str]:
results = vector_db.search(embed(query), top_k=k)
return [r.metadata["text"] for r in results]利点
- コンテキストウィンドウの上限を超えて、長期的な情報をエージェントに参照させられる
- セッションをまたいでユーザー固有の好みや過去の経緯を踏まえた対応ができる
- 重要な情報だけを要約・保存することで、コンテキストウィンドウを圧迫せずに長期的な文脈を扱える
欠点
- どの情報を記憶し、どの情報を破棄するかの設計(要約・優先度付け等)が難しい
- 誤った、または古くなった記憶が蓄積すると、以後の判断に悪影響を及ぼす場合がある
- 保存された記憶にユーザーの機微な情報が含まれる場合、プライバシー・セキュリティ面の配慮が必要になる
比較
- コンテキストウィンドウ — 短期記憶は多くの場合コンテキストウィンドウ内に保持され、長期記憶はその外側に保存される
- RAG — 長期記憶の実装は、必要な情報を検索して取り出すという点でRAGと共通の技術基盤を使うことが多い
- ベクトルデータベース — 長期記憶は、埋め込みベクトルとしてベクトルデータベースに保存されることが多い
- AgentCore — AWSのAgentCoreは、エージェントの短期記憶・長期記憶をマネージドサービスとして提供するMemoryコンポーネントを持つ
関連用語
よくある質問
エージェントメモリとRAGは同じ?
密接に関連するが同じではない。 RAGは外部知識(文書等)を検索して回答の根拠にする手法全般を指し、エージェントメモリはその中でも、エージェント自身の過去のやり取りや学習内容を保持・活用する用途に焦点を当てた概念。
記憶が古くなった場合はどうする?
有効期限を設けて自動的に破棄する、更新のたびに古い記憶を上書きする、重要度に応じて保持期間を調整するといった運用が一般的。
参考文献
- DocumentationLangChain: Memory