🎠 Harness Engineering:AI Agent 开发的核心方法论

📅 2026-04-03 | 👁️ B站视频转录 · AI Agent 开发

引言:什么是 Harness Engineering

如果你最近在关注 AI Agent 的技术圈,一定到处都能看到Harness Engineering这个词。但大部分人对它的理解停留在"给 agent 加约束"这个层面,这远远不够。

今天我们将彻底讲清楚这个概念。看完之后,你会发现业界一直以来对 agent 做的技术优化,本质上都在做同样的事情——优化模型周围的系统,而非模型本身。

核心公式:Agent = Model + Harness
模型包含智能,Harness 让这个智能变得有用。

一、Harness 概念解析

Harness 这个词来自马术,指的是缰绳、马鞍等用来引导马匹朝正确方向走的装备。这个比喻是刻意的:

Harness 最早的定义非常简洁:每当你发现 agent 犯了一个错误,你就花时间设计一个解决方案,让 agent 永远不会再犯同样的错误。

LangChain 在此基础上给出了一个更精炼的公式:

Agent = Model + Harness

把模型想成引擎,agent 就是整辆车,而 harness 就好比方向盘和刹车——最好的引擎没有方向盘和刹车,去不了任何有用的地方

二、LangChain 实战案例:Terminal Bench 排名提升

先从一个反直觉的事实说起:LangChain 的 Coding Agent 在 Terminal Bench 排行榜上,从 30 名开外一路冲到了前五。

整个过程中,底层模型一行没换,始终是同一个模型。他们只动了三个东西:

  1. 系统提示
  2. 工具配置
  3. 中间件钩子

这个结果直接挑战了 AI 开发中一个根深蒂固的假设:更好的性能需要更大或更新的模型。

LangChain 用实际数据证明:模型不变的前提下,光靠优化模型周围的系统就能带来数量级的提升。他们用的方法论就叫 Harness Engineering。

三、Harness vs Context Engineering

你可能听过另一个类似的概念叫 Context Engineering(上下文工程)。它们是什么关系?

一句话讲清楚:

更准确地说:

四、Harness 六大核心组件详解

1. 上下文架构

前沿团队一致发现:给 agent 塞太多信息,反而有害。有研究表明,agent 的性能在上下文利用率超过大约 40% 之后开始下降。

所以关键不是给 agent 一本百科全书,而是给它一张地图,让它按需查找。

2. 架构约束

大多数人靠 prompt 来约束 agent 的行为:"请遵循以下规则……"但 prompt 里的规则本质上是建议,模型可以听,也可以不听。

前沿团队的做法是:用确定性的工具来机械式执行约束,比如自定义的 lint 和结构化测试规则。一旦编码,就在所有 agent 的对话中同时生效,不依赖模型的自觉性。

这里有一个反直觉的发现:v0 一开始给 agent 提供了大量工具,结果 agent 反而变得困惑,做冗余调用。后来他们移除了 80% 的工具,只留最必要的,agent 反而更快更可靠。约束解空间,反而提高了产出。

3. 自验证循环

Agent 有两个常见的失败模式:

  1. 陷入死循环,对同一个文件反复编辑十几次,但问题始终没解决
  2. 交付时跳过验证,第一个看起来合理的方案就直接输出

LangChain 的方案是用中间件钩子来解决:

他们还发现了一个非常有价值的策略叫"推理三明治"

全程最高推理强度反而成绩更差,因为会超时。把算力花在刀刃上效果最好。

4. 上下文隔离

当任务复杂到需要多个 agent 协作时,关键不是按角色分工(什么前端 agent、后端 agent),而是把子 agent 当做上下文防火墙

父 agent 只看到它给子 agent 的指令和子 agent 的最终结果,中间所有的工具调用和中间产物都被隔离掉了。这样,每个执行单元的上下文都保持干净,不会被无关信息污染。

5. 文档治理

Agent 的持续运行时间越长,系统的混乱度就越高:文档过时、架构漂移、知识库和代码不一致。

OpenAI 的方案是引入一个后台运行的文档梳理 agent,定期扫描过时的文档,并自动提交修复。为 agent 服务的文档,由 agent 来维护,形成自维护的闭环

6. 可拆卸性

这是最高维度的一层:更好的模型会让某些 harness 组件变成瓶颈。

2024 年需要复杂流水线的任务,2026 年可能一个 prompt 就搞定了。所以 harness 必须是模块化的、可拆卸的。

LangChain 的中间件架构是目前最好的参考,每个中间件独立添加特定能力,不需要的时候直接移除,不影响其他部分。

五、Anthropic 多 Agent 系统实战

Anthropic 用 Harness Engineering 的方法,让 Claude 自主写了四个小时代码,最终从一句话 prompt 生成了一个能用的浏览器端音乐制作软件——不是 demo,不是 toy project,是一个有编曲视图、混音器、音轨编辑,还内置 AI 助手的完整应用。

他们借鉴了深度学习里经典的GAN(生成对抗网络)思路:有一个生成器负责创造,一个判别器负责挑刺,二者对抗博弈,互相逼着对方进步。

Anthropic 把这个思路搬到了 agent 的架构上,设计了三 agent 系统

  1. 规划器(Planner)
  2. 生成器(Generator)
  3. 评估器(Evaluator)

每个 agent 解决一个明确的失败模式。

规划器:从一句话到产品规格

大多数人用 agent 写代码,上来就是一句 prompt 直接开干。Anthropic 发现这样做 agent 会严重低估项目的范围,做出来的东西功能很单薄。

所以他们加了一个规划器 agent,专门负责把你的一句话 prompt 扩展成一份完整的产品规格说明。

但这里有一个非常反直觉的设计决策:规划器只写高层产品设计,故意不写技术实现细节。

为什么?因为如果规划器在前期把某个技术细节写错,这个错误会一路传导到后面所有的实现环节,越错越离谱。不如只约束要做什么,让后面的 agent 自己决定怎么做。

设计原则:当你设计多 agent 系统时,上游 agent 的输出粒度要非常克制——给方向,但不给路径。

生成器:真正写代码的 agent

生成器就是真正写代码的 agent。Anthropic 一开始的设计是让它按迭代周期来工作,一次只做一个功能,每个迭代周期结束后自评一次,再交给评估器。

六、上下文焦虑与上下文重置

这里引出了 Anthropic 在这篇文章里揭示的第一个重大失败模式,叫"上下文焦虑"

什么意思呢?当 agent 持续工作,上下文窗口越填越满的时候,有些模型会开始慌——它们会觉得自己快到上下文上限了,然后开始草草收工,提前结束任务。

注意:不是真的到了上限,而是模型自己以为快到了

这个问题用常规的上下文压缩解决不了。所谓压缩,就是把前面的对话摘要一下,让 agent 在缩短的历史上继续工作。但问题是:agent 虽然拿到了更短的上下文,心理上的焦虑并没有消失,它仍然觉得自己快到极限了。

Anthropic 的解法叫上下文重置:不是压缩,而是彻底清空。启动一个全新的 agent,然后通过一个结构化的交接文档,把前一个 agent 的状态和下一步计划传递过去。给模型一块干净的白板。

代价是增加了编排复杂度和延迟,但效果显著。

重要发现:当 Anthropic 后来发布了更强的 Opus 模型之后,上下文焦虑这个问题基本消失了。这意味着上下文重置这个组件可以被拆掉——模型进步会让某些 harness 组件过时

七、评估器设计与校准

评估器是整套 harness 里最关键也最难做好的部分。

Anthropic 发现了第二个重大失败模式:agent 在评价自己的工作时倾向于自信地表扬自己,即使产出质量明显平庸,它也会说"做得不错"。

这个问题在主观任务上尤其严重(比如前端设计好不好看),agent 自评的时候几乎永远给自己高分。即使是在有客观标准的编程任务上,agent 也会犯同样的错误——它发现了一个 bug,然后说服自己这不是大问题,然后放行了。

Anthropic 的解法是:把生成和评估彻底分离,让另一个独立的 agent 来当裁判。

但注意:仅仅分离是不够的,因为评估器本身也是一个 LLM,它天然对 LLM 生成的内容宽容。关键的洞察是:调用一个独立的评估器让它变严格,比让生成器学会自我批判要容易得多。

如何让评估器真正严格起来?

Anthropic 做了两件事:

第一件事:把主观变成客观

把"好不好"变成可打分的具体维度,定义了四个评分标准:

然后做了很聪明的权重分配:工艺和功能性权重低(因为 Claude 默认就做得不错),设计质量和原创性权重高(因为这是模型的短板)。

而且他们在评分标准里明确写了:要惩罚那些一眼就能看出是 AI 生成的套路(比如紫色渐变配白色卡片)。

第二件事:用 few shot 示例加详细的评分分解来校准评估器

确保评估器的品位和开发者的品位对齐。评估器不是看截图打分的,它通过 Playwright 实际操作运行中的应用,点击导航、截图仔细研究,然后才输出评估。

每一轮反馈都回传给生成器,生成器要么继续优化当前方向,要么整体推翻重来。

惊艳的例子:让模型生成一个荷兰艺术博物馆的网站。前九轮迭代模型一直在做一个深色主题的落地页,视觉上很精致,但在预期范围内。到第十轮,模型突然推翻了整个方案,把网站重新想象成一个空间体验——一个用 CSS 透视渲染的 3D 房间,棋盘格地板,画作自由悬挂在墙上,通过门廊在画廊之间导航。

这种创造性的跳跃在单次生成中从来没见过,这就是对抗式反馈循环的力量。

评估器校准需要投入

Anthropic 也非常坦诚地说,让评估器达到这个水平花了大量功夫。Claude 开箱即用的时候是一个很差的 QA agent。他们的调优方法是:

  1. 读评估器的日志
  2. 找到它的判断和你的判断不一致的地方
  3. 改 prompt
  4. 再跑、再看日志、再改

反复多轮之后,评估器才开始输出合理的判断。

八、迭代合同机制

一个很精妙的机制叫迭代合同

在每个迭代周期开始之前,生成器和评估器会先协商一份合同。合同明确定义这个迭代周期做到什么程度算完成,包括具体要实现的功能和可测试的验收标准。双方要反复讨论,直到达成一致。

然后,生成器按合同来构建,评估器按合同来验收。

为什么要这样做?因为规划器的产品规格说明是故意写得很高层的,不会细到告诉你某个按钮应该怎么实现。迭代合同就是在高层规格和可测试的实践之间搭了一座桥。

通信方式也值得一提:Agent 之间不是通过对话来沟通的,而是通过文件——一个 agent 写一个文件,另一个 agent 读这个文件,然后回应。简洁、可追溯、不会污染各自的上下文。

评估器在验收时的严格程度到什么级别?文章给了几个实际例子:

这种力度的 QA 是真正在用层面上找问题,而不是走过场。

九、可拆卸性原则

最后说整篇文章里最有战略价值的一个认知。

当 Anthropic 发布了更强的 Opus 4.6 模型之后,他们做了一件很重要的事:回过头去重新审视整个 harness,看哪些组件还有存在的必要。

他们提出了一个原则:Harness 中的每一个组件,本质上都编码了一个假设——就是模型自己做不好这件事。这些假设需要反复被压力测试,因为它们可能一开始就是错的,也可能随着模型进步而过时。

具体来说,他们一开始想大刀阔斧地简化,直接砍掉一半组件,结果失败了——产出质量明显下降,而且搞不清楚是哪个组件的缺失导致的。

后来,他们换了一个更稳妥的方法:每次只移出一个组件,观察对最终结果的影响。最终他们成功地移除了整个迭代周期结构,因为 Opus 4.6 的持续工作能力大幅提升:

评估器本身没有被移除,因为在模型能力的边界上,评估器仍然能抓到生成器遗漏的功能和 bug。它的价值变成了动态的:任务越接近模型的能力极限,评估器的价值就越大。

简化之后的 harness 跑了一个浏览器端的数字音频工作站,四个小时 125 美元,最终产出一个有编曲视图、混音器、多音轨编辑的完整应用,而且内置的 AI 助手可以通过 prompt 来设置节拍、编写旋律、构建鼓轨、调整混音、添加混响。

从一句话 prompt 到一个能用的音乐制作软件,全程无人干预。

总结

从这篇文章里可以带走的最核心的几个认知:

  1. 永远不要让 agent 自己评价自己的工作——生成和评估必须分离,然后花时间把评估器调严格
  2. 主观质量是可以被打分的——定义具体的评分维度,用 few shot 校准,按短板加权,你就有了一个可以驱动迭代的反馈信号
  3. 上游规划要克制——只给方向,不给路径,避免错误级联
  4. Harness 的每一个组件都应该是可拆卸的——模型在进步,今天需要的脚手架,明天可能变成瓶颈。保持模块化,定期审视,每次只动一个变量
  5. Harness 的有趣组合空间不会随着模型进步而缩小——它只是在移动。模型能力的边界往外推了,harness 的设计空间也跟着往外推

一句话总结:Anthropic 用实战证明了 agent 的性能天花板不取决于模型能做什么,而取决于你在模型周围搭建了什么样的系统。模型进步一个台阶,harness 跟着进化一个台阶,两者叠加才是真正的前沿。

这就是 Harness Engineering。

核心主张:Agent 的可靠性瓶颈不在模型,在模型周围的系统。模型是引擎,agent 是整辆车——引擎再强,没有方向盘和刹车,到不了目的地。

← 返回博客首页