什么才是好的 Harness:判断归模型,物理归代码

同一个模型,换个 harness 性能能差 6 倍。结合 SWE-agent(ACI 开山之作)、How Much Heavy Lifting、Inside the Scaffold、Code as Agent Harness、Fork-Explore-Commit 等论文,深度拆解好 harness 的三件本职工作:把世界翻译成模型好用的接口、把确定性工作从模型手里拿走、让错误变便宜——以及为什么"提示词里的规则是恳求,harness 里的规则是物理法则"。

三个数字:同一个模型,harness 不同,端到端性能可以差 6 倍Jung & Son, 2026);LangChain 的 DeepAgents 在 Terminal-Bench 2.0 上从 52.8% 提到 66.5%,只改了 harness,一行模型没动Agent Harness Engineering Survey);SWE-agent 用同一个 GPT-4,比裸 Shell 基线相对提升 64%Yang et al., NeurIPS 2024)。

模型是所有人都在谈论的那一半,harness 是决定成败却很少被认真讨论的另一半。先给定义:harness 是包裹着模型的那个有状态的程序——它决定模型每一步看见什么,也决定模型的输出能对世界做什么。 工具定义、控制循环、权限、沙箱、上下文管理、验证门,全是它。

如果你只带走一句话,就带走这个:

好的 harness 只做一种分工:判断归模型,物理归代码。提示词里的规则是恳求——“请不要删除文件”;harness 里的规则是物理法则——“你无法删除文件”。该是物理的做成物理,该是判断的留给判断,harness 的所有设计问题都是这一句的展开。

这是本系列第三篇。第一篇讲设计时的减法(删掉 80% 提示词规则),第二篇讲运行时的减法(上下文管理)。这篇回答一个自然的追问:从提示词里删掉的规则去哪了? 答案是——好的那部分没有消失,它们从自然语言搬进了代码,从恳求变成了物理。

下面按三件本职工作展开,每一件配上论文证据。

本职一:把世界翻译成模型好用的接口(ACI)

这条线的开山之作是 SWE-agent(NeurIPS 2024)。它提出了一个当时反直觉、如今已成共识的主张:LM agent 是一类新的用户,有自己的需求和能力边界——就像人类程序员需要 IDE,agent 需要专门为它设计的 Agent-Computer Interface(ACI)。

这篇论文的消融实验,是我见过的关于”接口设计有多重要”最干净的证据(SWE-bench Lite,同一个 GPT-4 Turbo):

接口改动解决率
完整 ACI18.0%
文件查看器从 100 行窗口改成 30 行14.3%
文件查看器直接展示整个文件12.7%
去掉专用编辑工具10.3%
没有搜索工具15.7%
有搜索工具,但是”翻页式”的(像 Vim 那样一条条看)12.0%

最后两行值得盯着看十秒:一个设计糟糕的接口,比没有这个接口更糟。 翻页式搜索给了 agent 逐条查看的能力,agent 就真的会去逐条查看每一个匹配——把上下文和轮数烧在穷举上。换成一次性返回摘要列表(且上限 50 条、超了就提示你把查询写得更具体),性能立刻回来。接口的形状,直接塑造 agent 的行为。

从这些实验里可以蒸馏出 ACI 的几条设计法则:

  1. 动作要简单紧凑。人类可以消化 Vim 的一百个快捷键,agent 更适合少量、文档简短、一次完成一件事的命令;
  2. 反馈要有信息量但克制。整个文件是噪声,100 行窗口刚好;这与上一篇讲的 context rot 是同一个问题——接口是上下文的第一道供给侧;
  3. 护栏要在动作发生时拦截,而不是事后补救。SWE-agent 的编辑命令内置 linter:语法不过,编辑直接被拒绝、要求重试。论文明确说这防止了”一次坏编辑引发的连环错误”——他们试过让模型用 sed 改文件,频繁把代码改到语法崩溃。

第一篇里 Anthropic 说”别给例子,设计接口”(Todo 工具用状态枚举本身表达用法),你现在能看出那句话的学术源头就在这里:接口即提示词,而且是比自然语言更硬的提示词。

本职二:把确定性的活从模型手里拿走

2026 年 4 月有一篇标题就很挑衅的论文:《How Much Heavy Lifting Can an Agent Harness Do?》。它做了一件少有人做的事:把 harness 拆成层,逐层消融,量化每一层贡献了多少性能——在一个带噪声的协作海战棋规划任务上,把 harness 外化成四层(后验信念追踪、声明式规划、符号反思、LLM 复核门)。

结果扎眼:

  • 贡献最大的一层是声明式规划:胜率 +24.1 个百分点——零次 LLM 调用
  • LLM 复核门只在 4.3% 的回合里被触发,且效果有界、非单调;
  • 作者的结论措辞很克制但杀伤力十足:一旦 harness 各层可以被独立度量,“LLM 的贡献就可以被量化为残差,而不是被默认为核心”。

这不是说模型没用,而是说:在这个任务里,大部分”智能”其实是确定性计算,从一开始就不该由模型来做。 贝叶斯更新、约束求解、状态追踪——这些活代码做得又快又准又免费,让模型做纯属用世界上最贵的随机数发生器算加法。

同一个分工原则,在上一篇讲的 Self-GC 里是显式的架构:planner(模型)负责提议,harness(代码)负责执行——沙盘推演、合法性校验、安全提交边界,全是确定性代码。模型的提案要过 harness 的关卡才能生效。而 Code as Agent Harness(2026.05 综述)把这个方向推到极致:让代码成为 agent 推理、行动、环境建模和验证的操作基底——行动表达成可执行的程序,正确性靠运行验证而不是靠模型自评。

由此得到一个反直觉的健康指标:好 harness 的标志之一,是单位任务的 LLM 调用在变少。 每一次调用都应该在做真正需要判断的事。如果你的 agent 在用模型解析 JSON、做格式转换、数数——那不是 agent 能力强,是 harness 在偷懒。

本职三:让错误变便宜

Agent 循环里错误是复利的:一次坏编辑污染后续所有轮次的上下文,一个错误的删除毁掉整个任务。好的 harness 不追求模型不犯错(做不到),而是让每个错误的爆炸半径尽可能小。这有三道递进的防线:

第一道:动作时拦截。 SWE-agent 的 lint 护栏是原型——非法编辑根本不落盘。注意它和提示词护栏的本质区别:写在提示词里的”请确保语法正确”是恳求,写在编辑命令里的 linter 是物理。

第二道:隔离探索。 2026 年 2 月的 Fork, Explore, Commit 干脆把这件事做进了操作系统层:提出 Branch Context 原语——每条探索路径拿到写时复制(copy-on-write)的独立文件系统视图和进程组,fork → explore → commit/abort 的结构化生命周期,先提交者胜、兄弟分支自动作废,支持嵌套。他们的 BranchFS 实现分支创建耗时低于 350 微秒。上一篇里 AgentSwing 并行试三种上下文策略、跑三轮真实环境再选赢家——那种玩法之所以敢做,前提就是 harness 能提供廉价的隔离与回滚。能便宜地撤销,才敢大胆地探索。

第三道:提交前验证。 Self-GC 的每个压缩计划要先在本地沙盘物化、校验、估算收益,才允许在安全边界提交;Anthropic 2026 年 3 月的工程博客把长时程开发的 harness 归纳为 planner/generator/evaluator 三角色加验证门——工件不过门,流程不前进。

三道防线合起来是一个原则:模型的每个输出都是提案,harness 决定提案何时、以何种代价成为现实。

全景校验:13 个开源脚手架的解剖报告

以上三件事是不是我挑论文挑出来的幸存者偏差?2026 年 4 月的 Inside the Scaffold 提供了一次难得的全景校验:作者把 13 个开源编码 agent 的脚手架钉死在具体 commit 上做源码级解剖,建了一个 12 维、三层(控制架构 / 工具与环境接口 / 资源管理)的分类学。两个发现值得记住:

发现一:收敛的地方,是共识已经形成的地方。 工具能力类别、编辑格式、执行隔离——这些维度上 13 家高度趋同。注意这三样恰好对应本文的三件本职工作:接口、分工、错误控制。趋同说明这些问题的答案已经被工程实践投票选出来了。

发现二:发散的地方,是仍然开放的问题。 上下文压缩策略有 7 种互不相同的做法(这正是上一篇五篇论文还在混战的领域)、状态管理、多模型路由——各家各玩各的。另外,13 家里有 11 家组合多种循环原语(ReAct、生成-测试-修复、计划-执行、多次重试、树搜索),而不是押注单一控制结构——“用哪个 loop”是个伪问题,好 harness 是原语的组合。

该泼的冷水:harness 会不会也被苦涩的教训吃掉?

第一篇的核心论证是”提示词规则是给弱模型打的补丁,模型变强就该删”。一个诚实的读者必须追问:harness 不也是补丁吗?模型再强一代,这些脚手架会不会也该删了?

会,但只删一半。关键是区分 harness 里两种成分:

  • 替模型思考的部分——会持续变薄。强制的计划模板、手写的任务分解流程、替代模型判断的启发式路由,这些和提示词规则同构,模型的判断力长上来就该让位。DeepAgents 那 13.7 个百分点的提升里,相当一部分恰恰来自放松过度约束的控制流。
  • 替世界把关的部分——不会变薄,反而会变厚。沙箱、权限、隔离、验证门、审计日志,这些东西的存在理由不是”模型笨”,而是世界不可逆。模型再聪明,一次误删生产数据库也不可接受;而且 agent 能力越强、被授权做的事越多,物理护栏的价值越高。看 Claude Code 自己的演化就很说明问题:删掉 80% 提示词的同时,工具搜索、hooks、沙箱、权限系统这些代码层的机制在加厚

所以苦涩的教训的正确应用是一个筛子,不是一把火:问 harness 里的每个组件”你存在是因为模型不行,还是因为世界危险?“前者有保质期,后者是基础设施。

收束:四个问题,体检你的 harness

  1. 接口测试:模型犯的错里,有多少是接口诱导的?(翻页式搜索诱导穷举、整文件展示诱导迷失——先改接口,再怪模型)
  2. 分工测试:随便抽 10 次 LLM 调用,有几次在做真正需要判断的事?解析、转换、计数、校验——凡是能写成代码的,写成代码。
  3. 爆炸半径测试:模型最坏的一个动作,损失是多少?能不能在动作发生时拦截(linter)、在隔离里发生(branch)、在提交前验证(gate)?
  4. 恳求测试:把你所有的行为约束列出来,问每一条——它现在是提示词里的恳求,还是代码里的物理?所有你无法承受被违反的规则,都不配只活在提示词里。

模型每一代都在变,harness 的这三件本职——翻译世界、分配分工、控制爆炸半径——不会变。发动机的马力翻十倍,你需要的不是拆掉底盘,而是配得上它的底盘。


论文与资料清单

系列:① 删掉 80% 系统提示词之后(设计时的减法)→ ② 遗忘是一种能力(运行时的减法)→ ③ 本篇(承载减法的确定性机器)。