Z次元
文章笔记日志代码
Sections
专栏分类
文章归档
Community
友情链接
朋友圈
留言
头像
系列文章
0 Articles
15 分钟阅读
7.3k 字

什么是Harness Engineering?AI 迭代这么快,SDD 还有意义吗

系列文章
AI大模型
更新于:2026/5/16
|
发布于:2026/5/8
什
文章摘要
......

AI 工程范式的三次跃迁

AI 工程的范式在过去三年里经历了三次跃迁:

2023-2024:Prompt Engineering——核心问题是「怎么跟模型说话」。System Prompt、Few-shot、Chain-of-Thought,都是为了让模型更好地理解你的意图。

2025-2026 初:Context Engineering——核心问题变成了「模型能看到什么」。RAG、长上下文管理、MCP 工具注入,都是为了让模型获取正确的信息。

2026 至今:Harness Engineering——核心问题升级为「模型能在什么环境中行动」。不再只是让模型"理解"和"知道",而是构建一个完整的运行时环境,让模型能可靠地完成复杂任务。

每一次跃迁不是替代,而是叠加。Harness Engineering 包含了 Prompt 和 Context 层,并在其上构建了执行、反馈和约束系统。

Harness 到底是什么?

这个词在最近的讨论里被用得很模糊,有必要先说清楚。

一个简洁到暴力的公式

Viv Trivedy 提出了一个公式:

Agent = Model + Harness

简单来说就是:你用的 AI 编程助手,等于底层大模型加上围绕它搭建的一切脚手架。

模型是引擎,Harness 是底盘、变速箱、悬挂和整个车身。

Addy Osmani(Google Chrome 团队)把这个观点推到了极致:

"一个还行的模型配上一个优秀的 Harness,完胜一个顶级模型配上一个糟糕的 Harness。"

这不是修辞。在 Terminal Bench 2.0 上,Claude Opus 4.6 在 Claude Code(官方 Harness)中的得分,远低于同一个模型在一个定制 Harness 中的得分。有团队仅仅通过更换 Harness,就把编码 Agent 从 Top 30 拉到了 Top 5。模型没变,变的是 Harness。

Mitchell Hashimoto 的定义

Mitchell Hashimoto 在他 2026 年 2 月的博客里,把自己的 AI 采纳之旅分为六个阶段,第五阶段叫做「Engineer the Harness」。他的定义只有一句话:

“It is the idea that anytime you find an agent makes a mistake, you take the time to engineer a solution such that the agent never makes that mistake again.”

每当你发现 Agent 犯了一个错误,你就花时间去工程化一个解决方案,让它再也不会犯同样的错。

他提到了两类具体做法:

  • 在 AGENTS.md 里记录 Agent 的坏行为模式,防止重现。他以 Ghostty 项目的 AGENTS.md 为例,说「那个文件里的每一行,都来自一次真实的坏行为,写进去之后几乎全部得到了解决」。

  • 编写专用工具脚本(截图工具、过滤测试等),让 Agent 有办法验证自己的工作是否做对了。

OpenAI 的工程实践

OpenAI 的文章则从另一个角度——组织级工程实践——描述了 Harness。他们的一个团队用 3 名工程师 + Codex 智能体,在 5 个月内交付了 100 万行代码的产品,没有一行代码是人工编写的。

他们的 Harness 包含:

  • 文档和设计历史:让 Agent 理解"为什么这样设计"

  • 评估 Harness:自动验证 Agent 的输出质量

  • 代码审查和响应:Agent 和人类之间的反馈循环

  • 管理仓库本身的脚本:让系统自我维护

  • 生产环境配置:让 Agent 理解运行时约束

他们还建立了一套「黄金原则」——偏好共享工具包而非手写辅助函数、不 YOLO 式探测数据、在边界处验证数据形状。这些原则被编码进仓库,由定期的后台 Codex 任务扫描偏差并自动开 PR 修复。

Harness 的完整架构

综合 Mitchell Hashimoto、OpenAI、Martin Fowler 和 Addy Osmani 的实践,一个成熟的 Harness 包含以下层次:

指南层(Guides)——告诉 Agent 该怎么做:

  • AGENTS.md / CLAUDE.md:项目级的行为规范

  • Skill 文件:按需加载的专项能力说明

  • 子 Agent 提示词:分工明确的专项 Agent

Martin Fowler 的 Thoughtworks 团队将指南分为两类:

  • 计算型指南:Linter 规则、类型检查、自定义静态分析——机器可执行的硬约束

  • 推理型指南:代码审查 Agent、架构合规检查——需要模型推理的软约束

传感器层(Sensors)——告诉 Agent 做得怎么样:

  • 测试套件:单元测试、集成测试、端到端测试

  • Linter 和静态分析:代码风格、类型安全、依赖方向

  • 代码审查 Agent:架构合规性、设计模式检查

执行层(Runtime)——Agent 实际操作的地方:

  • 文件系统 + Git:持久化状态和版本控制

  • Bash 执行:通用问题解决能力

  • 沙箱环境:隔离、安全、可复现

编排层(Orchestration)——多 Agent 协作的核心:

  • 主循环(ReAct):推理 → 行动 → 观察 → 重复

  • 子 Agent 调度:专项任务分派

  • 模型路由:不同任务用不同模型

钩子层(Hooks)——系统级强制执行:

  • Pre-commit 检查:每次编辑后自动跑 lint 和 typecheck

  • 破坏性命令拦截:阻止 rm -rf、git push --force

  • 自动格式化:不让 Agent 浪费 token 在空白符上

记忆层(Memory)——跨会话的连续性:

  • AGENTS.md 持久化:每次会话开始时注入

  • 会话间知识传递:从一个 session 到下一个

可观测性(Observability)——了解系统在做什么:

  • 日志、Trace、成本计量、延迟监控

SDD 在 Harness 中的三个角色

现在回到核心问题:在这个 Harness 体系里,SDD(Spec-Driven Development)扮演什么角色?

仔细分析 OpenAI 和 Mitchell Hashimoto 的实践,你会发现 Spec 在 Harness 中承担着三个不可替代的角色:

角色 1:意图锚点(Intent Anchor)

Agent 不参与需求讨论,它只执行。Spec 是人类意图的唯一载体——“这个功能要做什么”、“为什么做”、“哪些是必须做的、哪些是可选的”。

没有 Spec,Agent 只能靠猜。猜对了是运气,猜错了就是那个"深色模式把所有图标都反色了"的段子。

OpenAI 的文章里反复强调一个观点:“人们脑子里的东西,系统是看不到的。” Slack 讨论中达成的架构共识?如果没写进仓库,Agent 就不知道,就像一个三个月后才入职的新人一样。

角色 2:约束生效的语义基础(Semantic Foundation)

OpenAI 用 linter 和结构测试来机械地强制执行架构规则——比如层间依赖方向、文件大小限制、命名规范。这些是「格式」层面的约束,可以完全自动化。

但 linter 检查不了语义。 它不知道「某个错误码在跨服务场景下应该怎么处理」,不知道「某个接口字段在特定来源场景下的业务含义」,不知道「这个状态的流转规则是什么」。

这些语义,必须被显式写下来,Agent 才能正确推理。Spec 的契约层和行为规格层承载的,正是这类「linter 管不到、但 Agent 必须知道」的语义约定。

角色 3:反馈循环的校准基准(Calibration Baseline)

测试和 Linter 只能告诉你"代码是否符合规则",Spec 告诉你"代码是否符合意图"。

在 OpenAI 的实践中,他们采用了 Planner → Generator → Evaluator 的三 Agent 架构。Generator 负责写代码,Evaluator 负责检查。Evaluator 检查的依据是什么?就是 Spec。

没有 Spec,Evaluator 只能检查"代码能不能跑"。有了 Spec,Evaluator 可以检查"代码是不是做了正确的事"。这是从"正确性"到"合规性"的质变。

Vibe Coding、SDD、Harness Engineering 的关系

这三者不是非此即彼的选择,而是同一光谱上的不同位置:

Vibe Coding(氛围编程):凭感觉、快、糙。适合原型验证和创意探索。

SDD(规范驱动开发):规格先行、契约驱动。适合需求明确的模块级开发。

Harness Engineering(驾驭工程):构建运行环境,让 AI 自主可靠执行。适合复杂系统的工程化。

它们之间的关系是递进和互补的:

  • Vibe → SDD:当原型验证有效、需求稳定后,用 Spec 固化规则,解决"看起来能用"到"真正能用"的鸿沟。

  • SDD → Harness:当系统复杂到需要多 Agent 协作、持续迭代时,用 Harness 构建自动化环境,让 AI 自主可靠运行。

现实中,大型项目常混合使用——Vibe 做探索、SDD 做模块、Harness 做整体工程化。

“棘轮效应”:Harness 的核心运行机制

理解了 Harness 和 SDD 的关系,再来看一个关键的运行机制——棘轮效应(Ratchet Effect)。

Mitchell Hashimoto 的定义本质上描述的就是一个棘轮:

  1. Agent 执行任务

  2. 出错了

  3. 工程师分析错误原因

  4. 在 Harness 中添加约束(写进 AGENTS.md、加 Linter 规则、写测试、加 Hook)

  5. 同类错误永远不再发生

这个循环有一个关键特性:只紧不松。每次迭代,Harness 都会新增约束来防止已发现的错误再次发生。随着时间推移,Agent 的行为空间被逐步收窄到"正确"的范围内。

Mitchell 以 Ghostty 项目的 AGENTS.md 为例:

“那个文件里的每一行,都来自一次真实的坏行为,写进去之后几乎全部得到了解决。”

OpenAI 团队也有类似的实践。他们发现团队每周要花 20% 的时间清理"AI 垃圾"——Agent 复制了代码库中已有的不优模式。解决方案不是人工清理,而是把"黄金原则"编码进仓库,让后台 Codex 任务定期扫描偏差并自动修复。

技术债像高息贷款——持续小额偿还,远好过一次性痛苦清理。

SDD 会过时吗?

模型会换,Spec 不会

GPT-4 → GPT-5 → GPT-5.5 → Claude Opus 4 → Opus 4.6,甚至最近的Opus 4.7,模型迭代速度极快。但你的业务需求、接口契约、行为规范不会因为换了模型就改变。

Spec 是模型无关的资产。今天用 GPT-5.5 写的 Spec,明天换 Claude Opus 5 一样能用。Harness 中的指南层和传感器层可以复用,只是换了底层的模型。

模型越强,约束越关键

这听起来反直觉,但逻辑很简单:

  • 模型弱的时候,它做不了太多事,破坏力有限

  • 模型强的时候,它能做的事情多得多,没有约束的破坏力也大得多

OpenAI 的文章里有一句很精辟的话:

“Agent 在有严格边界和可预测结构的环境中最为有效。”

一个能自主写 100 万行代码的 Agent,如果没有 Spec 约束,它也能自主制造 100 万行技术债。

Harness 是放大器,Spec 是被放大的内容

这是最核心的论点。

Harness 的执行能力越强,它对输入质量的要求就越高。就像一个高保真音响系统——输入是噪音,输出就是高保真的噪音。

SDD 提供的正是这个"输入质量"。 Spec 定义了意图、契约和行为规范,Harness 负责高保真地执行。没有 Spec 的 Harness,是一个没有乐谱的乐队——乐器再好,也演奏不出旋律。

一个真实的反面案例

知乎上有一篇广泛传播的文章,标题是《95% 的 Vibe Coding 项目活不过两周》。核心观点:

Vibe Coding 在原型阶段效率惊人,但 90-95% 的 AI 编码项目死于"规模化陷阱"——代码能跑但没人敢改。

原因很简单:没有 Spec,就没有"真相来源"。每次修改都是一次冒险,因为你不知道"正确的行为"应该是什么。

实践建议:从哪里开始?

如果你认同上述分析,想在自己的项目中引入 SDD + Harness,这里有一个务实的起步路径:

第一步:写 AGENTS.md

这是 Harness 中投资回报率最高的单一组件。不需要完美,从记录 Agent 的真实错误开始:

1# AGENTS.md2 3## 项目概述4这是一个电商订单系统,使用 TypeScript + NestJS + PostgreSQL。5 6## 禁止事项7- 不要修改 `src/legacy/` 目录下的任何文件8- 不要使用 `any` 类型9- 不要直接操作数据库,必须通过 Repository 层10 11## 代码规范12- 使用我们的自定义 logger,不要用 console.log13- 所有 API 响应必须遵循 `ApiResponse<T>` 包装格式14- 错误码参考 `src/constants/error-codes.ts`15 

记住 Mitchell 的原则:AGENTS.md 里的每一行,都应该来自一次真实的错误。

第二步:建立最小可行的 Spec 体系

不需要 200 页文档。一份好的 Spec 可以是一页 Markdown:

1# Spec: 用户登录2 3## 意图4提供邮箱+密码登录能力,支持多设备同时在线。5 6## 契约7- POST /api/auth/login8- Request: { email: string, password: string }9- Response: { token: string, refreshToken: string, expiresIn: number }10 11## 行为规格12- 密码错误 3 次后锁定账户 15 分钟13- 登录成功后记录设备信息14- token 有效期 2 小时15 16## 验收标准17- [ ] 正确邮箱+密码返回 token18- [ ] 错误密码返回 40119- [ ] 账户锁定返回 42320- [ ] token 在 2 小时后过期21 

把它放在仓库里,让 Agent 在开始工作前先读它。

第三步:搭建反馈传感器

至少要有:

  • 自动化测试:Agent 写完代码后自动跑

  • 类型检查:每次编辑后自动跑

  • 一个简单的 pre-commit hook

这些是 Harness 中投资回报率最高的组件。

第四步:启动棘轮

每次 Agent 犯错,问自己:我能不能改 Harness 让这个错误永远不再发生? 如果能,就改。

这就是棘轮——它只会越拧越紧。

写在最后

2026 年的 AI 工程正在经历一个有趣的分化:

一边是 Vibe Coding——跟 AI 聊天,快速出原型,适合探索和实验。

另一边是 Harness Engineering + SDD——构建约束、编码判断、建立反馈循环,适合交付真正要在生产环境运行的系统。

但是它们并不是对立。原型阶段用 Vibe Coding,交付阶段用 Harness + SDD。根据不同的场景选择不同的实现才是较优解。

Harness Engineering 告诉我们:模型的差距是 Harness 的差距。 SDD 告诉我们:没有规格的 AI 编码是自由落体。

把它们结合起来,你得到的是一个有约束、有反馈、可迭代、可维护的 AI 辅助开发系统。这不是回到瀑布流,这是在 AI 时代重新发明工程纪律。

而工程纪律,从来不会因为工具变强而过时。恰恰相反——工具越强大,纪律越重要。

版权声明
本文依据 CC-BY-NC-SA 4.0 许可协议授权,请您在转载时注明文章来源为 Z次元 ,若本文涉及转载第三方内容,请您一同注明。
A

AI大模型

拥抱AI,畅想未来

更多专栏文章推荐
AI Coding从零打造一款Todo待办桌面应用
2026/4/27
SpringBoot快速集成AI大模型
2026/1/21
Claude Code接入第三方Api(Deepseek)
2026/5/10
评论区

删除确认

评论删除后无法恢复,请确认是否继续?
[
]
目录
1
AI 工程范式的三次跃迁
2
Harness 到底是什么?
一个简洁到暴力的公式
Mitchell Hashimoto 的定义
OpenAI 的工程实践
Harness 的完整架构
3
SDD 在 Harness 中的三个角色
角色 1:意图锚点(Intent Anchor)
角色 2:约束生效的语义基础(Semantic Foundation)
角色 3:反馈循环的校准基准(Calibration Baseline)
4
Vibe Coding、SDD、Harness Engineering 的关系
5
“棘轮效应”:Harness 的核心运行机制
6
SDD 会过时吗?
模型会换,Spec 不会
模型越强,约束越关键
Harness 是放大器,Spec 是被放大的内容
一个真实的反面案例
7
实践建议:从哪里开始?
第一步:写 AGENTS.md
第二步:建立最小可行的 Spec 体系
第三步:搭建反馈传感器
第四步:启动棘轮
8
写在最后
目录
1
AI 工程范式的三次跃迁
2
Harness 到底是什么?
一个简洁到暴力的公式
Mitchell Hashimoto 的定义
OpenAI 的工程实践
Harness 的完整架构
3
SDD 在 Harness 中的三个角色
角色 1:意图锚点(Intent Anchor)
角色 2:约束生效的语义基础(Semantic Foundation)
角色 3:反馈循环的校准基准(Calibration Baseline)
4
Vibe Coding、SDD、Harness Engineering 的关系
5
“棘轮效应”:Harness 的核心运行机制
6
SDD 会过时吗?
模型会换,Spec 不会
模型越强,约束越关键
Harness 是放大器,Spec 是被放大的内容
一个真实的反面案例
7
实践建议:从哪里开始?
第一步:写 AGENTS.md
第二步:建立最小可行的 Spec 体系
第三步:搭建反馈传感器
第四步:启动棘轮
8
写在最后
博客
文章 笔记 日志 代码
专题
专栏分类 文章归档
友链
友情链接 朋友圈
交流
留言 关于我
主页
菜单
置顶
主题
我的
十玖八柒
每天进步多一点
欢迎到访φ(゜▽゜*)♪
最新评论
徐徐爱coding: @徐徐爱coding
666
徐徐爱coding:
新样式不错,眼花缭乱
柒: @2broear
确实,如果有原型图的话,ai确实是能复制的很好。不过我是因为不知道要怎么设计好才让ai自由发挥的
2broear:
得先指定风格,最好丢几张landpage给ai参考
我的
关于我
个人主页
站点地图
RSS订阅
导航
十年之约
虫洞穿梭
开源博客
前端开源仓库
后端开源仓库
©2020 - 2026 By 十玖八柒 版权所有
豫ICP备20021466号