最近关于 Agent 工程的话题里,一个反复出现的词就是 Harness。
如果只看单篇文章,很容易把它理解成“提示词包装”或者“某个 Agent 框架”。但把下面三个来源放在一起看,会发现 Harness 其实描述的是一整层系统设计:
- Viv(LangChain,2026 年 3 月 11 日)在 X Premium 长文里给出了一个非常干净的定义:Agent = Model + Harness,并从模型本身的能力边界反推 Harness 各组件的必要性
- Prithvi Rajasekaran(Anthropic Labs,2026 年 3 月 24 日)实验了如何用受 GAN 启发的生成器-评估器架构,让 Claude 在前端设计和全栈开发两个任务上跨越 Agent 的自我评估瓶颈
- Ryan Lopopolo(OpenAI,2026 年 2 月 11 日)展示了一个激进但已用于真实产品的工程形态:五个月内,三名工程师用 Codex 写出了 100 万行代码,每名工程师平均每天处理 3.5 个 PR,全程一行人工代码都没有
这篇文章不做逐段翻译,而是把三篇内容整理成一份适合开发者复用的学习笔记。
目录
一句话理解 Harness
最值得记住的定义是:模型只提供智能,Harness 负责把这种智能变成可执行的工作能力。
也就是说,裸模型通常只能接收输入、输出文本;真正让它像 Agent 一样工作的,是模型外侧那一层工程系统。
从工程视角看,Harness 包含但不限于:
- 系统提示词和运行规则
- 工具定义与工具调用机制
- 文件系统、终端、浏览器、沙箱等执行环境
- 子 Agent 编排、任务分解、handoff 和上下文管理
- 测试、评审、日志、截图、指标等验证回路
- 可持久化的文档、计划、记忆和版本控制
所以 Harness 不是一个单点功能,而是一组围绕模型构建的执行基础设施。
为什么模型本身不够
Viv 那篇线程最有价值的地方,是它从“模型做不到什么”反推 Harness 为什么必要。
如果没有 Harness,模型通常缺少以下能力:
- 持久状态:无法跨轮次、跨会话稳定保存工作进度
- 真实执行:不能自己运行代码、安装依赖、操作系统
- 外部感知:无法直接访问浏览器、日志、数据库和实时信息
- 验证闭环:不能可靠地检查自己做的事情是否真的成功
- 长时任务稳定性:上下文拉长后容易跑偏、提前收尾或者遗忘关键约束
因此,所谓 Harness Engineering,本质上就是把“我希望 Agent 具备的行为”翻译成系统级能力。
一个很实用的推导方式是:
想要什么行为,就为这个行为设计对应的环境、工具、约束和反馈回路。
例如:
- 想让 Agent 持续工作几个小时,就要设计任务分解、上下文重置或压缩、handoff 工件和进度记录
- 想让 Agent 修复前端问题,就不能只给它代码,还要给它浏览器、截图、日志和可验证标准
- 想让 Agent 在大仓库里不迷路,就必须把知识结构化写进仓库,而不是散落在聊天记录和人的脑子里 Viv 专门提到了 Context Rot(上下文腐化) 这个概念:随着 Context Window 逐渐填满,模型的推理和任务完成质量会系统性下降。Anthropic 的实验则观察到了一个更具体的变体——他们称之为 Context Anxiety(上下文焦虑):模型在接近认为自己的上下文极限时,会过早收尾并结束任务。应对方式不只是 Compaction(压缩对话历史让上下文变短继续跑),而是 Context Reset + 结构化 Handoff:彻底清空上下文,用一个结构化 Handoff 文件让下一个 Agent 接手,从而获得更干净的起点。
Harness 的核心组件
综合三篇文章,几乎所有高质量 Harness 都离不开下面这几类组件。
1. 文件系统是基础中的基础
Viv 把文件系统看成最底层的 Harness Primitive,这个判断我很认同。
因为文件系统同时解决了几件事:
- 给 Agent 提供真实工作空间
- 让中间产物可以落盘,不必全部塞进上下文
- 让多个 Agent 和人类通过共享文件协作
- 让状态能跨会话延续
Anthropic 的多 Agent 设计里,Planner、Generator、Evaluator 之间的沟通也是通过文件完成的。OpenAI 更进一步,直接把代码仓库当成记录系统,把文档、计划、架构说明、设计原则、技术债和生成产物全部收进仓库里。
结论很明确:如果 Agent 没有稳定的文件系统和结构化仓库,它的长期表现上限会很低。
2. 通用执行能力比预制工具更重要
Viv 提到一个关键观点:与其为每个动作手工设计专用工具,不如给 Agent 一个足够通用的执行能力,比如 bash 加代码执行。
原因很简单:
- 任务空间太大,预先枚举所有工具并不现实
- 代码执行允许模型即时创建“临时工具”
- 当 Agent 可以写代码并运行代码时,它的自主问题解决能力会显著提升
这也是为什么现代编码 Agent 几乎都把终端视为默认能力,而不是附属功能。
3. 沙箱、浏览器和可观测性共同构成“可验证环境”
Anthropic 文章里最值得借鉴的部分,是它没有把评估器局限在读代码,而是给 Evaluator 提供了 Playwright MCP,让它像真实用户一样操作应用。
这背后反映的是一个重要原则:评估必须尽量接近真实运行环境。
所以好的 Harness 往往不只提供代码访问,还会提供:
- 浏览器自动化
- 页面截图和 DOM 观察
- 测试运行器
- 日志和追踪
- 指标与性能数据
- 隔离沙箱
OpenAI 的做法更系统。他们让 Codex 可以直接读取 UI、日志、指标和追踪,并在独立 worktree 里启动应用、观察运行信号、修复问题、重启并重新验证。这意味着 Agent 不只是“写完代码就结束”,而是进入了接近工程闭环的工作模式。
4. 记忆和搜索不是附加项,而是长期运行前提
模型的知识受限于训练和当前上下文,所以只靠参数记忆无法支撑持续迭代。
Harness 通常要补上的两类能力是:
- 持久记忆:把重要规则、经验、计划、约束放进可复用文件。
AGENTS.md就是这类标准——Harness 在每次会话启动时自动注入这份记忆文件,实现跨会话的持续学习 - 动态检索:允许 Agent 查询仓库、文档和最新外部资料。Context7 等 MCP 工具可以帮助 Agent 访问训练截止日期之后的新库版本
Viv 提到了记忆文件标准和 Web Search;OpenAI 则把这件事工程化成”仓库即真相来源”。也就是说,凡是 Agent 需要持续理解的知识,最好都编码成它能访问、能搜索、能版本化的工件。
5. Ralph Loop:让 Agent 在长时任务里不提前退场
Ralph Loop 是一种被多篇文章反复提及的长时任务 Harness 模式。它的核心逻辑是:通过 Hook 拦截模型的退出尝试,在干净的上下文窗口里重新注入原始目标,强迫 Agent 继续工作直到完成。文件系统是让这个模式成立的基础——每次迭代以新鲜上下文启动,但读取上一次迭代留下的状态文件接续工作。这个模式直接对抗了模型在 Context Window 接近限制时的提前收尾倾向。
6. 上下文管理决定长时任务是否会崩
Anthropic 明确指出,长任务里最常见的两个问题是:
- 上下文变长后,模型逐渐失去连贯性
- 模型产生“context anxiety”,在接近上下文极限时过早收尾
他们对 Sonnet 4.5 的经验是,单纯 compaction 不够,context reset 加结构化 handoff 更有效。后来随着 Opus 4.5/4.6 能力增强,一些原本必须的脚手架又可以删除。
这里能提炼出一个很实用的原则:
Harness 设计不是越复杂越好,而是要围绕当前模型的真实短板做最小必要补强。
Anthropic:用生成器和评估器把主观质量变得可优化
Anthropic 这篇文章最有启发的地方,是它把一个很难处理的问题拆开了:模型不擅长给自己的结果做严厉评价。
灵感来源:把 GAN 的思路用在 Agent 设计上
Prithvi Rajasekaran 在文章里明确说,这套 Generator + Evaluator 架构的灵感来源于生成对抗网络(GAN):一个生成器负责产出,一个判别器负责批评,两者对抗迭代。把这个思路迁移到 Agent 系统里,就得到了”生成-评估”的反馈闭环。
前端设计场景的核心思路
作者先在前端设计问题上实验。他发现模型如果自我评估,通常会对自己过于宽容,于是改成:
- 一个 Generator 负责生成页面
- 一个 Evaluator 负责打分和批评
- Evaluator 获得 Playwright MCP,可以像真实用户一样打开页面、截图、导航、检查交互,基于实际运行结果再评分
- 评分结果流回 Generator 作为下一轮迭代的输入
更重要的是,它不是问一个模糊问题,比如”这个页面美吗”,而是把评价拆成四个可操作的评分标准:
- 设计质量(Design Quality):设计是否形成有凝聚力的整体?颜色、排版、布局是否共同建立了一种独特气质?
- 原创性(Originality):是否存在定制决策,还是模板布局、库默认和 AI 生成模式?紫色渐变配白卡片——AI 生成的典型标志——会在这项上直接扣分
- 工艺(Craft):排版层级、间距一致性、色彩和谐度、对比度——这是能力检查不是创意检查
- 可用性(Functionality):用户能否理解界面、找到主要操作、完成任务
这样做的意义在于:先把主观任务变成可评分任务,再用多轮反馈把结果推高。
每次生成运行 5 到 15 轮迭代,由于 Evaluator 需要真实导航页面,单次完整运行最长可达四小时。Generator 在每次评估后还被要求做一个策略决定:如果分数趋势良好则沿当前方向优化,如果方向整体不奏效则直接做风格转向。
一个让人印象深刻的案例:作者提示模型创建一个荷兰艺术博物馆网站。前九次迭代产出的是干净的深色主题落地页,视觉不错但在预期范围内。到了第十次迭代,模型彻底推翻之前方案,把网站重新构想成了一个空间体验:用 CSS 透视渲染的 3D 房间,带有棋盘格地板,画作悬挂在墙上,通过门道而非滚动来切换画廊空间。这种创意跃变是单次生成里从来没有出现过的。
扩展到全栈应用开发
在全栈场景里,Anthropic 把结构升级成三 Agent:
- Planner:把 1-4 句话的简短提示扩展成完整产品规格,被指示放大范围、聚焦产品背景和高层技术设计,而不是预先规定实现细节(避免规格错误向下级联)
- Generator:按 Sprint 逐个实现功能(React + Vite + FastAPI + SQLite 栈),每个 Sprint 结束后先自评再交给 Evaluator
- Evaluator:获得 Playwright MCP,像真实用户一样点击运行中的应用、测试 UI 功能、API 端点和数据库状态,并按标准给出具体失败点
Generator 和 Evaluator 在每个 Sprint 开始前先协商出 Sprint Contract:Generator 提出要构建的内容和成功标准,Evaluator 评审并确认,两者对齐后才开始写代码。Agent 之间的通信通过文件进行——一个 Agent 写文件,另一个读后在同一文件里回应或写新文件。
一个具体的对比实验:同一个提示”创建一个 2D 复古游戏制作工具,包含关卡编辑器、精灵编辑器、实体行为和可玩测试模式”:
| Harness | 时长 | 花费 | 结果 |
|---|---|---|---|
| 单 Agent | 20 分钟 | $9 | 游戏核心玩法坏的,实体出现在屏幕上但无法响应输入 |
| 完整 Harness | 6 小时 | $200 | 游戏可实际玩,Planner 把一句话扩展成 16 功能 10 Sprint 规格,含 AI 辅助精灵生成和带分享链接的游戏导出 |
Evaluator 在日志里留下了非常精确的 Bug 报告,例如:
fillRectangle函数存在但mouseUp时未正确触发,导致矩形填充工具只在拖拽起终点放置瓦片- FastAPI 中
PUT /frames/reorder路由定义在/{frame_id}之后,FastAPI 把reorder解析成整数 frame_id,返回 422 错误
关于模型升级如何驱动 Harness 简化:最初使用 Sonnet 4.5 时,Context Anxiety 问题突出,必须使用 Context Reset + Handoff 机制。升级到 Opus 4.5 后 Context Anxiety 基本消失,可以去掉 Context Reset 让 Agent 单次连续运行整个构建过程。升级到 Opus 4.6 后,Sprint 分解结构也可以去掉了——新模型能原生处理更长时间的连续工作,DAW(数字音频工作站)构建任务中 Generator 连续运行超过两小时,整个 Harness 耗时 3 小时 50 分钟,花费 $124.70。
我认为这篇文章给出的最大收获不是”三 Agent”这个表面结构,而是两条底层原则:
- 生成与评估分离
- 评估必须基于真实运行结果,而不是只看代码表面
这对构建任何高要求 Agent 都成立,不只是前端和全栈开发。
OpenAI:把整个代码仓库变成 Agent 可读、可执行、可维护的系统
OpenAI 文章提供的是另一种视角:当 Agent 生成代码的比例极高时,工程团队的重心会从“写代码”转移到“设计环境”。
他们重点优化的不是代码补全,而是环境可读性
文章里一个特别强的观点是:对 Agent 来说,看不到的知识就等于不存在。
这意味着:
- Slack 讨论如果不写回仓库,Agent 就无法利用
- 架构约束如果只是口头共识,Agent 就很难稳定执行
- 品味和规范如果只是 reviewer 的感觉,而不是文档或规则,Agent 很难持续复现
所以 OpenAI 的做法是把尽可能多的上下文显式写入仓库:
- AGENTS.md 作为简短导航,而不是百科全书
- docs 目录作为结构化知识库
- 执行计划作为一等工件版本化管理
- 架构规则、命名习惯、可靠性要求写成可检查规则
- 用 linter、结构测试和 CI 强制执行这些不变量
这比单纯“给模型更长上下文”更关键,因为它让知识变成了可维护的工程对象。
他们把可观测性直接接给了 Agent
OpenAI 还做了一件很多团队还没认真投入的事情:让 Agent 直接读日志、指标和追踪。
这样一来,提示不再只是:
- “把 bug 修掉”
而可以变成:
- “确保服务启动时间低于 800ms”
- “关键用户链路的 span 不能超过 2 秒”
- “复现问题,修复后重新验证 UI 流程和运行指标”
这说明高水平 Harness 设计已经不只是“让模型会写”,而是“让模型能观察、判断、迭代和回归验证”。
他们对 AGENTS.md 的态度尤其值得抄作业
OpenAI 明确反对把 AGENTS.md 写成大而全手册,亲身实践后得出四条教训:
- 上下文是稀缺资源:庞大的指令文件挤掉任务、代码和相关文档,模型要么错过关键约束,要么开始针对错误约束优化
- 过多则变成无效:当所有内容都”重要”时,什么都不重要了——模型会进行局部模式匹配而不是有意识地导航
- 立刻腐烂:庞杂手册变成陈旧规则的坟场,无法判断哪些仍然有效
- 难以机械验证:单个 blob 无法进行覆盖率、新鲜度、所有权、交叉链接的检查
他们改成把 AGENTS.md 当目录入口(约 100 行),把细节分散到结构化文档中。仓库文档结构实例(OpenAI 在文章里直接展示了目录树):
AGENTS.md
ARCHITECTURE.md
docs/
├── design-docs/
│ ├── index.md
│ └── core-beliefs.md
├── exec-plans/
│ ├── active/
│ ├── completed/
│ └── tech-debt-tracker.md
├── generated/
│ └── db-schema.md
├── product-specs/
│ └── new-user-onboarding.md
├── references/
│ └── design-system-reference-llms.txt
├── DESIGN.md
├── FRONTEND.md
├── PLANS.md
└── RELIABILITY.md
执行计划是一等工件,带有进度和决策日志,提交进仓库版本控制。活跃计划、已完成计划和技术债务都集中存放,让 Agent 无需依赖外部上下文也能运行。
doc-gardening 模式:他们还运行着一个定期执行的”文档维护” Agent,专门扫描那些不再反映真实代码行为的过时文档,并发起修复 PR。把文档维护本身也交给 Agent 来做——这是我认为很多团队最值得立刻借鉴的一条实践。
模型与 Harness 的协同进化
Viv 在文章末尾提出了一个值得长期关注的洞见:模型训练和 Harness 设计正在形成一个耦合的反馈回路。
今天的 Agent 产品(如 Claude Code、Codex)都是在把模型和 Harness 同时纳入训练循环的情况下做后训练优化的,这帮助模型在文件系统操作、Bash 执行、规划、并行化 Subagent 等能力上持续改进。
但这种协同进化有一个有趣的副作用:改变工具逻辑会导致模型性能变差。 Codex 的 apply_patch 工具就是一个例子——理论上通用的模型在切换补丁方法时应该没有阻力,但在 Harness 循环中训练的模型会对特定工具实现过拟合。
这并不意味着最好的 Harness 就是模型被训练时用的那个。Terminal Bench 2.0 排行榜上,Claude Code 里的 Opus 4.6 得分远低于其他 Harness 里的 Opus 4.6——这证明针对你的任务优化 Harness,仍然有巨大提升空间,不应只依赖模型的默认配置。
随着模型能力提升,Harness 里今天存在的一些功能会逐渐被模型原生吸收——规划、自我验证、长时连贯性。但就像 Prompt Engineering 到今天仍然有价值一样,Harness Engineering 很可能也会持续有用:真正配置良好的环境、正确的工具、持久状态和验证回路,无论基础模型能力多强,都会让 Agent 变得更高效。
三篇内容放在一起后,我总结出的统一框架
如果把这三篇内容合在一起,可以得到一个非常完整的 Harness 心智模型。
1. Harness 的本质是“为模型设计工作系统”
它不是一个提示词模板,也不是某个单独 SDK,而是一层把模型智能变成稳定产出的系统设计。
2. 高质量 Agent 不只是会生成,还必须会验证
Anthropic 用 Evaluator 加 Playwright 证明了这点。OpenAI 则把验证扩展到日志、指标、追踪和代码仓库规则。
3. 文件系统和仓库结构决定长期能力上限
没有稳定工件、计划文件、知识地图和版本控制,长时任务最终都会退化为混乱对话。
4. 好的 Harness 会随着模型升级而删减或重构
Anthropic 在新模型上去掉了一些旧脚手架,说明 Harness 不是越多越好,而是要持续验证哪些部分仍然真正承重。
5. 人类的角色正在从“直接实现者”转向“环境设计者”
OpenAI 文章反复强调,人类的主要价值变成:
- 定义目标
- 设计结构
- 编码规则
- 建立反馈回路
- 判断哪些约束应该被机械化执行
这很可能就是未来一段时间 AI 工程的真实重心。
一个适合个人开发者的最小 Harness 模板
如果你不是在做超大规模系统,而是想自己搭一个实用 Agent,我建议从下面这个最小版本开始。
第一步:先把工作空间搭对
- 给 Agent 一个独立项目目录
- 默认可读写文件系统
- 提供 git
- 提供终端和语言运行时
第二步:把关键知识写进仓库
- 一个简短的 AGENTS.md,只写导航和核心规则
- 一个 docs 目录,放架构、约束、常见命令、领域说明
- 一个 plans 目录,存活跃任务和 handoff 记录
第三步:加上验证回路
- 后端项目至少接入测试命令和日志
- Web 项目尽量接入浏览器自动化,比如 Playwright
- 每次完成阶段任务后执行一次独立验证,而不是只靠生成器自评
第四步:只在必要时增加多 Agent
推荐的演进顺序是:
- 单 Agent + 工具 + 测试
- 单 Agent + 计划文件 + 记忆文件
- Generator + Evaluator
- 再考虑 Planner、子 Agent、复杂编排
不要一上来就堆多 Agent。模型能力不足和任务复杂度不足时,复杂 Harness 只会增加成本和调试难度。
我现在对 Harness Engineering 的理解
看完这三篇内容后,我对 Harness 的理解从“模型外的一层壳”变成了“围绕模型构造生产系统”。
真正决定 Agent 能力上限的,往往不是模型参数本身,而是下面这些问题有没有被工程化处理:
- 它是否能访问正确的上下文
- 它是否能在真实环境里执行动作
- 它是否能看到结果并独立验证
- 它是否有结构化的记忆与 handoff
- 它是否被放在一个边界清晰、规则可执行的系统里
如果这些都没有,再强的模型也容易退化成“会说但不稳定”;如果这些设计得足够好,中等能力的模型也可能表现出远超裸用时的效果。
可直接复用的检查清单
准备设计自己的 Harness 时,我会先检查这 10 件事:
- 模型能否读写文件并长期保存中间结果?
- 模型能否运行代码、安装依赖并看到执行结果?
- 是否有独立于生成器的验证机制?
- Web 场景里是否能用浏览器自动化做真实交互测试?
- 计划、handoff 和约束是否落到了文件,而不是只停留在聊天里?
- AGENTS.md 是否足够短,并且只是导航入口?
- 仓库里是否存在结构化文档来承接长期知识?
- 是否能访问日志、指标、追踪等运行信号?
- 当前 Harness 的复杂度,是否真的对应当前模型的短板?
- 有没有机制持续删除已经不再承重的脚手架?
参考来源
- Viv(LangChain),2026-03-11,The Anatomy of an Agent Harness: https://x.com/Vtrivedy10/status/2031408954517971368
- Prithvi Rajasekaran(Anthropic Labs),2026-03-24,Harness design for long-running application development: https://www.anthropic.com/engineering/harness-design-long-running-apps
- Ryan Lopopolo(OpenAI),2026-02-11,Harness engineering: https://openai.com/index/harness-engineering/
如果后面继续写这个系列,我会进一步拆三块:
- 如何给编码 Agent 设计可执行的仓库文档体系
- 为什么 Playwright 正在成为前端 Agent 的基础验证工具
- 什么时候该加多 Agent,什么时候应该先删脚手架