【Agent】Agent Harness:长时运行智能体的关键设计模式
引言
随着大语言模型能力的快速提升,AI Agent 被赋予了越来越复杂的任务:从自动化编写代码、跑通测试,到自主构建完整的全栈应用。然而,当任务的复杂度超过单个上下文窗口所能容纳的范围时,Agent 的表现往往会出现明显退化。
这就引出了”Agent Harness(智能体执行框架)”这一概念。Harness 不是模型本身,而是围绕模型构建的一套调度机制和工程脚手架,用来解决长时运行任务中出现的上下文切换、任务衔接、状态管理等核心问题。Anthropic 工程团队在实际构建长时 Agent 系统的过程中,系统地探索了 Harness 的设计方法,并将经验总结在两篇工程博客中(见文末参考资料)。本文将基于这些内容,介绍 Agent Harness 的核心概念与设计模式。
什么是 Agent Harness
Agent Harness(智能体执行框架)是指围绕大语言模型构建的一套外部调度与工程机制,其目的是让 Agent 能够在长时任务中保持稳定、高效地运行。
可以用一个比方来理解:如果 Agent 是一名工程师,那么 Harness 就是这名工程师的工作环境——包括交接文档、任务清单、版本控制系统、测试流程等。没有这些基础设施,即便是经验丰富的工程师在换班时也会不知所措。
一个典型的 Harness 通常包含以下要素:
- 初始化机制:在任务开始时建立清晰的工作环境和任务上下文
- 状态持久化:保存任务进度,供下一个 Agent 实例恢复工作
- 任务分解结构:将复杂任务拆解为可独立完成的子任务
- 测试与验证流程:确保每个阶段的输出符合预期
- 上下文管理策略:应对上下文窗口用尽的情况
长时运行 Agent 的挑战
为什么朴素实现会失败
当给 Agent 一个高层次的指令(如”构建一个 claude.ai 的克隆版本”)时,如果没有额外的 Harness 支持,Agent 通常会出现两类典型的失败模式:
第一类是”一次性完成”的冲动。Agent 倾向于试图在单个上下文窗口内完成整个任务,结果是在实现到一半时上下文耗尽,留下半完成的、未文档化的代码,导致下一个会话的 Agent 必须花费大量时间猜测之前发生了什么。
第二类是”提前宣告完成”。在一些功能已经实现之后,后续的 Agent 实例可能看到已有进展就认为任务基本完成,直接宣告胜利并停止工作,忽略了大量尚未实现的功能。
上下文焦虑问题
除了上述两类失败,还有一个更微妙的问题:上下文焦虑(context anxiety)。某些模型在感知到上下文窗口即将用尽时,会开始提前收尾工作——匆匆生成结论、跳过未完成的功能、草率地标记任务为”完成”。这并非模型能力不足,而是对上下文限制的一种错误应对。
上下文压缩(compaction)技术虽然能够延长上下文寿命,但并不能完全解决焦虑问题——因为模型仍然处于同一个会话中,感知到的上下文压力没有从根本上消除。
核心 Harness 设计要素
Anthropic 的工程团队通过实验,总结出了一套有效的 Harness 设计方案,核心是”初始化 Agent + 编码 Agent”的两阶段结构。
初始化 Agent
初始化 Agent 只在任务的第一个会话中运行,负责搭建整个工作环境,为后续所有会话提供清晰的上下文。具体包括:
- 生成功能需求列表(
feature_list.json):将高层次的用户需求展开为具体、可验证的功能点,初始状态均标记为”未通过” - 编写启动脚本(
init.sh):记录如何启动开发服务器,避免每个编码 Agent 都要重新摸索 - 创建进度文件(
claude-progress.txt):记录任务进展,为后续会话提供历史摘要 - 建立初始 git 仓库,并提交初始代码
功能需求列表是其中最关键的组件。以 claude.ai 克隆项目为例,该列表包含了超过 200 个具体功能点,例如:
1 | { |
Agent 被明确要求只能通过修改 passes 字段来更新功能清单,且禁止删除或修改测试描述本身,以防止因”减少测试数量”来刷通过率的投机行为。使用 JSON 格式而非 Markdown,也是为了降低模型无意间修改结构的概率。
增量进展策略
在初始化完成之后,编码 Agent 的核心工作原则是:每次只做一件事,做完一件再做下一件。
具体而言,每个编码会话开始时,Agent 会:
- 读取进度文件和 git 日志,了解上次做到了哪里
- 从功能列表中选择优先级最高的未完成功能
- 专注实现该功能,并在完成后提交 git commit(附带描述性提交信息)
- 更新进度文件,记录本次会话的工作内容
这种增量式的方式从根本上避免了”一次性完成”的冲动,同时确保每次会话结束时,代码库都处于干净、可提交的状态。
端到端测试
在没有明确提示的情况下,Agent 容易将”代码写完”等同于”功能实现”,而实际上功能可能存在端到端的集成问题。Anthropic 的实践表明,明确提示 Agent 使用浏览器自动化工具(如 Puppeteer MCP)进行端到端测试,可以显著提升功能的最终质量。
一个典型的会话开始序列如下:
- 启动开发服务器
- 通过浏览器自动化工具执行一次基础端到端测试(如发起一个对话、接收回复)
- 确认应用处于可工作状态后,再开始新功能的开发
这样的流程能够在第一时间发现遗留 bug,避免”边开发新功能,边埋下旧问题”的情况。
进阶 Harness 设计:生成器与评估器
在基础 Harness 能够让 Agent 稳定运行之后,Anthropic 的工程师进一步引入了一个更强大的设计模式:受生成对抗网络(GAN)启发的”生成器 - 评估器”双 Agent 架构。
为什么需要双 Agent
单个 Agent 在评估自己输出时,存在明显的乐观偏差:它倾向于认为自己的工作是好的,即便在旁观者看来质量明显不足。这个问题在主观性强的任务(如前端设计)中尤为突出。
将生成和评估分离到两个 Agent 中,是解决这个问题的有效手段。评估 Agent 专注于发现问题,而生成 Agent 则根据反馈进行改进。更重要的是,把一个针对 LLM 生成内容保持怀疑态度的评估者提示进行精心调优,要比让生成 Agent 自我批评容易得多。
前端设计的评估标准化
在前端设计场景中,Anthropic 定义了四个可量化的评估维度:
- 设计质量:设计是否整体协调、具有统一的视觉语言,而不只是零散组件的堆砌
- 原创性:是否有明显的定制化决策,而非直接使用模板、库的默认样式或 AI 生成的俗套模式(如紫色渐变白卡片)
- 工艺水准:字体层级、间距一致性、色彩对比等技术执行质量
- 功能性:用户能否理解界面用途,顺利完成操作
评估 Agent 配备了 Playwright MCP,可以直接与生成的网页进行真实交互(而非只看静态截图),逐项打分后生成详细评审报告,反馈给生成 Agent 进行下一轮改进。实验中每次构建跑 5 到 15 次迭代,每轮迭代评估分数稳步提升,直到趋于平稳。
全栈开发的三 Agent 架构
将双 Agent 模式扩展到全栈开发时,Anthropic 进一步演进为三 Agent 架构:
规划者(Planner):接受用户的简短描述(1-4 句话),将其扩展为详细的产品功能规格,并主动寻找将 AI 特性融入产品的机会。规划者只关注”要做什么”,刻意避免指定”怎么做”,以防止早期的错误假设传导到后续实现中。
生成者(Generator):按照规格逐步构建应用,每次完成一个功能点(sprint),并在每个 sprint 结束时进行自我评估后移交给评估者。
评估者(Evaluator):使用 Playwright MCP 像真实用户一样操作已部署的应用,根据预先约定的验收标准逐项检验,将 bug 和质量问题列表反馈给生成者进行修复。
生成者和评估者在每个 sprint 开始前会先”协商合同”(sprint contract):明确这个 sprint 要实现什么、如何验证完成。这一协商步骤有效弥合了高层规格与可测试实现之间的鸿沟。
两个 Agent 之间通过文件来传递信息——一个 Agent 写文件,另一个读文件并回应。这种方式简单可靠,避免了复杂的实时通信依赖。
上下文管理:压缩与重置
上下文重置 vs. 上下文压缩
处理上下文窗口耗尽问题,主要有两种策略:
上下文压缩(compaction)是在同一会话内,将较早的对话历史进行摘要,腾出空间继续执行。这种方式保留了会话的连续性,但并不给 Agent 一个”全新的开始”,上下文焦虑问题可能仍然存在。
上下文重置(context reset)是完全清空上下文,启动一个全新的 Agent 实例,通过结构化的交接文档(handoff artifact)将必要的状态传递给新 Agent。这能彻底消除上下文焦虑,但需要交接文档足够完整,才能让新 Agent 顺利接手。
在早期使用 Claude Sonnet 4.5 的实验中,上下文焦虑问题足够严重,必须采用上下文重置才能保证长时任务的稳定性。而在 Opus 4.6 上,模型的长上下文能力显著提升,自带的压缩机制已经足够,无需再做额外的重置处理。
Harness 复杂度随模型能力而演化
这一点值得特别关注:Harness 的每个组件都对应着对模型能力的一个假设。模型更强了,某些组件就可能不再必要。
Anthropic 的实践表明,Opus 4.6 相比 4.5 在长时任务规划、大型代码库操作、自我 Debug 等方面有显著提升,这使得原本需要”sprint 分解”才能保持稳定的任务,现在可以由模型在一次连续会话中完成。因此,工程师将原来按 sprint 触发的评估者,改为在整个构建完成后做一次性评估,既降低了系统复杂度,又保留了评估者在关键边界任务上的价值。
Anthropic 总结的原则是:遵循”找到最简单有效的方案,只在必要时增加复杂度”的原则,并在每次新模型发布后,重新审视 Harness 中哪些组件仍然必要。
常见失败模式与解决方案
| 失败模式 | 初始化 Agent 的对策 | 编码 Agent 的对策 |
|---|---|---|
| Agent 过早宣告任务完成 | 生成包含所有功能点的功能清单文件 | 每次会话开始时读取功能清单,选取单个未完成功能作为本次目标 |
| Agent 遗留 bug 或未记录进展 | 创建初始 git 仓库和进度文件 | 会话开始时读取进度文件和 git 日志;会话结束时提交 commit 并更新进度 |
| Agent 未做真实测试就标记功能为完成 | 生成功能清单,明确验证步骤 | 使用浏览器自动化进行端到端测试,通过真实操作验证功能 |
| Agent 每次会话都要重新摸索如何启动应用 | 编写 init.sh 启动脚本 |
会话开始时读取并执行 init.sh |
总结
Agent Harness 是构建长时运行 AI Agent 系统的关键工程基础。它的核心价值不在于让模型变得更聪明,而在于为模型提供稳定、结构化的工作环境:清晰的任务边界、持续的状态传递、独立的质量评估反馈。
从 Anthropic 的实践中可以提炼出以下设计原则:
- 从最简单的方案开始,只在遇到真实问题时才增加复杂度
- Harness 中每个组件都应有明确的存在理由,随着模型能力提升及时精简
- 将生成与评估分离,有助于打破模型的自我乐观偏差
- 用结构化文件(功能清单、进度文件、交接文档)而非依赖上下文记忆来传递状态
- 端到端测试是发现集成问题的唯一可靠手段
随着模型能力的持续提升,Harness 的具体形式也在不断演化。但其核心思想——通过工程手段补足模型的系统性短板——将长期保持其价值。
参考资料
- Anthropic Engineering, “Effective harnesses for long-running agents” (2025): https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents
- Anthropic Engineering, “Harness design for long-running application development” (2026): https://www.anthropic.com/engineering/harness-design-long-running-apps
- Anthropic, “Building Effective Agents”: https://www.anthropic.com/research/building-effective-agents
- Claude Agent SDK 文档: https://platform.claude.com/docs/en/agent-sdk/overview
- Autonomous Coding Quickstart(代码示例): https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding