📝

Mem0とMem0gの論文を読んで試してみた

に公開

はじめに

大規模言語モデル(LLM)は、賢いけれど記憶がない。どんなに優れた応答をしても、コンテキストウィンドウを超えた瞬間に「さっきの話」を忘れてしまう。
ただし最近はMCPの流行などもあってコンテキスト長はあまり消費したくないムーブもあり、外部保持したメモリの研究が流行っているらしい。

2025年4月に発表された論文
Mem0: Memory Optimization for Long-term Conversational Agents を読んでみた。
LLMの記憶をどう設計すれば 「正確で、軽く、実運用に耐える」かを考え、評価している。


1. Mem0とは何か

Mem0は、エージェントの長期会話を「記憶」として扱う仕組み。
大きく4段階で動く:

  1. Extraction(抽出)
    会話ログから「長期的に価値のある事実」だけを抜き出す。
    例:ユーザーの予定、嗜好、関係者の名前など。

  2. Update(統合)
    既存の記憶と照合し、重複・補足・矛盾を検出して更新。
    新しい情報を足し、古いものを上書きする。

  3. Storage(保存)
    抽出した事実をベクトルDBなどに保存。
    “メモリ”は自然言語テキストとして保持される。

  4. Retrieval(検索)
    質問に応じて、必要な記憶だけを取り出し、LLMに渡す。
    つまり、すべての履歴を投げずに「思い出す」ことができる。

この設計により、Mem0はトークン消費とレイテンシを大幅に削減しつつ、
対話の一貫性を保つことに成功している。

図で表すとこんなかんじ。


2. Mem0g: 記憶を“構造化”する拡張版

Mem0gはMem0の発展形。
会話中の情報をグラフ構造で保存し、
エンティティ(人・場所・出来事)とその関係(住んでいる・働いている・訪れたなど)を
トリプレット (head, relation, tail) で抽出するのがポイントらしい。
Neo4jというデータベースを使っているらしいが私は使ったことがない, GraphRAGという言葉が登場して1年ちょっと経ったが, 実運用されている率ってどれぐらいなんだろうか.

例:
(Alice) -[lives_in]-> (San Francisco)


3. 評価:LOCOMOベンチマーク

研究チームは、LOCOMOという長期会話データセットを使って性能を検証した。
1つの会話が平均600ターン(約26,000トークン)にも及ぶ、
まさに“記憶力テスト”のようなデータセット。

質問タイプは4種類:

  • 🧩 Single-hop:1つの発話に答えがある質問 (ex: Aliceの犬の名前は?)
  • 🔗 Multi-hop:複数の発話をまたぐ質問 (ex: Aliceの犬を預かっているのは誰?)
  • 🕰️ Temporal:時間順序を理解する質問 (ex: Aliceは引っ越す前と後でどこに住んでいた?)
  • 🌍 Open-domain:文脈を越えた自由質問 (ex: Aliceは音楽が好きそう?)

4. 結果まとめ

質問タイプ 勝者 ポイント
Single-hop Mem0 単一事実の検索で最高スコア。
Multi-hop Mem0 複数発話の統合推論で他を圧倒。
Temporal Mem0g 時系列の理解で圧倒的に強い。
Open-domain Zep(僅差) 外部知識を統合できる設計が有利。

Mem0はベンチマーク全体で安定した高スコアを示した。
しかも、レイテンシを大きく削減したとも書いてある.


5. なぜMem0が効くのか

  • 自然言語ベースの記憶が柔軟で密度が高い
  • **Conflict detection(矛盾検出)**で古い情報を自動更新
  • 必要最小限の記憶 を保持 することでレイテンシの性能を改善

つまり、Mem0は「思い出すべきことだけを覚えておく」賢いメモリらしい.
Mem0でハイスコアを出したようなタスクだとMem0gは冗長すぎるようだ.


6. Mem0gが光る場面

グラフ構造は、すべてのタスクで有利とは限らない。
シンプルな質問ではオーバーヘッドが生じるが、
時間的・関係的文脈が絡む質問では強力

特に「イベントの順序」や「人物の関係性」を追うタスクでは、
Mem0gが明確に上回った。

テストコードを作ってみた

Mem0はすでに公式のGitがある.
https://github.com/mem0ai/mem0/tree/main

手早く試したいならこれが一番参考になりそうだ。
https://github.com/mem0ai/mem0/blob/main/docs/v0x/quickstart.mdx

これを参考に私も簡単なテスト用スクリプトを作ってみた.
Mem0については動作は多少確認したが、Mem0gはいまいちまだよくわかっていない部分も多いので, 使う場合は要検証.
https://github.com/otsukimi-tanuki/mem0_test

次はLOCOMOのデータセットを使って論文の結果を試してみたい.

Discussion