没有记忆的 Agent,每次对话都像"失忆患者"——用户上一句说"我是素食者",下一句它就推荐荤菜。Mem0 是一个专为 Agent 设计的记忆层:你把对话片段喂给它,它会自动抽出"事实"存好,需要时按用户/标签/语义检索出来再注入提示词。本教程从装包到接进 Agent 循环,全程可跑。
🧠 本教程适合:想让 Agent"记住"用户偏好、历史上下文的开发者/产品同学。需要 Python 3.10+;开源版默认用 OpenAI 做抽取与向量化。
先搞懂:记忆层解决什么?
用一句话理解:Mem0 把"用户说过的话"变成"可检索的事实库",Agent 每次回答前先查这个库,再决定怎么答。它负责存储、抽取、去重、检索,你的 Agent 逻辑只管"规划 + 调工具",不用自己维护一大坨对话历史。
| 操作 | Mem0 API | 作用 |
|---|---|---|
| 存 | add(messages, user_id) | 抽取事实并存储 |
| 取 | search(query, filters) | 按用户/语义检索 |
| 改 | update / delete | 更新或遗忘某条 |
Step 1:安装并配置
1 pip 装好,配好抽取模型
pip install mem0ai
export OPENAI_API_KEY="sk-..." # 开源版默认用 OpenAI 做事实抽取与向量化
💡 不想用 OpenAI?Mem0 开源版可换 Ollama / Anthropic / 本地嵌入,具体见 Mem0 配置文档(改
Memory 的 config 即可)。Step 2:初始化 Memory
2 一行拿到记忆对象
from mem0 import Memory
m = Memory()
默认存储位置要知道。开源版 Memory() 默认把向量存到 /tmp/qdrant、历史存到 ~/.mem0。涉及真实用户隐私数据,请改用私有部署 / 自托管向量库,别用默认本地路径裸奔。
Step 3:存一条记忆
3 add 自动拆成事实
把一段对话(角色 + 内容)交给 add,Mem0 会自动把"我是 Alex,喜欢篮球和游戏"拆成多条独立事实分别存:
messages = [
{"role": "user", "content": "我是 Alex,喜欢篮球和游戏。"},
{"role": "assistant", "content": "好的,我会记住你的兴趣。"},
]
m.add(messages, user_id="alex")
🔑 关键:用
user_id 区分不同用户。这样检索时只取该用户的事实,不会把 A 的偏好泄露给 B。Step 4:检索记忆
4 search 按用户过滤
results = m.search("你了解我什么?", filters={"user_id": "alex"})
for r in results["results"]:
print(r["memory"])
# 可能输出:
# 喜欢篮球
# 喜欢游戏
# 名字是 Alex
Step 5:在 Agent 循环里用记忆
5 注入系统提示
把检索到的记忆拼进系统提示,Agent 跨会话、跨用户都一致:
import openai
def chat(user_id: str, user_input: str) -> str:
mem = m.search(user_input, filters={"user_id": user_id})
memory_block = "\n".join(f"- {x['memory']}" for x in mem["results"])
sys_prompt = f"你是助手,遵循已知记忆:\n{memory_block}"
resp = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": sys_prompt},
{"role": "user", "content": user_input},
],
)
return resp.choices[0].message.content
🧩 这正是"记忆层"的价值:Agent 代码不必维护长对话历史,只管"先查 Mem0、再回答"。新会话、新进程都能拿到同一份记忆。
Step 6:更新与遗忘
6 修正错误、响应撤回
m.update(memory_id, text="新事实文本") # 修正
m.delete(memory_id) # 删除(用户撤回 / 合规)
合规红线:用户要求删除数据要真删。涉及 GDPR / 个人信息保护时,必须走 delete 并保留操作审计,不能只"在提示里忽略"。Mem0 平台版自带治理与审计能力。
Step 7:平台版(MemoryClient,可选)
7 免运维、带治理
不想自己管向量库和抽取管线,可以用 Mem0 平台版,API 几乎一致:
from mem0 import MemoryClient
client = MemoryClient(api_key="your-mem0-key")
client.add(messages, user_id="alex")
results = client.search("...", filters={"user_id": "alex"})
🏢 平台版免运维、带治理(SOC 2 / HIPAA / 审计),适合生产;开源版适合自托管和本地调试。按团队实际合规要求选择。
常见问题速查
| 现象 | 原因 & 解决 |
|---|---|
| add 报错 401 | OPENAI_API_KEY 未配置(开源版默认用它抽取) |
| 检索串味(A 看到 B) | search 没传 filters={"user_id": ...} |
| 本地存储找不到 | 检查 /tmp/qdrant 与 ~/.mem0 权限 |
| 要换模型 | 改 Memory 的 config,见 Mem0 配置文档 |