记忆:从无状态(即每次对话都从零开始、什么都不记得)到有状态
这一章讲三件事: 为什么「上下文窗口够大」解决不了记忆问题;CoALA 框架怎么把记忆 分成四类型两范围;三个主流记忆框架各自的取舍,以及怎么判断你的记忆系统在好好工作还是在腐化。 这是全书后半程的主旋律:agent 从「每次都失忆的工具」变成「越用越懂你的同事」1。
1. 为什么窗口变大也没用
第 02 章留过一个伏笔:上下文窗口从 4,096 token 涨到了百万级。原书在这里把账算完2:
- 贵。 每次请求都把几百页历史重新发一遍,按 token 计费,成本线性上涨;
- 慢。 输入越长,推理越慢;
- 反而变差。 注意力机制在超长文本里会 让信号淹进噪声——窗口越大,「lost in noise」越严重。
更根本的:agent 是要连续做决策的——它必须记得自己做过什么、结果如何、哪些路走不通, 否则会重复失败路径、忘掉约束、丢掉目标。这些不是「把历史塞进窗口」能解决的, 需要有组织的存储与精准的检索。记忆的本质是 RAG 的延伸:基本 RAG 检索静态文档, agentic memory 是被 agent 的经历持续更新的、会成长的知识库3。
原书还给了一句定位:在所有 LLM 应用里,agent 对记忆的需求是最强的,没有之一4。
2. 进化史:三代记忆方案
原书把二十年历史压缩成三级台阶,每一级都值得看一眼失败原因5:
-
状态机时代(2000s): AIML 规则引擎,记忆=会话变量。会话一结束全忘光。任务型对话的 slot filling(往预设空格填信息)进步了一些——订机票记住「出发地/目的地/日期」, 但预设槽位——即对话系统里预设好的待填空格——之外的东西一概记不住;
-
ChatGPT 拐点(2022): 对话空前自然,但每个会话都是孤岛。开发者拼历史进提示词自救, 撞上窗口天花板后面临三难:截断(丢早期上下文)、摘要(压掉细节还加延迟)、 选择性保留(要写复杂的启发式——即凭经验拍出来的快速判断办法——规则来决定留哪句);
-
二元不够,认知科学登场: 「短期/长期」的二分法装不下真实需求——对话记录、用户偏好、 做事的方法,是完全不同性质的信息。研究者转向认知科学:人类记忆本来就是多系统分工的。 这条思路最终结晶为 CoALA 框架(Cognitive Architectures for Language Agents, Princeton 等机构的研究者 2024 年提出):工作、情景、语义、程序四种记忆, plus 它们之间的交互方式6。
3. CoALA:四种记忆 + 两个范围
3.1 四种记忆类型
| 类型 | 存什么 | 类比 | RAG 视角 |
|---|---|---|---|
| 工作记忆 working | 当前会话上下文与中间状态 | 电脑的 RAM | 决定每次检索时上下文里放什么 |
| 情景记忆 episodic | 具体经历:过去的对话、当时的解法、决策结果 | 「上次那件事」的录像带 | agent 对自己的经历库做 RAG |
| 语义记忆 semantic | 事实:用户偏好、领域知识、世界常识 | 百科卡片 | KG 支撑多跳(投资目标→风险→行情) |
| 程序性记忆 procedural | 怎么做事:规则、工作流(即一套固定顺序的办事流程)、行为模式 | 「会骑车」这种肌肉记忆 | 不存信息,直接塑造行为 |
四个要点展开7:
- 工作记忆严格说不属于 CoALA 的长期记忆部分,但它是其他一切的原料——工作记忆里流过的脏数据, 下游提取出的所有记忆全带病。所以它的质量要最先抓8;
- 情景记忆的价值是 case-based reasoning(基于案例的推理): 遇到新问题时搜相似旧案例, 把当年的解法适配过来。原书强调这是 RAG 检索机制的进化——检索对象从静态文档库 变成了 agent 自己的经历库9;
- 语义记忆有社区/个人两面(下一节),两面都有的意义:既能给通用建议,又能深度个性化10;
- 程序性记忆最特殊:它显形为 system prompt、工具使用模式、检索策略(何时触发检索、 查哪个库)。改它就是改 agent 的行为本身,所以更新要格外谨慎——要在「能自我改进」和 「保持稳定可预测」之间走钢丝11。
3.2 两个范围:社区与个人
同一类记忆再按范围切两半12:
-
社区记忆(共享): 一个用户处发现的有效解法,匿名化——即抹掉一切能认出具体是谁的信息——后抽象成集体知识(比如「这类软件故障的有效排查套路」)。晋升到社区要有门槛——多个用户的相似经历达到阈值才晋升,兼顾统计显著性和隐私13;
-
个人记忆(私有):
-
个人记忆(私有): 显式事实(投资目标、过敏史)+ 隐式模式(交流风格偏好、活跃时段、 反复出现的担忧)。铁律是严格隔离:每个用户独立命名空间(即互相看不见的独立存储分区),加密存储,防止任何串户; 用户有权查看、更正、删除自己的记忆14。甚至有系统做「记忆衰减」——久不用的记忆渐渐淡去, 模仿人类的遗忘曲线15。
范围×类型叉乘出一个实用组合:工作记忆只有个人的(它天生就是单次会话的); 其余三种长期记忆各有社区/个人两面——3×2=6 类,一次复杂的回答往往同时调用四五种 (医疗助手例:社区语义(医学知识)+ 社区情景(成功治疗模式)+ 个人语义(病史)+ 个人情景(上次谈过的治疗偏好))16。
4. 三个框架:一条谱系上的三个点
| Mem0 | LangMem | Zep / Graphiti | |
|---|---|---|---|
| 哲学 | 统一存储,不分认知类型 | 直接实现 CoALA 分类 | 时序知识图谱 |
| 机制 | extract-update-retrieve 管线:LLM 抽事实→去重/合并/冲突消解 | 四类型各有命名空间与提取管线;热路径即时写+后台异步提取 | 三层子图(episode 原始对话/semantic entity 实体事实/community 聚类);双时间轴 |
| 招牌数字 | LOCOMO 基准比 OpenAI 记忆实现准 26%,延迟与 token 省 ~90%;41,000+ GitHub stars、月 API 调用 1.86 亿+ | 三者中唯一有生产级程序性记忆实现 | 检索零 LLM 调用,P95 延迟 300 毫秒;深度记忆检索 94.8%,LongMemEval +18.5% |
| 短板 | 没有类型区分,行为模式与事实混在一起 | 依赖 LangChain 生态 | 没有程序性记忆 |
Graphiti 的**双时间轴(bi-temporal)**最值得单独讲:每条边带四个时间戳——
t_valid/t_invalid 记「这个事实在现实世界何时成立/失效」,
t_created/t_expired 记「系统何时录入/过期」。新事实与旧边矛盾时,系统做语义比较,
把被取代的旧边标上 t_invalid 而不删除——历史完整保留,任意时点的图状态都可以重建。
医疗进程追踪、投资组合演化、合规审计这类「过去很重要」的场景就吃这一套17。
选型判据(原书总结)18:统一长期记忆够用→Mem0;事实/经历/程序真的需要分开管理→LangMem; 时间动态主导→Zep/Graphiti;复杂需求可以混搭(如 LangMem 的程序性记忆 + Graphiti 的时序情景/语义)。
(补充(不在书里,依据我们的 frontier 书架):Mem0 的 add 管线八阶段与三路融合检索、 Graphiti 的实体消解与时序建模,在我们对这两个源码库的拆解里有更细的逐行分析。 依据: shelf=ai-frontier-reference/mem0#01-add-pipeline.md 事实=Mem0 把对话抽取的事实经去重合并后落库,检索按语义+关键词+实体三路融合排序。 另见 shelf=ai-frontier-reference/graphiti#02-resolution-temporal.md,事实=Graphiti 以 bi-temporal 边维护事实的有效时间与系统时间。)
5. 记忆系统怎么评测、怎么腐化
5.1 评测:从「点」到「轨迹」
无记忆的 agent 评单轮表现就够了;有记忆的 agent 必须评轨迹——三个时间尺度19:
- 短期: 单次会话内上下文连贯吗;
- 中期: 跨会话保留关键事实吗?隔了一周还能检索准确吗?
- 长期: 它真的在学习和改进吗(看性能轨迹,不看单点)?
具体指标四组:检索精度与召回完整度、记忆操作的延迟开销、存储效率(value-per-byte, 每字节(byte,信息量的最小计量单位)记忆提供了多少价值)、利用率(哪些记忆被频繁访问、哪些在睡觉)20。 行为面更有意思的指标:引用自然度(生硬的「As you mentioned before...」要扣分)、 学习效率(纠正次数应随交互下降)、以及错误恢复——原书断言: 「没有重复犯错,比任何正面指标都更能证明记忆在起作用」21。
5.2 两种腐化
生产中的记忆系统有两种典型病,原书各给了名字22:
- memory bloat(记忆膨胀): 什么都存,相似信息反复存,信噪比逐渐被稀释——检索精度随时间下滑;
- memory sclerosis(记忆硬化): 老记忆霸占检索结果。向量搜索不懂时间性—— 两年前的偏好照样被顶到最前面。对策:合并、衰减、冲突消解、归档,且不同类型的记忆衰老速度不同 (语义事实稳定多年,情景记忆很快过时),一刀切的策略必然失败23。
监控面上,延迟看 P50/P95/P99,缓存看命中率,分布看「是不是总在用同一小撮记忆」—— 后者往往意味着检索已经偏科24。
6. 边界与局限
- CoALA 是概念框架,不是实现标准——三个框架对它的实现程度各不相同(原书明说 Mem0 偏实用主义、Zep 没有 procedural)25;
- 三个框架的基准数字来自各自官方,横向可比性有限;
- 记忆的隐私与合规(用户删除权、跨用户隔离)原书点了题,深度有限——多租户大规模场景要另做功课26。
7. 可带走的
- 窗口变大≠记忆解决:贵、慢、lost in noise,三座山都在。
- CoALA 四类型:工作(原料)/情景(经历库)/语义(事实库)/程序(行为本身)。
- 情景记忆 = agent 对自己的经历做 RAG;case-based reasoning 是它的用法。
- 社区记忆晋升要有匿名化+多用户阈值;个人记忆要严格命名空间隔离。
- 三代框架一条谱系:Mem0(统一实用)→ LangMem(显式 CoALA,唯一生产级 procedural)→ Zep/Graphiti(双时间轴,无 procedural)。
- 双时间轴四时间戳:
t_valid/t_invalid管现实世界,t_created/t_expired管系统——历史不删,可重建。 - 评测看轨迹不看单点;「没有重复犯错」是最硬的记忆有效证据。
- 两种腐化要分别对症:bloat 靠过滤去重,sclerosis 靠时间感知的衰减。
8. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 记忆=RAG 的进化 | Agentic Memory: Extending RAG with Stateful Intelligence | text/109-fm-agentic-memory-extending-rag-with-stateful-intel.txt:49(搜「retrieve-then-generate」) |
| 多存储并用(polyglot) | Agentic Memory: Extending RAG with Stateful Intelligence | text/109-fm-agentic-memory-extending-rag-with-stateful-intel.txt:55(搜「polyglot」) |
| 状态机与 AIML | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:4(搜「finite state machines」) |
| slot filling 的局限 | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:7(搜「slots」) |
| 窗口约束与几百 token 的窘境 | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:19(搜「context window constraints」) |
| 拼历史三难 | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:22(搜「concatenating conversation history」) |
| 信号淹进噪声 | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:28(搜「lost in noise」) |
| agent 对记忆需求最强 | The pre-ChatGPT era – state machines and slot filling | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:31(搜「Memory has always been central」) |
| CoALA 提出 | The pre-ChatGPT era – state machines and slot filling · Procedural memory (skills) | text/110-fm-the-pre-chatgpt-era-state-machines-and-slot-fill.txt:49(搜「CoALA」) · text/114-fm-procedural-memory-skills.txt:17(搜「Princeton」) |
| 工作记忆=RAM 与原料论 | Working memory (short-term) | text/111-fm-working-memory-short-term.txt:4(搜「RAM」) · text/111-fm-working-memory-short-term.txt:7(搜「source material」) |
| 情景记忆与案例推理 | Episodic memory (experiences/events) | text/112-fm-episodic-memory-experiences-events.txt:4(搜「Episodic memory」) · text/112-fm-episodic-memory-experiences-events.txt:7(搜「case-based reasoning」) |
| 语义记忆两面 | Semantic memory (facts/knowledge) | text/113-fm-semantic-memory-facts-knowledge.txt:7(搜「dual nature」) |
| 程序性记忆与风险 | Procedural memory (skills) | text/114-fm-procedural-memory-skills.txt:4(搜「how the agent acts」所在段,搜「shapes the agent」) |
| 社区记忆与晋升阈值 | Community/public memory – shared across all users | text/115-fm-community-public-memory-shared-across-all-users.txt:4(搜「Community memory」) · text/115-fm-community-public-memory-shared-across-all-users.txt:10(搜「threshold of similar experiences」) |
| 个人记忆与隔离 | Personal/user-specific memory – individual context | text/116-fm-personal-user-specific-memory-individual-context.txt:10(搜「namespace」) |
| 遗忘曲线 | Personal/user-specific memory – individual context | text/116-fm-personal-user-specific-memory-individual-context.txt:13(搜「forgetting curve」) |
| 工作记忆只有个人、六类组合 | How memory types and scopes intersect | text/117-fm-how-memory-types-and-scopes-intersect.txt:4(搜「exclusively personal」) · text/117-fm-how-memory-types-and-scopes-intersect.txt:16(搜「healthcare assistant」) |
| 聊天日志不够、要遥测 | Quality of working memory data | text/118-fm-quality-of-working-memory-data.txt:4(搜「designed for agentic memory」) |
| 记忆硬化(sclerosis) | Curation and maintenance of growing memory stores | text/120-fm-curation-and-maintenance-of-growing-memory-store.txt:4(搜「sclerosis」) |
| Mem0 管线与数字 | Mem0 architecture | text/121-fm-mem0-architecture.txt:4(搜「extract-update-retrieve」) · text/121-fm-mem0-architecture.txt:10(搜「LOCOMO」) · text/121-fm-mem0-architecture.txt:10(搜「41,000+」) |
| LangMem 双模式与 BaseStore | LangMem | text/122-fm-langmem.txt:7(搜「Hot-path」) · text/122-fm-langmem.txt:10(搜「BaseStore」) |
| Graphiti 三层子图与双时间轴 | Zep and Graphiti | text/123-fm-zep-and-graphiti.txt:7(搜「episode subgraph」) · text/123-fm-zep-and-graphiti.txt:10(搜「t_valid」) |
| Graphiti 检索与数字 | Zep and Graphiti | text/123-fm-zep-and-graphiti.txt:13(搜「300 ms」) · text/123-fm-zep-and-graphiti.txt:13(搜「94.8%」) |
| 无程序性记忆的短板 | Zep and Graphiti | text/123-fm-zep-and-graphiti.txt:16(搜「procedural memory」) |
| 选型判据 | Choosing the right memory framework | text/124-fm-choosing-the-right-memory-framework.txt:7(搜「Mem0」) · text/124-fm-choosing-the-right-memory-framework.txt:16(搜「Hybrid architectures」) |
| 评测三时间尺度 | Evaluating memory-based versus memoryless systems | text/125-fm-evaluating-memory-based-versus-memoryless-system.txt:14(搜「Short-term evaluation」) · text/125-fm-evaluating-memory-based-versus-memoryless-system.txt:7(搜「trajectory」) |
| 四组指标与 value-per-byte | Memory effectiveness metrics | text/126-fm-memory-effectiveness-metrics.txt:4(搜「retrieval precision」) · text/126-fm-memory-effectiveness-metrics.txt:110(搜「value-per-byte」) |
| 引用自然度与错误恢复 | Behavioral evaluation | text/127-fm-behavioral-evaluation.txt:34(搜「As you mentioned before」) · text/127-fm-behavioral-evaluation.txt:116(搜「The absence of repeated errors」) |
| 记忆膨胀与硬化 | Performance tracking | text/128-fm-performance-tracking.txt:93(搜「Memory bloat」) · text/128-fm-performance-tracking.txt:106(搜「sclerosis」) |
| 监控与工具 | Performance tracking | text/128-fm-performance-tracking.txt:62(搜「Datadog」) |