当我们讨论 Harness 的时候,我们在讨论什么?

2026 年初,"harness" 这个词在 AI 工程领域突然无处不在。Mitchell Hashimoto 给出了操作性定义1,OpenAI 用百万行代码做了验证4,LangChain 把它写进了公式。但如果把时间线拉长,你会发现这个词在软件工程里已经存在了五十年------从 test harness 到 evaluation harness,再到今天的 agent harness7。每一次,它都在说同一件事:在受控者外围构建控制系统。


Model + Harness = Agent

当前 harness 叙事的标准起点是这个公式:

ini 复制代码
Model + Harness = Agent

Mitchell Hashimoto 给出了最简洁的操作性定义1:"每当 agent 犯了一个错误,你就花时间设计一个解决方案,使得 agent 未来不会再犯同样的错误。" OpenAI 紧接着用一个三人团队、五个月、零手写代码的实验验证了这个思路4------产出一百万行生产代码和 1500 个合并的 PR。

如图 1 所示,harness 被理解为包裹 model 的一切外围系统:提示词模板、上下文注入、工具调用约束、沙箱环境、反馈循环。控制对象始终是 model。

这个定义没有错。但 model 只是受控者的一种。我认为,对 model 的 harness 的思想,可以扩大到适用于所有对不确定行为的控制。这不是推翻当前定义,而是把它放到一个更大的图景里。test harness 比 AI harness 早了五十年79,harness 的控制思想从来就不只属于 AI。


Harness 的本质:控制不确定行为

从词源到 test harness:这不是新概念

"harness" 原义是马具------缰绳、鞍具、挽具。它不是马,但它让骑手能控制马。这个隐喻从一开始就锁定了 harness 的核心洞察:不直接修改受控者本身,而是在它外围构建控制系统。

1970 年代,test harness 的概念在软件工程中成型9。Bell Labs 的研究员用 stubs 和 drivers 构建受控环境,为被测组件提供输入、捕获输出、验证结果7。组件不知道自己被测试,它只是运行。NIST 在 70 年代末标准化了这个术语9,它成为 JUnit、pytest 等所有现代测试框架的祖先。

但 test harness 有结构性的局限。它只有反馈(运行 → 验证),没有前馈(执行前引导方向)。它的 harness 是静态的------由人设计,由人维护,不会根据被测系统的表现自动迭代。它是快照式检查,不关心代码在两次测试之间是否在退化。它的受控者是确定性的:给相同输入,产相同输出。它的控制循环是一次性的:跑测试、出报告、结束。

test harness 把 harness 当作一个工具 ,而不是一个系统。工具用完就放下。现代 harness 需要的是持续运行的系统------harness 一刻不停地约束受控者,受控者一刻不停地产出。这个"持续约束"的特征,是区分 harness 和非 harness 的核心标准。

Fowler 的框架:前馈 + 反馈

2026 年 4 月,Birgitta Böckeler 在 Martin Fowler 的网站上发表了一篇文章2,将 harness 拆解为两个互补的控制机制:

Guides(前馈控制) 在 agent 行动之前预判它的行为并引导方向。目标是提高 agent 第一次就做对的概率。实现形式包括:AGENTS.md、系统提示词、上下文注入、架构约束文档。这是 test harness 完全缺失的维度------不是等代码写完再检查,而是在 agent 动手之前就把规则塞进去。

Sensors(反馈控制) 在 agent 行动之后观察结果并帮助它自我纠正。目标是在问题到达人眼之前尽可能多地自动修正。实现形式包括:linter、测试套件、CI 门禁、自定义校验脚本。test harness 的核心就是一种 feedback-only 的 sensor,但 Fowler 框架的关键洞察是:sensor 产出的信号应该为 LLM 优化------比如自定义 linter 消息里包含自我修正的指令,本质上是一种正向的 prompt injection3

两者的配合至关重要。只用 Guides,agent 编码了规则但永远不知道规则有没有生效。只用 Sensors,agent 反复犯同样的错误,无法从源头预防。这就像带一个实习生:你先跟他聊编码规范(前馈),然后 review 他的代码,发现问题就补充规则(反馈)。这个循环持续运转,harness 才是活的。

受控者不一定是 Model

harness 用于控制不确定的受控者。受控者可以是 model,这是当前叙事的焦点。但受控者也可以是人------业务流程约束的就是人怎么规范地操作。受控者还可以是整个业务运作过程------怎么设计、怎么落地、怎么监控、怎么优化,这些都不确定,都需要持续的控制。


广义 Harness 的三个层级

harness 的控制模式在不同层级重复出现,但控制对象不同。

AI 层 Harness 的公式是 model(受控者)+ harness(控制系统)= agent。harness 运行时持续生效,就像马奔跑时缰绳一直在。它控制的是 model 的推理和行动------系统提示词约束角色,工具调用约束能力边界,反馈循环纠正偏差。这是当前市场讨论最多的 harness 形态14

构建时工作流 的公式是 agent + 工作流 = 业务代码。agent 按照方法论运行,产出业务代码后,代码独立运转,不再依赖 agent。这是一次性的生产过程------产出后控制系统就撤了。回到刚才的标准:它是否持续约束不确定的受控者? 不是。所以,工作流不是 harness。

工程层 Harness 的公式是业务本身 + 工程 harness = 业务系统。业务代码是确定的,不需要约束。但业务本身------怎么设计、怎么落地、怎么监控------是不确定的,是人和流程在推动。这一层的 harness 约束的是业务运作过程:测试框架持续验证质量,业务流程持续约束操作规范,产研效能持续监控和改进。Böckeler 已经在讨论 maintainability harness 和 architecture fitness harness23------这些就是工程层 harness 的具体形态。

AI 层和工程层都是 harness,因为它们都持续约束不确定的受控者。构建时工作流不是 harness,因为它是一次性的。


广义 Harness 的四个要素

完整的 harness 实践包含四个要素。Fowler 的文章2描述了前两个,Böckeler 的 steering loop 触及了第三个,但完整的四要素框架还没有被明确提出。

运行时控制:前馈 + 反馈

这是 harness 的核心引擎。前馈在行动前引导方向,反馈在行动后纠正偏差。Fowler 已经把这个机制讲得很清楚了2------Guides 提高首次正确的概率,Sensors 在错误到达人眼之前自动修正。两者缺一不可。

Harness 治理:谁来迭代控制系统本身

harness 不能自己迭代自己。

Böckeler 提出的 steering loop(驾驶循环)描述了这个过程2:每次 agent 完成一个会话,人类要思考------这次它又犯了什么常见的错?能不能加一个 sensor 来捕捉?能不能改一下 guide 来预防?OpenAI 团队的 Ryan Lopopolo 写过一篇文章4,说他们团队尽量不直接改代码,而是把精力花在迭代规则上------不是人在修代码,是人在修规则,然后让规则去修代码。

但 steering loop 目前被当作 harness 的"使用方式",而不是 harness 的一个独立要素。我认为它值得被单独提出来,原因很简单:它的操作对象是 harness 本身,不是受控者。当 agent 的表现出了问题,你有两种选择------调整受控者(比如换一个 model),或者调整 harness(比如修改 AGENTS.md、增加一条 linter 规则)。治理关注的是后者。没有治理,harness 会退化成一堆过时的规则,约束力逐年衰减。

系统熵管理:谁来维护产出物

受控者的产出------代码、文档、架构------随时间退化。新功能不断叠加,旧代码没人清理,文档和实现逐渐脱节。这是软件系统的热力学第二定律。

没有自动化反熵机制,系统会腐化到一个临界点:harness 的约束依然有效,但产出物本身已经烂到 harness 救不了的程度。园艺 Agent、定时巡检、自动清理脚本------这些反熵工具的操作对象是产出物,既不是受控者,也不是 harness 本身。

四者的关系

复制代码
前馈 + 反馈  →  harness 的运行时引擎     →  操作对象:受控者
Harness 治理 →  harness 的进化机制        →  操作对象:harness 本身
系统熵管理   →  系统健康的兜底           →  操作对象:受控者的产出物

三个操作对象,三套不同的关注点。用治理的手段去解决熵管理的问题,或者用运行时控制的手段去解决治理的问题,方向就错了。

四要素在任何一层都适用。AI 层的治理是迭代 AGENTS.md 和 linter 规则,工程层的治理是迭代测试框架和流程规范。AI 层的熵管理是自动清理 agent 产出的冗余代码,工程层的熵管理是定期巡检业务代码的健康度。控制对象不同,但四要素的框架不变。


层级封装与实践启示

一个项目的 harness 可能由 skill、rules、agent.md、hooks、linter、测试框架等多个组件构成。它们是独立的子系统还是共同构成控制系统,取决于你的视角。对组件自身,它是独立系统;对上层业务,它是控制系统的一部分。

更关键的是层级封装:当一个系统封装好并作为下一层的受控者后,下一层应该在此基础上封装自己的控制系统,而不应介入本系统的内部逻辑。就像操作系统分层------应用不需要知道内核的调度算法。AI 层 harness 不应该直接操控业务代码,工程层 harness 不应该直接操控 model 的推理过程。每一层管好自己的控制范围,系统才能稳定演进。

无论你是做 AI 工程、测试开发、还是业务架构,都在 harness 的某个层级上工作。认清自己的层级,才能找到正确的发力方向。当前叙事集中在 AI 层14,但工程层的 harness 一直都在------而且因为受控者是人和业务流程,可能更难做好。

如果我们不把 harness 的版图说清楚,就会出现一种错觉:harness 是 AI 时代的新发明,只有做 AI 的人才需要懂。但 harness 的思想比 AI 早了半个世纪79。理解了这张版图,我们的工程能力才能真正跟上 AI 的浪潮。


参考来源

  1. Mitchell Hashimoto, My AI Adoption Journey, 2026.02
  2. Birgitta Böckeler, Harness engineering for coding agent users, martinfowler.com, 2026.04
  3. Birgitta Böckeler, Maintainability sensors for coding agents, martinfowler.com, 2026.05
  4. OpenAI, Harness engineering: leveraging Codex in an agent-first world, 2026.02
  5. Anthropic, Effective harnesses for long-running agents
  6. Akira Sato, Harness Engineering: From Code Scaffolding to WorldModel Stewardship, 2026.05
  7. Sanderson Macedo, What makes a harness a harness, arxiv, 2026.06
  8. deepset, Harness Engineering: How to Build Reliable AI Agents, 2026.05
  9. OutcomeDev, Harness Engineering: The Discipline That Decides Whether AI Builds or Burns, 2026.05
相关推荐
乘风gg1 小时前
代码都已经让 AI 写了,为什么有些人却更慌了?
前端·ai编程·claude
ZJPRENO1 小时前
Claude 必备技能 Superpowers
ai编程
辰合软件1 小时前
通达OA二次开发入门指南
ai编程
我不是外星人1 小时前
一键还原任意网站,这套 Playwright + 多 Agent 工程流太猛了
前端·后端·ai编程
程序猿小卡2 小时前
模型越来越便宜之后,AI 应用团队要重算的不是 token 价格
agent·ai编程
zzgnbfd65882 小时前
2026最新2款AI编程工具平替实测深度对比
ai编程
Arranging157882 小时前
2026最新5款高适配AI编程工具平替实测
ai编程
怕浪猫2 小时前
第10章 实战项目二:自动化研发运维Agent
aigc·openai·ai编程
xiezhr3 小时前
数据库1600张表的文档,我让AI自动维护了
人工智能·ai编程·dba