Mem0(“mem-zero”)是一个专为 AI 应用设计的智能记忆层。它通过自动化的记忆提取、整合与检索,能够将无状态的 AI Agent 转变为具备上下文感知和持久记忆能力的智能系统。本教程将引导您完成基于 AnalyticDB for MySQL + Mem0 的 Agent Memory 管理实践,内容涵盖记忆的添加、检索、更新、搜索、删除以及历史追溯等核心操作,帮助您快速构建具备长期记忆能力的 AI 应用。
准备工作
在开始之前,请确保您已完成以下准备工作:
已创建AnalyticDB for MySQL 版集群,并确保其版本支持向量检索功能(如余弦相似度)。具体操作请参见:企业版、基础版及湖仓版快速入门。
获取支持 AnalyticDB for MySQL 的 Mem0 框架版本。
说明请通过钉钉联系阿里云服务支持(钉钉账号:
x5v_rm8wqzuqf),获取对应安装包。已获取模型服务 API Key,本教程使用阿里云百炼大模型服务平台,请开通服务并获取 API Key,详情请参考文档:获取API Key。
操作指南
环境准备
准备 AnalyticDB for MySQL
在您的 AnalyticDB for MySQL 集群中创建一个用于本教程的数据库。
CREATE DATABASE mem0;如果您计划通过公网连接,请在 AnalyticDB for MySQL 控制台为集群开启公网访问地址,并将您运行 Demo 环境的公网 IP 地址添加到白名单中。
安装 Mem0 及依赖
检查 Python 环境:确保您的运行环境中已安装 Python。本教程在 Python 3.12.2 版本下验证通过。
# 使用Mac, 检查Python版本, 如无请至官网安装 https://www.python.org/ python3 --version # 使用Linux, 检查Python版本, 如无使用 yum 进行安装, sudo yum install python python --version安装 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 支持通过元数据进行精确过滤检索,以及通过语义进行相似性搜索。
准备数据:为 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'}]}
精确过滤检索:使用
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'}]}
相似性搜索:使用
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)