site logo

Marico's space

生产环境中的Agent记忆:Mem0 vs Zep vs LangChain Memory vs Redis DIY

AI技术与应用 2026-09-08 17:34:04 12

现在每个 agent 框架都在推"记忆"功能,每个厂商都信誓旦旦说自己的方案能让 agent 不会再跟用户说"很高兴认识你"——哪怕他们已经聊过五十次了。这周的一个热门讨论——你的 AI 什么都记得,但什么都信——正好戳中了这个问题的本质:记忆工具擅长存储,却不擅长判断什么仍然是真相。选工具的时候我真正关心的就是这条轴,而不是什么向量维度或者选用哪个向量数据库。

我用同一套测试场景跑了四种方案:一个客服 agent,需要记住用户偏好、历史工单和跨会话的纠正,中间偶尔会出现和之前矛盾的事实(比如说完了"我住在广州"之后又说"其实我上个月搬去深圳了")。看看 Mem0、Zep、LangChain 的 memory 类,还有一个手撸的 Redis 方案实际表现怎么样。

参赛选手

Mem0——一个托管(或自托管)的记忆层,夹在你的 LLM 调用和存储之间。它从对话轮次中提取事实、打分,然后在写入前跟已有记忆做冲突比对。

Zep——会话记忆加上时序知识图谱。它不只是存储事实,还会打时间戳,允许你查询"截至 X 时间点我们认为什么是真的"。

LangChain memoryConversationSummaryBufferMemoryVectorStoreRetrieverMemory)——不是产品,是一堆类,你需要自己接到已有的向量存储上。除了你自己写的,没有提取逻辑。

Redis + RedisVL,DIY——没有框架。你自己存储 embedding 和元数据,自己写检索和冲突处理逻辑。

真正拉开差距的地方

事实提取和冲突解决

这是每个厂商都吹得不够、每个自研系统都低估的部分。

用 Mem0,发一条新消息会触发一次 LLM 调用来提取候选事实,跟用户已有的记忆做比对,然后决定是添加、更新还是丢弃:

from mem0 import Memory m = Memory()
m.add("我上个月搬去深圳了,不过这交通真是烦人", user_id="u123")
# 之后
results = m.search("用户住在哪里", user_id="u123")
# 返回深圳的事实,广州那条标记为过期,不会被删除

"不会被删除"这点很关键——Mem0 保留历史而不是覆盖,这是后续回答"用户以前住哪里"的唯一方式。这是正经的工程活儿,不是在 upsert 外面套个壳。

Zep 的做法完全不同:它构建时序图谱,所以不是"当前事实赢",而是得到一条带有效期的时间边。如果你的 agent 需要推理某件事什么时候变了、而不只是当前是什么,这更表达力更强——比如 agent 要能解释"您的订阅在三月之前是年付,之后改成月付了"。对于只需要"当前什么是真的"的客服机器人,这套表达力就是查询时需要付的额外开销。

LangChain 的 memory 类根本不做这些。VectorStoreRetrieverMemory 会很愉快地同时返回广州和深圳两条相似度差不多的事实,决定信哪个是你自己的事。我见过团队把这个直接上生产环境,以为语义相似度高的就是最新的——根本不是,而且静默失败:agent 选了那个碰巧 embedding 距离查询更近的事实。

Redis DIY 也有同样问题,甚至更惨——连向量存储的便利都没有。你得到的就是你自己写的冲突处理,对于大多数赶工期的团队来说,冲突处理就是"没有",直到客诉冒出来才发现。

延迟和成本

Mem0 的提取步骤是每次写入多一次 LLM 调用——实测延迟 300-800 毫秒(用小体积提取模型),token 成本也是真的。对于写入密集型的 agent,每轮对话都会产生候选记忆,这个成本会累加起来。Mem0 通过异步写入和批量提取来缓解,但你还是在主 completion 之外多付了一次模型调用。

Zep 的图谱写入默认更便宜(除非开启 LLM 提取),但查询图谱做"最新事实"之外的任何操作,读的时候成本更高——图遍历不像向量相似度搜索那么便宜。

LangChain memory 和 Redis DIY 写入时最便宜,因为它们做的事最少——你付的是 embedding 调用费用,不是提取费用。成本会在后面以工程时间和错误答案的形式出现——如果你跳过冲突解决的话。

各家的实际优势场景

需求 选哪个
托管的事实提取 + 冲突解决,最少胶水代码 Mem0
时序推理("截至 X 日期我们认为是什么") Zep
已经深度使用 LangChain,在原型阶段,记忆量不大 LangChain memory 类
完全控制,已有 Redis 基础设施,团队有能力自己搞定冲突逻辑 Redis + RedisVL

文档里没人诚实说的权衡

每个帮你做提取和冲突解决的记忆工具,都在替你做信任判断——这恰恰是这周那篇热帖指出的失败模式。Mem0 的"保留历史、标记过期"方式比 Zep 的图边模型更保守,图边模型又比"用向量相似度当真相"更保守——LangChain memory 和粗暴的 Redis 方案默认就是最后一种,不管你愿不愿意。

如果你在给生产环境的 agent 选型,别先跑检索延迟 benchmark。给每个方案喂一段故意矛盾的对话——用户纠正自己两次——然后等一周后问"我住在哪里",看 agent 怎么答。这个单一测试比任何延迟图表都更快暴露这些工具的真实差距,因为差距在于记忆系统和"上面套了向量搜索的事实垃圾堆"之间。

对于大多数要做客服或个人助手 agent、需要几个月对话后仍然保持准确性的团队来说,这指向 Mem0 或 Zep 而不是自研——提取和冲突解决逻辑真的很难做对,这正是值得买而不是值得造的那种同质化工程。