随笔文章作品
首页随笔文章作品
语言 / Language
← 文章
20262
  • 让 Agent 长时间稳定工作:有效的运行框架|Anthropic
  • Effective harnesses for long-running agents \ Anthropic

让 Agent 长时间稳定工作:有效的运行框架|Anthropic

发布于 2026年1月11日
GitHub

随着 AI Agent 能力提升,开发者越来越希望把需要数小时甚至数天的复杂任务交给它们。但如何让 Agent 在这样的任务中持续、稳定地取得进展,仍是一个尚未解决的问题。

长期任务的核心难点在于:Agent 必须分多个会话工作,而每个新会话开始时,都不记得之前发生过什么。想象一个软件项目由轮班的工程师负责,每位接班者到岗时都完全不记得上一班做了什么。上下文窗口有限,大多数复杂项目也无法在一个窗口内完成,因此 Agent 需要一种办法,跨越编码会话之间的断层。

我们采用了两部分组成的方案,让 Claude Agent SDK 能够跨多个上下文窗口有效工作:第一个会话由初始化 Agent 搭建环境,之后由编码 Agent 在每个会话中推进一小步,并留下清楚的交接材料。配套的 quickstart 示例 中有相应代码。

长期运行的 Agent 面临什么问题

Claude Agent SDK 是一个能力很强的通用 Agent 运行框架,擅长编码,也能完成其他需要使用工具收集上下文、制定计划并执行的任务。它具备上下文管理能力,例如压缩上下文,让 Agent 工作时不至于耗尽窗口。理论上,有了这些能力,Agent 应该可以一直做有用的工作。

但仅有上下文压缩还不够。即便把 Opus 4.5 这样的前沿编码模型放进 Claude Agent SDK,在多个上下文窗口中循环运行,只给它一个“做一个 claude.ai 克隆版”之类的高层目标,它最终也很难做出达到生产质量的 Web 应用。

Claude 的失败主要有两种表现。第一种是想一次做太多,试图一口气完成整个应用。结果模型常在某项功能写到一半时耗尽上下文,让下一个会话接手一个既没做完、也没写明进度的半成品。接班的 Agent 只好猜之前发生了什么,花大量时间重新弄清应用的基本状态。即使启用了上下文压缩,这个问题仍会出现,因为压缩结果并不总能清楚传达交接信息。

第二种失败通常发生在项目已有一部分成果之后。后续某个 Agent 会话看见项目已经取得进展,就直接宣布任务完成。

所以问题可以拆成两部分。首先,需要在最初建立一个基础环境,把目标要求的所有功能都明确列出来,使 Agent 能逐项推进。其次,要提示每个会话只做增量工作,并在结束时留下整洁的环境,供下个会话接手。这里的“整洁”,指的是代码达到了可以合入主分支的状态:没有明显的大问题,结构和文档清楚,其他开发者可以直接开始下一项功能,不必先收拾无关的烂摊子。

在内部实验中,我们用两类 Agent 来解决这两个问题:

  • 初始化 Agent:第一个会话使用专门的提示词搭好环境,包括运行环境的 init.sh、记录工作进展的 claude-progress.txt,以及展示新增文件的初始 Git 提交。
  • 编码 Agent:之后每个会话都只推进一小步,并给下一次会话留下结构化的进展记录。¹

关键在于让刚拿到全新上下文窗口的 Agent 能迅速理解现状;claude-progress.txt 和 Git 历史一起承担了这个任务。这些做法借鉴了优秀软件工程师日常工作的方式。

管理工作环境

我们曾在更新后的 Claude 4 提示词指南 中分享跨上下文窗口工作的最佳实践,其中包括“第一个上下文窗口使用不同的提示词”。这个特殊提示词要求初始化 Agent 为后续编码 Agent 准备好所需的全部上下文。下面进一步介绍这种环境中的几个关键部分。

功能清单

为了防止 Agent 试图一次写完整个应用,或过早宣布完成,我们要求初始化 Agent 根据用户的初始需求,展开写出完整的功能要求清单。在 claude.ai 克隆项目中,这份清单包含 200 多项功能,例如“用户可以打开新对话、输入问题并按回车,然后看到 AI 的回复”。最初,所有功能都标为未通过,让后续编码 Agent 清楚知道完整交付是什么样子。

JSON
12 lines
{
  "category": "functional",
  "description": "点击新对话按钮后创建一个新对话",
  "steps": [
    "进入主界面",
    "点击“新对话”按钮",
    "确认创建了新对话",
    "确认对话区域显示欢迎状态",
    "确认新对话出现在侧边栏"
  ],
  "passes": false
}

我们要求编码 Agent 只能修改 passes 字段的状态,并用明确的提示语强调:“删除或改动测试是不可接受的,因为这可能掩盖缺失或有问题的功能。”经过一些尝试,我们最终选用 JSON:相比 Markdown,模型似乎更不容易不恰当地删改 JSON 文件。

增量推进

下一轮的编码 Agent 每次只做一项功能。事实证明,这对抑制 Agent 一次做太多至关重要。

开始增量工作后,每次改动结束时仍必须留下整洁的环境。我们在实验中发现,最有效的办法是要求 Agent 用描述清楚的提交信息做 Git 提交,并在进度文件中记录本次工作。这样,下一个会话既能依据记录接着做,也能用 Git 回退有问题的修改。

这还节省了每个会话的时间:Agent 不必费力猜测此前究竟做过什么。

测试

最后一种常见失败,是 Claude 在没有充分测试时就把功能标为完成。如果没有明确提示,模型通常会改代码,也会运行单元测试,或用 curl 向开发服务器发请求,却可能漏掉浏览器中的端到端验证。

在构建 Web 应用的实验中,只要明确要求编码 Agent 像真实用户那样通过浏览器自动化验证全部功能,它通常能较好地完成端到端检查。

Claude 使用 Puppeteer MCP 服务器测试 claude.ai 克隆应用时截取的画面

这些画面是 Claude 通过 Puppeteer MCP 服务器测试 claude.ai 克隆应用时截取的。给 Agent 这样的工具后,它能发现不少仅看代码不容易察觉的问题。

当然,仍有一些限制,例如视觉能力和浏览器自动化工具本身的局限,会让部分问题难以发现。Claude 无法通过 Puppeteer MCP 看到浏览器原生的警告弹窗,因此依赖这类弹窗的功能往往更容易出错。

快速接上进度

每次启动新的编码 Agent 会话,我们都会提示它先做几件基础但有用的事:

  • 执行 pwd,确认当前工作目录;它只能编辑这个目录里的文件。
  • 阅读 Git 日志和进度文件,了解最近完成了什么。
  • 阅读功能清单,选择尚未完成的最高优先级功能。

这些步骤能减少 Agent 每次重新摸索测试方式所耗的 token。我们还会要求初始化 Agent 编写可启动开发服务器的 init.sh,并在开始实现新功能前跑一遍基本的端到端检查。

以 claude.ai 克隆项目为例,Agent 会先启动开发服务器,再通过浏览器打开新对话、发送消息、确认收到回复。这样,前一个会话若把应用留在了有问题的状态,新会话能在动手开发前发现并修复它。否则,它可能在原有问题上继续堆代码。

一个典型会话开头大致如下:

TEXT
11 lines
[Assistant] 我先确认项目当前的状态。
[Tool Use] bash - pwd
[Tool Use] 读取 claude-progress.txt
[Tool Use] 读取 feature_list.json
[Assistant] 接着查看最近的 Git 提交。
[Tool Use] bash - git log --oneline -20
[Assistant] 看看是否有可用于重启服务的 init.sh。
<启动开发服务器>
[Assistant] 先在浏览器中检查基本功能:打开新对话、发送消息并收到回复。
<执行基本端到端测试>
[Assistant] 基本功能正常。现在阅读功能清单,选择下一项任务。

这些实践针对四种常见问题:

问题初始化 Agent 的做法编码 Agent 的做法
Claude 过早宣布整个项目完成。建立功能清单。每次选择一项尚未完成的最高优先级功能。
Claude 留下有问题或没有记录的工作状态。初始化 Git 仓库和进度记录。开始时阅读进度记录与 Git 历史;结束时提交代码并更新记录。
Claude 过早把功能标为完成。建立功能清单。只在仔细自行验证每项功能之后,才把它标为通过。
Claude 每次都要重新摸索如何运行应用。编写可运行开发服务器的 init.sh。每次会话先阅读 init.sh。

这四组做法分别对应长期任务中最常见的失败模式。

后续方向

这些研究展示了一种在长期运行的 Agent 运行框架中,跨多个上下文窗口保持进展的方案,但仍有一些开放问题。

最值得继续研究的是:一个通用编码 Agent 是否在各种场景下都最有效?还是让测试、质量检查、代码清理等工作分别由专门的 Agent 承担,效果会更好?

此外,这个演示主要针对全栈 Web 应用开发。未来还可以探索如何把部分或全部实践推广到其他领域,例如科学研究和金融建模。

致谢

本文由 Justin Young 撰写。特别感谢 David Hershey、Prithvi Rajasakeran、Jeremy Hadfield、Naia Bouscal、Michael Tingley、Jesse Mu、Jake Eaton、Marius Buleandara、Maggie Vo、Pedram Navid、Nadine Yasser 和 Alex Notov 的贡献。

这项工作凝聚了很多团队的努力,包括代码强化学习团队和 Claude Code 团队,他们让 Claude 有能力安全地完成长周期的自主软件工程工作。欢迎有兴趣的朋友查看 Anthropic 招聘页面。

脚注

1. 文中称它们为两类 Agent,只是因为它们使用了不同的初始提示词;除此之外,两者使用的是同一个 Agent 运行框架。

文章批注

本文暂无批注

← 文章下一篇: Effective harnesses for long-running agents \ Anthropic →

本文来源于 GitHub 仓库