Anthropic Workshop:构建可运行数小时的 Agent

主讲:Ash Prabaker、Andrew Wilson(Anthropic Applied AI Team)
原视频:https://www.youtube.com/watch?v=mR-WAvEPRwE

概括

这场 workshop 讲的是:长时间运行的 Agent 不是只靠更强模型实现的,而是模型能力与外部 harness(脚手架、调度、记忆、评估、工具、权限、状态管理)共同演化的结果。

讲者以 Claude Code / Agent SDK 的演进为主线,解释了为什么 Agent 过去只能稳定工作十几分钟,而现在可以通过更好的模型、上下文管理、子 Agent、检查点、文件状态、评估器和自动化测试,持续完成数小时级复杂任务,例如从一句话 prompt 构建一个完整 Web App。


这场分享要解决的问题

长期运行 Agent 的难点主要集中在三个方面:

1. 上下文问题

Agent 的上下文窗口有限。随着任务变长,会出现:

  • 上下文遗忘:新会话像失忆一样,需要重新建立任务状态。
  • 上下文腐化:会话越长,模型对早期目标和约束的把握越容易漂移。
  • 上下文焦虑:接近上下文窗口末尾时,模型可能急于“收尾”,导致半成品被误判为完成。

2. 规划问题

模型默认并不总是擅长长期规划。它可能:

  • 试图一次性完成所有事情;
  • 做到一半就停下;
  • 只实现看起来显眼的部分;
  • 在没有明确验收标准的情况下提前宣布完成。

3. 自我评估问题

讲者反复强调:让同一个 Agent 自己构建、自己检查,通常是不可靠的。

模型容易对自己的输出过于宽容。一个按钮可能看起来存在,但后端没有接好;一个页面可能视觉上完整,但交互完全不可用。长期 Agent 需要更强的外部评估与验证机制。


核心观点:模型和 Harness 会共同演化

分享中把能力提升分为两条线:

方向 说明
模型更新 模型本身更会规划、使用工具、管理上下文、保持长期目标一致性。
Harness 演进 外部系统提供循环、记忆、检查点、权限、工具调用、子 Agent、评估器、状态文件等能力。

重点不是“模型变强后 harness 就没用了”,而是:

模型越强,harness 的设计越需要调整。旧模型需要复杂脚手架,新模型可能只需要更简化但更关键的结构。


Claude / Agent 能力演进脉络

阶段 关键变化 对长期 Agent 的意义
Sonnet 3.5 / Computer Use / MCP 模型开始能写代码、看截图、点击页面、调用工具 Agent 不再只生成文本,而能观察和操作环境
Claude Code 研究预览 用真实开发场景反过来改进模型 Code Agent 成为模型改进和 harness 实验场
Ralph Loop 把任务拆解成循环执行,失败可预测 提供了早期“长期任务分段执行”的思路
Sonnet 4.5 / Agent SDK / Checkpoints 更好的上下文感知、检查点、回滚能力 Agent 可以更安全地执行较长任务
Opus 4.5 / Sub-agents / Skills 更经济地运行多个子 Agent,技能按需加载 复杂任务可以拆分给不同角色
Opus 4.6 / Agent Teams / Server-side Compaction 更强规划、更长时间运行、服务端压缩 更接近连续多小时自主执行

关键模式一:不要依赖自我评价,使用对抗式 Evaluator

最重要的设计模式是:

text
Planner → Generator ↔ Evaluator

Planner:规划者

Planner 不负责写具体技术细节,而是把一句话需求拆成高层产品方向和 sprint。它的作用更像 PM:

  • 明确产品边界;
  • 生成高层功能结构;
  • 避免一开始把技术细节规划得过死。

Generator:构建者

Generator 负责真正实现功能,例如写前端、后端、交互、测试等。

Evaluator:评估者 / QA

Evaluator 不只是读 diff,而是实际运行应用,使用 Playwright、浏览器或 Computer Use:

  • 打开页面;
  • 点击按钮;
  • 检查控制台错误;
  • 测试交互;
  • 截图观察 UI;
  • 按照 rubric 打分;
  • 给 Generator 提供具体 critique。

核心原因是:

调教一个“严厉的评估者”比调教一个“既会构建又会严格批判自己”的构建者更可行。


关键模式二:Generator 和 Evaluator 先协商“完成”的定义

在真正写代码前,Generator 和 Evaluator 会先通过文件系统协商一个 contract:

text
Generator:我准备实现 X,测试方式是 Y。
Evaluator:范围太大,测试太弱,还漏了 Z 边界情况。
Generator:调整实现范围和测试标准。
Evaluator:同意,形成验收 contract。

然后再开始构建。

这一步非常重要,因为它把模糊的用户需求转化为具体、可验证的断言:

  • 哪些功能必须存在;
  • 哪些边界情况必须通过;
  • 哪些交互必须可用;
  • 哪些测试才算真正完成。

分享中的一个案例里,应用最终形成了 27 条 contract criteria。讲者认为,粒度越具体,Evaluator 的反馈越可执行,Generator 越容易修复。


关键模式三:用文件系统保存共享状态

长时间运行时,不应只依赖上下文窗口。讲者推荐使用文件系统作为状态载体,例如:

text
featurelist.json
progress.json
run-log.json
contract.md
evaluator-report.md
implementation-notes.md

文件系统的好处是:

  • 不容易因为上下文压缩而完全丢失;
  • 后续 Agent 可以 grep、读取、接续;
  • 人类也能快速理解执行历史;
  • JSON 文件相对不容易被模型随意覆盖。

推荐记录的内容包括:

  • 尝试了什么;
  • 发现了什么 bug;
  • 做了什么修复;
  • 修复是否有效;
  • 当前还剩哪些未完成项;
  • 文件结构和关键设计决策。

案例:Retro Game Maker

分享中展示了一个 prompt:

text
Build a retro game maker.

单 Agent / 普通循环的结果

普通单 Agent 输出看起来还不错:

  • 有首页;
  • 有 sprite editor;
  • 有画布、调色板、预览区。

但实际进入 play mode 后:

  • 方向键无效;
  • 空格键无效;
  • 游戏实体没有真实交互;
  • 看似完成,实际核心功能不可用。

Planner + Generator + Evaluator Harness 的结果

使用长期 harness 后,同样的 prompt 得到更完整的产品:

  • 自动命名为 Retro Forge;
  • 有新建项目对话框;
  • 有完整 sprite 编辑器;
  • 有 54 色调色板;
  • 有 AI level assistant;
  • play mode 中物理循环真实运行;
  • 方向键可移动角色;
  • 能与墙体碰撞;
  • debug HUD 显示实时状态。

差异不在于 prompt 更复杂,而在于 harness 迫使 Agent 规划、验证、修正、重试,甚至在方向错误时推倒重来


评价主观质量:Taste 也可以写成 Rubric

讲者特别讨论了前端和设计质量。

很多人认为“审美不可评估”,但他们的观点是:

如果你有足够明确的品味,就可以把它写成 rubric。

他们使用类似下面的维度:

维度 含义
Design 是否有清晰视觉层级、布局、空间感和一致性
Originality 是否避免模板化、AI slop、紫色渐变滥用
Craft 细节是否精致,是否有完成度
Functionality 功能是否真正可用

Evaluator 会根据这些维度打分、截图、反馈,再推动 Generator 迭代。


随模型变强,Harness 应该删减而不是堆叠

一个重要经验是:不要把 harness 当成永远固定的架构。

讲者提到,某些在 Opus 4.5 上必要的复杂结构,在 Opus 4.6 上可以简化。例如:

Harness 组件 旧模型中的作用 新模型中可能的变化
频繁重置上下文 避免上下文腐化 更强模型可能能用单长会话 + compaction
每个 sprint 强制评估 防止偏航 新模型可能只需阶段性评估
细粒度功能拆分 帮助模型保持方向 更强模型能连续完成更长 build
复杂状态同步 弥补模型记忆不足 可保留关键状态文件,删掉冗余流程

结论是:

Harness 的目标不是越复杂越好,而是刚好补齐当前模型的短板。


如何自己搭一个简化版长期 Agent Harness

可以从下面这个最小结构开始:

text
/project
  /state
    spec.md
    contract.md
    progress.json
    run-log.json
    evaluator-report.md
  /app
    ...

Step 1:Planner 生成高层规格

输入一句话需求,让 Planner 输出:

  • 产品目标;
  • 用户画像;
  • 核心 workflow;
  • 功能边界;
  • 不做什么。

Step 2:Generator 与 Evaluator 协商 contract

在写代码前,双方先确定:

  • 本轮实现范围;
  • 验收标准;
  • 必须测试的交互;
  • 失败条件;
  • 哪些问题不能忽略。

Step 3:Generator 实现

Generator 读取:

然后只做本轮 contract 对应的实现。

Step 4:Evaluator 独立验证

Evaluator 使用浏览器、Playwright、单元测试、日志、截图等方式验证。

不要只让它“读代码觉得是否正确”,要让它实际运行产品。

Step 5:写回状态并循环

如果失败:

  • 写入 evaluator-report.md
  • 标记失败原因;
  • Generator 修复;
  • 必要时推倒重来。

如果成功:

  • 更新 progress.json;
  • 记录关键决策;
  • 提交或保存检查点;
  • 进入下一轮。

最重要的五条 takeaway

  1. 自我评估是陷阱
    构建者很容易高估自己的输出。使用独立、严厉、对抗式 Evaluator。

  2. Compaction 不等于 coherence
    上下文压缩能让会话延续,但 lossy summary 仍可能漂移。需要结构化 handoff。

  3. 用干净上下文和结构化交接
    分角色、分文件、分状态,避免所有信息混在一个长上下文里。

  4. 主观质量也能被评估
    只要你能定义好品味,就能把 design taste 写成 rubric。

  5. 读 traces 是构建 Agent 的核心技能
    不要只看最终结果,要读 Agent 的完整执行轨迹,理解它为什么偏航、为什么误判、为什么停止。


对开发者的启发

这场分享真正有价值的地方不只是“Anthropic 的模型能跑更久”,而是给出了一个更通用的 Agent 工程方法论:

  • 把长期任务拆成角色;
  • 把模糊目标变成可验证 contract;
  • 把状态写到文件,而不是只塞进上下文;
  • 用真实环境验证,而不是只读代码;
  • 把评估器训练得更严格;
  • 随模型能力变化持续删减 harness。

如果要构建真正可用的长期 Agent,重点不是写一个无限循环,而是设计一个能 规划、执行、检查、记忆、纠错、重试、交接 的系统。