何が発表されたのか
AIエージェントの自律的な動作や、ユーザーに最適化された対話を実現するためには、過去の対話内容やユーザーの好みを永続的に保持する「記憶システム」が不可欠です。本動画では、AIエージェント向けのオープンソース記憶管理フレームワーク「Mem0(メンバーゼロ)」の技術的な内部アーキテクチャが詳細に解説されました。
Mem0は、単なるベクトル検索によるコンテキストの追加にとどまらず、情報のインジェクション(取り込み)、構造化、そして複数のアルゴリズムを組み合わせたハイブリッドな検索(リトリーバル)を統合したシステムです。本発表は、学術的な研究段階ではなく、すでにGitHubで広く公開されており、プロダクション環境での利用を想定した一般提供(GA)レベルの技術解説として位置づけられています。
発表された機能・アップデートの全容
動画内では、プレゼンターの手書きスライドを交えながら、Mem0の設計思想と具体的な処理フローが順を追って説明されました。その主要な機能とアーキテクチャの全容を5つの要素に分けて解説します。
会話記憶と長期記憶の決定的な違い
LLM自体は、入力を受け取って出力を生成する「ステートレス」なシステムです。従来のチャットアプリなどでは、会話履歴をすべてプロンプトに含めてLLMに送信する「会話記憶(Conversational Memory)」が用いられてきました。しかし、この方法では新しい会話セッションが開始されると、過去のコンテキストはすべて失われてしまいます。また、履歴が増えるにつれてコンテキストウィンドウを圧迫し、APIコストの増大や処理速度の低下を招きます。
これに対し、Mem0が提供する「長期記憶(Long-term Memory)」は、会話の外部に完全に独立したデータベースとして構築されます。ユーザーが「ヴィーガンレストランを好む」といった事実を対話の中で述べた場合、システムはその事実だけを抽出して永続的に保存します。これにより、セッションを跨いでも、あるいは異なるAIエージェント(ChatGPTやClaudeなど)を利用していても、同じユーザーの好みを共有し続けることが可能になります。
Mem0を構成する3つのデータベース構造
Mem0は、記憶を効率的に管理するために役割の異なる3つのストアを併用しています。動画内では、この多層的なストレージ構成がMem0の強力なハイブリッド検索を支えていることが示されました。
メインメモリ(Main Memory) ベクトルデータベース(Vector DB)として構築され、抽出された記憶のテキスト本体(「ユーザーはヴィーガンレストランを好む」など)と、それに紐づく豊富なメタデータを保存します。メタデータには、記憶の作成・更新日時、ユーザー/エージェントの識別子、重複排除のためのテキストハッシュ、キーワード検索用のレンマ化(原形化)されたテキスト、有効期限、アトリビューション(どのエージェントが書き込んだか)などが含まれます。
エンティティメモリ(Entity Memory) メインメモリとは別のベクトルデータベースとして管理されます。メインメモリから抽出された特定の「エンティティ」(場所、人物、固有名詞など。例:パリ、モンマルトルなど)を個別のベクトルとして保存し、それらがメインメモリのどの記憶とリンクしているかを管理します。このエンティティメモリが、後述する「エンティティブースト」において極めて重要な役割を果たします。
SQLiteデータベース リレーショナルデータベースとして機能し、主に2つの役割を担います。1つは、ベクトルストアに対するすべての変更履歴を記録するロギングシステムです。もう1つは、直近に送信された10件のメッセージ履歴の保持です。この直近履歴は、代名詞(「それ」「彼」など)が指す対象を正しく理解するためのコンテキストとして、インジェクション時に利用されます。
記憶のインジェクション(取り込み)パイプライン
対話から新しい記憶をデータベースに格納する「インジェクション」のフェーズでは、3つの異なるアプローチが用意されています。1つ目はエージェントのアクションを要約する手続き型記憶(Procedural Memory)、2つ目はメッセージを処理せずにそのまま埋め込んで保存する簡易モード(infer = false)、そして3つ目がLLMを用いて構造化された記憶を抽出する高度なモード(infer = true)です。
動画では、最も洗練されたアプローチである infer = true の詳細なフローが解説されました。エージェントのターンが終了すると、以下の情報がコンテキストとしてLLMパイプラインに送られます。
- ユーザーの基本情報サマリー
- 新しい入力メッセージ
- メインメモリから取得した最近の記憶および関連する記憶
- SQLiteから取得した直近10件の会話履歴
- 会話の日時および現在の日時
LLMはこれらの膨大なコンテキストを分析し、新しい事実のみを抽出して、構造化されたJSON形式で出力します。例えば、「昨日はヴィーガンピザを食べた。本当に美味しかった」という会話から、「ユーザーはヴィーガンレストランを好む」という明確な事実を抽出し、メインメモリとSQLiteに保存します。このとき、すでに全く同じ記憶が存在する場合はハッシュ値によって重複排除が行われます。
ハイブリッドリトリーバル(検索)と3段階のスコアリングシステム
Mem0の最大の特徴は、検索クエリに対して関連する記憶を呼び出す「リトリーバル」のアルゴリズムにあります。単純なベクトル類似度検索だけでは、文脈的に似ているだけの無関係な記憶を拾ってしまう課題があります。これを解決するため、Mem0は3つのスコアを統合したリランキング処理を行います。
まず、クエリを受け取ると、指定された top-k の4倍(または最低60件)の候補を、メインベクトルDBから近似最近傍探索(ANN)によって抽出します。取得した各候補に対し、以下の3つのスコアを計算します。
ベクトル類似度スコア(Vector Similarity Score) クエリと記憶テキストのベクトル空間におけるコサイン類似度。値の範囲は
0.0から1.0です。キーワードマッチングスコア(BM25) クエリと記憶の「レンマ化(原形化)されたテキスト」を比較し、単語の重複度を測定します。これにより、固有名詞や特定のキーワードが正確に一致している記憶の優先度を上げます。値の範囲は
0.0から1.0です。エンティティブースト(Entity Boost) クエリから抽出されたエンティティと、エンティティメモリを照合します。ここで、そのエンティティにリンクされているメモリの数($n_{linked}$)に基づいて重み付けを行います。数式は以下の通りです。
$$W_{memory} = \frac{1}{1 + 0.001 \times (n_{linked} - 1)^2}$$
この仕組みにより、「パリ」のように多くの記憶にリンクされている広範なエンティティよりも、「モンマルトル」のように特定の少数の記憶にしかリンクされていない具体的なエンティティの方が、高いブースト値を得られます。エンティティブーストのスコア範囲は 0.0 から 0.5 です。
最終的に、これら3つのスコア(ベクトル類似度 + BM25 + エンティティブースト)を合算し、最大値である 2.5 で除算することで、0.0 から 1.0 の範囲に正規化された「最終スコア」を算出します。この最終スコアでソートし、上位 top-k 個の記憶のみをエージェントのコンテキストとして返します。
ローカル環境での実行に適したオープンソースLLMの選定
Mem0はデフォルトでOpenAIのAPIなどの商用クローズドモデルを使用しますが、完全にローカルな環境でオープンソースモデルを用いて運用することも可能です。動画では、インジェクションにおけるLLMベースの構造化抽出タスクには、10億(1B)から120億(12B)パラメータ程度の小規模なモデルが適していると説明されました。
具体的には、Metaの「Llama 3」やAlibabaの「Qwen 3(特にQwen3-8B)」などが推奨されています。記憶の抽出タスクは比較的単純な構造化タスクであるため、80億パラメータクラスのモデルであれば、十分な精度を保ちながらローカルマシン上で高速かつ実質無料で実行可能です。




