多 Agent 架构

Anthropic 这篇文章讨论的是两个相互关联的问题:如何让 Claude 产出更高质量的前端设计,以及如何让它在没有人工干预的情况下构建完整应用。

前一代 frontend design skill 和 long-running coding agent harness 已经通过 prompt engineering 和 Harness 设计,把 Claude 的表现推到高于基线的位置,但两者最终都遇到天花板。为突破这个天花板,作者借鉴了 GAN 的思路:把负责生成的 Agent 和负责评估的 Agent 分开。

最后形成的是一个三 Agent 架构:planner、generator、evaluator。它能在数小时自主编码会话中产出更完整的全栈应用。

三 Agent 架构 分离规划、生成与评估 用户提示 (1-4 句话) 规划 Agent (Planner) 扩展提示 → 完整产品规格 高层设计、范围雄心、AI 功能机会 产品规格 构建-评估循环(每轮次) Sprint 合约 — 协商"完成"标准 生成 Agent (Generator) 逐功能实现 Git 版本控制,自评 评估 Agent (QA) Playwright MCP — 用户视角测试 评分、批评、通过/失败 构建 反馈 迭代直到约定标准通过 设计质量 ★ 原创性 ★ 工艺 功能性 完整应用

为什么朴素实现不够

早期长程 Agent 方案使用 initializer agent 把产品规格拆成任务列表,再由 coding agent 一次实现一个功能,并通过结构化产物在会话之间交接上下文。这解决了多会话连续性问题,但复杂任务仍然会让 Agent 随时间逐渐偏离轨道。

Anthropic 观察到两个持续存在的问题。

第一,模型在长任务中会随着上下文窗口填满而失去连贯性。有些模型还会出现 context anxiety:当它感觉自己接近上下文限制时,会过早开始收尾。Context reset 可以缓解这个问题:完全清空上下文窗口,启动一个新的 Agent,并通过结构化交接产物传递上一轮状态和下一步任务。

这和 compaction 不同。Compaction 会把早期对话压缩后让同一个 Agent 继续工作,它保留连续性,但没有给 Agent 一个干净的新窗口,因此 context anxiety 仍可能存在。Reset 给了模型 clean slate,但代价是交接产物必须足够完整,否则下一位 Agent 接不上。

第二,是自我评估问题。要求 Agent 评估自己刚刚产出的工作时,它往往会自信地赞美平庸输出。这个问题在设计这类主观任务中尤其明显,因为没有类似软件测试那样的二元检查。一个布局是精致还是模板化,本质上是判断题,而 Agent 给自己打分时会稳定偏乐观。

即使在有可验证结果的任务中,Agent 也会表现出影响任务完成的判断力问题。把“做事的 Agent”和“评判的 Agent”分开,是解决这个问题的强杠杆。分离本身不会立刻消除宽松评估,因为 evaluator 仍然是 LLM,也会倾向于宽容;但把一个独立 evaluator 调得更怀疑,远比让 generator 对自己保持批判容易。

前端设计:把主观质量变成可评分标准

作者先从前端设计开始实验,因为自我评估问题在这里最明显。没有干预时,Claude 通常会走向安全、可预测、技术上能用但视觉上平庸的布局。

这个实验基于两个洞察:

  1. 审美不能完全还原成分数,个人偏好也永远会不同;但可以用评分标准编码设计原则和偏好。
  2. 把前端生成和前端评分分开,可以形成反馈循环,推动 generator 产出更强的结果。

作者为 generator 和 evaluator 都提供了四个评分标准:

标准关注点
设计质量设计是否像一个协调的整体,而不是零散部件的集合?颜色、字体、布局、图片和细节是否形成明确的氛围和身份?
原创性是否能看到定制化决策,而不是模板布局、库默认样式和常见 AI 生成痕迹?
工艺技术执行是否扎实:字体层级、间距一致性、色彩和谐、对比度等。
功能性独立于审美的可用性:用户是否能理解界面、找到主要操作并完成任务?

其中,设计质量和原创性的权重更高。Claude 默认在工艺和功能性上已经不错,但在设计质量和原创性上容易产出平淡结果。评分标准明确惩罚高度模板化的 “AI slop” 模式,例如紫色渐变加白色卡片,并推动模型承担更多审美风险。

Evaluator 还需要校准。作者用 few-shot 示例和详细分数拆解,让 evaluator 的判断对齐自己的偏好,并减少迭代过程中的分数漂移。

这个循环基于 Claude Agent SDK:generator 根据用户 prompt 创建 HTML/CSS/JS 前端;evaluator 配备 Playwright MCP,可以直接和页面交互,在评分前自主浏览、截图、研究实现。然后 evaluator 的反馈会回流给 generator,进入下一轮迭代。

每次生成通常运行 5 到 15 轮。由于 evaluator 不是只看静态截图,而是实际操作页面,每轮都需要真实时间,完整运行可能持续数小时。Generator 在每次评估后还要做一个策略判断:如果分数趋势好,就沿当前方向打磨;如果方向不行,就切换到完全不同的审美路线。

实验中的几个观察很重要:

  • Evaluator 的评分会随迭代改善,然后进入平台期。
  • 评分标准中的词会以意想不到的方式塑造输出,例如类似 “museum quality” 的措辞会把设计推向某种视觉趋同。
  • 改善不是线性的,有时中间版本比最后版本更好。
  • 随着 evaluator 反馈推进,generator 会尝试更复杂、更有野心的实现。
  • 即使第一轮,也明显好过没有评分标准的基线,说明标准本身就能把模型从通用默认值中拉出来。

一个典型例子是荷兰艺术博物馆网站。第九轮时,模型已经生成了一个干净、深色主题、视觉上符合预期的 landing page。第十轮,它完全推翻原方案,把网站重构成一个空间体验:CSS 透视渲染的 3D 房间、棋盘地面、自由挂在墙上的艺术品,以及通过门洞在画廊房间之间导航。这种跃迁很难从单轮生成中得到。

扩展到全栈编码

有了前端实验结果后,作者把这个 GAN-inspired 模式应用到全栈开发。Generator-evaluator 循环自然映射到软件开发生命周期:代码审查和 QA 在结构上承担 evaluator 的角色。

架构

早期 long-running harness 已经用 initializer agent、逐功能 coding agent 和 context reset 解决了多会话编码连贯性问题。Context reset 当时很关键,因为 Sonnet 4.5 会表现出明显的 context anxiety。

到了 Opus 4.5,这种行为基本被模型能力本身缓解,所以这个新 Harness 去掉了 context reset。Agents 在整个构建过程中作为一个连续会话运行,由 Claude Agent SDK 的自动 compaction 处理上下文增长。

新系统保留了三类 Agent persona:

Planner

之前的长程 Harness 需要用户一开始提供详细规格。Planner 的作用是把 1 到 4 句简单用户 prompt 扩展成完整产品规格。

Planner 被要求:

  • 对范围保持雄心。
  • 聚焦产品上下文和高层技术设计。
  • 避免过早指定细粒度技术实现。
  • 寻找把 AI 功能融入产品规格的机会。

避免细粒度实现细节是有意的:如果 planner 在早期指定了错误的技术细节,这些错误会级联到下游实现。更好的做法是约束要交付什么,让后续 Agent 在工作中决定具体路径。

Generator

Generator 继承了早期 Harness 的“一次一个功能”思路,用 sprint 管理范围。它每个 sprint 从 spec 中选择一个功能来实现。

当时的实现栈是 React、Vite、FastAPI 和 SQLite,后来换成 PostgreSQL。Generator 在每个 sprint 结束时要先自评,再交给 QA,同时使用 git 做版本控制。

Evaluator

早期 Harness 生成的应用常常看起来不错,但实际使用时仍有真实 bug。Evaluator 的任务就是抓这些问题。它通过 Playwright MCP 像真实用户一样点击运行中的应用,测试 UI 功能、API 端点和数据库状态。

然后 evaluator 会根据一组标准评分。这组标准借鉴了前端实验,但扩展到产品深度、功能性、视觉设计和代码质量。每个标准都有硬阈值:任一标准低于阈值,sprint 就失败,generator 会收到具体反馈并继续修复。

Sprint 合约

每个 sprint 开始前,generator 和 evaluator 会协商一个 sprint contract,也就是先就这轮“完成”的定义达成一致,再写代码。

这个环节存在的原因是:产品规格故意保持高层,必须有一步把用户故事转成可测试实现。Generator 提出要构建什么,以及如何验证成功;evaluator 审查这个提议,确认它是否在构建正确的东西。双方通过文件来通信:一个 Agent 写文件,另一个读取并在文件中或新文件中回应。

这样既能保持对 spec 的忠实,又不会在早期过度指定实现。

运行 Harness:复古游戏制作器

第一版 Harness 使用 Claude Opus 4.5。作者用同一个 prompt 分别跑完整 Harness 和单 Agent 系统做对比:

Create a 2D retro game maker with features including a level editor, sprite editor, entity behaviors, and a playable test mode.
Harness耗时成本
Solo20 分钟$9
Full harness6 小时$200

完整 Harness 成本超过 20 倍,但输出质量差异很明显。

Solo run 的应用表面上符合预期:可以构建关卡和组件,然后点击 play 测试。但实际点击后,问题开始出现:布局浪费空间,固定高度面板让大部分视口空着;工作流僵硬,界面没有引导用户先创建 sprites 和 entities;更关键的是,游戏本身坏了,实体显示在屏幕上却不响应输入。查看代码后发现,entity definitions 和 game runtime 之间的连接断了,而且界面没有暴露这个问题。

完整 Harness 从同一个一句话 prompt 开始,但 planner 把它扩展成 16 个功能、10 个 sprint。规格不只包含核心编辑器和 play mode,还包括 sprite animation system、behavior templates、音效和音乐、AI-assisted sprite generator、AI level designer,以及带可分享链接的 game export。

Planner 还读取 frontend design skill,并把视觉设计语言写进 spec。每个 sprint 中,generator 和 evaluator 会协商 contract,明确这一轮的实现细节和可测试行为。

完整 Harness 产出的应用明显更精致:canvas 使用完整视口,面板尺寸更合理,界面有一致视觉识别,并延续 spec 中的设计方向。它仍有一些笨拙之处,例如用户仍然需要自己摸索“先做 sprites 和 entities,再填充关卡”的流程。这更像基础模型产品直觉的缺口,而不是 Harness 本身已经解决的问题。

真正大的差异出现在 play mode:作者可以移动实体并实际玩游戏。物理效果还有粗糙边缘,例如角色跳上平台后与平台重叠;AI 生成关卡也会出现无法跳过大墙导致卡住的问题。但核心玩法是可用的,而 solo run 没做到这一点。

从日志看,evaluator 把实现紧紧拉回 spec。每个 sprint 它都会根据 sprint contract 的测试标准,通过 Playwright 操作运行中的应用,并对偏离预期的地方提交 bug。仅 Sprint 3 就有 27 条 criteria,覆盖 level editor;evaluator 的反馈细到无需额外调查即可行动。

几个 evaluator 发现的问题示例:

Contract criterionEvaluator finding
Rectangle fill tool 允许拖拽填充矩形区域FAIL:工具只在拖拽起点和终点放置 tile,没有填满区域;fillRectangle 函数存在,但没有在 mouseUp 正确触发。
用户可以选择并删除 entity spawn pointsFAIL:LevelEditor.tsx 中 Delete key handler 同时要求 selection 和 selectedEntityId,但点击 entity 只会设置 selectedEntityId。
用户可以通过 API 重排 animation framesFAIL:PUT /frames/reorder 路由定义在 /{frame_id} 之后,FastAPI 把 reorder 当作 frame id 解析,返回 422。

QA Agent 的调优难点

让 evaluator 达到这个水平并不容易。开箱即用时,Claude 是一个糟糕的 QA agent。

早期运行中,它会识别出真实问题,然后说服自己这些问题不严重,并批准工作。它也倾向于浅层测试,而不是探测边界情况,所以更细微的 bug 会漏掉。

调优循环是:

  1. 阅读 evaluator 日志。
  2. 找出它和人类判断不一致的例子。
  3. 更新 QA prompt 来修正这些偏差。

经过几轮后,evaluator 的评分才达到作者认为合理的程度。即便如此,Harness 输出仍显示出模型 QA 能力边界:小布局问题、不够直觉的交互、深层嵌套功能中 evaluator 没有充分测试到的 bug。

但和 solo run 相比,提升很明显:solo run 的核心功能根本不可用,而完整 Harness 至少让核心体验跑了起来。

迭代 Harness

第一版结果令人鼓舞,但 Harness 也庞大、缓慢、昂贵。下一步自然是:在不降低表现的前提下简化 Harness。

这里有一个通用原则:Harness 中的每个组件,都编码了对“模型自己做不到什么”的假设。这些假设值得被压力测试,因为它们可能是错的,也可能随着模型变强迅速过时。

作者第一次尝试简化时删得太猛,并加入了一些新想法,结果无法复现原 Harness 的表现,也难以判断哪些组件才是真正承重的。于是他改用更有方法的路径:一次移除一个组件,然后观察它对最终结果的影响。

随着 Opus 4.6 发布,简化 Harness 更有必要。Opus 4.6 在长期规划、持续 agentic task、更大代码库可靠性、代码审查、调试、长上下文检索上都有提升,而这些正是原 Harness 用来补足的能力。

移除 Sprint 结构

作者首先完全移除了 sprint construct。Sprint 结构原本用于把工作拆成模型能连贯处理的块;但 Opus 4.6 已经有理由能原生处理更长任务。

Planner 和 evaluator 被保留下来,因为两者仍有明显价值:

  • 没有 planner,generator 会低估范围,拿到原始 prompt 后直接开工,最终应用不如 planner 规格下丰富。
  • Evaluator 则从每个 sprint 后评分,变成在运行结束后做单次 QA。

模型能力提升后,evaluator 是否“承重”变成任务相关,而不是固定答案。对于 4.5,很多构建都处在 generator 独立能力边界附近,evaluator 能持续抓到有意义问题。到了 4.6,边界外移,很多过去需要 evaluator 的任务已经能被 generator 独立完成;在这些任务上,evaluator 可能只是额外开销。但对仍然处在 generator 能力边界上的部分,evaluator 继续带来真实提升。

实际含义是:是否使用 evaluator,不是永远 yes/no,而要看任务是否超出当前模型可靠 solo 完成的范围。

同时,作者还加入了 prompt,让 Harness 更好地把 AI 功能构建进每个应用,尤其是让 generator 构建一个能通过工具驱动应用自身功能的 proper agent。这也需要迭代,因为相关知识很新,模型训练数据覆盖较薄。

更新后 Harness:浏览器 DAW

为了测试更新后 Harness,作者给出一个 Digital Audio Workstation prompt:

Build a fully featured DAW in the browser using the Web Audio API.

这次运行仍然漫长且昂贵,总计约 4 小时,token 成本约 $124。多数时间花在 builder 上,它在没有 Opus 4.5 所需 sprint 分解的情况下,连贯运行了两个多小时。

Agent / 阶段耗时成本
Planner4.7 分钟$0.46
Build Round 12 小时 7 分钟$71.08
QA Round 18.8 分钟$3.24
Build Round 21 小时 2 分钟$36.89
QA Round 26.8 分钟$3.09
Build Round 310.9 分钟$5.88
QA Round 39.6 分钟$4.06
Total V2 Harness3 小时 50 分钟$124.70

和前一个 Harness 一样,planner 把一句话 prompt 扩展成完整 spec。日志显示,generator 在规划应用和 agent 设计、把 agent 接入应用、以及交给 QA 前测试方面表现不错。

但 QA agent 仍然抓到了真实缺口。第一轮反馈指出,应用设计 fidelity、AI agent 和后端都不错,但 feature completeness 是主要失败点:若干核心 DAW 功能只是展示,没有交互深度,例如 clip 不能在 timeline 上拖动或移动,没有 instrument UI panels,也没有视觉化 effect editors。

第二轮 QA 又抓到几类功能缺口:录音仍然只是 stub,clip 边缘拖拽 resize 和 clip split 没实现,effect visualization 只是数字滑块而不是 EQ curve 等图形界面。

最终应用还远不是专业音乐制作程序,Agent 的作曲能力也明显需要继续提升。更重要的是,Claude 实际上听不到声音,因此 QA feedback loop 在音乐品味方面不够有效。

但最终应用已经具备浏览器音乐制作程序的核心组件:可用的 arrangement view、mixer、transport。作者还可以完全通过 prompting 做出一段短歌:Agent 设置 tempo 和 key,铺 melody,生成 drum track,调整 mixer levels,并添加 reverb。

接下来

随着模型继续进步,我们大致可以预期它们能工作更久,也能处理更复杂的任务。有些情况下,模型周围的脚手架会随着时间变得不那么重要,开发者可以等下一个模型,让某些问题自然消失。

另一方面,模型越强,就越有空间设计更有野心的 Harness,完成基线模型做不到的复杂任务。

这项工作的经验是:

  • 始终用目标模型做实验。
  • 在真实问题上阅读执行轨迹。
  • 为目标结果调优性能。
  • 复杂任务中,拆解任务并为不同方面使用 specialized agents,可能仍有提升空间。
  • 新模型到来时,要重新审视 Harness,移除不再承重的组件,也加入过去不可能的新能力。

作者最后的判断是:随着模型变强,有趣的 Harness 组合空间不会缩小,而是会移动。AI 工程师的工作,是持续找到下一个有效的新组合。


来源

Harness Design for Long-Running Application Development — Prithvi Rajasekaran, Anthropic, 2026.03。

这页有帮助吗?