powered by TechFeed
表示モード
ハウツー

AIエージェントの「毎回ゼロから説明し直し」問題を解決する — Mem0でセッションをまたいだ長期記憶を実装する方法

11月7日、Abid Ali Awanが「How to Give Your AI Agent Memory」と題した記事を公開した。この記事では、OpenAI Agents SDKとMem0を組み合わせてAIエージェントにセッションをまたいだ長期記憶を持たせる実装方法について詳しく紹介されている。

11月7日、Abid Ali Awanが「How to Give Your AI Agent Memory」と題した記事を公開した。この記事では、OpenAI Agents SDKとMem0を組み合わせてAIエージェントにセッションをまたいだ長期記憶を持たせる実装方法について詳しく紹介されている。


AIエージェントはツールを使い、複雑なタスクをこなせる。しかし多くの実装では、セッションが終わると会話の内容をすべて忘れてしまう。毎回ゼロから説明し直す体験は、エージェントの実用性を大きく損なう。

この問題はRAGやファインチューニングでは根本的に解消しにくい。RAGはドキュメント検索には強いが「このユーザーの好み」を動的に蓄積する用途には向かない。ファインチューニングはコストと再学習コストが高い。これに対してユーザーごとの記憶を外部ストレージに持たせ、必要な部分だけを動的に引き出すアプローチは、現実的な代替手段として注目を集めている。

この問題を解消するのが長期記憶(Long-term Memory)の仕組みだ。本記事で紹介されるアーキテクチャでは、OpenAI Agents SDKとMem0を組み合わせる。さらに、コーディングエージェントのOpenCode(AIを活用したターミナルベースのコーディング支援ツール。公式サイト)に同じ記憶システムを接続する方法も示されている。


エージェント記憶の基本構造

記憶には2種類ある。

  • 短期記憶(Short-term): 現在の会話内のメッセージや一時的な状態
  • 長期記憶(Long-term): セッションをまたいで保持される設定、決定事項、目標、過去の経験

重要なのは検索(Retrieval)の仕組みだ。過去の会話すべてをプロンプトに詰め込むのではなく、現在のリクエストに関連する情報だけをセマンティック検索で引き出す。コンテキストウィンドウを圧迫せずに、文脈を維持できる。

Mem0はこの「書き込み・検索・更新」をAPIとして提供するマネージドサービスだ。公式ドキュメントではセルフホスト構成も案内されており、データをクラウドに送りたくない用途にも対応できる。


Mem0 + OpenAI Agents SDKで実装する

インストールと初期設定

pip install openai-agents mem0ai
export OPENAI_API_KEY="your-openai-key"
export MEM0_API_KEY="your-mem0-key"
from agents import Agent, Runner, function_tool
from mem0 import MemoryClient

memory = MemoryClient()
USER_ID = "abid"

USER_IDでユーザーごとに記憶を分離する。複数ユーザーを扱う場合はここを切り替えるだけでよい。

記憶の読み書きツール

エージェントに渡すツールは2つ。まず検索ツール:

@function_tool
def search_memory(query: str) -> str:
    """Search for relevant memories about the user."""
    results = memory.search(
        query=query,
        filters={"user_id": USER_ID},
        top_k=5,
    )
    memories = results.get("results", [])
    if not memories:
        return "No relevant memories found."
    return "\n".join(
        f"- {item['memory']}"
        for item in memories
    )

Mem0はセマンティック検索を使うため、表現が多少違っても意味が近ければヒットする。

次に書き込みツール:

@function_tool
def save_memory(content: str) -> str:
    """Save useful long-term information about the user."""
    memory.add(
        messages=[{"role": "user", "content": content}],
        user_id=USER_ID,
    )
    return "Memory saved."

Mem0側が内容を処理し、長期保存する価値のある情報だけを抽出して保存する。会話全体を丸ごと保存するわけではない。

エージェントの組み立て

agent = Agent(
    name="Memory Assistant",
    model="gpt-4o",  # 元記事記載のモデル名を使用(※)
    instructions="""
    You are a personal assistant with long-term memory.
    Always call search_memory before answering, even for general questions.
    When a relevant memory is found, acknowledge it naturally at the start,
    for example: "Oh, I remember you prefer...", then use it.
    Save durable preferences, goals, and facts; confirm each save in one
    sentence. Skip greetings, temporary info, and duplicates.
    """,
    tools=[search_memory, save_memory],
)

※元記事のコードサンプルには gpt-5.6-luna というモデル名が記載されているが、2026年11月時点でOpenAIが公式に提供しているモデル名とは一致しない。元記事の表記をそのまま転載するとコードが動作しない可能性があるため、上記では一般的な代替例を示した。実際に使用するモデル名はOpenAIのモデル一覧で確認していただきたい。

instructionsで「何を検索し、何を保存し、何を無視するか」を制御している点が設計上のキモだ。保存基準をシステムプロンプトで制御することで、無関係な情報が蓄積されるノイズを防ぐ。

動作確認

print(chat("Remember that I prefer Python and use uv for managing my projects."))
# → "I'll remember that you prefer Python and use `uv` to manage your projects."

print(chat("How should I set up my next Python project?"))
# → "I remember you prefer Python and use uv for project management. A solid setup:
#    uv init my-project ..."

Pythonプロセスを再起動しても、Mem0に保存された記憶は引き続き取得できる。


OpenCodeへのMCP接続(コマンド1本)

自前でPythonツールを書かなくても、Mem0はMCP(Model Context Protocol)サーバーを公式に提供している。MCPとは、AIエージェントが外部ツールと標準化されたプロトコルで通信するための仕組みで、Anthropicが主導する規格だ。MCP公式仕様では、ツール接続の標準化によってエージェント実装の再利用性を高めることを目指している。

OpenCodeへの接続はコマンド1本で完了する:

npx mcp-add \
  --name mem0-mcp \
  --type http \
  --url "https://mcp.mem0.ai/mcp" \
  --clients "opencode"

Mem0 MCPが提供するオペレーションはadd_memory、search_memories、get_memories、update_memory、delete_memoryなど。接続確認はopencode mcp listで行える。

OpenCodeを再起動後、「uvをpipの代わりに使うのが好み」と伝えると、次のセッションでプロジェクト初期化方法を聞いたときにその設定を考慮した回答が返ってくる。


まとめと展望

ユーザーの好みを覚えるパーソナルアシスタント、意思決定の経緯を追跡する社内ツール、フレームワーク設定を記憶するコーディングエージェントなど、元記事ではこれらを具体的なユースケースとして挙げている。

注目すべきは実装の軽さだ。外部ストレージとの接続・検索・保存がそれぞれ数十行のコードで完結し、既存のエージェントへの後付けも現実的な範囲に収まる。ChatGPTの記憶機能と同等の体験を自前のエージェントアプリで再現できるという点は、プロダクト開発者にとって素直に魅力的な選択肢だろう。一方で、何をどこまで記憶させるかの設計判断——保存基準、記憶の有効期限、ユーザーによる削除手段——はアプリケーション側の責任として残る。記憶機能は実装するだけでなく、適切に「忘れさせる」設計も同時に考えておく必要がある。


参考リンク

詳細はHow to Give Your AI Agent Memoryを参照していただきたい。