Mem0 ("mem-zero") は、AI アプリケーション向けに設計されたインテリジェントなメモリレイヤーです。自動化されたメモリ抽出、統合、取得を通じて、ステートレス AI エージェントをコンテキスト認識と永続メモリ機能を備えたインテリジェントなシステムに変換します。このチュートリアルでは、AnalyticDB for MySQL + Mem0 を使用したエージェントのメモリ管理について説明します。メモリの追加、取得、更新、検索、削除、履歴追跡などのコア操作を網羅しており、長期記憶機能を備えた AI アプリケーションを迅速に構築するのに役立ちます。
事前準備
開始する前に、次の準備を完了してください。
AnalyticDB for MySQL クラスターを作成し、そのバージョンがベクター取得 (コサイン類似度など) をサポートしていることを確認します。詳細については、「Enterprise、Basic、および Data Lakehouse Editions のクイックスタート」をご参照ください。
AnalyticDB for MySQL をサポートする Mem0 フレームワークのバージョンを取得します。
説明インストールパッケージを入手するには、DingTalk (DingTalk アカウント:
x5v_rm8wqzuqf) を通じて Alibaba Cloud サービスサポートにお問い合わせください。モデルサービス API キーを取得します。このチュートリアルでは、Alibaba Cloud Model Studio を使用します。サービスをアクティブ化し、API キーを取得します。詳細については、「API キーの取得」をご参照ください。
ユーザーガイド
環境設定
準備 AnalyticDB for MySQL
このチュートリアル用に、AnalyticDB for MySQL クラスターにデータベースを作成します。
CREATE DATABASE mem0;パブリックネットワーク経由で接続する予定がある場合は、AnalyticDB for MySQL コンソールでクラスターのパブリックネットワークアクセスを有効にし、デモ環境のパブリック IP アドレスをホワイトリストに追加します。
Mem0 と依存関係のインストール
Python 環境の確認: Python が環境にインストールされていることを確認します。このチュートリアルは Python 3.12.2 で検証済みです。
# Mac の場合、Python のバージョンを確認します。インストールされていない場合は、https://www.python.org/ からインストールします。 python3 --version # Linux の場合、Python のバージョンを確認します。インストールされていない場合は、yum を使用してインストールします: sudo yum install python python --versionMem0 フレームワークのインストール: 取得した 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_URLMem0 インスタンスの初期化:
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"]["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 a 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 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") # ユーザーのすべてのメモリを取得 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 は、メタデータを使用した正確なフィルター済み取得と、セマンティクスを使用した類似検索をサポートしています。
データ準備: Mike と Julia の
agent_idとmetadataを使用してメモリを追加します。コード
# 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 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 のメモリ 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'}]}
正確なフィルター済み取得:
get_allメソッドを使用し、フィルター条件を渡します。コード
# ユーザーに属する特定のエージェントのすべてのメモリを取得 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") # フィルター付きでユーザーに属するすべてのメモリを取得 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'}]}
類似検索:
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」が最も高いスコアを持ち、結果の最初にランク付けされます。ベジタリアンデーの検索:
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メソッドを使用して、指定したユーザーまたはエージェントのすべてのメモリを削除します。コード
# 特定のユーザーに属する特定のエージェントのすべてのメモリを削除します。 m.delete_all(user_id="Julia") result = m.get_all(user_id="Julia") print(result) # ユーザーのすべてのメモリを削除します。 m.delete_all(user_id="Mike") result = m.get_all(user_id="Mike") print(result)結果分析
コレクション mem0_adb_demo をリセット中... {'results': []} コレクション mem0_adb_demo をリセット中... {'results': []}
概要
このチュートリアルでは、Mem0 と AnalyticDB for MySQL を組み合わせて、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 passward>",
"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 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")
# ユーザーのすべてのメモリを取得
result = m.get_all(user_id="Mike")
print("Get all memories for a 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 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 のメモリ
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 a user:" + "Mike" + ", result => " , result , "\n")
# フィルター付きでユーザーに属するすべてのメモリを取得
result = m.get_all(user_id="Julia", filters={"category": "hobbies"})
print("Get all memories belonging to a user with 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")
# ユーザーに属する特定のエージェントのすべてのメモリを削除
m.delete_all(user_id="Julia")
result = m.get_all(user_id="Julia")
print(result)
# ユーザーのすべてのメモリを削除
m.delete_all(user_id="Mike")
result = m.get_all(user_id="Mike")
print(result)