Skip to content

长时间运行 Agent 的有效 Harness

发布日期: 2025年11月26日

作者: Justin Young


Agent 在跨多个 Context Window 工作时仍然面临挑战。Anthropic 从人类工程师那里汲取灵感,为长时间运行的 Agent 创建更有效的 Harness。

随着 AI Agent 变得越来越强大,开发者越来越多地分配给它们跨越数小时甚至数天的复杂任务。然而,让 Agent 在多个 Context Window 之间保持一致的进展仍然是一个未解决的问题。

核心挑战是 Agent 必须在离散的 Session 中工作,每个新 Session 开始时对之前发生的事情没有记忆。文章使用了一个类比:一个由轮班工程师组成的软件项目,每个新工程师到达时对前一班次一无所知。由于 Context Window 是有限的,大多数复杂项目无法在单个窗口内完成,Agent 需要一种方法来弥合编码 Session 之间的差距。

解决方案

Anthropic 为 Claude Agent SDK 开发了一个双重解决方案:一个在首次运行时设置环境的初始化 Agent,以及一个在每个 Session 中取得增量进展同时为下一个 Session 留下清晰制品的编码 Agent。代码示例可在配套的快速入门中获取。

长时间运行 Agent 问题

Claude Agent SDK 被描述为"擅长编码的强大通用 Agent Harness",具有压缩等上下文管理功能。理论上,这应该允许 Agent 在任意长的时间内做有用的工作。

然而,仅靠压缩是不够的。即使在 Claude Agent SDK 上跨多个 Context Window 循环运行的 Opus 4.5,也无法仅凭高层提示构建生产质量的 Web 应用。

Claude 的失败表现为两种模式:

  1. 试图一次做太多 —— 试图一次性完成应用,经常在实现中途耗尽上下文,让下一个 Session 猜测发生了什么。
  2. 过早完成 —— 在构建了一些功能后,后来的 Agent 实例会环顾四周,看到已经取得了进展,然后宣布工作完成。

解决方案分解为两个部分:设置一个为所有必需功能奠定基础的初始环境,以及提示每个 Agent 取得增量进展同时将环境保持在干净状态——"没有重大 bug,代码有序且有良好的文档。"

环境管理

功能列表

初始化 Agent 被提示编写一个扩展用户初始提示的综合功能需求文件。对于 claude.ai 克隆示例,这意味着超过200个功能,例如"用户可以打开新聊天、输入查询、按回车键并看到 AI 响应。"所有功能最初被标记为"失败",以便后来的编码 Agent 有完整功能的清晰大纲。

每个功能条目以 JSON 结构化,包含类别、描述、步骤和 passes 布尔值字段。一个示例功能条目描述了"新建聊天按钮创建全新对话",带有验证步骤和 passes: false

编码 Agent 被指示仅通过更改 passes 字段的状态来编辑此文件,并有措辞强烈的指示反对删除或编辑测试。选择 JSON 而不是 Markdown 是因为"模型不太可能不当地更改或覆盖 JSON 文件。"

增量进展

编码 Agent 被要求一次只处理一个功能。这种增量方法对于解决一次做太多的倾向至关重要。模型还被要求用描述性的提交消息将进展提交到 Git,并在进度文件中写入摘要,使其能够使用 Git 回滚糟糕的更改并恢复工作状态。

测试

一个主要的失败模式是 Claude 倾向于在没有适当测试的情况下将功能标记为完成。Claude 会进行代码更改并使用单元测试或 curl 命令测试,但未能认识到功能无法端到端工作。

对于 Web 应用构建,一旦明确提示使用浏览器自动化工具并像人类用户一样测试,Claude 在端到端验证功能方面表现出色。文章显示了 Claude 通过 Puppeteer MCP 服务器在测试 claude.ai 克隆时拍摄的截图。

提供测试工具显著提高了性能。仍然存在一些局限性,例如 Claude 的视觉限制和浏览器自动化工具约束——例如,Claude 无法通过 Puppeteer MCP 看到浏览器原生的警报模态框。

快速上手

每个编码 Agent 被提示运行一系列步骤:

  1. 运行 pwd 查看工作目录
  2. 阅读 Git 日志和进度文件以了解最近的工作
  3. 阅读功能列表文件并选择最高优先级的未完成功能

初始化 Agent 编写一个 init.sh 脚本来运行开发服务器,编码 Agent 在实现新功能之前运行基本的端到端测试。这确保 Claude 可以快速识别应用是否处于损坏状态,然后再进行更改使情况变得更糟。

典型的 Session 从 Agent 熟悉环境开始,阅读进度文件和功能列表,检查 Git 日志,启动开发服务器,验证基本功能仍然有效,然后开始新功能的工作。

Agent 失败模式和解决方案

问题初始化 Agent 行为编码 Agent 行为
Claude 过早宣布胜利设置结构化的 JSON 功能列表文件在 Session 开始时阅读功能列表;选择单个功能
Claude 留下有 bug 或无文档的环境创建初始 Git 仓库和进度记录文件在开始时阅读进度记录和 Git 日志;运行基本测试;在结束时提交和更新
Claude 过早将功能标记为完成设置功能列表文件自我验证所有功能;仅在仔细测试后标记为"通过"
Claude 花时间弄清楚如何运行应用编写 init.sh 脚本在 Session 开始时阅读 init.sh

未来工作

该研究展示了长时间运行 Agent Harness 的一组可能解决方案。仍然存在一些开放问题:

  • 单个通用编码 Agent 在各种上下文中是否表现最佳,还是多 Agent 架构(测试 Agent、QA 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。这项工作反映了 Anthropic 的集体努力,特别是代码 RL 和 Claude Code 团队。

脚注

  1. Agent 被称为独立的只是因为它们有不同的初始用户提示。系统提示、工具和整体 Agent Harness 在其他方面是相同的。
AI 落地咨询
艾维禾砺数字科技

企业 AI 落地全链路服务

Agent 开发工作流搭建Claude Code 集成
微信咨询
d187l8801b6124
访问官网 ivheli.com