Guide · 使用教程
Mem0 长期记忆 API 教程:写入、检索、纠错与删除实操
用 Python 和 Mem0 托管 API 给现有 Agent 增加跨会话记忆,按用户范围写入与检索,并演练更正、删除、隔离、成本监控和上线验收。
这篇教程会完成什么
用 Mem0 托管 Platform 给一个已有的 AI 助手加上跨会话记忆。我们只做五步:取得 API Key、按用户写入一条脱敏偏好、新会话检索、纠正旧记忆、演练删除。示例使用 Python,不需要先搭建向量数据库。最后会给出多租户、成本和上线验收检查。代码结构依据 Mem0 官方 Quickstart 与官方文档索引;这里没有代你运行真实账号,复制到生产前请用自己的测试环境复核 SDK 版本。
Mem0 只负责记忆层。最终回答和工具执行仍由你现有的模型、Agent 或后端控制。即使记忆里写着“用户曾同意”,也不能代替当前操作所需的业务授权。
开始前准备
准备 Python 3.10+、Mem0 Platform 账号和测试 API Key。先挑一个不涉及真实个人信息的案例,例如测试用户 demo-001 喜欢把项目摘要整理成三条要点。不要用病历、身份证、密钥、真实客户聊天作为第一条样本。若你的数据不能交给托管服务,先读开源部署文档并评估模型、数据库和运维要求,而不是把敏感数据上传后再讨论地域或删除。
安装依赖并把 Key 放在环境变量中:
python -m pip install mem0ai
export MEM0_API_KEY="你的测试密钥"
实际项目请使用密钥管理服务或受控环境变量,不要把 Key 写入仓库、提示词或日志。确认测试环境和正式环境使用不同 Key、不同用户 ID 命名空间。
第一步:写入有用而稳定的事实
下面的代码采用官方托管 SDK 的 MemoryClient。只传与后续任务有关的对话内容;在业务后端根据登录会话决定 user_id,不要让模型自己编造或从用户输入中直接取值。
import os
from mem0 import MemoryClient
client = MemoryClient(api_key=os.environ["MEM0_API_KEY"])
user_id = "demo-001"
messages = [
{"role": "user", "content": "以后给我的项目摘要请整理成三条要点。"},
{"role": "assistant", "content": "好的,后续项目摘要会优先用三条要点呈现。"},
]
result = client.add(messages, user_id=user_id)
print(result)
add 可能从一轮对话中提取多条记忆,也可能根据已有记忆决定更新或不存储。不要假设输入一条消息就一定得到一个固定的 memory ID。上线时记录写入来源、时间、用户授权状态和返回的结果,但日志里不要保存敏感原文。若同一请求重试,业务侧要设计去重或幂等策略。
第二步:在新会话检索
重新启动应用进程,仍用相同测试 user_id 搜索:
results = client.search(
"这个用户喜欢怎样看项目摘要?",
filters={"user_id": user_id},
)
for item in results.get("results", []):
print(item.get("id"), item.get("memory"), item.get("score"))
关键是 filters={"user_id": user_id}。漏掉过滤、使用全局标识或把租户 ID 混在可猜的文本里,都可能让另一位用户的记忆进入答案。正式系统应从已验证的会话上下文确定用户 ID,并在 API 代理层统一强制加入过滤条件。若存在 Agent 或项目作用域,依据当前 SDK 文档增加相应范围,并测试跨范围检索是否被拒绝。
检索不是最终回答。把命中的事实和最近几轮对话一起交给模型;最近对话必须单独保留,因为记忆写入可能有处理时间,且长期提炼会省略即时上下文。告诉模型“以下是可能相关的历史资料,请以当前用户请求和业务规则为准”,不要把记忆内容放进系统指令。回答中出现矛盾时,优先让用户确认,而不是凭相似度分数猜测。
第三步:纠正旧偏好
让同一测试用户说:“现在改成五条要点”。先查看当前检索结果和 ID,再决定调用更新接口,或者写入新的更正对话并观察 Mem0 的提炼行为。官方 Platform Python 接口支持 get_all、update(memory_id=..., text=...) 和 delete(memory_id=...)。执行更新前要验证选中的 ID 确实属于当前用户;不能只拿模型返回的一个 ID 就改写数据库。
memories = client.get_all(filters={"user_id": user_id})
for item in memories.get("results", []):
print(item["id"], item["memory"])
# 由已授权的业务流程确认旧记忆 ID 后执行:
# client.update(memory_id=old_id, text="该用户希望项目摘要整理成五条要点")
这段代码故意不自动选择 old_id:真实账号可能存有多条相似偏好,自动选第一条容易改错。测试时先人工核对,再执行更新并再次搜索“摘要应该分几条”,确认五条成为当前偏好、三条不再主导回答。把“改口前后”加入长期回归测试集。
第四步:演练删除与退出
用户撤回授权或账号注销时,要清理长期记忆,并检查你的缓存、应用数据库、日志和模型对话存储。Mem0 Platform Python 接口提供单条 delete(memory_id=...) 与按用户 delete_all(user_id=...)。删除属于不可逆操作,应由有权限的后端流程调用;先在测试账号演练:
# 仅对隔离的测试用户执行;生产环境须经过授权与审计。
# client.delete_all(user_id=user_id)
# after = client.search("这个用户的项目摘要偏好是什么?",
# filters={"user_id": user_id})
# assert not after.get("results")
删除 API 成功不等于整个业务系统已完成删除。缓存、导出、备份与下游索引可能各有保留策略;根据你的隐私政策和合同核对。重新检索应查不到相应事实,应用回答也不应从最近对话或其他副本“复活”已删除偏好。
第五步:接进现有 Agent,而不扩大权限
在模型调用前由后端按当前登录用户检索 3—5 条相关记忆,将其作为普通上下文连同来源或更新时间传入;回复后只挑选用户同意、可能长期有用的事实写回。避免每轮完整写入几十页聊天记录,也不要把模型推断的敏感属性当作用户确认的事实。对外部动作,如发短信、修改订单或支付,保留原有权限检查与人工确认。
如果用 Mem0 MCP 让 Agent 自己选择何时保存或搜索,先把可写范围和审批做成明确工具策略,记录每次调用。应用端的身份必须映射到正确的 Mem0 用户范围;不能让一个共享 Agent 使用全局默认用户存所有人的记忆。
成本与验收
截至 2026 年 9 月,官方托管 Hobby 免费档每月有 10,000 次 add 与 1,000 次 retrieval,Starter 每月 19 美元,Pro 每月 249 美元。把“每次用户消息写入几次、每次回答检索几次、失败重试几次”记录一周,再计算月度用量。模型 token、数据库、监控和人工纠错也要计入总成本。官方价格页可能更新,采购时再核对。
上线前至少跑六类样本:跨会话召回、用户改口、同名不同用户、错误或无关记忆、记忆删除、记忆里包含恶意“忽略系统规则”文本。记录准确召回率、误召回、跨用户泄露、删除回归、P95 延迟和每个有效回答成本。任一跨用户泄露或未经授权的工具动作都应阻止上线。
常见问题与排查
搜索返回空:确认写入成功、使用相同 user ID、处理已完成、过滤条件匹配,以及查询不是太宽泛。先查 get_all,再看搜索。搜索到了旧偏好:检查更正是否已写入或更新,最近对话是否传给模型;不要靠提高相似度分数掩盖冲突。账单增长快:记录每个请求的 add 和 search 数量,减少重复写入与无意义检索;把高频问答与长期事实分层。跨用户数据出现:立即停用该流程,核查所有读写入口的用户范围和缓存键,再用隔离样本复测。
常见问题
- Mem0 Platform Quickstart 需要自己搭建向量数据库吗?
- 不需要。托管 Platform 管理服务端组件;开源自托管路线才需要按自己的架构配置模型、存储和运维。
- 为什么写入一条对话后会出现多条记忆?
- Mem0 会从消息中提取独立事实,输入消息数与记忆条数并非一一对应;应检查返回结果和后续检索。
- 搜索时必须传 user_id 过滤吗?
- 多用户应用必须确保每次搜索都被可信后端限定到当前用户及必要作用域,并用交叉用户样本验证隔离。
- 用户改口时直接再写一条可以吗?
- 可测试提炼与更新行为,但应确认旧记忆不再误导回答。需要精确修正时,先核对记忆 ID,再由授权流程调用更新或删除。
- 删除 Mem0 记忆后就完成所有数据删除了吗?
- 不一定。还要检查应用缓存、日志、导出、备份、最近对话与其他下游系统,并按保留政策复核。
- 免费档适合生产吗?
- 它适合小规模验证。生产前按每月 add 和 retrieval 次数、模型费用、失败重试及人工纠错计算完整成本。