讲 Harness 最透彻的一个演讲。
这应该是我看到过的、关于 Harness Engineering 最透彻的一次分享,推荐大家看一下。
视频链接:
podwise.ai整场演讲就 20 分钟,IBM 的工程师 Tejas Kumar 用一个例子,挺巧妙的把 Harness 的价值讲清楚了,通俗易懂。
整场分享的观点其实就一句话,模型只是大脑,真正让 AI 进入真实世界工作的是 Harness。
这句话经常听到,但通过这个例子,能直接看出来为什么是这样。
把我的笔记分享出来,希望对大家有启发。
1
让一个没有怎么做 Harness Engineering 的 Agent 去给 Hacker News 上的帖子点 upvote。流程看起来非常简单。
打开链接,如果没登录就跳到登录页,登录后再返回帖子页面,点一下 upvote,任务结束。
但裸模型的 Agent 碰到登录页就不知道怎么办了。它搞不定登录,却稀里糊涂告诉用户任务已经搞定,upvote 成功。
实际上根本没点,Agent 撒谎了。去年大家但凡用过 Agent,一定碰到过类似的情况。
面对这个问题,把提示词写得再细,或者换一个更强的模型,都未必管用。问题在于这个 Agent 根本没有 Harness。
说到这里,顺带讲一下到底什么是 Harness。
其实可以这么理解,Harness 就是包裹在模型外面的一整套基础设施。一个完整的 Harness 一般包含下面这几部分。
1)工具注册表,决定模型能调用哪些工具。
2)上下文管理,控制哪些信息继续留在上下文里,哪些信息该压缩或丢掉。
3)护栏,给 Agent 运行过程设定边界,比如最多执行多少轮、最多调用多少次工具,或者遇到异常状态就立刻停止。
4)Agent Loop,让模型一轮一轮地观察、思考、调用工具、接收结果。
5)验证步骤,任务结束后核对结果到底有没有真的完成。
为什么需要这层东西?因为模型不像程序那样,给定输入就一定沿着固定路径执行。
它可能正常完成任务,也可能中途跑偏、忘记目标、误判状态,甚至任务都失败了还声称自己搞定了。
Harness 的作用,就是在模型外面加一层确定性的控制系统。哪些工具能调用,任务什么时候该停,上下文怎么压缩,结果到底算不算完成,都交给确定性的代码来管理。
像 Claude Code、Cursor、Codex 这些产品,都是 Harness 包裹起来的 Agent。它们之所以好用,不全是因为背后接的模型聪明,更因为外面这层基础设施做得比较到位。
2
回到刚才的案例。开始在 Agent 外面一层一层加 Harness。
先加两层最基础的运行控制。
一层是迭代上限。一个没有任何约束的 Agent,很容易陷入死循环。有时候碰到卡点,它会反复点同一个按钮,然后在一个死循环里绕不出来。
Harness 可以给 Agent 设一个明确的运行边界。比如执行轮数超过阈值,就直接中断,标记失败。这样至少能保证,一个失败任务会在可控成本内结束。
另一层是上下文管理。浏览器返回的 HTML 本来就长,几轮工具调用日志一叠加,上下文窗口很快就塞满了。
一旦塞满,Agent 就开始被自己的历史淹没,越往后越糊涂,连最初的目标都记不清。
Harness 可以定期压缩历史上下文,只保留对下一步决策还有价值的信息。这样就可以避免 Agent 因为上下文过长,被历史信息拖垮的问题。
加完这两层后,Agent 至少开始变得可控。但还有一个更关键的问题没有解决。它说任务完成了,这件事系统怎么才能确认是真的。
3
所以下一层的 Harness,就是要解决 Agent 结果验证的问题。
之前的流程中,Agent 跑完一圈任务回来说搞定了,系统也就默认任务真的已经完成。
但其实模型说自己完成,很可能是幻觉,跟它实际做了什么是两码事。
所以这层 Harness 要做的事,就是把判断权从模型的单一输出,转移到对真实执行记录的核查上。
在 Hacker News 的例子里其实很简单,加一层单独的验证逻辑就行。任务结束后,Harness 再跑一轮额外的验证,从执行过程中的工具调用历史里看一遍。
它访问了哪些 URL,点了哪些按钮,DOM 状态有没有真的发生变化。如果 DOM 变了,比如 upvote 按钮被点亮,任务就算成功。
如果没变,那任务肯定执行失败了,不管模型最后怎么总结。
这一步看起来简单,但其实是所有 Agent 必加的环节。模型自己说什么不重要,重要的是有一套任务是否完成的标准。
我知道,很多人面对 Agent 不靠谱的第一反应是模型不够强。但很多时候问题真不在模型。
再聪明的模型,只要没有一个机制去核对它到底有没有完成,这事就无解。
4
有了验证之后,再回头解决 Hacker News 登录的问题。前面那些 Harness 策略,不管是迭代上限、上下文压缩还是验证步骤,都是在给 Agent 本身加约束、加监督。
但登录需要 Agent 像人一样,真的可以输入用户名和密码,完成登录这一步。
具体做法是,Harness 在每一轮循环里,单独检查一下浏览器当前的 URL。如果发现当前页面进入了登录态,就不再把控制权交给模型,而是触发预先写好的登录逻辑。
这段逻辑完全不依赖模型推理,而是确定性的程序执行,从环境变量里拿账号密码,定位到输入框,填进去,点提交。
登录成功之后,把浏览器导回原来的页面,再把控制权交还给 Agent,让它继续做原来的任务。
整个过程,Agent 完全不知道发生了什么。它只是发现自己刚才在 A 页面,现在还在 A 页面,但身份状态变了,可以继续往下走了。
这个设计背后有一个很重要的认知,不是所有事情都该让模型来做。
模型适合处理开放问题。需要理解、判断、泛化的场景,它很强。但登录不是。
更准确的说法是,Harness 在这里做了一件事,识别出哪些场景是模型不擅长的,然后用代码把这些场景接管掉,做完之后再把世界恢复到模型能继续发挥的状态。
加上这一层之后,整个 Agent 终于能跑通了。同样的模型,同样的 prompt,没有任何改动,但它现在可以稳定地打开 Hacker News,跳到登录页,登录,回到原帖,点 upvote,确认完成。
从一个连登录都过不去的 Agent,变成一个能跑通完整流程的 Agent。
5
回过头看这四层 Harness,会发现一个挺有意思的事情。
第一层迭代上限,处理的是会不会失控。第二层上下文压缩,处理的是能不能跑完。
第三层验证步骤,处理的是有没有真的做成。第四层登录接管,处理的是哪些事情根本不该让模型自己做。
这四层加起来,做的其实是同一件事。用确定性的工程系统,去约束和支撑一个非确定性的模型。
这就是为什么模型是大脑,Harness 是身体这个说法成立。
模型本身只负责推理,但真实世界是一个由状态、权限、页面、网络和异常流程组成的系统。只有推理能力,是无法稳定进入真实工作流的。
Harness 做的,是把这些复杂性重新收敛成模型能够稳定处理的运行环境。
这个例子最值得琢磨的一点是,从头到尾,Agent 的模型没换,Prompt 没改,改的全是它外面的执行框架。
但 Agent 的表现,已经从一个连登录都过不去的系统,变成了一个能稳定跑通完整流程的 Agent。
这件事翻译过来就是,很多时候,真正决定 Agent 稳定性的,其实是 Harness。
模型进步当然重要。但很多 Agent 的问题,并不是模型能力问题。
更重要的是,Harness 不是玄学。它是一整套可以被拆解、被测试、被优化的软件工程问题。