智能体记忆的形态:文件、存储与经验

HN LLM Code Research 2026-08-31T11:39:01.387021

左图:基于存储的记忆——一个冻结的模型在其旁侧的存储库中写入和读取,存储库同时存放两类内容(文件行和结构化数据点);写入来自模型的整理或嵌入器,读取来自 grep 或排序召回;它可以接入任何模型,并在写入和读取时计费。右图:基于经验的记忆——一个被虚线边界(表示通过强化学习训练)包围的智能体,与一个回合库交换回合,写回完成的回合并检索它们;模型单一且不可分割,以训练算力计费。

存储架构

左图:基于文件的记忆——每一轮新交互都会让模型写入或编辑一个文件,在约 200 行的 MEMORY.md 索引中加入一行,索引指向各个主题文件;读取时把索引放入上下文,然后用 grep 检索并读取文件,不使用嵌入,搜索是字面匹配。右图:结构化记忆——每一轮新交互会被自动抽取为原子单元,由嵌入器嵌入而无需 LLM 写入,拆分为「稠密 + 稀疏」向量存储和一张时间事实图(用于取代旧事实),后台合并,读取时通过排序检索并预载重要单元。

左图:基于文件的记忆——每一轮新交互都会让模型写入或编辑一个文件,在约 200 行的 MEMORY.md 索引中加入一行,索引指向各个主题文件;读取时把索引放入上下文,然后用 grep 检索并读取文件,不使用嵌入,搜索是字面匹配。右图:结构化记忆——每一轮新交互会被自动抽取为原子单元,由嵌入器嵌入而无需 LLM 写入,拆分为「稠密 + 稀疏」向量存储和一张时间事实图(用于取代旧事实),后台合并,读取时通过排序检索并预载重要单元。

图 2. 同一个任务,两种架构。基于文件的记忆把模型放在写入路径,把文本搜索放在读取路径;结构化记忆则把嵌入器放在写入路径,把排序器放在读取路径。

两种方案都放在一个冻结模型旁边,跨会话保存事实。真正的区别在于:谁来干活,以及什么时候干。

基于文件的记忆

基于文件的记忆把预算花在写入阶段,由模型自己判断。每轮对话结束后,模型决定有没有值得保留的内容;如果有,就编辑一个文件——在索引里加一行,或在某个主题文件里加一段。索引被刻意做得小,因为每次会话都要把它加载进上下文;常见预算是前 200 行左右。其余内容都存放在主题文件里,模型不去读就不会加载。因此,“回忆”就是模型把索引放在眼前,再对剩下的文件做一次文本搜索所能找回的东西。这里没有嵌入器,也没有排序器。整个系统就是模型自己的判断加一个文本搜索——正因为如此它非常容易发布:只要你有文件工具,你就有了这套能力。

这种思路在已发布的编码代理中随处可见:Claude Code 的 auto-memory(一个项目级 MEMORY.md 索引,索引由模型整理的主题文件组成)、Anthropic API 中的 memory tool 原语、社区的 Cline “Memory Bank” 及其衍生版本,还有 Cursor 和 Windsurf 里的自动记忆。需要把它和指令文件族(AGENTS.mdCLAUDE.md.cursorrules)区分开:后者是人工编写的静态上下文;本文评价的是那种由模型自己

结构化记忆

结构化记忆同样把预算花在写入阶段,只不过不靠模型来做。每一轮对话都会被拆成原子单元,各自做嵌入,配上稠密和稀疏向量一起存储;关键事实还会织进一张图里,边上带有效期,新的说法可以覆盖旧的。后台另有一个过程负责去重、合并图结构。整条写入链路不需要模型来“想”,就是抽取和嵌入。到了召回时,走的是带排序的混合查询,而最关键的单元会在用户开口之前就预载进上下文,所以智能体常常根本不用搜索,直接就能回答。

这正是专门做记忆的那些创业公司在卖的东西:mem0 把抽取出来的事实放进以向量优先、可选加图层的存储里;Letta(原 MemGPT)把分层的记忆在上下文里换进换出;Zep 建了一张双时间知识图谱,算是这套思路里最彻底的一种。它们共同的做法,是用“抽取器 + 排序器”取代文件式记忆里的“模型判断 + grep”。

这个分野直接引出两个设计取舍,整个游戏就看这两点:

两条脉络:按位置,还是按实体与时间

把上面这些统统叫做一种“形状”,其实掩盖了内部真正的分歧——结构化这一极底下还有两条脉络,分别围绕不同的原点组织记忆:按位置或按实体与时间

查看原文