エージェントのメモリ:短期と長期をどう持たせるか
会話履歴はすぐ溢れ、エージェントは昨日の文脈を忘れる。短期メモリと長期メモリを分けて設計し、有限なコンテキスト窓に何を載せ何を外部へ逃がすかを、想起と要約の観点から整理できる。
- エージェントのメモリは、直近のやり取りを保持する短期メモリと、経験を外部に貯める長期メモリに分かれる。短期は会話履歴やスクラッチパッドとしてコンテキスト窓に載るが揮発し、長期はベクトルDBやファイルに書き出してセッションを跨いで持続する。
- 要点はコンテキスト窓の有限性にある。トークン上限を超えた履歴は溢れるため、直近だけ残して古い部分を要約へ畳む圧縮が要る。何を覚え何を忘れるかを決め、要約による情報損失と想起の精度を天秤にかけるのが短期メモリ設計の核心だ。
- 長期メモリは書き込みのタイミングと想起(retrieval)の設計が肝になる。会話の要点や学びを外部ストアへ保存し、必要時に関連するものだけを引いて文脈へ戻す。技術はRAGに近いが、外部知識ではなく自分の経験を貯めて再利用する点が異なる。
横にスクロール
どんなパターンか
大規模言語モデルそのものは、本質的にステートレスだ。一回の推論は、そのときプロンプトに載っていた情報だけで完結し、応答を返し終えれば直前のやり取りさえ保持しない。それでもチャットが会話として成立して見えるのは、アプリケーション側が過去の発言をまとめて毎回プロンプトへ詰め直しているからにすぎない。エージェントに「覚えている」ように振る舞わせる仕組みは、モデルの外側で人間が設計するものだ。
この記憶の設計は、性質の異なる二層に分けて考えると整理しやすい。ひとつは短期メモリで、直近の会話履歴や、思考の途中経過を書き留めるスクラッチパッドがこれにあたる。いずれもコンテキスト窓、すなわちその回の推論に渡すプロンプトの中に直接載る情報であり、セッションが終われば消える揮発的な記憶だ。もうひとつは長期メモリで、会話の要点や学んだ事実を外部のストアへ書き出しておき、必要になったときに想起してプロンプトへ戻す。こちらはセッションを跨いで持続する。
人間の記憶になぞらえるなら、短期メモリは目の前の作業を支えるワーキングメモリ、長期メモリは経験として蓄えられる長期記憶に近い。容量の限られた作業台の上で今の仕事を回しつつ、そこに載りきらないものは棚へしまい、また要るときに取り出す。エージェントのメモリ設計とは、この作業台と棚の役割分担を決めることだと言ってよい。
二つのメモリは択一ではなく、協調して働く。長期ストアから想起した内容は、最終的に短期メモリ、すなわちコンテキスト窓の一部として推論に渡される。長期メモリは、短期メモリへ載せ直す材料を供給する裏方だと捉えると、両者の関係がつかみやすい。
仕組み
両者の違いを、置き場所・持続・容量・用途の四つの観点で対比すると輪郭がはっきりする。
| 観点 | 短期メモリ | 長期メモリ |
|---|---|---|
| 場所 | コンテキスト窓(プロンプト内) | 外部ストア(ベクトルDB・ファイル) |
| 持続 | セッション内で揮発 | セッションを跨いで永続 |
| 容量 | トークン上限に縛られ有限 | 実質的に無制限 |
| 用途 | 直近の会話と作業中の中間状態 | 経験・知識・過去の対話の蓄積 |
短期メモリの実体は、プロンプトに詰め込まれる一連のテキストだ。システムプロンプト、これまでの会話履歴、ツールを呼んだ結果、そして途中の推論を書き留めたスクラッチパッド。これらが積み重なって一回分の入力を構成する。問題は、この入力に上限があることだ。モデルが一度に読めるトークン数、すなわちコンテキスト窓は有限であり、会話が長引くほど履歴は膨らみ、やがて上限に達する(入力がどうトークンへ分割されるかはトークナイザを参照)。
上限を超えた履歴をそのまま切り捨てれば、古い文脈は失われる。そこで要約と圧縮の戦略が要る。よく使われるのは、直近の数ターンは原文のまま残し、それより古い部分を短い要約へ畳んでいくやり方だ。会話が進むたびに要約を更新していく方式もあれば、一定の長さに達したところで履歴全体をまとめて圧縮する方式もある。いずれも狙いは同じで、限られた窓の面積に、できるだけ密度の高い情報を載せることにある。
長期メモリの実体は、コンテキスト窓の外に置かれた永続的なストアだ。埋め込みベクトルで類似検索するベクトルDB、単純なキーバリュー、あるいはファイルやリレーショナルDBが使われる。ここで設計上の勘所は二つある。書き込みと想起だ。書き込みでは、何を、いつ保存するかを決める。会話の終わりに要点を要約して残す、重要なイベントが起きた時点で都度記録する、ユーザーの嗜好を抽出して蓄える、といった判断がここに含まれる。想起では、今の状況に関連する記憶だけをクエリで引き出し、プロンプトへ差し込む。
この想起の仕組みは、RAGと技術的にはほとんど同じだ。関連する情報を外部から検索し、生成の文脈に加える流れは共通する。違いは何を貯めるかにある。RAGが対象とするのは、あらかじめ用意された外部の知識やドキュメントだ。一方でメモリが貯めるのは、エージェント自身が対話や作業を通じて得た経験である。同じ検索技術を、他人の知識を引くために使うのか、自分の過去を思い出すために使うのか、という目的の違いが両者を分ける。
「外部の知識を引く」のがRAG、「自分の経験を貯めて引く」のがメモリ、と覚えるとよい。実装は同じベクトル検索でも、書き込むデータの出所が違う。メモリでは、エージェント自身が生成した要約や気づきが、次の想起の対象になる。
実際のエージェントでは、この二層が一つのループとして回る。セッションの開始時に、長期ストアから関連する記憶を想起して短期メモリの初期状態を組み立て、対話を進めながら短期メモリを更新し、区切りのよいところで新たな要点を長期ストアへ書き戻す。この読み出しと書き込みの往復が、セッションを跨いだ連続性を生む。短期メモリだけでは一度きりの会話に閉じ、長期メモリだけでは今この瞬間の文脈を欠く。両者がループとして噛み合って初めて、エージェントは学び続ける主体のように振る舞える。
使いどころと注意
具体的な場面に当てはめると要点がつかみやすい。継続的にコードを書くエージェントなら、プロジェクトの規約や過去に踏んだ失敗は長期メモリに置き、今開いているファイルや直前のエラー出力は短期メモリに置く。カスタマーサポートのエージェントなら、ユーザーの契約内容や過去の問い合わせ履歴は長期に、今の会話の流れは短期に、と自然に振り分けられる。どちらの層に何を置くかは、その情報が一回の対話で閉じるのか、次以降のセッションにも効くのかで決まる。
メモリを持たせるうえで最初に向き合う問いは、何を覚え、何を忘れるかだ。すべてを保存すれば安心に思えるが、実際は逆効果になりやすい。ストアが肥大化すれば想起のノイズが増え、関連の薄い記憶まで引いてしまう。結果として、肝心の情報が埋もれ、トークンとコストだけが膨らむ。忘れることは失敗ではなく、記憶を有用に保つための積極的な設計判断だと捉えたい。
書き込みのタイミングにも注意が要る。細かく書きすぎればストアは断片で溢れ、古い記憶と新しい事実が矛盾しはじめる。ユーザーの居住地が変わった、以前の決定が覆った、といった更新をどう扱うかは、あらかじめ方針を決めておくべきだ。多くの場合はタイムスタンプを持たせ、矛盾したときは新しい記憶を優先する。想起の側でも、単なる類似度だけでなく、鮮度や重要度を加味して並べ替えると精度が上がる。
要約による情報の損失も見落とせない。圧縮は不可逆であり、いちど畳んだ細部は元に戻らない。そのとき不要に見えた数値や固有名詞が、後の対話で決定的に効いてくることがある。どこまで縮めてよいかは、エージェントの用途しだいで変わる。事実の正確さが問われる場面ほど、要約は慎重にすべきだ。
コンテキスト窓が大きいモデルを使えばメモリ設計は要らない、という発想は危うい。窓が広くても、長い入力の中ほどに置かれた情報は見落とされやすいことが知られている。加えて、載せるトークンが増えるほどコストとレイテンシは上がる。窓が広がっても、何を載せ何を外へ逃がすかという判断は消えない。
もう一点、長期メモリはユーザーに関する情報を持続的に蓄えるため、プライバシーへの配慮が欠かせない。何を保存し、いつ消せるようにするかは、機能である以上に責任の問題だ。保存する範囲を必要最小限にとどめる設計は、想起のノイズを減らすうえでも理にかなっている。
まとめ
エージェントのメモリは、揮発的で有限な短期メモリと、永続的で外部にある長期メモリの二層で捉えるのが基本だ。短期メモリはコンテキスト窓に直接載る直近の文脈であり、その有限性ゆえに要約と圧縮が避けられない。長期メモリは経験をストアへ書き出し、必要なときに想起して窓へ戻す。設計の核心は、限られたコンテキスト窓をどう使い、何を外へ逃がし、いつ呼び戻すかという配分にある。関連する設計パターンはエージェント設計パターンから辿れる。
AIエージェント設計の記事ガイド
エージェントのメモリ:短期と長期をどう持たせるかを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
AIエージェント
比較で見る軸
難易度: advanced / カテゴリ: AIエージェント設計 / タグ数: 4
導入後に効く点
要点はコンテキスト窓の有限性にある。トークン上限を超えた履歴は溢れるため、直近だけ残して古い部分を要約へ畳む圧縮が要る。何を覚え何を忘れるかを決め、要約による情報損失と想起の精度を天秤にかけるのが短期メモリ設計の核心だ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AIエージェント設計
- タグ数
- 4
判断チェックリスト
- 自社の用途が「AIエージェント / LLM」に近いか確認する。
- 強みである「エージェントのメモリは、直近のやり取りを保持する短期メモリと、経験を外部に貯める長期メモリに分かれる。短期は会話履歴やスクラッチパッドとしてコンテキスト窓に載るが揮発し、長期はベクトルDBやファイルに書き出してセッションを跨いで持続する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。