全部產品
Search
文件中心

AnalyticDB:AnalyticDB for MySQL + Mem0 實踐指南

更新時間:Mar 14, 2026

Mem0(“mem-zero”)是一個專為 AI 應用設計的智能記憶層。它通過自動化的記憶提取、整合與檢索,能夠將無狀態的 AI Agent 轉變為具備上下文感知和持久記憶能力的智能系統。本教程將引導您完成基於 AnalyticDB for MySQL + Mem0 的 Agent Memory 管理實踐,內容涵蓋記憶的添加、檢索、更新、搜尋、刪除以及歷史追溯等核心操作,協助您快速構建具備長期記憶能力的 AI 應用。

準備工作

在開始之前,請確保您已完成以下準備工作:

  1. 已建立AnalyticDB for MySQL 版叢集,並確保其版本支援向量檢索功能(如餘弦相似性)。具體操作請參見:企業版、基礎版及湖倉版快速入門

  2. 擷取支援 AnalyticDB for MySQL 的 Mem0 架構版本。

    說明

    請通過DingTalk聯絡阿里雲服務支援(DingTalk帳號:x5v_rm8wqzuqf),擷取對應安裝包。

  3. 已擷取模型服務 API Key,本教程使用阿里雲百鍊大模型服務平台,請開通服務並擷取 API Key,詳情請參考文檔:擷取API Key

操作指南

環境準備

  • 準備 AnalyticDB for MySQL

    1. 在您的 AnalyticDB for MySQL 叢集中建立一個用於本教程的資料庫。

      CREATE DATABASE mem0;
    2. 如果您計劃通過公網串連,請在 AnalyticDB for MySQL 控制台為叢集開啟公網訪問地址,並將您運行 Demo 環境的公網 IP 位址添加到白名單中。

  • 安裝 Mem0 及依賴

    1. 檢查 Python 環境:確保您的運行環境中已安裝 Python。本教程在 Python 3.12.2 版本下驗證通過。

      # 使用Mac, 檢查Python版本, 如無請至官網安裝 https://www.python.org/
      python3 --version
      
      # 使用Linux, 檢查Python版本, 如無使用 yum 進行安裝, sudo yum install python
      python --version
    2. 安裝 Mem0 架構:解壓您擷取的 Mem0 架構檔案,並安裝必要的依賴庫。

      # 解壓並安裝
      unzip mem0.zip 
      cd mem0
      pip install .
      pip install pymysql dbutils

配置並初始化

  • 配置環境變數:

    為了安全起見,建議將大模型的 API Key 配置為環境變數。

    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 配置:使用阿里雲百鍊的 qwen-plus 模型。

    • Embedder 配置:使用阿里雲百鍊的 text-embedding-v4 模型,向量維度為 1536。

    • Vector Store 配置:使用 aliyun_adb,並填入您的 AnalyticDB for MySQL 串連資訊。

    from mem0 import Memory
    
    # This example must connect to an adb instance with 1536 vector dimensions specified.
    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"
            }
        }
    }
    
    
    """
    Suppose we have two users, Mike and Julia
    1、Mike is a vegetarian, who likes fruit and playing basketball
    2、Julia is a carnivore, who likes steak and playing badminton
    """
    
    m = Memory.from_config(config_dict=config)

核心記憶操作示範

  • 添加與擷取記憶:

    使用 m.add() 方法為使用者添加記憶,m.get_all() 方法擷取使用者的全部記憶。

    • 代碼

      # add memorys for 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")
      
      # Get all memories for a user
      result = m.get_all(user_id="Mike")
      print("Get all memories for a user:" + "Mike" + ", result => " , result , "\n")
    • 結果分析
      返回的結果是一個列表,包含了 Mike 的兩條記憶及其中繼資料,如 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 a 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("Manual Delete a memory:" + "I like durian" + ", result => " , result , "\n")
      
      result = m.add("I hate things that taste like durian", user_id="Mike")
      print("Automatic Delete a contradictory historical memory for Mike:" + "I like durian" + ", result => " , result , "\n")
      
      # Get all memories for a user
      result = m.get_all(user_id="Mike")
      print("Get all memories for a user:" + "Mike" + ", result => " , result , "\n")
    • 結果分析

      Manual Delete a memory:I like durian, result =>  {'message': 'Memory deleted successfully!'} 
      
      Automatic 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 a user:Mike, result =>  {'results': []} 
      • 添加衝突記憶後,add 方法的返回結果會包含一個 DELETE 事件,表明舊的、衝突的記憶(“I like durian”)已被自動移除。

      • 再次調用 get_all 時,會發現舊的記憶已不複存在,體現了 Mem0 的自適應與自洽能力。

  • 檢索與搜尋記憶:

    Mem0 支援通過中繼資料進行精確過濾檢索,以及通過語義進行相似性搜尋。

    1. 準備資料:為 Mike 和 Julia 添加帶有 agent_id 和 metadata 的記憶。

      • 代碼

        # Mike Memory
        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 meta:" + "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 Memory
        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 meta: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 方法並傳入過濾條件。

      • 代碼

        # Get all memories for a specific agent belonging to a user
        result = m.get_all(user_id="Mike", agent_id="fitness-assistant")
        print("Get all memories for a specific agent belonging to a user:" + "Mike" + ", result => " , result , "\n")
        
        
        # Get all memories belonging to a user with filter
        result = m.get_all(user_id="Julia", filters={"category": "hobbies"})
        print("Get all memories belonging to a user with filter:" + "Julia" + ", result => " , result , "\n")
      • 結果分析

        Get all memories for a specific agent belonging to a 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 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)降序排列。

      • 代碼

        # Search memories for a user
        result = m.search("Who likes playing badminton better", agent_id="fitness-assistant")
        print("Search memories:" + "Who likes playing badminton better" + ", result => " , result , "\n")
        
        # Search memories for a specific agent belonging to a user
        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")
        
        # Search memories for a user
        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")
        
        # Search memories for a user
        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”的得分最高,排在首位。

        • 搜尋素食日:agent_id 過濾了非飲食相關的記憶,結果中“I'm a vegetarian”的得分最高,排在首位。

        • 搜尋 Mike 的水果偏好:user_id 過濾了 Julia 的記憶,結果中“I like durian, watermelon and strawberries”得分最高。

        • 搜尋 Julia 的運動偏好:user_id 和 agent_id 雙重過濾,精確地返回了“I like playing badminton”。

  • 清理記憶:

    使用 delete_all 方法可以清空指定使用者或 Agent 的所有記憶。

    • 代碼

      # Delete all memories for a specific agent belonging to a user
      m.delete_all(user_id="Julia")
      result = m.get_all(user_id="Julia")
      print(result)
      
      # Delete all memories for a user
      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': []}

總結

通過本教程,我們示範了如何結合使用 Mem0 和 AnalyticDB for MySQL,輕鬆實現 AI Agent 記憶的增、刪、改、查等一系列智能化管理操作。這套組合為構建能夠進行長期、連貫對話,並具備個人化服務能力的複雜 AI 應用,提供了強大、可靠且易於擴充的基礎。


附錄:完整範例程式碼

為了方便您快速體驗,以下是整合了所有步驟的完整 Python 指令碼。請將其中的預留位置(如 <YOUR_ADB_HOST> 等)替換為您的實際配置。

from mem0 import Memory

# This example must connect to an adb instance with 1536 vector dimensions specified.
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 passward>",
            "collection_name": "adb_mem0_demo"
        }
    }
}

"""
Suppose we have two users, Mike and Julia
1、Mike is a vegetarian, who likes fruit and playing basketball
2、Julia is a carnivore, who likes steak and playing badminton
"""

m = Memory.from_config(config_dict=config)

# add memory for 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")

# Get all memories for a user
result = m.get_all(user_id="Mike")
print("Get all memories for a user:" + "Mike" + ", result => " , result , "\n")

result = m.delete(memory_id=memory_id)
print("Manual Delete a memory:" + "I like durian" + ", result => " , result , "\n")

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

# Get all memories for a user
result = m.get_all(user_id="Mike")
print("Get all memories for a user:" + "Mike" + ", result => " , result , "\n")

# Mike Memory
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 meta:" + "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 Memory
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")


# Get all memories for a specific agent belonging to a user
result = m.get_all(user_id="Mike", agent_id="fitness-assistant")
print("Get all memories for a specific agent belonging to a user:" + "Mike" + ", result => " , result , "\n")


# Get all memories belonging to a user with filter
result = m.get_all(user_id="Julia", filters={"category": "hobbies"})
print("Get all memories belonging to a user with filter:" + "Julia" + ", result => " , result , "\n")


# Search memories for a user
result = m.search("Who likes playing badminton better", agent_id="fitness-assistant")
print("Search memories:" + "Who likes playing badminton better" + ", result => " , result , "\n")

# Search memories for a specific agent belonging to a user
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")

# Search memories for a user
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")

# Search memories for a user
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")

# Delete all memories for a specific agent belonging to a user
m.delete_all(user_id="Julia")
result = m.get_all(user_id="Julia")
print(result)

# Delete all memories for a user
m.delete_all(user_id="Mike")
result = m.get_all(user_id="Mike")
print(result)