面向长时间运行应用开发的 Harness 设计
这篇文章把 harness 设计从抽象理念拆成了能直接落地的工程部件,并通过两个完整案例说明它为什么会实质改变 agent 的表现上限。文章试图解决什么问题作者聚焦两个相关目标:让 Claude 做出更强的前端设计,以及让它能在长时间运行的自主编程任务里稳定产出完整应用。文章认为,单靠模型原始能力会遇到两个核心瓶颈:长…
转载说明:本文基于 Anthropic Engineering 于 2026 年 3 月 24 日发布的文章 Harness design for long-running application development 进行完整中文精译与整理。面向长时间运行应用开发的 Harness 设计 发布于 2026 年 3 月 24 日 Harness 设计是 agentic coding 前沿性能的关键。本文展示了我们如何在前端设计和长时间运行的自主软件工程任务中,把 Claude 推得更远。 作者:Anthropic Labs 团队成员 Prithvi Rajasekaran 过去几个月里,我一直在处理两个彼此关联的问题:怎样让 Claude 产出高质量的前端设计,以及怎样让它在没有人工干预的情况下构建完整应用。这项工作起源于我们更早的两个尝试:frontend design skill 和 long-running coding agent harness。在这些项目里,我和同事们已经借助 prompt engineering 与 harness 设计,把 Claude 的表现拉到了远高于 baseline 的水平,但两条路最终都碰到了上限。 为了继续突破,我开始寻找能同时适用于两个差异极大的领域的 AI 工程方法:一个领域由主观审美驱动,另一个领域则由可验证的正确性与可用性定义。受 生成对抗网络(GAN)启发,我设计了一种由 generator 与 evaluator 组成的多代理结构。要让 evaluator 能稳定而且“有品位”地打分,第一步就是先把“这个设计好不好”这类主观判断,转译成可具体评分的标准。 随后,我把这些方法迁移到长时间运行的自主编程任务上,并延续了我们此前 harness 工作中的两个经验:把构建任务拆成更容易处理的块,以及用结构化工件在不同 session 之间交接上下文。最终形成的是一个 planner、generator、evaluator 三代理架构,它能在长达数小时的自主编程 session 中持续产出完整的全栈应用。为什么朴素实现会失效 我们之前已经展示过,harness 设计会显著影响长时间运行 agentic coding 的效果。在更早的一次 实验 中,我们使用了一个 initializer agent,把产品规格拆成任务列表,再由 coding agent 一次实现一个功能,并在 session 之间通过工件完成上下文交接。更广泛的开发者社区也逐渐得出了类似结论,例如 Ralph Wiggum 这类方法,就会借助 hooks 或脚本让 agent 进入持续迭代循环。 但仍有一些问题持续存在。面对更复杂的任务时,agent 仍然会随着时间推移逐渐偏航。在拆解这一问题时,我们观察到执行这类任务的 agent 通常会出现两种失败模式。 第一种是,随着上下文窗口逐渐填满,模型在长任务中的连贯性会下降(见我们关于 context engineering 的文章)。某些模型还会表现出“context anxiety(上下文焦虑)”:当它们感觉自己快接近上下文极限时,会过早开始收尾。context reset 的做法是彻底清空上下文窗口、启动一个全新的 agent,再通过结构化 handoff 把前一个 agent 的状态与下一步计划带过去。这一做法可以同时解决上述两个问题。 这和 compaction 不同。compaction 是把更早的对话内容原地压缩总结,让同一个 agent 在更短的历史上继续工作。compaction 保留了连续性,但它不会给 agent 一个真正的“干净起点”,因此上下文焦虑仍可能持续存在。reset 的优势是能提供一个全新的起点,代价则是 handoff 工件必须保存足够完整的状态,才能让下一个 agent 无缝接手工作。我们在早期测试中发现,Claude Sonnet 4.5 的上下文焦虑严重到仅靠 compaction 还不足以支撑优秀的长任务表现,因此 context reset 变成了 harness 设计里的关键一环。它解决了核心问题,但也带来了编排复杂度、token 开销以及额外延迟。 第二个此前尚未系统处理的问题,是自我评估。当 agent 被要求评估自己产出的内容时,它往往会非常自信地夸奖自己的工作,即便在人类看来质量明显很一般。这个问题在设计这类主观任务上尤其严重,因为这里不存在一个像软件测试那样的二元正确性检查。某个布局看起来是精致还是平庸,本身就是判断题,而 agent 在给自己打分时会稳定地偏向乐观。 但即便是在有明确可验证结果的任务里,agent 也仍然会表现出妨碍任务完成的糟糕判断力。把“执行工作的 agent”和“判断工作的 agent…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行