LLMメモリの選び方と残し方
生成AIの進化にともない、AIエージェントが人間に近い自然な対話を行うことが求められるようになっています。
その中で、注目すべき技術が「記憶の選択と構造化」です。
「全てを記録すればいい」という時代は終わりました。
これからは、“何を残し、どう使うか”という記憶設計が、AI対話の質を決定づける要因となります。
AIエージェントにおける「記憶」の必要性とは?
AIがユーザーとの継続的な関係を築くには、一貫した文脈理解が必要不可欠です。
それを支えるのが「記憶」。ただし、単純なログ保存では意味がありません。
例えば:
-
ユーザーの名前や好みを覚えるだけでは、雑談はできても信頼関係は築けない
-
対話の背景や流れを理解して初めて「話が通じるAI」になる
つまり、AIエージェントに求められるのは「意味ある情報を抽出し、構造的に整理し、活用する力」なのです。
記憶の最適化手法:「Mem0」と「Mem0g」
今回紹介する研究では、LLMエージェントにおける記憶の取り扱いを大きく2つのアーキテクチャに分けて設計しています。
それが、
-
抽象化記憶システム「Mem0」
-
関係構造記憶システム「Mem0g」
この2つは、「何を残すか」と「どう残すか」の問いに対し、それぞれ異なるアプローチを提示しています。
Mem0:重要な情報だけを抽出し、選別・更新する記憶
Mem0の基本構造は以下の通り。
抽出フェーズ:
-
新しい発言が追加されるたびに、直近の履歴と要約(サマリー)を参照しながら
-
意味のある情報だけを抽出
-
この判断は言語モデルによって行われ、スコアリングやルールベースではない点が特徴
更新フェーズ:
-
抽出した内容を、既存の記憶と照合
-
意味的に近い記憶がある場合は「統合」または「上書き」などの処理を選択
-
矛盾する場合は、旧情報を無効化するだけで削除はしない(消すのではなく、“記憶から外す”)
このように、Mem0は「情報の重複・冗長性を抑えながら、鮮度と整合性を保つ」記憶手法です。
Mem0g:知識グラフで関係性を構造化する記憶
一方、Mem0gはより構造的なアプローチを採ります。
ここでの記憶は「三つ組(subject, predicate, object)」として定義され、意味ネットワークとして構築されます。
例:
「アリスはサンフランシスコに住んでいる」
➡️ 「アリス」「住んでいる」「サンフランシスコ」
これをノードとエッジのグラフ構造として記憶し、以下のような特徴があります:
-
関連ノード(人物・場所・出来事)を接続し、意味的な文脈を維持
-
ノードの重複を避けるため、類似ノードの存在確認を実施
-
矛盾する情報は削除せず、「現在は無効」とマーク
この構造は、知識の全体像を保持しやすく、推論や検索の基盤として非常に優れています。
方法の紹介|LLMにおける記憶抽出と構造化の実装ステップ
ここで、読者が実際にこの手法を試せるよう、プロンプト設計の要点を整理します。
Mem0 用プロンプトの構成(抜粋)
-
記憶の内容とタイムスタンプを重視
-
相対表現(「去年」「先月」)を具体的な日付に変換
-
矛盾があれば最新情報を優先
-
回答は「5~6語」で簡潔に(例:「2023年3月に訪問」)
Mem0g 用プロンプトの構成(拡張)
-
基本はMem0と共通だが
-
ナレッジグラフ(関係性メモリ)を併用
-
登場人物の関係・行動・変化を三つ組で記憶
-
複雑な質問に対しても、意味ネットワークから論理的に回答を導出可能
ステップ1:発言から「意味のある要素」を抽出する
元の会話:
(2023年5月8日 午後1時56分)
Caroline:昨日LGBTQ支援グループに行ったんだけど、とても力をもらえたわ。
Melanie:子育てと仕事でてんてこまいよ。
抽出される記憶(Mem0ベース):
-
[2023年5月7日] CarolineはLGBTQ支援グループに参加した
-
[2023年5月8日] Melanieは子育てと仕事に忙殺されている
ここでは、「抽出フェーズ」が自然言語を理解し、行動・状態・出来事を明確なフレーズに要約しています。
Mem0の特徴は、この“自然言語そのままの記録”によって、文脈保持がしやすい点にあります。
ステップ2:記憶を“整理・照合”して保持する(Mem0)
抽出した記憶は、そのまま保存されるわけではありません。
-
同様の内容がすでに記録されていないか?
-
以前の情報と意味的に重複していないか?
-
更新すべきか、新規に追加すべきか?
たとえば、Melanieの「忙しい」という発言が以前にもあった場合、
「繰り返しの傾向がある」と判断してタグ付け(e.g., "慢性的な多忙"
)が行われる可能性もあります。
これにより、AIは**「状態の継続性」や「生活パターン」**を推測できるようになります。
ステップ3:関係性としてグラフ化する(Mem0g)
Mem0gでは、前述の情報を**三つ組(subject-predicate-object)**で記憶します。
Caroline の記憶(Mem0g形式):
-
(Caroline, 参加した, LGBTQ支援グループ)
-
(LGBTQ支援グループ, 開催日, 2023年5月7日)
Melanie の記憶(Mem0g形式):
-
(Melanie, 忙しい, 子育て)
-
(Melanie, 忙しい, 仕事)
このようなグラフ形式にすることで、
**「誰が・いつ・何に関わったか」「どの属性が行動に影響を与えているか」**といった
因果関係や時間軸を含んだクエリが可能になります。
ステップ4:質問に対して記憶を活用し回答する
たとえば後日、AIが以下のような質問を受けたとします:
「Carolineが前に感動したイベントってなんだっけ?」
Mem0であれば:
→ 「5月7日にLGBTQ支援グループに参加し、とても力をもらえたと言っていた」
Mem0gであれば:
→ グラフ内から (Caroline, 参加した, LGBTQ支援グループ)
+ (LGBTQ支援グループ, 感情的影響, ポジティブ)
を結びつけて
→ 「LGBTQ支援グループへの参加(5月7日)」
両者は同じ記憶を扱っていても、形式と応用方法がまったく異なることが分かります。
記憶から“意味ある応答”を導く|精度評価の実例
この記憶が正しく機能しているかを評価するため、以下のようなスキームが用いられます。
🧪 評価フォーマット:
-
質問:「Melanieは最近どんな生活をしてるの?」
-
ゴールドアンサー:「子育てと仕事で忙しい」
-
生成回答:「Melanieは最近子どもと過ごす時間が多くて、仕事も忙しいって言ってたよ」
→ 理由:発言の要点が含まれており、トピックも一致。
→ label: "CORRECT"
このように、評価では「正確さ」「文脈整合性」「話題一致性」が重視されます。
単なるキーワード一致でないことが、LLMならではの評価軸となっています。
実運用へのヒント|記憶をどう設計に取り込むか
実際にプロダクトへ組み込む際は、以下のステップを参考に設計するとよいでしょう。
実装ロードマップ:
-
会話ログの整形と前処理(スピーカー・時間情報の明確化)
-
意味的な要約/三つ組抽出(Mem0とMem0gのどちらを採用するか選択)
-
記憶の重複チェックと更新処理(新旧比較と上書き)
-
インデックス化とクエリ対応の整備(検索速度と精度のバランス設計)
-
応答生成時のメモリ参照戦略の実装(常に呼ぶ?必要時だけ?)
このプロセスを回すことで、LLMエージェントが
**“ユーザーと関係を育てるAI”**としての第一歩を踏み出すことになります。