すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:AnalyticDB for MySQL で Mem0 を利用するガイド

最終更新日:Jun 23, 2026

Mem0 ("mem-zero") は、ステートレスな AI エージェントを長期記憶を持つコンテキスト認識システムに変換するインテリジェントなメモリレイヤーです。これはメモリの自動抽出、統合、取得によって実現されています。このチュートリアルでは、AnalyticDB for MySQL をベクトルストアとして使用し、メモリの追加、取得、更新、検索、削除といった主要なメモリ操作について説明します。

事前準備

開始する前に、以下の準備を完了してください。

  1. AnalyticDB for MySQL クラスターを作成します。コサイン類似度などのベクトル検索機能をサポートするバージョンであることを確認してください。詳細については、「Enterprise Edition、Basic Edition、および Data Lakehouse Edition のクイックスタート」をご参照ください。

  2. AnalyticDB for MySQL をサポートする Mem0 フレームワークのバージョンを取得してください。

    説明

    インストールパッケージを取得するには、DingTalk (DingTalk ID: x5v_rm8wqzuqf) で Alibaba Cloud サービスサポートにお問い合わせください。

  3. Model Studio の API キーを取得してください。このチュートリアルでは、Alibaba Cloud Model Studio を使用します。サービスを有効化し、API キーを取得してください。詳細については、「API キーの取得」をご参照ください。

利用ガイド

環境の準備

  • AnalyticDB for MySQL の準備

    1. AnalyticDB for MySQL クラスターで、このチュートリアル用のデータベースを作成します。

      CREATE DATABASE mem0;
    2. パブリックネットワーク経由で接続する場合は、AnalyticDB for MySQL コンソールでクラスターのパブリックネットワークアクセスを有効にします。次に、デモ環境のパブリック IP アドレスをホワイトリストに追加します。

  • Mem0 と依存関係のインストール

    1. Python 環境の確認: Python がインストールされていることを確認します。このチュートリアルは Python 3.12.2 で検証済みです。

      # macOS の場合、Python のバージョンを確認します。インストールされていない場合は、https://www.python.org/ からインストールしてください。
      python3 --version
      
      # Linux の場合、Python のバージョンを確認します。インストールされていない場合は、yum を使用してインストールします: sudo yum install python
      python --version
    2. Mem0 フレームワークのインストール: 取得したファイルを解凍し、必要な依存関係をインストールします。

      # 解凍とインストール
      unzip mem0.zip 
      cd mem0
      pip install .
      pip install pymysql dbutils

設定と初期化

  • 環境変数の設定:

    セキュリティのため、大規模言語モデル (LLM) の API キーを環境変数として設定します。

    echo "export DASHSCOPE_API_KEY='<YOUR_DASHSCOPE_API_KEY>'" >> ~/.bashrc
    # オプション。デフォルトはシンガポールエンドポイントです。
    echo "export DASHSCOPE_BASE_URL='https://dashscope-intl.aliyuncs.com/compatible-mode/v1'" >> ~/.bashrc   
    
    source ~/.bashrc
    
    # 設定が有効かどうかを確認します
    echo $DASHSCOPE_API_KEY
    echo $DASHSCOPE_BASE_URL  
  • Mem0 インスタンスの初期化:

    Python スクリプトで、Memory インスタンスを設定して初期化します。

    • LLM 設定: Alibaba Cloud Model Studio の qwen-plus モデルを使用します。

    • エンベッダー設定: Alibaba Cloud Model Studio の text-embedding-v4 モデルを使用し、ベクトル次元は 1536 です。

    • ベクトルストア設定: aliyun_adb を使用し、AnalyticDB for MySQL の接続情報を入力します。

    from mem0 import Memory
    
    # この例では、ベクトル次元が 1536 の adb インスタンスに接続する必要があります。
    config = {
        "llm": {
            "provider": "bailian",
            "config": {"model": "qwen-plus"},
        },
        "embedder": {
            "provider": "bailian",
            "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
        },
        "vector_store": {
            "provider": "aliyun_adb",
            "config": {
                "host": "<adb host>",
                "port": 3306,
                "database": "mem0",
                "user": "<your user name>",
                "password": "<your password>",
                "collection_name": "adb_mem0_demo"
            }
        }
    }
    
    
    """
    Mike と Julia という 2 人のユーザーがいると仮定します。
    1. Mike はベジタリアンで、果物とバスケットボールが好きです。
    2. Julia は肉食で、ステーキとバドミントンが好きです。
    """
    
    m = Memory.from_config(config_dict=config)

主要なメモリ操作のデモ

  • メモリの追加と取得:

    m.add() メソッドはユーザーのメモリを追加し、m.get_all() はそのユーザーのすべてのメモリを取得します。

    • コード

      # Mike のメモリを追加
      result = m.add("I'm a vegetarian", user_id="Mike")
      memory_id = result["results"][0]["id"]
      print("Add a memory for Mike: " + "I'm a vegetarian" + ", result => ", result, "\n")
      
      
      result = m.add("I like durian", user_id="Mike")
      print("Add a memory for Mike: " + "I like durian" + ", result => ", result, "\n")
      
      # ユーザーのすべてのメモリを取得
      result = m.get_all(user_id="Mike")
      print("Get all memories for user: " + "Mike" + ", result => ", result, "\n")
    • 結果の分析
      返された結果は、Mike の 2 つのメモリとそのメタデータ (ID、内容、作成時刻など) を含むリストです。















      Add a memory for Mike: I'm a vegetarian, result =>  {'results': [{'id': '32ac2932-10da-422b-beba-bb5a2b4666aa', 'memory': "I'm a vegetarian", 'event': 'ADD'}]} 
      
      Add a memory for Mike: I like durian, result =>  {'results': [{'id': '40098c00-9f96-4486-af8b-5c79612fea10', 'memory': 'I like durian', 'event': 'ADD'}]} 
      
      Get all memories for user: Mike, result =>  {'results': [{'id': '40098c00-9f96-4486-af8b-5c79612fea10', 'memory': 'I like durian', 'hash': 'dfd43e3d0a6ddc82cda440e0a1d39e7f', 'metadata': None, 'created_at': '2025-10-29T20:52:54.156926-07:00', 'updated_at': None, 'user_id': 'Mike'}, {'id': '32ac2932-10da-422b-beba-bb5a2b4666aa', 'memory': "I'm a vegetarian", 'hash': '27f3478f622dd27dd71969f131bd886f', 'metadata': None, 'created_at': '2025-10-29T20:52:51.126628-07:00', 'updated_at': None, 'user_id': 'Mike'}]} 
  • メモリの更新と削除:

    Mem0 は、メモリ ID による手動削除、または新しいメモリを追加する際の自動的な矛盾解決をサポートします。

    • コード

      result = m.delete(memory_id=memory_id)
      print("Manually delete a memory: " + "I'm a vegetarian" + ", result => ", result, "\n")
      
      result = m.add("I hate things that taste like durian", user_id="Mike")
      print("Automatically delete a contradictory historical memory for Mike: " + "I like durian" + ", result => ", result, "\n")
      
      # ユーザーのすべてのメモリを取得
      result = m.get_all(user_id="Mike")
      print("Get all memories for user: " + "Mike" + ", result => ", result, "\n")
    • 結果の分析

      Manually delete a memory: I'm a vegetarian, result =>  {'message': 'Memory deleted successfully!'} 
      
      Automatically delete a contradictory historical memory for Mike: I like durian, result =>  {'results': [{'id': 'dc308443-ae8c-4cb3-851f-060adfc39eaf', 'memory': 'I like durian', 'event': 'DELETE'}]} 
      
      Get all memories for user: Mike, result =>  {'results': [{'id': 'b1f9e8a7-6d5c-4b3a-9f8e-7c6a5b4d3e2f', 'memory': 'I hate things that taste like durian', 'hash': 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6', 'metadata': None, 'created_at': '2025-10-29T20:52:58.123456-07:00', 'updated_at': None, 'user_id': 'Mike'}]} 
      • 矛盾するメモリを追加した後、add メソッドが返す結果には DELETE イベントが含まれます。これは、古い矛盾するメモリ ("I like durian") が自動的に削除されたことを示します。

      • get_all を再度呼び出すと、古いメモリは削除されています。これは、Mem0 の適応性と自己一貫性の機能を示します。

  • メモリの取得と検索:

    Mem0 は、メタデータフィルターを使用した正確な取得と、意味的な類似検索をサポートします。

    1. データの準備: Mike と Julia のメモリに agent_idmetadata を追加します。

      • コード

        # Mike のメモリ
        result = m.add("I'm a vegetarian", user_id="Mike", agent_id="diet-assistant")
        print("Add a memory for Mike: " + "I'm a vegetarian" + ", result => ", result, "\n")
        
        result = m.add("I like durian, watermelon and strawberries", user_id="Mike", metadata={"category": "hobbies"})
        print("Add a memory for Mike with metadata: " + "I like durian, watermelon and strawberries" + ", result => ", result, "\n")
        
        result = m.add("I like playing basketball", user_id="Mike", agent_id="fitness-assistant")
        print("Add a memory for Mike: " + "I like playing basketball" + ", result => ", result, "\n")
        
        
        # Julia のメモリ
        result = m.add("I'm a carnivore", user_id="Julia", agent_id="diet-assistant")
        print("Add a memory for Julia: " + "I'm a carnivore" + ", result => ", result, "\n")
        
        result = m.add("I like steak", user_id="Julia", metadata={"category": "hobbies"})
        print("Add a memory for Julia: " + "I like steak" + ", result => ", result, "\n")
        
        result = m.add("I like playing badminton", user_id="Julia", agent_id="fitness-assistant")
        print("Add a memory for Julia: " + "I like playing badminton" + ", result => ", result, "\n")
        
      • 結果の分析

        Add a memory for Mike: I'm a vegetarian, result =>  {'results': [{'id': 'a0fadb7e-c6b7-46b2-b0b8-6b036d879015', 'memory': "I'm a vegetarian", 'event': 'ADD'}]} 
        
        Add a memory for Mike with metadata: I like durian, watermelon and strawberries, result =>  {'results': [{'id': 'efec6c25-c2a7-454f-8344-367018c5b607', 'memory': 'I like durian, watermelon and strawberries', 'event': 'ADD'}]} 
        
        Add a memory for Mike: I like playing basketball, result =>  {'results': [{'id': '75da451c-dbf7-45aa-b9ab-72aab54df7b8', 'memory': 'I like playing basketball', 'event': 'ADD'}]} 
        
        Add a memory for Julia: I'm a carnivore, result =>  {'results': [{'id': '93a03639-195e-40ef-9f5f-55d366b76333', 'memory': "I'm a carnivore", 'event': 'ADD'}]} 
        
        Add a memory for Julia: I like steak, result =>  {'results': [{'id': 'e30faceb-ba71-4b27-b052-28863f26abf9', 'memory': 'I like steak', 'event': 'ADD'}]} 
        
        Add a memory for Julia: I like playing badminton, result =>  {'results': [{'id': '90d45867-b198-415f-99e8-7375b4c6c35b', 'memory': 'I like playing badminton', 'event': 'ADD'}]} 
    2. 正確なフィルタリングによる取得: get_all メソッドにフィルター条件を渡します。

      • コード

        # ユーザーに属する特定のエージェントのすべてのメモリを取得
        result = m.get_all(user_id="Mike", agent_id="fitness-assistant")
        print("Get all memories for a specific agent belonging to user: " + "Mike" + ", result => ", result, "\n")
        
        
        # フィルターを使用してユーザーに属するすべてのメモリを取得
        result = m.get_all(user_id="Julia", filters={"category": "hobbies"})
        print("Get all memories belonging to a user with a filter: " + "Julia" + ", result => ", result, "\n")
      • 結果の分析

        Get all memories for a specific agent belonging to user: Mike, result =>  {'results': [{'id': '75da451c-dbf7-45aa-b9ab-72aab54df7b8', 'memory': 'I like playing basketball', 'hash': '000b24fa8e8f76134286d2c4626c036d', 'metadata': None, 'created_at': '2025-10-30T00:13:08.390949-07:00', 'updated_at': None, 'user_id': 'Mike', 'agent_id': 'fitness-assistant'}]} 
        
        Get all memories belonging to a user with a filter: Julia, result =>  {'results': [{'id': 'e30faceb-ba71-4b27-b052-28863f26abf9', 'memory': 'I like steak', 'hash': '6e7129fc2010e93e94c943dbf6f69246', 'metadata': {'category': 'hobbies'}, 'created_at': '2025-10-30T00:13:14.631531-07:00', 'updated_at': None, 'user_id': 'Julia'}]} 
    3. 類似検索: search メソッドを使用して、意味的な検索を実行します。結果は、類似度スコア (score) の降順でランク付けされます。

      • コード

        # 特定のエージェントに関連するメモリを検索
        result = m.search("Who likes playing badminton better?", agent_id="fitness-assistant")
        print("Search memories: " + "Who likes playing badminton better?" + ", result => ", result, "\n")
        
        # 特定のエージェントに関連するメモリを検索
        result = m.search("Who will celebrate on International Vegetarian Day?", agent_id="diet-assistant")
        print("Search memories: " + "Who will celebrate on International Vegetarian Day?" + ", result => ", result, "\n")
        
        # 特定のユーザーのメモリを検索
        result = m.search("What kind of fruit do you like?", user_id="Mike")
        print("Search memories: " + "What kind of fruit do you like?" + ", result => ", result, "\n")
        
        # 特定のユーザーとエージェントのメモリを検索
        result = m.search("What sport do you like?", user_id="Julia", agent_id="fitness-assistant")
        print("Search memories: " + "What sport do you like?" + ", result => ", result, "\n")
        
      • 結果の分析

        Search memories: Who likes playing badminton better?, result =>  {'results': [{'id': '90d45867-b198-415f-99e8-7375b4c6c35b', 'memory': 'I like playing badminton', 'hash': '304d03421834255d1650b46877b3785b', 'metadata': None, 'score': 0.82532454, 'created_at': '2025-10-30T00:13:18.218251-07:00', 'updated_at': None, 'user_id': 'Julia', 'agent_id': 'fitness-assistant'}, {'id': '75da451c-dbf7-45aa-b9ab-72aab54df7b8', 'memory': 'I like playing basketball', 'hash': '000b24fa8e8f76134286d2c4626c036d', 'metadata': None, 'score': 0.56634325, 'created_at': '2025-10-30T00:13:08.390949-07:00', 'updated_at': None, 'user_id': 'Mike', 'agent_id': 'fitness-assistant'}]} 
        
        Search memories: Who will celebrate on International Vegetarian Day?, result =>  {'results': [{'id': 'a0fadb7e-c6b7-46b2-b0b8-6b036d879015', 'memory': "I'm a vegetarian", 'hash': '27f3478f622dd27dd71969f131bd886f', 'metadata': None, 'score': 0.5640734, 'created_at': '2025-10-30T00:13:01.011810-07:00', 'updated_at': None, 'user_id': 'Mike', 'agent_id': 'diet-assistant'}, {'id': '93a03639-195e-40ef-9f5f-55d366b76333', 'memory': "I'm a carnivore", 'hash': '5f81d3e6f06baba2e10ec6c155d012e3', 'metadata': None, 'score': 0.41749594, 'created_at': '2025-10-30T00:13:11.462159-07:00', 'updated_at': None, 'user_id': 'Julia', 'agent_id': 'diet-assistant'}]} 
        
        Search memories: What kind of fruit do you like?, result =>  {'results': [{'id': 'efec6c25-c2a7-454f-8344-367018c5b607', 'memory': 'I like durian, watermelon and strawberries', 'hash': '07cc049e2beaa043bb359b50a33664ac', 'metadata': {'category': 'hobbies'}, 'score': 0.6519712, 'created_at': '2025-10-30T00:13:04.981195-07:00', 'updated_at': None, 'user_id': 'Mike'}, {'id': '75da451c-dbf7-45aa-b9ab-72aab54df7b8', 'memory': 'I like playing basketball', 'hash': '000b24fa8e8f76134286d2c4626c036d', 'metadata': None, 'score': 0.3975049, 'created_at': '2025-10-30T00:13:08.390949-07:00', 'updated_at': None, 'user_id': 'Mike', 'agent_id': 'fitness-assistant'}, {'id': 'a0fadb7e-c6b7-46b2-b0b8-6b036d879015', 'memory': "I'm a vegetarian", 'hash': '27f3478f622dd27dd71969f131bd886f', 'metadata': None, 'score': 0.3382097, 'created_at': '2025-10-30T00:13:01.011810-07:00', 'updated_at': None, 'user_id': 'Mike', 'agent_id': 'diet-assistant'}]} 
        
        Search memories: What sport do you like?, result =>  {'results': [{'id': '90d45867-b198-415f-99e8-7375b4c6c35b', 'memory': 'I like playing badminton', 'hash': '304d03421834255d1650b46877b3785b', 'metadata': None, 'score': 0.61615115, 'created_at': '2025-10-30T00:13:18.218251-07:00', 'updated_at': None, 'user_id': 'Julia', 'agent_id': 'fitness-assistant'}]} 
        • バドミントンの検索: agent_id がスポーツに関連しないメモリをフィルタリングします。結果では、"I like playing badminton" が最も高いスコアで 1 位になります。

        • ベジタリアンデーの検索: agent_id が食事に関連しないメモリをフィルタリングします。結果では、"I'm a vegetarian" が最も高いスコアで 1 位になります。

        • Mike の果物の好みの検索: user_id が Julia のメモリをフィルタリングします。結果では、"I like durian, watermelon and strawberries" が最も高いスコアです。

        • Julia のスポーツの好みの検索: user_idagent_id が二重フィルターとして機能し、"I like playing badminton" を正確に返します。

  • メモリのクリア:

    delete_all メソッドは、指定されたユーザーまたはエージェントのすべてのメモリをクリアします。

    • コード

      # Julia のすべてのメモリを削除
      m.delete_all(user_id="Julia")
      result = m.get_all(user_id="Julia")
      print(result)
      
      # Mike のすべてのメモリを削除
      m.delete_all(user_id="Mike")
      result = m.get_all(user_id="Mike")
      print(result)
    • 結果の分析

      Resetting collection mem0_adb_demo...
      {'results': []}
      Resetting collection mem0_adb_demo...
      {'results': []}

まとめ

このチュートリアルでは、AnalyticDB for MySQL で Mem0 を使用して、AI エージェントのメモリを管理する方法 (追加、削除、更新、クエリ) を示しました。この組み合わせは、長期的で一貫性のある会話とパーソナライズされたサービスを提供する AI アプリケーションを構築するための、信頼性が高くスケーラブルな基盤を提供します。


付録: 完全なサンプルコード

以下の完全な Python スクリプトは、上記のすべてのステップを統合しています。<YOUR_ADB_HOST> などのプレースホルダーを実際の設定に置き換えてください。

from mem0 import Memory

# この例では、ベクトル次元が 1536 の adb インスタンスに接続する必要があります。
config = {
    "llm": {
        "provider": "bailian",
        "config": {"model": "qwen-plus"},
    },
    "embedder": {
        "provider": "bailian",
        "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
    },
    "vector_store": {
        "provider": "aliyun_adb",
        "config": {
            "host": "<adb host>",
            "port": 3306,
            "database": "mem0",
            "user": "<your user name>",
            "password": "<your password>",
            "collection_name": "adb_mem0_demo"
        }
    }
}

"""
Mike と Julia という 2 人のユーザーがいると仮定します。
1. Mike はベジタリアンで、果物とバスケットボールが好きです。
2. Julia は肉食で、ステーキとバドミントンが好きです。
"""

m = Memory.from_config(config_dict=config)

# Mike のメモリを追加
result = m.add("I'm a vegetarian", user_id="Mike")
memory_id = result["results"][0]["id"]
print("Add a memory for Mike: " + "I'm a vegetarian" + ", result => ", result, "\n")


result = m.add("I like durian", user_id="Mike")
print("Add a memory for Mike: " + "I like durian" + ", result => ", result, "\n")

# ユーザーのすべてのメモリを取得
result = m.get_all(user_id="Mike")
print("Get all memories for user: " + "Mike" + ", result => ", result, "\n")

result = m.delete(memory_id=memory_id)
print("Manually delete a memory: " + "I'm a vegetarian" + ", result => ", result, "\n")

result = m.add("I hate things that taste like durian", user_id="Mike")
print("Automatically delete a contradictory historical memory for Mike: " + "I like durian" + ", result => ", result, "\n")

# ユーザーのすべてのメモリを取得
result = m.get_all(user_id="Mike")
print("Get all memories for user: " + "Mike" + ", result => ", result, "\n")

# Mike のメモリ
result = m.add("I'm a vegetarian", user_id="Mike", agent_id="diet-assistant")
print("Add a memory for Mike: " + "I'm a vegetarian" + ", result => ", result, "\n")

result = m.add("I like durian, watermelon and strawberries", user_id="Mike", metadata={"category": "hobbies"})
print("Add a memory for Mike with metadata: " + "I like durian, watermelon and strawberries" + ", result => ", result, "\n")

result = m.add("I like playing basketball", user_id="Mike", agent_id="fitness-assistant")
print("Add a memory for Mike: " + "I like playing basketball" + ", result => ", result, "\n")


# Julia のメモリ
result = m.add("I'm a carnivore", user_id="Julia", agent_id="diet-assistant")
print("Add a memory for Julia: " + "I'm a carnivore" + ", result => ", result, "\n")

result = m.add("I like steak", user_id="Julia", metadata={"category": "hobbies"})
print("Add a memory for Julia: " + "I like steak" + ", result => ", result, "\n")

result = m.add("I like playing badminton", user_id="Julia", agent_id="fitness-assistant")
print("Add a memory for Julia: " + "I like playing badminton" + ", result => ", result, "\n")


# ユーザーに属する特定のエージェントのすべてのメモリを取得
result = m.get_all(user_id="Mike", agent_id="fitness-assistant")
print("Get all memories for a specific agent belonging to user: " + "Mike" + ", result => ", result, "\n")


# フィルターを使用してユーザーに属するすべてのメモリを取得
result = m.get_all(user_id="Julia", filters={"category": "hobbies"})
print("Get all memories belonging to a user with a filter: " + "Julia" + ", result => ", result, "\n")


# 特定のエージェントに関連するメモリを検索
result = m.search("Who likes playing badminton better?", agent_id="fitness-assistant")
print("Search memories: " + "Who likes playing badminton better?" + ", result => ", result, "\n")

# 特定のエージェントに関連するメモリを検索
result = m.search("Who will celebrate on International Vegetarian Day?", agent_id="diet-assistant")
print("Search memories: " + "Who will celebrate on International Vegetarian Day?" + ", result => ", result, "\n")

# 特定のユーザーのメモリを検索
result = m.search("What kind of fruit do you like?", user_id="Mike")
print("Search memories: " + "What kind of fruit do you like?" + ", result => ", result, "\n")

# 特定のユーザーとエージェントのメモリを検索
result = m.search("What sport do you like?", user_id="Julia", agent_id="fitness-assistant")
print("Search memories: " + "What sport do you like?" + ", result => ", result, "\n")

# Julia のすべてのメモリを削除
m.delete_all(user_id="Julia")
result = m.get_all(user_id="Julia")
print(result)

# Mike のすべてのメモリを削除
m.delete_all(user_id="Mike")
result = m.get_all(user_id="Mike")
print(result)