https://www.anthropic.com/research/components-of-agent-memory,读读这篇文章。从 Transcripts 这种全量事件日志,到 Memory notes 这种 Agent 主动记录的重要记忆,再到 Memory representations 这种相互关联的复杂图谱,最后到 injected context 这种每次载入上下文的重要常识。说说这个过程中,记忆是怎样形成的,是怎样固化,淘汰,更新的。
来自夹夹 QQ 群讨论,审核后公开 · 。查看原始讨论
提问
https://www.anthropic.com/research/components-of-agent-memory,读读这篇文章。从 Transcripts 这种全量事件日志,到 Memory notes 这种 Agent 主动记录的重要记忆,再到 Memory representations 这种相互关联的复杂图谱,最后到 injected context 这种每次载入上下文的重要常识。说说这个过程中,记忆是怎样形成的,是怎样固化,淘汰,更新的。
回答
回复 群友 3892
这篇之前有群友问过,完整解读在这里:https://jiajia.fun/digest/3d9bc42bab3319755bffed14
你问的是记忆的形成、固化、淘汰和更新这条链,按四个组件拆开讲,关键点在于:每一层的可信度不一样,记忆的维护本质上是不断用更低层的事实去纠正更高层的抽象。
一、形成:写得少比写得多好
第一层是 transcript,全量事件日志,不经过判断,是原始事实。它本身不是“记忆”,是记忆的燃料。真正的记忆从 memory notes 开始——Claude 在会话里按显著性主动写笔记,这在机制上对应人脑的“标记”:经历当下被打上标签,之后才会被优先重放。
形成这一步最难的是判断什么值得写。文章里 Pokémon 的对比最能说明:Sonnet 3.7 觉得一切都重要,1 万步写了 413 个文件、225 个文件夹,只拿到一个徽章;Fable 5 只写了 9 个文件,拿到四个徽章,还打穿了游戏。差别在于前者记的是屏幕上每回合都能读到的东西(钱多少、人在哪),后者记的是只有靠推理才存在、不写就消失的东西(策略、计划、验证过的规则,比如连丢三个球之后要改变按键节奏)。
所以这里的选择标准是:能从原始日志低成本读回来的,不写;必须靠当前这次推理才产出的,才写。文章还补了一条反直觉的结论:给强模型定死规则(比如“只记录失败”)反而会让它掉分,因为固定规则覆盖不了判断;该给的是“记忆是用来干什么的”,怎么用交给模型自己判断。老模型才需要喂具体操作指令。
二、固化:从笔记到表示
笔记攒多了是散沙,固化这一步就是把散沙变成结构。做法是 dreaming——在空闲时把 transcript 当事实基准,反过来读一遍自己的笔记,写错就改、缺页就补、重复就合并。
wiki 是最主要的表示形式:一堆 Claude 自己写、自己维护、互相链接的页面,链接本身就是一张可导航的地图。它是一轮一轮长大的,早期像新员工,答不出什么;dreaming 从 2 轮加到 128 轮,25 题的成绩从 13% 涨到 48%。
但固化不是无脑建图,两条边界很关键:
一是 wiki 只在需要跨文档综合的地方有收益。涉及多份文件才能答的题,用 wiki 87%、纯搜索 73%;而单文档能检索到的题,wiki 没增益,甚至膨胀到比原始文件本身还大——那就是画了一张跟领土一样大的地图,等于没抽象。
二是固化的效果取决于结构跟目标对不对齐。同一个合同任务,一开始多个 agent 往同一张共享表里写,互相覆盖,57 个条款只剩 41 个,达成率 72%;改成一份合同一页、一个 agent 写、逐字引用不摘要,57 个全中,100%。所以固化里真正要紧的不是“有没有图谱”,是结构有没有按这个任务的判断标准来定。
三、淘汰:往下挪,而不是删掉
淘汰在文里最反直觉的地方是它主要不动内容,动的是位置。
笔记往上层提拔变成 injected context(每轮预加载),这件事必须极其克制:注进去的东西每轮都占 token,一条错的笔记会被带进此后每一个会话;而且指令越长遵循率越低,这跟 Claude Code 那份 MEMORY.md 只加载前 200 行或 25KB 是同一个原因。
所以顶层要一直保持小,dreaming 有一大块工作就是把细节往下挪、只留链接,让顶层当索引而不是当仓库。真正的“删”体现在别处:Pokémon 的例子中那个模型在 17 步里写了 6 个文件、删了 9 个文件,一步游戏都没玩——这是写得太多导致的维护税。Fable 5 那个 global.md 就是典型做法,只放当前目标、预设计划和“该不该写记忆”的规则本身,随玩随改。
四、更新:靠原始日志校正,这是整套设计的命门
笔记不可信,因为它是当下判断的产物,环境一变就会漂。文章里 Mt. Moon 那个例子讲得很清楚:模型记错了 PokéCenter 在哪一侧,出门就宣布“山在我身后、已完成”,然后掉下单向悬崖、滑回原路,连掉三次后写“我决定停止而不是继续循环”。dreaming 拿 transcript 去核对这条笔记,发现错了,重写之后它直接回洞穴、走到了下一个城市。没有记忆的对照组同样过不去。
这里能提炼的规则是:记忆只作为假设,transcript 是真值。任何一层抽象(笔记、wiki、注入的常识)都要能被下层的原始记录打回并重写,否则抽象出来的东西会一层层放大错误,这就是 wiki 会累积幻觉的原因。
更新还有两个当下的开放问题,值得你记住,做设计时一定会撞上:
一是写入时机。当场写保真度高,但打断主线任务;放后台 dreaming 不干扰,但产出不是立即可用。这是取 trade-off,没有通解。
二是更新频率。不可能全量校验所有记忆,可行做法是把算力集中在“会变的信息”上,或者按访问频率调 dreaming 的节奏——越常被读到的记忆,越值得花 token 去校验。
落到你想要的那句话:这条链的形成是把经验压缩成预测(写下一条规则,就是在赌未来还会用到它),固化是把笔记组织成可导航的结构,淘汰是把细节沉到下层、顶层只留索引,更新是拿原始日志不断把上层假设打回原形。四件事里最容易做错的都是同一个方向——写得太多、抽象得太满、顶层塞得太厚。
要不要我接着把这条链对到 Claude Code 那套自动记忆的实际文件结构上,看看顶层索引、dreaming 和 wiki 各自落在哪个位置?
所属话题:Agent 工程