04 · 落地

框架 · 厂商 · 选型 · 前沿

前三章建立了记忆的边界、机制与架构——这章落到真实的框架、厂商方案、选型判据与失败模式。

本章建立的 schema

  • 五个主流框架(Mem0 / Letta / Zep / LangMem / Cognee)的存储模型与底层机制差异,能从一张表读出"为什么这个数字"。
  • 三家厂商原生方案的归属差异,以及它如何映射回 03 章的「记忆状态归属轴」。
  • 一条从需求出发的选型判据链,加上六类反复出现的失败模式与它们的根因。

到这里,记忆已经不是抽象概念:写入路径、生命周期五环、分层虚拟上下文、状态归属——都已就位。剩下的问题是工程问题。市面上有十几个号称"给 agent 加记忆"的框架,每个都给一组漂亮的 benchmark 数字;三家大厂各自端出原生记忆 API,措辞接近却归属完全不同。这章把它们摊开比较,给出选型判据,并把那些在生产里反复咬人的失败模式归到根因。

4.1框架横评:五个主流方案

框架之间的真正差异不在 API 形态,而在存储模型——它决定了能回答哪类查询、写入要花多少 LLM 调用、以及时间正确性能不能保证。

为什么从存储模型切入

每个框架都暴露 add() / search() 这类接口,看接口分不出高下。决定能力上限的是底层:向量库召回语义近邻但不编码关系,多跳查询会失败;知识图谱能多跳、能查"当时是什么状态",但每条记忆都要付实体抽取的延迟。读懂存储模型,benchmark 数字就不再是孤立的——而是机制的必然结果。

表 4.1 · 五个主流记忆框架横评
框架 存储模型 记忆类型 写入机制 检索机制 区别特征 最适用
Mem0 hybrid:向量 + KV + SQL(可选 graph) 语义事实 / 偏好 LLM 抽取 + 冲突消解 多信号:vector + BM25 + entity token 高效、框架无关的 drop-in 需要廉价快速个性化的 chatbot / 助手
Letta
(ex-MemGPT)
分层 LLM-OS:core blocks + recall + archival 向量 working / episodic / semantic agent 自编辑 + sleeptime 后台巩固 agent 自主调用 archival 检索 agent 自己治理 persona 与记忆 长生命周期、需自治的 agent
Zep
(Graphiti)
时序知识图谱(Neo4j 底) episodic + semantic + 社区子图 LLM 抽实体/边 + bitemporal 标注 hybrid:语义 + BM25 + 图遍历 四时间戳,时间正确 事实会变、需时间感知的场景
LangMem
(LangGraph)
可插拔 BaseStore(vector / KV)+ checkpointer semantic / episodic / procedural 命名空间写入,开发者控制时机 命名空间 store.search 短期(thread)vs 长期(namespace)干净切分 已经在 LangGraph 上的团队
Cognee KG + vector hybrid 实体 + 关系 + 语义块 ECL 管道:Extract → Cognify → Load 图 + 向量联合检索 把异构语料结构化为 grounding 层 在大量异构语料上做 grounding

每个框架的底层机制(比 README 深一层)

Mem0 把记忆当成选择性抽取后的原子事实集合。写入时一次 LLM 抽取把"最新交流 + 滚动摘要 + 近期消息"压成事实,再检索 top-s 相似旧记忆,让模型在 ADD / UPDATE / DELETE / NOOP 间用 function-calling 决策——冲突在写入时就消解掉。代价是每次写入一个 LLM 调用 + embedding;回报是检索时上下文干净。公开数字:LoCoMo 上准确率 ≈ 92.5,每次查询 ≈ 7K token(2026-04 数据)——后者是它"token 高效"卖点的来源,对比全历史塞进 prompt 的方案,token 占用低一个数量级。

Letta 不是"存事实",而是把 03 章的分层虚拟上下文产品化:core memory blocks(persona / human)常驻 context,recall 与 archival 在 context 外,agent 通过 memory_replace / archival_insert 自己分页。它的差异点是记忆的写入决策权交给了 agent 自己——配合 sleeptime agent(一等的 agent 类型,在空闲时重写 memory blocks)做后台巩固。所以它没有"benchmark 准确率"这种单一指标——它卖的是自治,不是召回率。

Zep / Graphiti 的底层是bitemporal 时序知识图谱。每条边带四个时间戳:valid_at / invalid_at(事实在现实世界中的有效期)与 created_at / expired_at(记录在系统里的存续期)。这让"用户当前用什么数据库""用户三个月前用什么"都能精确查到,且旧事实被标记失效而非删除——不会产生陈旧幻觉。代价是每条 episode 的 LLM 实体 + 边抽取延迟。公开数字:LongMemEval 上相对基线 +18.5%,正确性提升直接来自时间维度。

LangMem 的机制是把记忆收编进 LangGraph 的存储抽象:长期记忆走可插拔 BaseStore(按 namespace 组织),短期会话走 checkpointer(按 thread)。它本身不发明新的抽取或图算法,价值在于把"短期 vs 长期"这条 03 章的归属切分做成了一等概念,让已在 LangGraph 的团队零摩擦接入。

Cognee 走 ECL 管道(Extract → Cognify → Load):从异构语料抽实体、构知识图谱、写入图 + 向量双存储。它解决的不是"记住对话",而是"把一大堆杂乱文档变成可 grounding 的结构层",更接近知识工程而非对话记忆。

预测一下

同一个问题——"用户上个季度用的是哪个数据库?"——Mem0(向量 + KV)和 Zep(时序图)谁能答对?为什么?

展开

Zep 能,Mem0 不能。Mem0 的 recency-wins 消解会把旧的"Postgres"覆盖成新的"MySQL",旧值不再可检索——它只保留"当前真相"。Zep 把旧事实标记 invalid_at 而非删除,valid_at 区间仍可查询历史状态。这正是"时间正确性"作为选型轴的意义:不是召回更准,而是能回答带时间的问题。

五个记忆框架在「存储模型 × 自治程度」平面上的定位 存储模型 向量 / KV 知识图谱 自治程度 agent 自治 简单 drop-in Mem0 LangMem Cognee Zep / Graphiti Letta 控制面 · 与存储正交
图 4.1框架定位:横轴是存储模型(向量/KV ↔ 知识图谱),纵轴是把记忆决策权交给 agent 的程度。注意:Letta 居中靠上不是折中——它的存储是可换的,真正的轴是"谁来决定记什么",这与左右两端正交。

4.2厂商原生:三家的措辞接近、归属不同

三家大厂都端出"记忆",但它们落在 03 章归属轴的不同位置——记忆数据归谁、存在谁的基础设施上,是比 API 形态更重要的分界。

为什么归属比 API 重要

"记忆 API"听起来都一样:写一条、读一条。但 Anthropic 的方案里记忆文件存在你的后端,服务器不留任何记忆;OpenAI 的 Conversations 把数据存在 OpenAI 基础设施、无 TTL;Gemini 的 Memory Bank 是托管且模型无关。这决定了可移植性、隐私边界、以及供应商锁定的程度——选错了,迁移成本是重写整条记忆层。

Anthropic:memory tool + context editing(App 拥有)

Anthropic 的 memory tool 只提供工具接口——对一个 /memories 目录的 create / read / update / delete——后端存储由开发者自己托管。Anthropic 的服务器上不留任何记忆。配套的 context editing(clear_tool_uses_20250919)在 token 超阈值时服务端自动清除陈旧工具结果、替换为占位符。两者搭配,在 100 轮 web-search 评测上联合提升 39%、token 减少 84%。归属落点:App 拥有——控制、可移植、隐私最大,代价是开发者自建存储与保留策略。

OpenAI:消费级 vs API 的三档持久性

OpenAI 这边要分两层。ChatGPT 产品里的"记忆"是消费级、自动的,开发者不可控。Responses API 则给三档:手动(自己拼上下文,最大控制)/ previous_response_id + store=true(链式引用,30 天保留)/ Conversations API(持久、无 TTL)。归属落点随档位滑动——手动模式偏 App 拥有,后两档偏厂商拥有(数据驻留 OpenAI、保留策略不透明)。

弃用提醒

旧的 Assistants API 已弃用,2026-08-26 下线。新建项目不要再基于它的线程记忆——迁移到 Responses API 的 Conversations 或自管状态。

Google:Gemini 消费级 + Vertex Memory Bank(厂商托管、模型无关)

Gemini 产品端是消费级自动记忆。面向开发者的是 Vertex AI Memory Bank:托管存储、自动抽取、设了 TTL,关键差异是模型无关——记忆层不绑死在某个 Gemini 版本上,可跨模型复用。归属落点:典型的厂商拥有——代码最少(存储、抽取、TTL 都由厂商管),代价是锁定与数据驻留在厂商基础设施。

表 4.2 · 三家厂商原生方案的归属定位
厂商方案归属(见 03 章)持久性关键约束
Anthropic memory tool App 拥有 由开发者后端决定 服务器零留存;自建存储
OpenAI 手动 / previous_response_id App ↔ 厂商(随档位) 手动无限 / 链式 30 天 Assistants API 2026-08-26 下线
OpenAI Conversations 偏厂商拥有 持久、无 TTL 数据驻留 OpenAI
Vertex Memory Bank 厂商拥有 托管 + TTL 锁定;但模型无关

4.3选型判据:从需求倒推框架

选型不从"哪个 benchmark 高"出发,而从"要回答哪类查询、谁来运维、记忆归谁"三个问题倒推——每条需求几乎唯一地指向一个框架。

为什么是判据而非排名

没有"最好的记忆框架",只有"对这个需求最对的"。LoCoMo 上 Mem0 的 92.5 对一个需要时间正确性的场景毫无意义——它根本不存历史状态。判据把选型从比分变成匹配:先确定主约束(成本?自治?时间?存量栈?数据形态?),框架自然浮出。

下面这棵决策树把五条主约束串起来。每个菱形是一个二元判断,终端框是结论。归属轴(App / 框架 / 厂商)是正交的第二维——任何一条路径都要再叠加 03 章的归属选择。

记忆框架选型决策树 需要给 agent 加记忆 事实会变 需查历史状态? 是 Zep 时间正确 否 长生命周期 agent 自治记忆? 是 Letta 自编辑+sleeptime 否 已经在 LangGraph? 是 LangMem 否 大量异构语料 要 KG grounding? 是 Cognee 否 Mem0 最快 drop-in
图 4.2选型决策树:按主约束逐层下沉,Mem0 是"无特殊约束 + 成本敏感"的默认落点。注意:这棵树只解决"哪个框架",归属轴(App / 框架 / 厂商拥有)是正交的第二个决策,每条路径都要再叠加一次。
表 4.3 · 选型判据速查
主约束 / 需求指向根因(为什么是它)
最快 drop-in 且成本敏感 Mem0 选择性抽取 + 多信号检索,token 占用低一个数量级
agent 自己治理记忆 / 长自主 Letta 自编辑 + sleeptime,把写入决策权交给 agent
时间正确性:"当时是什么" Zep bitemporal 四时间戳,旧事实标失效而非删除
已经在 LangGraph 上 LangMem 原生 BaseStore + checkpointer,零摩擦接入
异构语料要 KG grounding Cognee ECL 管道把杂乱文档结构化为图 + 向量
一句话存储轴

向量 / KV = 简单 + 便宜 + 快;图 = 关系 / 时序、成本更高;Letta = 控制面,与存储正交。需求里的主约束基本就锁定了存储轴,存储轴基本就锁定了框架。

4.4六类失败模式:根因与防线

记忆系统的失败模式高度集中在六类——其中投毒是安全级别的、独有于"有写入路径"的系统,是 RAG 永远不会遇到的那一类。

为什么单列失败模式

记忆引入了 RAG 没有的写入路径(这是整个教程的分界线),写入路径也引入了 RAG 没有的失败面。把这六类摊开、归到根因,是把"加了记忆"从功能点变成可运维系统的前提——否则上线后才在客户面前撞上"陈旧记忆告诉客户用错数据库"这类事故。

① 记忆投毒(memory poisoning)

攻击者在网页、邮件、文档里植入"请记住……"的指令,被抽取器写入记忆后跨会话存活,日后甚至对另一个用户触发。这是注入攻击的持久化版本:一次注入,长期生效。学术侧 MINJA(NeurIPS 2025)实测 95% 注入成功率 / 70% 攻击成功率(ASR);相关工作还有 MemoryGraft。安全侧已被收进 OWASP ASI06(Agentic Security 记忆投毒条目)。根因:写入路径信任了不可信输入。防线:写入前对来源做信任分级、对"祈使句式的记忆"做过滤、关键记忆要 provenance。

这是记忆独有的失败模式

RAG 是只读的,没有写入路径,因此永远不会被投毒。投毒只发生在 agent 能自己写记忆的系统里——这恰好印证了整个教程的分界线:真正的区别是那条写入路径,而它既是能力来源,也是新攻击面。

② 陈旧 / 矛盾记忆

用户三个月前从 Postgres 迁到了 MySQL,记忆里却还存着"用户在用 Postgres",于是 agent 在迁移六周后还在告诉客户用 Postgres。根因:没有 supersession(取代)机制——新事实没有让旧事实失效。防线:写入时冲突消解(recency-wins)或时序图的 invalid_at 标注。这正是 Zep 那套 bitemporal 要解决的核心问题。

③ 检索漂移 / distractor 干扰

检索回来的记忆里混进了语义相近但无关的条目(distractor),把模型带偏。关键反直觉点(02 章已建立):单条 distractor 就能实测降低准确率,且随上下文长度复合——"检索太多"不是稀释,是主动误导。根因:纯相似度检索不区分"相关"和"看起来相关"。防线:rerank、重要性加权、收紧 top-k。

④ 上下文膨胀 / 腐烂

图省事把全部历史每轮都塞进 prompt,token 成本随轮次线性涨——相对"选择性抽取"的方案,膨胀到 约 10× 成本,且 prefill 延迟同步恶化。根因:没有上下文治理(02 章的 compaction / 03 章的 context editing 就是来管这个的)。防线:在 100% 窗口前 compact、用记忆框架的选择性抽取替代全量。

⑤ 实体碎片化

同一个实体以多种表面形式存在——"张总""张伟""Mr. Zhang"被当成三个人,记忆碎成三份,检索时永远只命中一份。根因:写入时没有归一到 canonical ID(02 章写入环节的要求)。防线:实体解析 / 别名归并,知识图谱框架在这点上结构性占优。

⑥ 评测困难(+ 隐私)

用错基准会系统性低估问题:NIAH(Needle-in-a-Haystack)准确率 >99.7%,看起来记忆毫无问题,但它测的是"容量"不是"连续性"。要用 LongMemEval / LoCoMo / BEAM 这类真正测记忆能力的基准。隐私是平行的失败面:抽取器会把用户随口说的秘密(密码、PII)无限期留存——根因是抽取不做敏感信息过滤。防线:抽取阶段加 PII 检测 + 按类别 TTL。

预测一下

一个团队上线前用 NIAH 测他们的记忆 agent,拿到 99.8% 通过率,宣布"记忆没问题"。哪里出了错?

展开

基准选错了。NIAH 测的是"能否从长文本里捞出一根针"——这是容量问题,不是连续性问题。它不考验跨会话写入、冲突消解、时间正确性、多跳关联——而这些才是记忆的真实能力。换 LongMemEval(长上下文助手在它上面掉 30%)或 BEAM,分数会立刻露馅。这就是失败模式⑥:用错基准 → 系统性低估。

4.5前沿:稳定 / 在变 / 已过时(dated 2026-06)

记忆是个快速移动的领域,把结论分成三桶——已经沉淀的、正在变的、已经过时的——比给一份"现状速览"更能指导决策。每条带日期。

为什么分三桶

"前沿"如果只是罗列新论文,半年后就全错。分桶让读者知道哪些可以现在就当地基(稳定)、哪些要押注但留退路(在变)、哪些别再碰(已过时)。日期是给未来的自己看的——便于判断这份判断本身有多新。

稳定(可作地基)

  • memory ≠ 长上下文:BEAM(ICLR 2026)证明结构化记忆与长上下文的差距随 token 增大而拉大,不会被"更长窗口"消解。
  • CoALA 类型 + 生命周期:四类记忆 + 写入/存储/检索/遗忘/治理的框架已成共识(survey 2512.13564,2025-12)。
  • 选择性抽取 + 多信号检索 > 全塞:Mem0(2025-04)确立,token 低一个数量级而准确率不降。
  • 文件即记忆:把记忆写成 context 外的文件(Letta 2025-08 + Anthropic memory tool 2025-09)已是经过验证的模式。

在变(押注但留退路)

  • procedural / skill memory:把"学到的做法"显式存为可复用技能——MemSkill(2026-02)、分层程序记忆(2025-12)。这是 2026 最活跃的前沿,因为它直指 agent"从经验中学会怎么做",而不止"记住事实"。
  • Mem0 新算法:从 2025-04 的 ADD/UPDATE/DELETE/NOOP 多遍消解,转向 2026-04 的单遍 ADD 优先——写入策略仍在演化。
  • sleeptime 后台巩固:空闲时重写记忆块的子 agent(Letta,2025–26 持续迭代)。
  • 厂商消费级记忆:ChatGPT(2025-04)、Gemini(2025-08)、Anthropic Memory for Agents(2026-04)相继落地,归属与保留策略仍在分化。
  • 时序知识图谱:Zep(2025-01)把 bitemporal 带进主流,其它框架是否跟进尚未定型。

已过时(别再碰)

  • 全塞一个向量库:把所有东西丢进一个 flat 向量库当记忆——distractor 与膨胀问题已证明它不可扩展。
  • 无限长 context 当记忆替代品:长上下文助手在 LongMemEval 上掉 30%——"够长就不用记忆"被证伪。
  • NIAH / RULER 当记忆基准:已被重新归类为"容量"而非"连续性"基准,用它评记忆等于系统性低估。

基准演进:测量标准本身在升级

记忆基准三年走了一条明显的升级路线,每一代都是因为上一代"太容易/测错了维度"而出现:

记忆基准演进 LoCoMo → LongMemEval → BEAM 2024 2024 末 ICLR 2026 LoCoMo 多会话 QA 头条:奠基基准 如今"太温和" LongMemEval 5 种记忆能力 头条:长上下文 助手掉 30% BEAM 1M–10M token · 10 能力 结构化 > 长上下文 +3.5 ~ 12.7% 无方法饱和
图 4.3基准演进:每一代都因上一代"测错维度或太容易"而出现,能力数从 5 涨到 10、上下文从多会话涨到 10M token。注意:BEAM 上"无方法饱和"——没有任何现有方法刷满,意味着记忆远未被解决,这是该领域仍在快速移动的硬证据。

最新战报:Hindsight(2025-12)在 BEAM-10M 上排第一,并在 LongMemEval 上拿到 91.4%——但 BEAM 整体仍无方法饱和,说明"长上下文 + 结构化记忆"的组合空间远未探尽。

自测

  1. 一个客服 agent 需要记住"客户当前用哪个数据库",且客户会迁移、过去状态偶尔要追溯。Mem0 和 Zep,选哪个?为什么这是存储模型问题而非准确率问题?
    参考答案

    选 Zep。要追溯"过去用什么"就需要历史状态可查,这是存储模型能力:Zep 的 bitemporal 把旧事实标 invalid_at 而非删除,valid_at 区间可查历史。Mem0 的 recency-wins 只保留"当前真相",旧值被覆盖、不可检索——无论它 LoCoMo 准确率多高(92.5)都答不了带时间的问题。这就是为什么选型要从"回答哪类查询"而非"哪个 benchmark 高"出发。

  2. 为什么"记忆投毒"是 RAG 永远不会遇到、而记忆系统独有的失败模式?把它和整个教程的分界线联系起来。
    参考答案

    RAG 是只读的,没有写入路径,外部文档不会被"记进去"再在未来触发。投毒需要一条能把不可信输入写进持久状态的路径——这正是 agent memory 独有的写入路径(教程的分界线)。所以写入路径既是记忆相对 RAG 的能力来源,也是它独有的攻击面:MINJA 实测 95% 注入 / 70% ASR,已进 OWASP ASI06。

  3. 团队上线前用 NIAH 测出 99.8% 通过率,宣称记忆没问题。这个结论错在哪?该用什么基准?
    参考答案

    NIAH 测的是容量(能否从长文本捞出一根针),不是连续性(跨会话写入、冲突消解、时间正确、多跳)。它系统性低估真实记忆问题。应改用 LongMemEval(长上下文助手在它上掉 30%)或 BEAM(10M token、10 能力、无方法饱和)。NIAH / RULER 已被重新归类为"容量"基准——这是失败模式⑥。

  4. Anthropic memory tool 和 Vertex Memory Bank 都叫"记忆",但落在 03 章归属轴的两端。分别在哪一端?各自的代价是什么?
    参考答案

    Anthropic memory tool = App 拥有:只给工具接口,记忆文件存在开发者后端,Anthropic 服务器零留存——控制 / 可移植 / 隐私最大,代价是自建存储与保留策略。Vertex Memory Bank = 厂商拥有:托管存储 + 自动抽取 + TTL,代码最少,代价是供应商锁定与数据驻留厂商基础设施(但它模型无关,缓解了部分锁定)。归属是比 API 形态更重要的分界。

进阶挑战

给一个"会随时间变化的事实"设计跨框架的真相维护

设想用户的职位会变(工程师 → 团队 leader → CTO),下游 agent 既要知道"现在是 CTO",偶尔也要回答"他升 leader 是什么时候"。(a) 用 Mem0(向量 + KV)实现,会丢什么、需要在应用层补什么?(b) 用 Zep(bitemporal)实现,四个时间戳各自记什么?(c) 如果这个"职位"事实来自一封外部邮件,③检索漂移、①投毒、⑤实体碎片化三类失败模式分别会在哪一步咬人,各设一道防线。把答案写成一段"真相维护策略",并标注它在哪种框架下成本最低。

参考来源

  • Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory — arXiv 2504.19413(2025-04,LoCoMo 与 token 效率数据来源)
  • Zep / Graphiti: A Temporal Knowledge Graph Architecture for Agent Memory — arXiv 2501.13956(2025-01,bitemporal 四时间戳、LongMemEval +18.5%)
  • Anthropic — Managing context on the Claude Developer Platform(memory tool + context editing)— anthropic.com/news/context-management(2025-09)
  • OpenAI — Conversation state & the Responses API(手动 / previous_response_id / Conversations)— platform.openai.com/docs/guides/conversation-state
  • Google Cloud — Vertex AI Agent Engine Memory Bank(托管、模型无关)— cloud.google.com · Memory Bank overview
  • A Survey on the Memory Mechanism of LLM Agents — arXiv 2512.13564(2025-12,CoALA 类型 + 生命周期综述)
  • BEAM: 长程 agent 记忆基准(1M–10M token、10 能力、无方法饱和)— ICLR 2026;Hindsight(2025-12,BEAM-10M 第一,LongMemEval 91.4%)
  • MINJA: Memory Injection Attack on LLM Agents — NeurIPS 2025(95% 注入 / 70% ASR);OWASP Agentic Security ASI06(记忆投毒)