长时运行智能体的有效 Harness 设计
摘要: Anthropic提出了一种两段式智能体框架(Harness)来解决AI在长周期任务中的上下文窗口限制问题。该框架包含Initializer Agent(负责项目初始化,生成功能清单、代码仓库等结构化环境)和Coding Agent(专注增量开发,通过Git提交、进度日志和Puppeteer测试确保任务连贯性)。通过四大关键工件(功能列表JSON、Git仓库、进度日志、启动脚本)构建外部记
·
一、核心挑战:跨越上下文窗口
- 根本障碍:“智能体如何跨越多个、离散的上下文窗口,保持记忆和状态,从而持续推进任务?”
- 典型失败模式:
- “一次性做太多(Trying to do too much at once)”:智能体试图在单个会话内“一蹴而就”,结果耗尽上下文,留下一堆半成品。
- “过早宣布胜利(Declaring victory too early)”:智能体看到已取得部分进展,便错误地判断任务已经完成,停止了工作。
二、核心解决方案:两段式智能体 Harness
借鉴人类软件工程师的协作模式,将任务分解为两个由专门智能体执行的阶段。
- 1. Initializer Agent:环境的奠基者
- 职责:“仅在项目启动的第一个会话中运行”,接收高层指令,“将其分解、结构化,为后续所有工作创建一个清晰、规范的初始环境。”
- 产出:
- “功能列表 (Feature List)”:将模糊需求具体化为详尽清单,以 JSON 存储。
- “初始代码仓库 (Git Repository)”
- “进度日志 (Progress Log)”
- “启动脚本 (Init Script)”
- 2. Coding Agent:增量的推进者
- 职责:“在 Initializer Agent 完成使命后,Coding Agent 接管所有后续会话。”
- 工作循环:
- 状态同步:在每个会话开始时,通过读取工件理解项目状态。
- 单点突破:“从功能列表中选择一个最高优先级的未完成项,并只专注于这一个特性的开发。”
- 端到端验证:“使用浏览器自动化工具(如 Puppeteer)进行端到端测试。”
- 清洁收尾:“提交有意义的 Git Commit,并更新进度日志,确保工作区处于一个随时可以交接的‘干净’状态。”
三、环境管理:四大关键工件与策略
这些工件构成了一个“外部记忆”系统。
- 1. 全量功能列表:定义“完成”的标尺
- 目的:为了解决“过早宣布胜利”。
- 内容:“每一项都是一个端到端的用户故事或功能描述”。
- 格式:“使用 JSON 格式比 Markdown 更为稳健。”
- 使用约束:“只允许修改
passes字段的状态,绝不允许删除或修改任何功能描述”。
- 2. 增量推进与清洁收尾:Git 与进度日志
- Git 的作用:“原子提交”和“可回滚性”,是“智能体的安全网”。
- 进度日志 (claude-progress.txt):“一个简单的文本文件,用于记录每个会话的关键决策和进展摘要”,比
git log更具可读性。
- 3. 端到端测试:Puppeteer 作为“眼睛”和“手”
- 作用:“这相当于给了智能体一双‘眼睛’和一双‘手’,让它能像真实用户一样与 Web 应用交互”,能发现“布局问题、交互错误、状态未同步等”隐性 Bug。
- 4. 起步流程:标准化的“上手三步”
- 流程:1.
pwd建立空间感;2. 通过git log和进度日志了解历史;3. 读取feature_list.json选择任务。 init.sh的作用:“一键启动开发服务器”,并“先运行一个基本的端到端测试,确保应用当前处于健康状态”。
- 流程:1.
四、失败模式与应对策略总结
| 失败模式 (Problem) | Initializer Agent 的应对行为 | Coding Agent 的应对行为 |
|---|---|---|
| 过早宣布胜利:智能体在项目未完全完成时就错误地认为任务已结束。 | 建立功能列表 (feature list) 文件:…生成一个结构化的 JSON 文件,…并全部标记为未完成。 | 阅读并逐一攻克功能列表:在会话开始时读取功能列表,选择一个未完成的特性开始工作,直到所有特性都标记为通过。 |
| 状态混乱与交接困难:智能体留下有 Bug 或未记录进展的代码,导致后续会话难以继续。 | 创建 Git 仓库和进度日志:初始化一个 Git 仓库和 claude-progress.txt 文件,为版本控制和状态记录打下基础。 | 先同步状态,再清洁收尾:启动时:阅读进度日志和 Git 提交历史,并运行基本测试以发现未记录的 Bug。结束时:提交一个清晰的 Git Commit,并更新进度日志。 |
| 虚假完成:智能体在未经充分测试的情况下,就将某个功能标记为完成。 | 建立功能列表文件:(同第一点,功能列表也是测试的基准。) | 强制进行自我验证:在将任何功能标记为 “passing” 之前,必须使用端到端测试工具(如 Puppeteer)进行严格验证。 |
| 低效的环境设置:智能体在每个会话中都花费大量时间去弄清楚如何运行和测试应用。 | 编写 init.sh 启动脚本:创建一个可以一键启动开发服务器和运行基础测试的脚本。 | 阅读并执行 init.sh:在会话开始时,直接读取并执行该脚本来快速搭建工作环境。 |
更多推荐



所有评论(0)