跳到正文
实时
Anthropic Research·· 9 天前精选62

Anthropic 拆解智能体记忆的组成与 dreaming 机制

The components of agent memory

要点速览

Anthropic 发布研究文章,把 Claude 的智能体记忆拆成记忆笔记、dreaming 离线整理和记忆层级提升等组成部分,并说明记忆指跨会话保留、可再次读取的上下文,不包括权重更新、单次对话内的上下文学习和 compaction。

Why it matters

Anthropic 公开了智能体记忆的分层设计与 dreaming 机制,并用 CL-Bench、宝可梦和内部文档语料给出可对照的实测结果。

正文 · AI 翻译

译文尚不完整,完整内容请切换到原文。

Søren Kierkegaard 写道,生活只能 向后 被理解,但必须 向前 被生活。我们在为 AI 代理设计记忆时遇到了类似的困境。

作为人类,我们在日常生活中不断编码记忆。 海马体 在此过程中扮演着核心角色,它在当下捕捉体验,以便记忆迅速形成并立即可用。但只有 一些体验 被巩固为长期知识。

巩固过程似乎大多发生在我们的大脑离线时。当我们睡觉以及在进行安静的 休息 时,海马体会重播我们最近的体验。据认为,这是逐渐提炼 这些体验并将其 整合到新皮层的过程——我们大脑中存储大部分我们认为的知识的部分。

代理记忆可以使用类似的分工。代理将它们的大部分工作记录在日志或转录中。Letta 和加州大学伯克利分校的研究人员提出了 睡眠时计算 作为一种方法,让模型在交互之间的空闲时间重新组织其现有上下文。同样的想法可以帮助代理通过反思日志来纠正错误或生成新的笔记和表示。这个过程通常 被称为 做梦 (图 1)。

我们发现,做梦已成为帮助我们赋予 Claude 有效记忆的有用工具。在本文中,我们分享了我们对代理记忆的看法,并详细介绍了我们用于探索代理记忆的几个评估,包括做梦的使用,以及每个组件对记忆组织所做的贡献。

记忆笔记

我们所说的“代理记忆”是指 Claude 从经验中获得的知识——包括与用户的交互以及分配给它的任务——并在会话之间保留下来,作为它可以稍后读取的上下文。它不包括模型学习或管理上下文的其它方式,例如训练期间设置的内部参数 权重、情境内学习 (在单个对话中获得的知识),以及 压缩 (Claude 编写的摘要,用于替换其旧的回合,以便它可以在新的上下文窗口中继续工作)。

在人脑中,在体验之前、期间或之后释放的化学信号可以 标记记忆 为重要。标记的记忆在离线期间往往会比未标记的记忆被重播得更频繁。这个过程称为 重播,它有助于稳定并将它们整合到长期记忆中。

类似地,Claude 可以在会话日志中标记突出的事件,以便以后更容易找到它们,或者它可以 写入 它们到记忆存储中,例如一个记忆笔记文件夹(图 2)。但 Claude 如何在知道接下来会发生什么之前判断当前什么是突出的?

记忆可以是对未来需求的预测

记忆偶尔是对未来的预测。通过写下一条规则,代理预测它所描述的模式将再次相关。例如,写下一条经过验证的事实是一种预测,即未来的会话中的代理将希望依赖该事实而无需再次检查。随着时间的推移,Claude 在做出这类预测方面已经变得非常擅长。

考虑一个来自 持续学习基准 (CL-Bench) 1.0 的任务,该基准衡量一个智能体使用记忆来处理长期任务的能力。其中一个特定任务要求 Claude 通过在数据库中查找信息来回答一系列问题。Claude 给出答案后,会被告知正确解决方案,并可以写入记忆以帮助回答未来的问题。

记忆可以在这里支持一个学习循环。如果 Claude 答错问题,它可以记录失败,提出关于出错原因的理论,测试这些理论,并将发现的内容转化为未来回答问题的规则。

我们使用 Claude 管理代理 运行了 CL-Bench 1.0 任务。Claude 在每个问题开始时都在一个新会话中开始,只有一个例外:它可以从 记忆目录 中检索文件,该目录可以在一个会话和一个会话之间持续存在。

不同的模型在创建自己的学习循环方面取得了不同级别的成功。Claude Sonnet 4.6 得到了生成关于答案为何错误的理论。它的记忆目录中包含了一些文件,每个文件列出了几个未测试的猜测。

Claude Opus 4.7 将其笔记整合为单个参考文档,并开始标记它已经检查过的事实和哪些事实仍然未经确认。Claude Sonnet 5 在评分员检查答案后将其每个答案标记为确认,并在回答错误时写上更正。

Claude Opus 5 是这些模型中第一个关闭循环的。它的大多数条目都包含一个规则(以及它如何知道规则是真的),对先前问题的答案,以及它发现的陷阱的明确警告(图 3)。

像 Opus 5 一样,Claude Opus 5.5 和 Claude Sonnet 5.5 也关闭了循环,使用记忆来捕获关于如何最好地回答未来问题的经过验证的规则。有了记忆,两者的得分与 Opus 5 大致相同,尽管它们没有记忆时的基线性能略高。

Claude 学会了判断显著性

我们还评估了 Claude 玩 Pokémon Red 的能力,这是一款游戏,挑战 Claude 导航 复杂的长期任务,作为测试 Claude 关于 什么 应该保存到记忆中的判断力的测试。在每次运行开始时,我们给每个模型一个包含记忆文件的文件夹,它可以在玩游戏时读取和写入(图 4)。

我们比较了 Claude Sonnet 3.7 和 Claude Fable 5 每次运行大约 10,000 步游戏时的记忆文件夹。我们注意到的关键区别是每个模型认为值得记住的内容。Sonnet 3.7 假设一切可能都很重要,并且不加区别地写入记忆。它的记忆文件夹包含了一个遭遇存档,通常为它打过的每场战斗、找到的每个物品以及遇到的每个非玩家角色都有单独的文件。最终,Sonnet 3.7 在 225 个文件夹中写入了 413 个记忆文件,并获得了一个徽章(徽章标记玩家在游戏中的进度)。

相比之下,Fable 5 在两个文件夹中写了九个文件,加上一个名为 global.md 的单个顶层文件,并获得了四个徽章。

Sonnet 3.7 的方法是一个问题,主要是因为宝可梦的游戏状态不断变化—Sonnet 3.7 的详细记录不断过时。结果,随着 Claude 的进展,它不得不花费更多的时间和资源翻阅它的记忆,而不是玩游戏。例如,在步骤 10,000 左右,Sonnet 3.7 开始它的第四个“主”记忆文件文件夹。在接下来的 17 步中,它创建了六个文件,删除了九个其他文件,并且它本身在游戏中没有采取任何行动。

Fable 5 的方法使用记忆来存储游戏没有明确告诉它的东西。Sonnet 3.7 写入记忆的一些信息—例如玩家有多少钱或玩家在地图上的位置—每回合都可以从屏幕上读出,所以存储它是多余的。相比之下,关于策略、计划和测试规则的记忆文件只有在 Claude 想出它们时才存在,除非 Claude 写下来,否则它们就会消失。

Fable 5 相应地组织了它的记忆。它的 global.md 文件充当仪表板,包含当前目标、应对体育馆(赢得徽章的挑战)的预写计划,以及模型使用记忆的自己的规则。一个 locations 文件夹包含导航特定路线的计划,一个 gameplay 文件夹包含基于它学到的关于游戏如何运作的策略。例如,在连续七个宝可梦球未能捕捉到魔墙鱼(最容易捕捉的宝可梦之一)后,Claude 写道,“如果连续 3+ 球失败,改变时间(在菜单步骤之间插入额外的“等待”按键)- 捕捉正好在这个操作之后成功。”

与 Sonnet 3.7 相比,Fable 5 使用一个更小的记忆文件夹,在游戏中取得了更远的进展。Opus 5.5 采取了类似的方法:它保留了一个小的记忆笔记文件夹,跟踪它的当前目标和下一步,在玩游戏时重写它们,并赢得了游戏。

引导 Claude 写入记忆

我们发现告诉 Claude 记忆的用途,而不是 如何 使用它是有帮助的。在 CL-Bench 上,我们简单地告诉 Claude 有一个记忆文件夹可用。这种一般性的指导足以让 Opus 4.7 和 Opus 5 有效地使用记忆,并且两者在性能上都有明显的提升(图 3)。

我们还测试了给模型关于它们应该写入记忆的特定规则,每个测试一条规则。我们比较了每个模型从每个规则中获得的记忆增益与没有规则时获得的增益。当我们设置一条规则为“仅记录失败”时,Opus 5 和 Opus 4.7 都失去了记忆给它们带来的大部分性能提升(图 5,右)。对于更强的模型,给它们自由判断显著性比预先设置固定规则更有效,而且那些规则最终可能会削弱性能。

我们还注意到,引导对较旧的模型帮助最大。例如,Sonnet 4.6 经常不读取它的记忆目录中的文件,并且未能测试它关于为什么答案错误的假设。

在这种情况下,提示 Claude 在回答之前读取它的记忆文件—然后明确测试它的假设—几乎使它的基准分数翻了一番(图 5,左)。Sonnet 5 自己会这样做。在没有提示的情况下,它在 10 次中有 9 次在回答之前读取它的记忆。相比之下,Sonnet 4.6 这样做的时间不到一半。

对于前沿的 Claude 模型,我们通常在有人要求它们或某事明显值得记住时给它们简单的指导来创建记忆笔记,并将这种判断留给 Claude。

做梦可以纠正记忆

由于 Claude 会根据它判断的会话中显著的信息写入内存,一个从一开始就错误或随着环境变化而漂移的笔记可以被 Claude 在后续的会话中读取,并信任。

做梦让 Claude 有一种方式来将其笔记与原始转录本(图 6)进行比对。我们看到了一个积极的例子,当时 Claude 使用 Managed Agents 并挂载了用于其记忆的目录来玩《宝可梦》。

在游戏的一部分中,玩家必须穿过月见山,这是一个入口在地图西侧而出口在东侧的洞穴系统。在入口附近有一个陷阱:一个单向的边缘,将玩家掉落到他们来时的路线,而没有明确的方法可以爬回去。Claude 正在使用位于山入口的建筑宝可梦中心作为地标,所以它是否走下边缘取决于它认为宝可梦中心在山的哪一侧。

在某个时刻,Claude 写下(错误地)宝可梦中心在东侧。当它走出宝可梦中心时,它宣布,“月见山在我后面”,并更新了它的笔记:“月见山 完成。” 但月见山并不在它后面。几步操作后,Claude 走过边缘并落回到它来时的路线上(图 7)。它的导航工具没有显示坠落,所以 Claude 得出结论,“我向远西边偏移太大了”,并且它一直都在正确的侧边。它并没有。

然后我们测试了做梦是否可以帮助 Claude 避开这个陷阱。我们在包含宝可梦中心错误位置的内存文件夹上运行了做梦:Claude 将笔记与会话转录本进行核对,发现了它的错误,并重新写下了它。转录本给了 Claude 一个用来验证其记忆的真实情况。有了修正后的记忆笔记,Claude 直接回到了月见山,并最终到达了蓝城。

在未修正的笔记的运行中,Claude 三次掉回到那条早先的路线。在第三次失败后,Claude 似乎放弃了,写着,“我将停止而不是继续循环。” 我们的设置中的自动回复指示它继续。所以它确实继续了,一直回到城都市的皮卡丘市,那是山前的城镇,它希望在那里恢复健康和补充物品。运行结束,Claude 从未到达蓝城。

做梦可以构建新的记忆表示

通过做梦,Claude 可以构建表示来帮助导航记忆(图 9)。它使用的一种记忆表示类型称为 维基,这是一个由 Claude 编写和维护的页面集合,它收集了 Claude 关于一个主题所知道的信息,并将其链接到其他笔记。这些链接实际上为 Claude 提供了一个它可以用来筛选其记忆并在需要时高效定位记忆的地图。

像维基这样的表示可以帮助 Claude 遍历它不断增长的知识库。我们使用来自我们五月份收购的软件公司 Stainless 的内部文档语料库(大约 350,000 个文件,约 420M 个标记)探索了维基作为记忆表示的好处。我们创建了一个关于这个语料库的 25 个问题的评估集,并给了 Claude 一个搜索工具来探索它。我们还指示 Claude 使用做梦基于这些文件创建一个维基。在 128 个会话中,我们提示 Opus 5 代理探索文件,编写或修正链接的维基页面,合并重复项,并对照来源检查声明。

每个会话都建立在代理在先前会话中取得的进展之上,使用共享日志来协调工作。随着我们将‘做梦’从两个会话扩展到128个,在25个问题上的表现从13%增长到48%的评分标准(图10)。

Claude逐步构建其维基。在创建初始维基后,它使用随后的‘做梦’轮次来添加、编辑或删除内容。在‘做梦’的早期轮次中,Claude的知识就像一个新员工,仅基于维基回答问题的能力有限。它做梦越多,其知识图谱就越丰富,就像一个经验丰富的员工。在我们的测试中,我们发现当我们也给它提供搜索工具访问权限时,维基对Claude的帮助最大。当它同时使用搜索和维基时,随着维基的增长,Claude的综合得分从54%上升到61%,而仅使用搜索工具时为53%。Claude仅使用维基回答问题时最佳得分为48%。同时使用搜索和维基还每个问题节省了约20,000个token。

我们想要测试哪些任务类型能从Claude拥有维基中受益。为此,我们使用了Harvey LAB基准以及关于并购的一组文档。该基准向Claude提供一组文档,并要求Claude根据其内容生成法律摘要。然后基准根据一系列标准对摘要进行评分。虽然可能不如捕捉皮卡丘跑酷有趣,但这些评估为我们提供了多样化的文档集合来构建维基。

我们指示Claude从文档中构建维基。然后我们要求Claude从维基和直接文件搜索中回答问题(关于并购)或生成法律摘要(LAB基准)。一项测试要求24个关于并购的问题(图11,左),其中超过一半需要Claude在多个文档中查找信息,许多问题还需要Claude使用判断或进行数学计算。在这些项目(红色和橙色线)中,当咨询维基时,Claude得分为87%,而单独使用搜索时为73%。

在其他情况下,维基不太有用。在一个LAB任务(图11,右)中,摘要标准通常可以通过从单个文档中进行的文本搜索来检索,并且相对于搜索,维基在性能上没有明显的提升。在另一个LAB任务中,维基的规模超过了文档本身(图12)。就像博尔赫斯一篇短篇故事《科学中的精确性》中绘制的地图制作者,他们绘制了一幅如此详细的地图,以至于它和它所代表的帝国一样大,Claude制作了一个极其详细的维基,实际上没有进行任何抽象。

‘做梦’可以促进笔记在记忆层次结构中提升

‘做梦’还可以将笔记浮动到记忆层次结构的顶部,代理可以利用它们在每次会话开始时预先加载到Claude的上下文中(图13)。这意味着Claude不需要搜索它们,甚至不需要知道需要搜索什么。

将记忆转化为新会话(一种上下文注入的形式)必须小心进行。注入的记忆会消耗宝贵的token,一个错误的笔记可能会被带入每个会话中。加载笔记也无法保证Claude会执行它:我们的Claude Code文档警告说,较长的指令文件会降低遵循度。因此,记忆层次结构的最顶层必须保持相对较小,而梦境在这里的大部分工作就是保持这种状态——通过将一些细节向下层移动并留下链接。

Claude Code的自动记忆以相同的方式保持其注入层的小型化,由Claude在会话期间维护。Claude不会将其所有自动记忆加载到每个会话的上下文窗口中。它只加载MEMORY.md的前200行或25 KB。这个标题作为一个索引,向Claude展示它知道什么以及在哪里找到它。

梦境可以专注于记忆以实现特定目标

梦境还可以塑造记忆的增长方式。例如,像Claude Duet这样的助手,通常受益于围绕其帮助对象组织的记忆,而梦境可以调整以服务于特定目标。

指导记忆增长的指令因任务而异,并告诉Claude哪些信息实际上很重要。例如,LAB基准中的一个任务模拟了公司收购,并提供了一套合同。该简报的评分标准是它是否正确描述了合同条款。

我们最初使用的基本指令用于生成维基,但没有告诉Claude如何使用维基。这项任务严重依赖于合同条款。在维基构建期间,几个代理同时写入了一个共享的合同条款表(图14,左)。

结果是缺少关键事实的维基。当我们根据维基生成简报时,Claude只包含了57个事实中的41个(72%)。当我们查看出了什么问题时,我们发现共享表对合同条款的总结很差,并且完全遗漏了一些条款,因为代理们互相覆盖了彼此的工作。

合同条款是维基最重要的部分,但指令没有说明这一点。为了找到更好的指令,我们运行了一个循环,Claude反思其失败,提出对指令的更改,并重新构建维基。这个循环使Claude发现了遵循合同条款的重要性,并相应地重写了构建维基的指令。

每个合同在维基中都有自己的页面,由单个代理编写,逐字引用条款而不是将它们总结成一个共享表。当我们根据这个改进的维基生成简报时,100%的标准得到了满足,从72%提高了。

梦境可以填补会话留下的空白

当Claude编写记忆笔记时,它只看到该特定会话中的上下文。梦境可以跨多个会话搜索,以找到常见的模式或纠正常见的错误。

在为LAB基准构建维基时(例如,见图14),有时Claude会链接到尚未创建的页面。第二次梦境遍历关闭了许多这样的空白。在一个任务(图15)中,梦境发现了维基中九个指向缺失页面的链接,并将它们重新指向了同一文档的现有页面。它还添加了三个新页面,包括一个索引,以改进维基。

逆向思考,向前看

关于如何为智能体设计内存系统,存在许多开放性问题。其中之一是 Claude 何时应该创建内存。当 Claude 处理任务时,它可以写入内存存储(例如,文件夹、文件或数据库),在源头上捕捉关键信息,并使重要细节立即可用于未来的回合或会话。但实时记录笔记不可避免地会分散 Claude 对其主要任务的注意力。相比之下,做梦可以将内存创建工作推到后台,但做梦产生的任何输出可能无法立即被 Claude 访问。

另一个问题是如何可靠地保持内存的更新。Claude 可能会做出错误的预测,或写入从一开始就是错误的规则到内存中。随着环境的变化,内存也可能漂移并变得不再相关。做梦是修正这些错误的一种方法(图 8),但它需要计算资源。指示 Claude 不断检查其所有内存可能并不实用。相反,将做梦的重点放在可能发生变化的信息上,或仔细调整做梦的节奏(例如,根据内存被访问的频率)可能更为重要。

将转录搜索视为 Claude 内存的基础也是合理的。结合表示(例如,维基百科)与搜索(图 10)有时可以取得一定效果。但 Claude 需要使用计算资源来维护内存表示,并确保它们不会积累错误或幻觉。

尽管 Claude 对关键性的判断有所改进,但没有模型能真正知道未来回合会发生什么。做梦给 Claude 提供了一个机会,让它可以回顾并使用计算资源来组织其内存,纠正错误,并维护允许未来会话更便捷地访问内存的表示。随着 Claude 能力的提升,内存系统将不断演变,我们仍有很多关于设计 Claude 内存系统的事情需要学习。

See our cookbooks for getting started with dreaming and knowledge wikis.

来源: Anthropic Research · anthropic.com