你做了一个 Agent,用户用了两天,问它"之前让我改的那个需求呢",它说"我不记得这件事"。加了记忆功能,用户问"上次那个页面你做了什么更新",它开始胡说八道,把别人的项目内容安到你头上。认真设计了记忆层,Agent 确实记住了上下文,但 Token 爆了,响应时间从 0.5 秒变成 8 秒。
这三个问题,分别对应了记忆系统的三个核心矛盾:丢了、假的、贵的。
LLM 生来无记忆
语言模型每次推理,都是从零开始。它没有"前一秒说了什么"的内置概念,更没有"上周帮用户做过什么"的长期记录。
这不是模型的缺陷,这是它的本质。一个 70B 参数的模型,在训练时见过互联网上的所有文本,但不包括"你上周让 Agent 改了一个按钮颜色"这件事——因为这件事发生在模型训练之后。
所以记忆系统是一个外部叠加层,不是模型的内置能力。它的全部职责,是回答四个架构问题:
- 存什么:哪些信息值得被记住
- 存在哪:存储介质的特点和代价
- 怎么取:Agent 需要的时候怎么找到这些记忆
- 怎么管:记忆怎么积累、怎么遗忘、怎么更新
这四个问题回答的方式不同,就形成了不同的记忆架构。
四层记忆模型
目前主流的 Agent 框架,记忆系统基本都落在同一个四层模型里,只是实现深浅不同。
第一层:上下文记忆(In-context)
生命周期:一个会话窗口之内,会话结束即消失。
原理:LLM 的上下文窗口就是它的"工作记忆"。你把什么 token 序列塞进去,它就在这次推理里能看见什么。超出窗口的内容,模型完全感知不到。
适用场景:当次会话的连续对话、当前任务的中间状态、需要完整还原对话过程的任务。
第二层:外部记忆(External)
生命周期:跨会话持久化,存在文件、数据库或向量库里。
原理:把需要跨会话保留的信息写入外部存储,下次开新会话时,通过检索把相关内容捞出来注入 context。
这是大多数 Agent 记忆系统的主要着力点。三个主流框架的实现差异也集中在这里:
OpenClaw 的做法:文件系统即真理来源。短期记忆是当天的日志文件(追加写入),长期记忆是 MEMORY.md(定期提炼精华)。检索时语义搜索和 BM25 并行,结果存入 SQLite 向量索引。逻辑是:没有写进文件的,等于没发生过。
Claude Code 的做法:不用语义搜索。它用路径编码——每个项目目录下放 CLAUDE.md,分为用户级、项目级、目录级。Agent 靠路径规则 O(1) 查找,不需要理解语义,所以不会检索错误,但也无法处理路径规则覆盖不到的隐式需求。
Hermes 的做法:热记忆(始终注入,上限 ~1300 token)+ 历史归档(SQLite FTS5 全文索引,Agent 主动检索,不自动注入)。注意它的反直觉设计:热记忆的上限很小,强制你只能放最关键的上下文——这对 Prefix Cache 友好,也逼迫设计者做质量控制而不是往里堆料。
适用场景:跨会话的用户偏好、项目背景、长期目标、已完成的关键决策。
第三层:情景记忆(Episodic)
生命周期:可积累,理论上随使用时间增长。
原理:记录 Agent 过去做过的关键行为,以及这些行为的后果。不是记录"说了什么",而是记录"做了什么决策、产生了什么结果"。
这是四层里实现难度最大的一层,目前只有 Hermes 有真正的情景记忆能力——它叫 Skills。
Hermes 的 Skills 系统:
当一个复杂任务(5 次以上工具调用)完成后,Hermes 会自动分析执行路径,把"为什么这样执行"和"效果如何"抽象成一个 Skill 文档。
OpenClaw 的 Dreaming 机制:在睡眠状态(会话结束、无活跃请求)下运行,自动回顾近期记忆片段,生成摘要写入 MEMORY.md。这是一个"被动积累"的思路,不依赖任务完成后的显式抽象。
第四层:参数记忆(Parametric / In-weights)
生命周期:模型始终拥有,训练后基本固定(除非做微调)。
原理:模型的权重里存储的知识。本质上是模型在预训练阶段从大规模语料里学到的"常识"。
这层的特点:始终存在,不需要额外存储和检索,但不可靠。幻觉问题就是这层的副作用。模型权重里的知识是模糊的概率分布,不是精确的事实存储。当你想精准提取某个知识时,它可能"幻觉"出一个看起来合理但实际错误的答案。
适用场景:通用常识、推理能力、语言理解。
四层记忆模型分别承担不同职责
存什么:
上下文层存当前会话的完整交互 外部层存跨会话的背景信息 情景层存成功路径的方法论 参数层天然包含通用知识,但不可靠
存在哪:
上下文 → GPU HBM(KV Cache)或 CPU 内存 外部 → 文件系统 / 向量数据库 / 结构化数据库 情景 → Skill 文档(Hermes)或自动生成的摘要(OpenClaw Dreaming) 参数 → 模型权重本身
怎么取:
上下文:直接注入,无需检索 外部:语义搜索(OpenClaw)或路径规则(Claude Code)或主动检索(Hermes) 情景:任务匹配触发,不是搜索,是调用 参数:靠模型本身推理,不是主动读取
怎么管:
上下文:随会话结束自然释放 外部:需要定期清理和提炼,防止向量索引膨胀 情景:最难,需要判断什么时候从经验生成 Skill,以及 Skill 过时了怎么更新 参数:微调可以修改,但成本极高,大多数场景不动
看了四层模型,你可能会想:这么多层,怎么可能还会在"丢了"这种低级问题?
因为实现成本差异极大。上下文记忆几乎零成本,随便一个聊天框架都能做。外部记忆需要向量数据库或文件系统和检索逻辑,Claude Code 用路径规则绕过了语义搜索,OpenClaw 需要完整的语义+BM25 混合检索能力。情景记忆就更复杂了,需要在任务完成后自动分析执行路径、抽象出可迁移的方法论,这需要整个执行层和记忆层的深度协同。
所以大多数 Agent 应用只做了第一层。用户关掉对话,记忆清零。第二天打开,Agent 什么都不记得。
但真正复杂的多步骤 Agent 任务,如果每次都是全新开始,Agent 就永远没法从错误里学习——它会反复犯同样的错误,每次都重新摸索同样的路径。这就是为什么 Hermes 的 Skills 思路是最值得关注的长期方向:Agent 能力的增长,应该来自执行历史的积累,而不是靠人工写更多的规则。
记忆系统的设计没有银弹,每一层都有代价。知道边界在哪,比堆功能更重要。
夜雨聆风