MemoryLake
返回全部文章
News2026 年 9 月 15 日·13 分钟阅读

Anthropic 自家智能体让其测试选择服务超载——重构的理由在一个长达数月的 Session 中进行了辩论 (2026)

2026 年 9 月 14 日,一位名叫 Sachin Malhotra 的 Anthropic 工程师发表了一篇关于持续集成的文章。从表面上看,这是一个基础设施的故事:智能体开始编写公司的大部分代码,拉取请求(PR)增加了,测试增加了,而决定在哪些更改上运行哪些测试的服务无法跟上节奏。三个快速修复方案分别争取到了 70 天、29 天,然后是不到 1 天的时间。接着,他们重构了它。

几乎所有报道这篇文章的人都会报道那部分内容。它包含具体的数据,而且这些数据非常惊人。

但中间的一个段落与持续集成毫无关系,它是 Anthropic 很久以来发布的关于工作记忆(working memory)最有趣的内容——部分原因在于,它似乎根本不是作为关于记忆的声明而写的。这是一位工程师几乎是顺便描述了他是如何让一个持续数月的架构争论保持活力的。

本文就是关于那个段落,以及紧挨着它的结构性失效,而这恰恰与悄悄降低你所信任的、用于记住某些事情的每个助手性能的失效是一样的。

Anthropic 究竟发布了什么

背景情况被清晰地记录了下来。Anthropic 工程师“每个季度交付的代码量是 2021-2025 年期间的 8 倍”,并且“编写代码不再是瓶颈,一旦 PR 评审加速,CI 就会开始感受到压力。”与此同时,“我们整个代码库中的测试数量增长了 10 倍,而我们只增加了一小部分工程师。”结果是:“在 6 个月内,我们的 CI 任务量增加了 25 倍。”

Anthropic 并没有在每次更改时运行所有测试,而是构建了文章中所称的“确定性测试影响分析或测试选择服务,该服务根据历史表现和包相关性来决定在每次更改中运行哪些测试。”它由两部分组成。“‘监听器’(listener)记录每次 CI 运行的测试结果。”“‘选择器’(selector)读取测试结果历史记录,并决定在哪些打开的 PR 上运行哪些测试。”

这个由两部分组成的设计就是故事的全部。一个组件记录发生的事情。另一个组件读取记录的内容并据此做出决策。当记录者与现实保持同步时,读取者的决策就是有依据的。当记录者落后时,什么都不会崩溃——读取者只是继续自信地根据不再与世界匹配的记录做出决策。

而它确实落后了。“监听器开始越来越多地落后于 PR 队列。”落后的幅度很具体:“20 分钟的监听器延迟可能导致数万个测试更新未应用到选择器。”原因也是如此:“所有这些都作为一个单一进程运行,因为保留每个测试的运行历史记录意味着需要一个单一的写入者来应用结果,”这“阻止了我们进行水平分片的能力。”

接着就是那个段落。在描述他如何推动长期修复时,Malhotra 写道:“我在一个专门用于监控该服务的内部版本 Claude Tag 中启动了一个长期运行的 session。”它是事件驱动的——“每当监听器延迟超过 50,000 个任务时,Claude 就会联系我,并恢复我们关于下一步措施的对话。”然后是至关重要的一行:“这持续了几个月,而且不需要不断提醒它过去的努力或上下文,这非常有帮助。”

他还加了一句值得深思的话:“Claude 经常主张进行彻底重构,但我们通常会妥协于另一个补丁。”

这改变了什么,又没有改变什么

让我们准确地看待这些主张,因为这很容易被夸大。

Anthropic 并不是在这里发布一款记忆产品。这篇文章是关于测试选择的工程回顾,而所讨论的 session 运行在一个内部工具的内部版本中。其中没有任何内容表明其他人也应该这样工作,也没有描述任何你可以去开启的功能。

Anthropic 也很小心,没有夸大损失。当服务严重落后时,文章写道:“需要明确的是,这并不意味着 CI 从未在这些 PR 上运行,也不意味着未测试的代码被推送到生产环境。”发生的事情更为局限:选择器“使用过期的数据来决定在 PR 上运行什么和不运行什么。”这是一个诚实、有界限的失效描述,值得被引用而不是被戏剧化。

这篇文章确实确立了两件事,且都是第一手经验。

第一件事是,一个历时数月才做出的决策,是由一个没有重新开始的对话维系在一起的。这里体现的价值不是智能,也不是速度。而是“不需要不断提醒它过去的努力或上下文”——即重新建立你已经达到的状态的成本。任何重新打开六周前的线程并花二十分钟重建为什么在第二周拒绝了显而易见的答案的人,都深知这种成本。

第二件事是,同一篇文章完全独立地描述了当书面记录落后于据此做出的决策时会发生什么。这种延迟是无形的。它没有产生任何错误。它根据过期的状态做出了自信的决策。

这两个观察结果是同一个观察结果,只是指向相反的方向。当记录跟得上时,数月的争论就能保持连贯。当它落后时,每一个下游决策都会悄然退化,而没有任何提示。

人们会从中得出什么结论,以及为什么不应该这样做

“长上下文(Long context)解决了这个问题。” 并没有,而且这篇文章意外地展示了原因。一个跨越未知数量的警报、运行数月的 session 不是一个上下文窗口问题;而是一个在激活之间什么能够存活下来的问题。我们在 为什么长上下文窗口不是记忆 中单独写了这一区别。

“所以对聊天记录进行检索(Retrieval)就可以了。” 检索寻找的是类似于你查询的文本。而推动这一论点向前发展的是一个既定的立场——即重构是合理的、已经尝试了三个补丁、每个补丁争取到的时间都比上一个少。这是一个结论,而不是一个段落,在对话记录中搜索它与保持它是一个不同的操作。我们在 为什么 RAG 不是记忆 中划清了这一界限。

“Anthropic 证明了智能体应该决定架构。” 文章温和地表达了相反的观点。Claude 反复主张重构,但一再被有其他优先事项的人类否决,文章将最终的达成一致框定为工程师自己的教训——“始终为指数级增长做计划。”该 session 的贡献是连续性,而不是权威性。

“这是一个关于编码智能体的故事。” 这一机制与代码毫无关系。记录层落后于决策层,就像你的助手存储的关于你偏好的摘要是在六月份写的,而你在八月份改变了主意。没有错误出现。答案只是变得微妙地错误。

解决方案:写下结论,而不仅仅是产生结论的对话

一个长达数月的 session 之所以有效,是因为它在大量的干扰中保留了少数既定的事实。你可以刻意获得这种特性,而不必依赖于任何单一供应商的 session 保持开启。

步骤 1:将运行日志与既定立场分离

在任何跨越多次会议的争论结束时,都会产生两个产物。一个是对话记录,它很长,主要由你拒绝的选项组成。另一个是立场,它很短:决定了什么、尝试了什么、成本是多少,以及什么会改变这个答案。

用你自己的话将立场写成散文,与对话记录分开。通常四五句话就足够了。“我们尝试了更大的机器;它维持了大约 70 天。我们尝试了按包分片;它维持了大约一个月。我们尝试了每日重启;它维持了一天。下一步是重新设计,而不是第四个补丁。”

那个段落才是长达数月的 session 真正承载的内容。其余的都是脚手架。

步骤 2:为立场注明日期并记录它所替代的内容

Anthropic 文章中的失效模式是记录落后了却没有任何声明。你自己的笔记也会以同样的方式失效:它们变旧了,而你变新了,没有任何东西标记这个差距。

因此,当立场发生变化时,不要默默地覆盖它。写下新的立场,注明日期,并保留一行关于它取代了什么的内容。“截至三月,重启不再被视为一种修复方法。”一个知道自己取代了什么的存储事实是可以被检查的;而一个不知道的事实只能被盲信。如果你从未研究过你自己的存储中相互矛盾的版本是如何相互解决的,那么 记忆冲突检测 首先值得了解。

步骤 3:把它放在下一个 session 无需被告知即可读取的地方

最后一个特性使其具有持久性。Anthropic 的 session 之所以有效,是因为助手在发出提醒时已经拥有了上下文;当延迟警报在凌晨 2 点触发时,没有人重新向它汇报情况。

通过将立场保存在你的工具在工作开始时读取的存储中,而不是你记得去粘贴的文档中,来重现这一点。测试很简单:在任何助手中打开一个全新的对话,并询问决定了什么。如果你必须先解释它,那么这个立场就没有被存储——它只是被写了下来。这一区别是 在 session 之间共享上下文 的主题。

在 MemoryLake 中进行设置

MemoryLake 的存在就是为了成为那个独立的、可寻址的层:一个存储你希望每个助手都已经拥有的决策的仓库,而不是一个触及其他任何人产品的地方。你自己用自己的话写下这些条目。没有任何内容是从 Anthropic 的系统、OpenAI 的系统或任何其他供应商的存储中拉取的,这里也没有任何内容会读取、恢复或修改这些供应商所持有的内容。

步骤 1:创建 API 密钥

登录并从仪表板生成一个密钥。该密钥可以让你的助手和智能体访问同一个层,从而使每个界面都读取同一组立场,而不是该工具自身历史记录中的任何内容。

MemoryLake 控制台 API 密钥页面,其中创建 API 密钥对话框已打开,要求输入密钥名称和过期时间
MemoryLake 控制台 API 密钥页面,其中创建 API 密钥对话框已打开,要求输入密钥名称和过期时间

步骤 2:上传你的第一批记忆

从立场开始,而不是对话记录。把你目前工作中正在进行的两个或三个争论——架构上的、流程上的、关于你正在标准化哪个供应商的——并将每个争论写成一段简短的、注明日期的段落,写明尝试了什么以及成本是多少。这是你可以存储的最有价值的东西,因为重建它需要最长的时间。

MemoryLake 默认工作区及其项目选项卡,显示第一个项目和附加到其上的数据源
MemoryLake 默认工作区及其项目选项卡,显示第一个项目和附加到其上的数据源

步骤 3:连接你的 AI 和智能体

将你的助手指向该层,以便在 session 开始时加载立场,而不是将其粘贴进去。然后通过打开一个真正新鲜的对话并询问当前的立场是什么来进行验证。读回它是连接有效的唯一证明;显示绿色状态的面板并不是一回事。

MemoryLake 集成库,带有 OpenClaw、Hermes Agent、Claude、ChatGPT、MCP 和 REST API 的卡片
MemoryLake 集成库,带有 OpenClaw、Hermes Agent、Claude、ChatGPT、MCP 和 REST API 的卡片

这在实践中改变了什么

实际的差异体现在什么都没有发生的时刻。

一个长达数月的争论并不是一个长达数月的对话。它可能是在一百天里进行的十五次真实互动,其间有数周的沉默。沉默正是立场腐烂的地方。有人尝试了这件事,但没有成功,他们继续前进,三周后同样的建议又回来了,因为上一次尝试的成本从未被写在任何持久的地方。

Anthropic 的文章针对机器而不是人提出了同样的观点:当记录延迟超过一个小时时,“大量的任务结果没有被监听器记录下来,”而选择器仍然继续做出决策。没有任何警报。决策只是变得更糟。

第二个区别是注意力的规模。文章指出,“智能体在夜间和周末进行推送,但它仍然是爆发性的,因为人类工程师仍然推动并批准了大量的 PR。”活动的底线已经上升;人类并没有获得更多的时间。如果你在更多的界面上监督更多的工作,重新汇报与思考的比例决定了你是否能够完成这项工作——这实际上是一个关于 应该给智能体分配多少记忆 的问题。

第三个是可审计性。重构之所以奏效,是因为团队终于可以将延迟视为一个数字。你的立场也应该得到同样的对待:一个你可以从头到尾阅读并说“这是最新的,这是过期的,这个与那个相矛盾”的存储。如果你从未做过这种检查,那么 审计你的 AI 实际记住了什么 就是开始的地方。

保持长达数月的决策清晰易读的最佳实践

在会议结束时写下立场,而不是在下一次会议开始时。 在拒绝一个选项后的十分钟内,你对为什么拒绝它的上下文了解是最充分的。

用散文形式记录。 八周后,一条写着“分片——不起作用”的要点是无法使用的。“按包分片让每个 worker 拥有一个部分;在延迟重新出现之前,它维持了大约一个月”在一年后仍然可以使用。

存储成本,而不仅仅是结果。 Anthropic 的文章令人难忘,因为它说明了每个补丁持续了多久。“它不起作用”会引来重新尝试。“它争取到了 29 天”则结束了争论。

指明什么会改变你的想法。 一个带有明确触发条件的立场会以一种有用的方式自我失效。如果没有,每当有新人加入时,你都会重新进行辩论。

不要将对话记录作为记录存储。 对话记录是证据。立场才是记录。将它们混为一谈会导致存储空间变大,同时变得毫无用处。

定期重新阅读立场。 Anthropic 的延迟在被测量之前是无形的。你的延迟也是如此。

结论

最引人注目的发现是,智能体编码在半年内给 Anthropic 的 CI 带来了 25 倍的负载,并且对单写入者服务进行三次补丁修复,比重新构建一次更浪费工程时间——而这次重构“由一名工程师花了三周时间完成”。

更含蓄的发现是在方法上。重构的论点是在几个月里提出的,由一个不需要被提醒争论进展到哪一步的助手,对抗一个不断选择补丁的人类。它之所以获胜,是因为它保持连贯的时间比反对意见持续的时间更长。

这不是任何特定工具的功能。它是将结论与对话分开、注明日期、并可供你接下来打开的任何工具读取的属性。Anthropic 是从一个恰好没有结束的 session 中获得这一点的。你可以有目的地获得它。

常见问题

Anthropic 是否表示其记忆功能推动了这一决策?

不,准确看待这一点很重要。文章描述了在用于监控的内部版本 Claude Tag 中的一个长期运行的 session,并表示它很有用,因为不需要重复过去的努力和上下文。它没有描述面向消费者的记忆功能,没有命名产品设置,也没有将其作为建议提出。该段落的价值在于它是对连续性价值的第一手叙述,而不是产品声明。

测试选择服务究竟出了什么问题?

记录的一半落后于决策的一半。文章描述了一个记录结果的监听器和一个读取结果的选择器,并指出“20 分钟的监听器延迟可能导致数万个测试更新未应用到选择器。”由于历史记录是在一个进程中按测试保留的,因此单个写入者必须应用每个结果,这“阻止了我们进行水平分片的能力。”重新设计将该状态移至内存存储中,以便任何 worker 都可以追加并继续。

这是否意味着未测试的代码已交付?

Anthropic 直接回应了这一点并表示否定:“需要明确的是,这并不意味着 CI 从未在这些 PR 上运行,也不意味着未测试的代码被推送到生产环境。”更局限的后果是测试选择是在过期数据上运行的,这主要意味着运行已经广泛失败的测试。这是一个供应商诚实地界定自身失效,而不是让读者去猜测的好例子。

为什么一个 CI 的故事会适用于个人 AI 记忆?

因为形式是完全相同的。一个组件记录发生的事情;另一个组件根据记录的内容做出决策。当记录落后于发生的事情时,决策仍然保持自信但变得错误,并且没有任何东西会暴露出错误。当助手存储的关于你偏好的摘要比你的偏好旧几个月时,就会发生这种情况。

我应该只保持一个非常长的聊天打开吗?

这在失效之前是有效的——线程会结束、工具会改变、账户会迁移、或者窗口会填满。让 Anthropic 的 session 具有价值的是连续性,而不是它存在于一个线程中。将既定的立场提取到一个独立的、注明日期的存储中,可以给你带来同样的连续性,而无需将赌注押在保持一个对话活跃上。

每个决策我应该写下多少内容?

比人们预期的要少。四五句话,涵盖决定了什么、尝试了什么、每次尝试的成本是多少,以及什么会重新开启这个问题。Anthropic 的文章在大致这么大的空间里就非常有说服力:三个补丁、70 天、29 天、不到一天,然后是重新设计。如果你的笔记无法达到这种密度,它可能只是对话记录,而不是立场。