智能体记忆的形态:文件、存储与经验
存储架构
图 2. 同一个任务,两种架构。基于文件的记忆把模型放在写入路径,把文本搜索放在读取路径;结构化记忆则把嵌入器放在写入路径,把排序器放在读取路径。
两种方案都放在一个冻结模型旁边,跨会话保存事实。真正的区别在于:谁来干活,以及什么时候干。
基于文件的记忆
基于文件的记忆把预算花在写入阶段,由模型自己判断。每轮对话结束后,模型决定有没有值得保留的内容;如果有,就编辑一个文件——在索引里加一行,或在某个主题文件里加一段。索引被刻意做得小,因为每次会话都要把它加载进上下文;常见预算是前 200 行左右。其余内容都存放在主题文件里,模型不去读就不会加载。因此,“回忆”就是模型把索引放在眼前,再对剩下的文件做一次文本搜索所能找回的东西。这里没有嵌入器,也没有排序器。整个系统就是模型自己的判断加一个文本搜索——正因为如此它非常容易发布:只要你有文件工具,你就有了这套能力。
这种思路在已发布的编码代理中随处可见:Claude Code 的 auto-memory(一个项目级 MEMORY.md 索引,索引由模型整理的主题文件组成)、Anthropic API 中的 memory tool 原语、社区的 Cline “Memory Bank” 及其衍生版本,还有 Cursor 和 Windsurf 里的自动记忆。需要把它和指令文件族(AGENTS.md、CLAUDE.md、.cursorrules)区分开:后者是人工编写的静态上下文;本文评价的是那种由模型自己
结构化记忆
结构化记忆同样把预算花在写入阶段,只不过不靠模型来做。每一轮对话都会被拆成原子单元,各自做嵌入,配上稠密和稀疏向量一起存储;关键事实还会织进一张图里,边上带有效期,新的说法可以覆盖旧的。后台另有一个过程负责去重、合并图结构。整条写入链路不需要模型来“想”,就是抽取和嵌入。到了召回时,走的是带排序的混合查询,而最关键的单元会在用户开口之前就预载进上下文,所以智能体常常根本不用搜索,直接就能回答。
这正是专门做记忆的那些创业公司在卖的东西:mem0 把抽取出来的事实放进以向量优先、可选加图层的存储里;Letta(原 MemGPT)把分层的记忆在上下文里换进换出;Zep 建了一张双时间知识图谱,算是这套思路里最彻底的一种。它们共同的做法,是用“抽取器 + 排序器”取代文件式记忆里的“模型判断 + grep”。
这个分野直接引出两个设计取舍,整个游戏就看这两点:
- 存什么。 文件式记忆存的是模型选择保存的内容;结构化记忆什么都存,之后用排序来定高下。
- 取什么。 文件式记忆靠字面搜索,从一个必须保持很小的索引里找结果;结构化记忆靠相似度排序,从一个可以无限增长的存储里找结果。
两条脉络:按位置,还是按实体与时间
把上面这些统统叫做一种“形状”,其实掩盖了内部真正的分歧——结构化这一极底下还有两条脉络,分别围绕不同的原点组织记忆:按位置,或按实体与时间。