Skip to main content

Documentation Index

Fetch the complete documentation index at: https://adonis-til.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

原文:Harness Design for Long-Running Application Development by Prithvi Rajasekaran (Anthropic Labs)

一句话总结

让 AI 跑 20 分钟和跑 6 小时是完全不同的工程问题。这篇文章讲的就是:当任务足够复杂、运行足够长时,如何设计多 Agent 协作架构(Harness)来保证产出质量。

一、两个核心失败模式

在开始讲解决方案之前,先搞清楚”到底哪里会出问题”。长时间运行的 Agent 有两个几乎必然会遇到的坑:

1.1 上下文退化:Agent 越跑越糊涂

你可能遇到过这种情况:Agent 前期表现不错,但随着对话越来越长,它开始丢细节、重复之前的错误、甚至忘了自己说过的话。 更隐蔽的问题是 “上下文焦虑”(Context Anxiety):当模型感知到上下文窗口快满了,它会开始草草收尾——不是因为做完了,而是因为”慌了”。 原则:Context Reset > Compaction
策略做法效果
Compaction(压缩)把之前的对话摘要后继续保持连续性,但无法消除焦虑行为
Context Reset(重启)清空上下文,启动全新 Agent干净的起点,焦虑行为消失
直觉上你会觉得摘要更好——保留了之前的信息嘛。但实际上,压缩虽然保留了连续性,却无法给模型提供”从头来过”的清爽感。重启一个新 Agent,把必要的上下文显式传递过去,效果更好。
实践要点: 当你发现 Agent 开始赶工、跳过步骤、或者质量下降时,不要试图”提醒”它——直接开一个新会话,把当前进度和剩余任务作为新的输入传进去。

1.2 自我评估偏差:Agent 永远觉得自己做得不错

这是更难察觉的问题。让 Agent 写完代码后评价自己的产出,它会 “自信地夸赞自己的作品——即使在人类看来质量明显平庸” 这在有明确对错的任务中问题不大(测试通不通过一目了然),但在 主观性任务 中会严重失真:
  • 前端设计好不好看?
  • 交互体验流不流畅?
  • 代码架构优不优雅?
这些都没有二进制的”对/错”判断,Agent 很容易自我感觉良好。 原则:评估与生成必须分离
让写代码的 Agent 评价自己写的代码,就像让学生批改自己的考卷。调优评估者的批判性,比让生成者学会自我批评要容易得多。

二、Generator-Evaluator 循环:让 AI 设计不再”AI 味”

为了解决自我评估偏差,作者引入了一个受 GAN(生成对抗网络)启发的模式:Generator 和 Evaluator 分离,循环对抗迭代

工作流程

Generator 生成设计 → Evaluator 用 Playwright 打开页面实际体验
  → 按四个维度打分 → 反馈给 Generator → Generator 改进
  → 重复 5-15 轮

四个评估维度

维度评估什么关键问题
Design Quality(设计质量)颜色、字体、布局、图像是否有统一的审美风格”看起来像不像一个整体?“
Originality(原创性)是否有自主的设计决策,而非模板默认值”有没有 AI 味 / 套模板感?“
Craft(工艺)层次、间距、色彩和谐、对比度等技术执行”细节处理到不到位?“
Functionality(功能性)脱离审美后的可用性”好不好用?“

关键发现

Prompt 措辞会独立于评估反馈,塑造输出的审美方向。 作者发现,在 prompt 中使用 “museum quality” 这样的措辞,会引导模型向特定美学方向收敛。在一个案例中,一个荷兰博物馆网站经过 10 轮迭代后,从普通页面演化成了 3D CSS 透视空间配合自由导航——这种创意跳跃在单次生成中几乎不可能出现。
实践要点: 当你希望 AI 生成的设计更有”性格”时,不要只描述功能需求,加入一些审美方向的暗示词(如 “editorial”、“museum quality”、“brutalist”),它们会像锚点一样引导整体风格。

三、三 Agent 架构:Planner → Generator → Evaluator

把上面的思路扩展到完整的全栈应用开发,作者设计了三个角色分工明确的 Agent:
┌──────────┐    ┌──────────┐    ┌──────────┐
│ Planner  │───▶│Generator │───▶│Evaluator │
│ 规划师    │    │ 生成器    │    │ 评估者    │
└──────────┘    └──────────┘    └──────────┘
 1-4 句需求       系统实现        像用户一样测试
 → 完整产品规格    → 自检后交付    → 打分 + 反馈

各角色详解

Planner(规划师)
  • 输入:1-4 句简短需求描述
  • 输出:完整的产品规格
  • 关键:鼓励野心但避免过度指定实现细节——告诉它”做什么”和”为什么”,而不是”怎么做”
  • 会主动寻找集成 AI 功能的机会
Generator(生成器)
  • 按规格系统实现功能
  • 使用典型全栈技术栈(React + Vite + FastAPI + SQLite/PostgreSQL)
  • 完成后先做一轮自检再交付
Evaluator(评估者)
  • 用 Playwright 像真实用户一样操作应用——点击界面、调用 API、检查数据库状态
  • 按具体标准打分,设有硬性阈值
  • 最重要的一点:先谈判 Sprint 合约,定义”完成”再开始编码

Sprint 合约:先定义”完成”再动手

这是整个架构中最值得借鉴的设计。在 Generator 开始写代码之前,Evaluator 会先和它协商一个 Sprint 合约
Sprint 合约示例:
✅ 用户能注册和登录
✅ 能创建新项目并保存到数据库
✅ 项目列表页支持分页
❌ 暂不考虑权限管理
❌ 暂不需要文件上传
为什么这很重要? 因为没有明确的完成标准,Agent 会陷入两个极端:要么草草了事宣布完成(自我评估偏差),要么无限迭代改来改去。Sprint 合约让”完成”变成了可验证的清单。

效果对比

以”制作一个复古游戏编辑器”为例:
方式耗时成本结果
单 Agent 直接跑20 分钟$9游戏机制有 bug,信息架构混乱
三 Agent Harness6 小时$200功能完整的编辑器、可玩关卡、集成 AI 生成精灵和关卡
差距不只是”好一点”——是从”勉强能看”到”真正可用”的质变。

四、随模型进步简化架构

这是文章中最有洞察力的部分。作者提出了一个核心原则:
每一个 Harness 组件都编码了一个关于模型局限性的假设。当模型改进后,这些假设需要被重新检验。

实例:Opus 4.6 带来的简化

在开发过程中,Claude 升级到了 Opus 4.6。作者发现可以逐步移除之前必要的组件:
移除的组件原因
Sprint 拆分Opus 4.6 的规划和持续执行能力提升,不再需要把任务拆成小 Sprint
无条件 QA评估者的价值取决于任务难度与模型能力的关系

条件式 QA:什么时候评估是价值,什么时候是开销

任务难度 vs 模型能力:

任务难度 ▲
         │  ╔═══════════════════╗
         │  ║  QA 有真实价值     ║  ← 任务超出模型舒适区
         │  ║  能抓到真实缺陷    ║
         │  ╠═══════════════════╣
         │  ║  QA 变成开销       ║  ← 任务在模型能力范围内
         │  ║  增加时间但无收益   ║
         │  ╚═══════════════════╝
         └──────────────────────▶ 模型能力
用一个实例说明:作者用简化后的系统生成一个 数字音频工作站(DAW),耗时 3 小时 50 分钟,花费 $124.70,经历了 3 轮构建 + QA 循环。Evaluator 在每轮中都精准地发现了 Generator 偷偷 stub 掉的核心功能——证明对于这种复杂度的任务,QA 仍然有真实价值。

怎么判断该加还是该减复杂度?

问自己这三个问题:

1. 这个组件要解决的模型缺陷,现在还存在吗?
   → 不存在 → 移除

2. 移除后质量会下降吗?
   → 做对照实验验证

3. 当前任务的难度超出模型的舒适区了吗?
   → 超出 → 保留/增加 QA
   → 没超出 → 简化

五、实战启示:这些原则怎么用在日常

你不需要搭建完整的三 Agent 系统才能从这篇文章中获益。以下是可以直接应用的原则:

原则 1:大任务用 Context Reset 而非长对话

❌ 在一个会话里干所有事,越到后面越糊涂
✅ 拆成多个会话,每个会话开头显式传入上下文和目标
在 Claude Code 中,这意味着:当你发现对话变长且质量下降时,开一个新会话,用清晰的 prompt 重述当前进度和剩余工作。

原则 2:生成和评估分开做

❌ "帮我写完这个组件,顺便检查一下有没有问题"
✅ 先让 Agent 写完 → 新开一轮/用子 Agent 专门审查
这和 Superpowers 中的 requesting-code-review skill 是同一个思路——让不同的 Agent 实例来评估,避免自我偏差。

原则 3:先定义”完成”再开始

❌ "帮我实现用户系统"
✅ "帮我实现用户系统,完成标准:
    1. 注册/登录流程能跑通
    2. 密码用 bcrypt 加密
    3. 有基本的输入校验
    暂不需要:OAuth、邮箱验证、权限角色"
明确的边界帮助 Agent 知道什么该做、什么不该做,避免无限发散或草草收尾。

原则 4:定期质疑你的工作流复杂度

每隔一段时间问自己:
  • 我的 CLAUDE.md 里有没有因为模型已经改进而不再需要的规则?
  • 我是不是在用旧模型的经验来限制新模型?
  • 哪些”必须”的步骤其实可以去掉了?
“有趣的 Harness 组合空间不会随着模型改进而缩小——它会移动。AI 工程师的有趣工作,就是不断发现下一个新的组合。“

原则 5:用审美暗示词提升设计质量

当需要 AI 生成前端设计时,在 prompt 中加入风格锚点:
暗示词引导方向
”museum quality”精致、沉浸式、艺术感
”editorial”排版驱动、杂志风
”brutalist”粗犷、反传统、强视觉冲击
”craft beer label”手工感、细节丰富
这些词不是指令,而是审美锚点——它们会在迭代过程中持续影响设计方向。

六、与相关文章的关系

这篇文章和 Agentic Engineering 的层级体系(见 Agentic Engineering 的 8 个层级)有直接对应:
层级概念本文对应内容
第 3 层上下文工程Context Reset vs Compaction
第 6 层Harness 工程三 Agent 架构、Sprint 合约、Playwright 测试
第 7 层后台 AgentGenerator-Evaluator 分离、条件式 QA
如果说 Superpowers 实战指南 讲的是”用 Skill 约束单个 Agent 的行为纪律”,那这篇讲的就是更上一层——用多 Agent 协作来突破单 Agent 的能力天花板 三者形成递进:
工程纪律(Superpowers)→ 多 Agent 协作(Harness)→ 自主团队(第 8 层)
    约束单个 Agent            突破单 Agent 天花板         Agent 间自主协调