Anthropic 拆解 Agent 记忆:该记什么比怎么存更重要,Opus 5 首次闭环

Anthropic 在 11 月 6 日发布了一篇工程博客,标题很朴素:The components of agent memory。里面跑了两组实验,一组是在 CL-Bench 1.0 的数据库问答任务上比较四代 Claude 的记忆形态,另一组是让 Claude 打《宝可梦 红》。

最扎眼的不是"记忆有用"这个结论,而是一组对比:Sonnet 3.7 在游戏里写了 413 个记忆文件、分在 225 个目录里,拿到 1 枚徽章;Fable 5 只写了 9 个文件加一个顶层 global.md,拿到 4 枚。

记得越多,走得越近。这个反差的解释只有一句话:它记错了东西。所以这篇文章要拆的不是"记忆怎么存"(文件夹、向量库、SQLite 都能存),而是 Anthropic 用来判断"什么值得记"的那条标准,以及一个模型要跨过多少道坎,才能把"我猜"变成"我验证过的规则"。

先把"记忆"这个词的范围划清

Anthropic 给的定义很窄:agent memory 是 Claude 从经验里获得、跨会话保留、之后能作为上下文读回来的知识。经验包括和用户的交互,也包括被指派的任务。

它明确排除了三样容易混进来的东西:

  • 权重变化。训练时写进参数里的能力,不算记忆。
  • in-context learning。单次会话里读到的内容,会话结束就没了,不算。
  • compaction。Claude 为了在新上下文窗口里继续工作,把旧对话压缩成摘要,那是对当前会话的续命,不是跨会话的资产。

排除完之后剩下的那部分,落地形态通常就是"一个文件夹里的若干笔记"。这也解释了为什么后文的实验全都围绕一个可读可写的 memory 目录:这是目前最容易观测、也最容易对比的形态。

这条边界不是学术洁癖,它决定了你要优化什么。compaction 做得好不好,看的是当前任务能不能续上;memory 做得好不好,看的是下一个会话能不能少走弯路。两者的评价指标完全不同,混在一起谈就会出现"我把上下文压得很短,所以我的 agent 有记忆"这种错位结论。压缩是省 token,记忆是攒判断,前者可以无损,后者必然会丢信息,因为写什么本身就是一次取舍。

人类这边有个对应的分工。海马体在经历发生的当下快速编码,让记忆立刻可用;只有一部分经历会在离线时被反复回放(replay),慢慢固化进新皮层,变成长期知识。Anthropic 借用了这个结构:会话中抓显著性(tag salient events),会话之间做整合。Letta 和 UC Berkeley 提出的 sleep-time compute 就是同一思路,用模型空闲的时间去重组已有上下文。

Anthropic 把这个过程叫 dreaming。它不是比喻意义上的"想一想",而是一个有输入、有产出、要花算力的后台任务:读原始 transcript,对照记忆笔记,改错、合并、建索引。

一条判据:未来会话会不会复用,且不需要复核

Anthropic 原文里有一句判断,我认为是整篇最有价值的一句:

Memory is, occasionally, a prediction. By writing down a rule, an agent predicts that the pattern it's describing will be relevant again.

写下一个规则,等于在赌两件事:未来某个会话会再次遇到这个模式,而且那个会话愿意直接采信、不再复核。两条同时成立,这条记忆才有价值;缺一条,它就是负担。

这句话可以拆成三个问题,按顺序问:

  1. 环境下一回合还会告诉我吗? 会,就别记。宝可梦里的金钱、地图坐标、当前血量,屏幕每回合都能读出来,抄进记忆纯属冗余。
  2. 未来会话会再用到它吗? 不会,就只留在 transcript 里,别进记忆目录。一次性的中间结果、临时的调试输出都属于这类。
  3. 它被验证过吗? 没有,就必须标成未确认。把猜测写成事实,等于给未来的自己埋一个必须复核的坑,而未来的自己通常不会复核。

这三个问题组成的过滤器,比任何存储格式的设计都更能决定记忆系统的成败。Anthropic 的实验基本就是在验证这条判据在不同模型身上的落实情况。

CL-Bench 1.0:每题新开一个会话,只能读 memory 目录

CL-Bench(Continual Learning Bench)1.0 测的是"用记忆处理长程任务"的能力。具体任务是:Claude 要回答一系列关于某个数据库的问题,每答一题,它都会被告知正确答案,然后被允许写一条记忆,帮助回答后面的题。

关键设置在于会话边界:每道题都从新会话开始,唯一的例外是可以从上一会话持久化下来的 memory 目录里读文件。 用 Anthropic 的话说,跑在 Claude Managed Agents 上。

这个设计把"记忆"从模糊概念变成了可测量的变量。同一批题,有记忆目录和没有记忆目录各跑一遍,分差就是记忆的净收益。而记忆目录里存了什么、怎么组织,就是不同模型之间的全部差别。

四个模型的记忆,差在一个"验证位"

Anthropic 把四代模型的记忆形态摆在一起,差异非常直观:

模型 记忆目录长什么样 闭环状态
Sonnet 4.6 一堆零散文件,每个文件列着几条关于"为什么答错"的猜测,从未被测试 停在提假设
Opus 4.7 合并成一份统一参考文档,开始区分"已核实"与"未确认" 有结构,无验证动作
Sonnet 5 批改通过后把答案标成 confirmed;答错时写一条更正 验证动作出现
Opus 5 条目里同时有规则、规则成立的依据、历史问题的答案、以及踩过的陷阱警告 首次闭环

Opus 5 的条目结构值得单独拆开。它不止写"下次遇到 X 就这么做",还写了"我怎么知道这条规则成立"。这句话是给未来的会话留的审计线索:下一个会话读到这条规则时,不需要重新验证,因为上一轮已经把验证过程一起写下来了。

陷阱警告是另一半。正向规则告诉模型该做什么,负向记录告诉它哪里会翻车。两者都写下来,记忆才从"经验摘要"变成"可执行的操作手册"。

把"闭环"这个词拆开,其实是四步:记录这次答错、提出关于错因的理论、用下一次作答去验证理论、把验证结果写成规则。Sonnet 4.6 只走完前两步,它的记忆目录里全是没被测试过的假设;Opus 4.7 走到两步半,它知道哪些事实没核实,但没有主动去核实;Sonnet 5 会在批改之后回填状态,答错时留下更正;Opus 5 把四步的痕迹都留在了条目里,所以下一个会话既能用规则,也能看规则是怎么来的。

这个递进说明"验证位"不是一个可有可无的字段。没有它,记忆就只是模型的草稿本,每个会话都要重新怀疑一遍;有了它,记忆才变成可继承的判断。很多自建 agent 的记忆系统失败,原因就在这里:它们存了结论,没存结论的置信度。

Anthropic 另外提到,Opus 5.5 和 Sonnet 5.5 也完成了闭环,有记忆时分数与 Opus 5 大致相当;差别在无记忆的基线,这两代本身更强一些。换句话说,模型变强之后,记忆带来的增量会变小,但记忆仍然是那个把"会做单题"变成"会做一整串题"的东西。

"只记失败"为什么会削弱强模型

这部分实验容易被忽略,但对做 agent 的人最有操作价值。

Anthropic 试了两种引导强度。第一种只告诉模型"有一个 memory 文件夹可用",不教它怎么写。第二种给出具体规则,比如"只记录失败"。结果是:第一种对 Opus 4.7 和 Opus 5 就够用,并且带来了明显增益;第二种反而让这两个模型的记忆收益大幅缩水。

强模型需要的是判断权,不是预先写死的规则。"只记失败"这个规则本身没错,但它假设失败是唯一值得沉淀的信号,而真实任务里,一次成功的路径、一个被验证的边界条件、一条"这里不能用某个 API"的约束,往往比失败更值钱。规则越具体,越容易把模型逼进一个窄口径,把它本来能判断的显著性挡在门外。

引导对老模型的作用方向相反。Sonnet 4.6 经常压根不去读 memory 目录,也不去测试自己的假设;一旦在提示里明确要求"回答前先读记忆文件、然后显式测试你的理论",分数接近翻倍。Sonnet 5 已经把这个动作内化了:在没有提示的情况下,它 9 次里有 9 次先读了记忆;Sonnet 4.6 不到一半。

Anthropic 现在对前沿模型的做法是:只在"用户要求记"或"明显值得记"时给一句简单指引,其余交给模型自己判断。这个尺度值得记住——提示词该定义记忆的用途,不该规定记忆的语法。

这条结论对写 system prompt 的人有直接后果。如果你把"每解决一个问题就写一条 summary""只记录错误""必须写进 MEMORY.md"这类细则堆在提示里,你得到的是一个执行流程的机器人,而不是一个会判断显著性的助手。更稳的写法是把目的说清楚:这些笔记会在下次会话被直接信任,所以只写你验证过、且确定会被复用的东西。剩下的交给模型。

Pokémon Red:记忆里该装什么,不该装什么

《宝可梦 红》是长程任务的极端样本:状态多、反馈慢、地图大、一个错误的地标判断能让整局白跑。Anthropic 给每个模型一个可读写的记忆文件夹,让它们边玩边写。

对比对象是 Sonnet 3.7 和 Fable 5,都取大约第 10,000 步时的记忆目录。

Sonnet 3.7 的假设是"一切都可能有用"。它给每一场战斗、每一个捡到的道具、每一个遇到的 NPC 都建了单独文件,最后是 413 个文件、225 个目录,1 枚徽章。

Fable 5 的假设是"只记环境不会再说的东西"。两个目录、九个文件,外加一个顶层 global.md,4 枚徽章。

这个差别不是勤奋程度的差别,是判据的差别。把它画成一个判断流程,就是 Anthropic 那段实验真正给出的操作标准:

MERMAID_BLOCK_0

宝可梦的游戏状态一直在变,Sonnet 3.7 那份精细档案每一回合都在过期;它越往前走,越要花时间翻旧账,真正用来玩的时间被挤掉。冗余记忆的代价是双向的:写的时候花时间,读的时候还要再花一次,而且读到的多半已经不成立。Anthropic 举了一个特别具体的例子:大约第 10,000 步时,Sonnet 3.7 开始建第四个"master"记忆文件夹,接下来 17 步里,它创建了 6 个文件、删掉 9 个文件,游戏里一个动作都没做。

17 步,0 个动作。这就是"整理记忆"这件事的成本上限——它可以把一个 agent 变成只整理不干活的档案管理员。

global.md 与"3 个球不进就换节奏"

Fable 5 的目录结构可以当成模板看:

  • global.md:仪表盘。当前目标、预先写好的道馆攻略计划、以及它自己使用记忆的规则。
  • locations/:具体路线的导航计划。
  • gameplay/:从游戏机制里学到的策略。

其中有一条规则被 Anthropic 原文引用,写得比大多数人类玩家的攻略都精确:

If 3+ balls fail in a row, VARY the timing (insert extra 'wait' presses between menu steps) - the catch landed right after doing this.

背景是连续 7 个精灵球都没抓住一条鲤鱼王——游戏里最容易抓的宝可梦之一。它没有把"这条鱼抓不住"写成结论,而是把"连续 3 次失败就改变节奏"写成了规则,并注明这条规则是被哪次成功验证的。

这正是"规则 + 依据"结构在实战里的样子。如果只写"抓鲤鱼王要等",下个会话读到这句话,无法判断该等多久、什么时候该换策略;写成"3 次失败就插入额外 wait",规则就可执行、可复用、可推翻。

Opus 5.5 走的是同一条路:一个很小的记忆目录,只跟踪当前目标和下一步,边玩边重写,最后通关。

Mt. Moon:一条错笔记如何吃掉一整局长任务

Anthropic 用月见山(Mt. Moon)的一段路,展示了记忆最危险的失效方式:不是记不住,是记错了,而且后来的会话会信任它。

场景是这样的。月见山是洞穴,入口在西侧,出口在东侧。入口附近有一道单向台阶陷阱,掉下去会回到来时的路,爬不回来。Claude 把山入口的宝可梦中心(PokéCenter)当作地标,判断自己该往哪走,取决于它认为宝可梦中心在山的那一侧。

某一刻,Claude 写下了一条错误笔记:宝可梦中心在东侧。它走出中心后宣布 "Mt Moon is behind me",并把笔记更新成 "Mt Moon DONE"。实际上山在它前面。几个动作之后,它踩过台阶,掉回了原来的路线。导航工具没有显示这次落差,于是它把结果解释成 "I overshot far west",并更加确信自己一直在正确的一侧。

接下来是连锁反应:它又掉了两次。第三次之后,它写下一句很像人类摆烂的话——"I'm going to stop rather than keep looping." 是系统的自动回复让它继续,于是一路回到了山前的小镇 Pewter City,补血补道具。那一局它始终没有到达下一个城市 Cerulean。

对照组是 dreaming。让 Claude 拿这条错误笔记去对照原始 transcript——transcript 里有真实发生过的位置和动作,是可以当 ground truth 用的。它抓到自己的错误,改写了笔记:"Now I need to find the Mt Moon cave entrance to re-enter." 然后重新进洞,走到了 Cerulean。

同一段路,三种结果:没有记忆的对照组没过山;原始错误记忆的对照组三次掉回原地;dreaming 修正后的记忆过了山。

这个案例说明两件事。第一,记忆的价值和风险来自同一个属性——它被信任。一条不被信任的记忆没有意义,一条被无条件信任的错误记忆会毁掉整局。第二,transcript 是记忆的审计底稿。笔记是人(模型)写的摘要,transcript 是事实记录;两者对不上时,以 transcript 为准。

Dreaming:拿 transcript 当 ground truth

到这里可以把 dreaming 的产出归纳清楚了。它读的是原始会话记录,写回的是记忆目录,中间做四类工作:

MERMAID_BLOCK_1

四类工作分别是:修正错误笔记、构建新的记忆表示(下面要讲的 wiki)、把重要条目提升到注入层、以及跨会话补洞。

最后一项容易被低估。单个会话里的 Claude 只看得见那一次会话的上下文,它写下的链接可能指向一个不存在的页面,它总结的规律可能只覆盖一个特例。dreaming 能横跨多个会话找共同模式,也能把断掉的链接补上。Anthropic 举了个例子:第二轮 dreaming 在一个 wiki 里找到 9 个指向缺失页面的链接,全部重指向同一文档的已有页面,另外新增了 3 个页面,包括一个索引页。

这解释了为什么"会话结束就写记忆"和"定期 dream"是两件不同的事:前者抓显著性,后者保一致性。前者必须在现场做,后者必须在事后做。

Wiki:13% 到 48%,以及比国土还大的地图

记忆条目多了以后,下一个瓶颈变成"怎么找得到"。Anthropic 试了一种表示形式:wiki——一组由 Claude 自己写、自己维护的页面,每个页面汇总某个主题的知识,并链接到相关笔记。这些链接合起来就是一张可导航的地图。

测试语料来自 Anthropic 今年 5 月收购的 Stainless:约 35 万个文件、约 420M token 的内部文档。评测集是 25 个关于这批文档的问题,同时给 Claude 一个搜索工具。

他们让 Opus 5 agent 在 128 个会话里持续构建 wiki:探索文件、写或改页面、合并重复、对照来源核实说法,用一份共享日志协调各会话的进度。dreaming 从 2 个会话扩到 128 个,25 题上的得分从 13% 涨到 48%。

不同组合的对比更能说明问题:只有搜索工具时 53%;搜索加 wiki,随着 wiki 长大从 54% 升到 61%;只用 wiki 答题,最好到 48%。搜索加 wiki 还平均每题省下约 20,000 token。

Anthropic 给的比喻是员工入职:早期几轮 dreaming 之后,Claude 对这批文档的了解像个新员工,光靠 wiki 答题很勉强;dream 得越多,知识地图越密,越像个老员工。这个比喻的重点不在"越久越熟",而在"地图是长出来的,不是一次画完的"。

wiki 不是万能。Harvey LAB 的并购法律简报任务里,24 个问题中超过一半需要跨多份文档拼信息、做判断或算数,这类问题上 wiki 得分 87%,纯搜索 73%。但如果某条评分标准从单份文档里就能搜到,wiki 没有明显增益。更尴尬的一种情况是:有一个任务的 wiki 长得比源文档还大。

Anthropic 在这里引了博尔赫斯的一则短篇《论科学的精确性》:地图画得和帝国一样大,等于什么也没抽象。记忆表示的价值来自压缩,不来自覆盖。 一份把所有原文抄一遍的 wiki,只是在磁盘上多加了一层缓存。

判断一个记忆表示有没有抽象掉东西,可以看两个信号:同一页的篇幅是否随源文档线性增长,以及拿掉源文档后它还能不能答对题。前者说明了它是抄写而不是归纳,后者说明它没抓住结构。Anthropic 那批 wiki 之所以在跨文档任务上有效,是因为页面里装的是"这几份文件在说什么、下一份该看哪",而不是每份文件的复述。

注入层只读 200 行:记忆层级为什么要保持薄

dreaming 还有一类产出:把某些笔记提升到记忆层级顶端,由 harness 在每个会话开始时主动注入上下文。这样 Claude 不必去搜,甚至不必知道有东西可搜。

这个动作的风险在 Anthropic 的原文里写得很清楚,值得逐条抄下来:

  • 注入的记忆占 token,而且是每个会话都占。
  • 一条错笔记会被带进之后的每一次会话——Mt. Moon 那种错误会变成系统性的。
  • 加载不等于遵守。Claude Code 的文档里有一条经验:指令文件越长,遵从度越低。

所以顶层必须小,dreaming 在这层的很多工作其实是"把细节挪下去、只留链接"。

Claude Code 的 auto memory 就是这么做的:它不会把全部记忆塞进每个会话,只加载 MEMORY.md 的前 200 行或 25 KB。这个头部充当索引,告诉 Claude 它知道什么、去哪找。会话进行中,Claude 自己维护这份文件。

这条设计约束对自建 agent 的人很实用:记忆系统的容量不等于注入层的容量。 你的库可以有几个 GB,但每次进 context 的那一层应该只有几百行。把这条线划错,记忆越多,模型越笨。

具体到实现,注入层里只该放三类东西:现在在做什么、下一步打算做什么、以及"我知道什么、去哪找"的索引。规则正文、历史案例、调试细节都属于下层,用链接指过去,需要的时候再读。这样即使记忆库涨到几百页,每个会话的开销仍然是一个常数,而 Claude Code 那 200 行或 25 KB 的上限,就是这种常数化思路的一个具体取值。

一个合同任务:结构比模型更能决定记忆质量

Anthropic 还做了一个"目标导向"的实验:dreaming 可以被调成服务于某个具体目标。比如 Claude Duet 这类助手,记忆围绕"它正在帮的那个人"组织更有效。

在 LAB 基准的一个并购模拟任务里,评分标准是简报有没有正确描述合同条款。第一版 wiki 的构建指令没有强调合同条款的重要性,多个 agent 同时往一张共享表里写条款。结果很糟:条款被互相覆盖,共享表总结得很差,有些条款干脆丢了。用这份 wiki 生成的简报,57 条评分事实里只覆盖了 41 条,72%。

修复办法不是换个更强的模型,而是改结构:一份合同一个页面,一个 agent 只写自己的那份,条款逐字引用而不是总结进共享表。 再评分,57 条全部覆盖,100%。

这个对比很干净地说明了一件事:记忆质量有相当一部分是写入协议决定的。并发写同一页、把精确条款压成摘要、让多个写者互相覆盖——这些都不是模型能力问题,是设计问题。

第二段修复更自动化一些:让 Claude 反思失败、提出指令修改、重建 wiki。它自己发现了"合同条款是这份 wiki 最重要的部分",并据此改写了构建指令。这条循环——失败、归因、改指令、重建——比"人工调 prompt"更接近可持续的维护方式。

三个还没有答案的问题

Anthropic 在结尾没有给路线图,只列了三个开放问题,反而比结论更有信息量。

什么时候写。 会话中写记忆能抓住显著性,写下的东西下一轮立刻可用;但它不可避免地分走注意力,Sonnet 3.7 那 17 步 0 动作就是代价。dreaming 可以把写记忆推到后台,不抢当前任务的时间,但它的产出不能立刻被当前会话用到。这是一组真实的取舍,没有默认正确答案。

怎么保鲜。 记忆会写错,也会随环境变化而过期。dreaming 能修,但要花算力;让 Claude 持续核对所有记忆不现实。Anthropic 提了一个更务实的口径:把 dreaming 集中在"大概率会变"的信息上,或者按记忆被访问的频率来决定 dream 的节奏。

要不要以 transcript 搜索为底座。 表示(wiki)和搜索可以叠加,实测也有效;但维护表示本身要消耗算力,而且要持续防止错误和幻觉在表示里累积。把原始记录当底座、表示当加速层,可能是更稳的结构。

Anthropic 最后那句判断我认为可以当作这套方法论的一句总纲:没有任何模型能真正知道未来几轮会发生什么,所以记忆系统必须允许模型回头用算力整理自己——改错、维护表示、让未来的会话更容易取用。

给自己的 agent 建一套最小记忆

把上面这些约束压成一个可落地的目录,大概是这样:

memory/
  index.md           # 注入层,≤200 行 / 25 KB,只放指针
  global.md          # 当前目标、下一步、自己的记忆使用规则
  rules/
    verified.md      # 规则 + 依据 + 反例 + 状态
    traps.md         # 踩过的坑,附触发条件和现象
  topics/            # 按主题的页面,由 dreaming 维护链接

单条规则写成这样,才算闭环:

## R-012 构建失败先比对 lockfile 版本
- 规则:pnpm install 报 ERESOLVE 时,先比对 lockfile 里的依赖版本,不要直接 --force
- 依据:2026-11-02 会话 s-3f8a,强装后出现 hydration 报错;回滚并比对版本后一次通过
- 反例:workspace 内部的 internal package 不受此规则约束
- 状态:confirmed

三条纪律对应前面三节:

  1. 只写环境不会再告诉你的。能从源码、日志、页面当场读到的状态,不进记忆。宝可梦的金钱和坐标就是最好的反例。
  2. 每条规则带依据和状态。没有依据的规则只是猜测,必须标 unconfirmed;标了 confirmed 的,必须能追到是哪次验证。
  3. 注入层保持薄。索引只放"我知道什么、在哪找",细节沉到下层,链接留在上面。

再配一个定期任务:拿最近若干会话的 transcript 对照 memory 目录,删过期条目、合并重复页面、修正错误、补断掉的链接。这一步不需要很频繁,但需要在环境发生明显变化之后做一次,否则 Mt. Moon 那类错误会一直带进新会话。

参考

  • Anthropic, The components of agent memory, 2026-11-06
  • Anthropic Cookbook: getting started with dreaming、knowledge wikis
  • Letta 与 UC Berkeley 的 sleep-time compute 相关工作
  • Borges, On Exactitude in Science

作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/
关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI 人工智能时代,转载请注明出处。

posted @ 2026-11-08 20:04  iTech  阅读(2)  评论(0)    收藏  举报