给 Agent 加记忆这件事,Mem0 是目前最主流的开源选择之一。但我们在实际使用中遇到了一些准确率方面的问题,于是用结构化的三层记忆架构做了对比测试,记录一下过程和结论。
为什么关注记忆准确率
如果你在用 Mem0 或类似方案给 Agent 加记忆,建议做个简单测试:让 Agent 记住 20 条信息,过一段时间再问它,看能准确召回多少条。
结果可能不如预期。
LOCOMO 基准测试中,Mem0 的召回准确率在 20% 左右。这个数据不代表 Mem0 不好——作为一个开源项目,它降低了 Agent 记忆的入门门槛,让很多团队能快速跑通原型。但如果要在生产环境中依赖记忆来做决策,20% 的准确率确实不够。
剩下的 80% 要么忘了,要么记混了,要么返回一堆噪音。在生产环境中,这意味着 Agent 在大部分情况下要么答非所问,要么需要用户反复纠正。
向量检索的记忆方式有什么问题
Mem0 的记忆机制本质上是向量存储和检索。流程大概是:从对话中提取关键信息,转成 embedding,存入向量数据库。查询时把问题转为向量,做相似度检索。
信息量小的时候还行。信息量一多,几个结构性问题就暴露出来了。
语义相近但含义不同的信息互相干扰。"用户喜欢 Java"和"用户的项目用 Java"在向量空间中非常接近,但意思完全不同。向量检索分不出来。
更新困难。用户说"我把数据库从 MySQL 迁到了 PostgreSQL",旧的"MySQL"记忆还在向量库里。向量没有结构,你没法精确定位并更新它。
没有时效性管理。六个月前的偏好和今天的偏好权重一样。过时的信息持续干扰检索结果。
这些问题不是 Mem0 特有的——所有基于纯向量检索做记忆的方案都会遇到。Mem0 作为开源项目已经在框架层面做了很多工作,但底层检索范式的局限是架构层面的。
结构化记忆方案怎么做的
我们尝试的三层记忆模型——原子事实、实体卡片、记忆图谱——在向量检索之上加了一层结构化的知识管理。
精确的事实级管理。每条记忆是独立的原子事实,带置信度和时间戳。更新一条不影响其他,不会产生残留。
实体聚合避免干扰。相关的原子事实聚合为实体卡片。查"用户的技术偏好"时返回的是聚合后的画像,不是一堆零散的、可能互相矛盾的向量片段。
图谱关联支持复杂查询。"改了支付接口会影响哪些模块?"这种涉及依赖关系的查询,向量检索做不了。记忆图谱可以沿着关系边做多跳查询。
协议兼容和迁移
我们做了一个决定:在 ContextDB 中兼容 Mem0 协议。这样现有 Mem0 用户可以低成本切换做对比测试。
现有代码是这样的:
from mem0 import Memory # 原来的 Mem0 配置 m = Memory() m.add("用户偏好使用 Go 语言开发后端服务", user_id="alice") results = m.search("alice 用什么语言?", user_id="alice")切换只需要改 endpoint:
from mem0 import Memory # 切换到结构化记忆方案 config = { "endpoint": "https://your-contextdb-endpoint.contextdb.rds.aliyuncs.com", "api_key": "your-api-key" } m = Memory.from_config(config) # 后续代码完全不变 m.add("用户偏好使用 Go 语言开发后端服务", user_id="alice") results = m.search("alice 用什么语言?", user_id="alice")没有数据迁移,没有代码重构,不用学新 API。改一行配置就能跑起来对比测试。
用 Coding Agent 的话,接入也很快:
curl -fsSL 'https://context-database-client.oss-cn-hangzhou.aliyuncs.com/install.sh' | bash -s -- --agent <agent> --api-key <api-key>支持 Qoder、Claude Code、Codex、OpenClaw、OpenCode、Hermes、QoderWork。
LOCOMO 基准测试数据
LOCOMO 基准测试中的对比数据:
| 指标 | 结构化记忆方案 | LightRAG(向量检索类方案) | Mem0(原生) |
|---|---|---|---|
| 召回准确率 | ~79% | ~65% | ~20% |
| Token 成本 | 基准(1x) | ~3x | 更高(冗余信息多) |
| 检索延迟 | ~1.6s | 更高 | 取决于数据量 |
准确率从 20% 到 79%,这个差距是显著的。在实际使用中,这基本就是"不太敢用"和"可以依赖"的分界线。
Token 成本的差异主要来自检索精度。Mem0 为了让 Agent 有"足够的上下文",往往返回大量冗余信息。结构化方案通过实体卡片聚合,返回的信息更精炼。
跨数据集也做了验证。FinanceBench(金融)、SyllabusQA(教育)、Qasper(学术)、ClapNQ(通用)四个数据集上,结构化方案的表现相对稳定。
不过需要说明:这些 Benchmark 数据是在特定条件下测出来的,实际效果会因场景而异。如果你的 Agent 只需要记住用户的一些简单偏好(比如语言、风格),Mem0 的准确率问题可能没那么突出。差距主要在知识量大、关联复杂的场景下才拉开。
自建 vs 托管:算笔账
很多团队基于 Mem0 自建记忆系统。这确实灵活,但算总账的话:
自建这边:向量数据库的部署和运维(Milvus/Pinecone 等)、Embedding 模型调用成本、记忆提取去重冲突消解逻辑的开发维护、检索优化的持续投入、基础设施弹性伸缩。
托管方案那边:API 调用费用。运维和开发的工作量大幅减少。
更关键的一点:自建系统如果底层还是向量检索范式,准确率上限就在 Mem0 那个水平附近。要显著提升准确率,得重新设计记忆架构——这时候其实已经不是"自建"和"托管"的选择了,而是技术路线的选择。
当然,托管方案也有它的问题:数据在别人那里、定制灵活度有限、目前只支持 RDS MySQL 底座。对数据安全和自主可控要求特别高的团队,可能还是倾向自建。
如果你正在用 Mem0
我的建议是比较务实的做法:
先做对比测试。在你的实际场景中用 Mem0 和结构化方案分别跑一组记忆召回测试。别看通用 Benchmark,看你自己业务数据。
然后灰度切换。不用一次切完。先在一个非核心场景上试试,观察一周。
看效果。对比切换前后的回答准确率、用户纠正次数、Token 消耗。
确认没问题再扩大范围。
整个过程代码改动量很小。
顺便说一句,Mem0 在轻量级场景下仍然是一个很好的选择。它开源、社区活跃、上手快,适合原型验证和对准确率要求不高的场景。只是当你的 Agent 记忆需求复杂到一定程度,才需要考虑更结构化的方案。
最后
Agent 记忆是个看起来简单、做起来很难的问题。
Mem0 作为开源项目,降低了这个领域的入门门槛,这值得尊重。向量检索在很多场景下也够用了,不是所有问题都需要复杂的三层架构。
但如果你的 Agent 在生产环境中频繁因为记忆不准确而出错,结构化记忆是一个值得尝试的方向。协议兼容让对比测试的成本很低——改个 endpoint 就能跑起来。
参考链接
- RDS ContextDB 快速入门 | 产品页