Harness Engineering 解读:让 AI Agent 可控的工程实践
TL;DR
OpenAI 团队用 5 个月时间、零手写代码,构建了一个超过 100 万行代码的真实产品。他们的秘密武器是 “Harness”——一套约束 AI Agent 的工具和实践。Martin Fowler 深度解读了这个案例,提出了 Harness Engineering 的概念:通过上下文工程、架构约束和”垃圾回收”机制,让 AI 生成的代码可维护、可信赖。
📋 本文结构
- 什么是 Harness?
- OpenAI 的百万行代码实验
- Harness 的三层架构
- 从”生成 Anything”到”约束解空间”
- Harness 会成为新的服务模板吗?
- 技术栈收敛的趋势
- 实践建议:构建你的第一个 Harness
- 结论:可控的 AI 自主
什么是 Harness?
Harness 原意是”马具”——用来控制和引导马匹的工具。
在 AI 工程中,Harness 指的是:让 AI Agent 保持可控的工具和实践集合。
为什么需要 Harness?
AI Agent 的能力带来了新的问题:
| 能力 | 风险 |
|---|---|
| 自主决策 | 可能做出错误选择 |
| 多步执行 | 错误会累积传播 |
| 代码生成 | 可能产生技术债务 |
| 长期运行 | 可能偏离目标 |
Harness 的目的:在给予 AI 自主性的同时,确保结果可预测、可维护、可信赖。
Harness vs 传统工具链
| 维度 | 传统工具链 | Harness |
|---|---|---|
| 目标 | 辅助人类开发 | 约束 AI 行为 |
| 确定性 | 人类判断为主 | 自动化约束为主 |
| 反馈循环 | Code Review | 实时验证 + 自动修复 |
| 适应性 | 静态规则 | 动态调整 |
OpenAI 的百万行代码实验
实验设置
约束条件:
- 零手写代码(”no manually typed code at all”)
- 使用 Codex Agent 开发
- 时间:5 个月
- 结果:超过 100 万行代码的真实产品
关键洞察:
“当 Agent 遇到困难时,我们将其视为信号:识别缺失的内容——工具、护栏、文档——并通过让 Codex 自己编写修复程序将其反馈到仓库中。”
为什么能成功?
不是 Prompt 工程,而是 Harness 工程。
OpenAI 团队构建了一套系统来:
- 提供上下文(Context Engineering)
- 约束架构(Architectural Constraints)
- 维护质量(Garbage Collection)
Harness 的三层架构
Martin Fowler 将 OpenAI 的实践归纳为三个层次:
┌─────────────────────────────────────────┐
│ Harness 架构 │
├─────────────────────────────────────────┤
│ Layer 3: 垃圾回收 (Garbage Collection) │
│ - 定期运行的 Agent │
│ - 发现文档不一致 │
│ - 修复架构违规 │
│ - 对抗熵增和腐烂 │
├─────────────────────────────────────────┤
│ Layer 2: 架构约束 │
│ - 确定性自定义 Linter │
│ - 结构化测试 │
│ - LLM-based Agent 监控 │
├─────────────────────────────────────────┤
│ Layer 1: 上下文工程 │
│ - 持续增强的知识库 │
│ - 动态上下文(可观测性数据) │
│ - 浏览器导航等实时信息 │
└─────────────────────────────────────────┘
Layer 1: 上下文工程
核心问题:Agent 需要知道什么才能做出正确决策?
OpenAI 的做法:
- 在代码库中维护持续增强的知识库
- 提供动态上下文(错误日志、性能指标、用户行为)
- 允许 Agent 浏览网页获取最新信息
关键原则:
Context is king. The better the context, the better the AI’s decisions.
Layer 2: 架构约束
核心问题:如何防止 Agent 生成混乱的代码?
混合方法:
- 确定性约束:自定义 Linter、结构测试(不可绕过)
- LLM 约束:让 Agent 自己检查架构合规性
约束示例:
# 架构约束配置
architecture_constraints:
- rule: "所有 API 调用必须通过 service layer"
linter: custom_api_linter
- rule: "数据库访问必须封装在 repository 中"
test: structural_test_db_access
- rule: "组件依赖必须遵循分层架构"
agent_check: "检查 import 是否符合分层规则"
Layer 3: 垃圾回收
核心问题:如何对抗代码腐烂?
机制:
- 定期运行的 Agent(如每天一次)
- 扫描代码库寻找:
- 过时的文档
- 架构违规
- 不一致的命名
- 死代码
- 自动生成修复 PR
类比:
- 就像垃圾回收器自动管理内存
- Harness 自动维护代码健康
从”生成 Anything”到”约束解空间”
早期的错误假设
AI 编码的初期愿景:
- LLM 可以生成任何语言、任何模式的代码
- 无需约束,LLM 会自己搞定
- 无限的灵活性
现实的经验
OpenAI 的实验表明:
为了增加信任和可靠性,必须约束解决方案空间。
具体约束:
- 特定的架构模式
- 强制的边界
- 标准化的结构
代价:
- 放弃一些”生成 Anything”的灵活性
- 需要更多的前期投入(Prompts、规则、Harness)
- 更多的技术 specifics
收益:
- 可维护的代码
- 可预测的行为
- 可信赖的系统
约束的类型
| 约束类型 | 示例 | 实施方式 |
|---|---|---|
| 架构模式 | MVC、Clean Architecture | 代码生成模板 + Linter |
| 命名规范 | 统一的命名约定 | 自动化检查 |
| 依赖规则 | 禁止循环依赖 | 静态分析 |
| 测试要求 | 代码覆盖率门槛 | CI/CD 检查 |
| 文档要求 | 所有公共 API 必须文档化 | Agent 扫描 + 自动生成 |
Harness 会成为新的服务模板吗?
服务模板的演进
传统服务模板(Golden Path):
- 帮助团队快速启动新服务
- 提供标准化的项目结构
- 集成常用工具链
未来的 Harness 模板:
- 针对常见应用拓扑的预配置 Harness
- 包含:
- 自定义 Linter
- 结构测试
- 基础上下文和知识文档
- 上下文提供者(可观测性、浏览器等)
选择 Harness,而非选择技术栈
Martin Fowler 的预测:
开发者可能不再仔细选择每个库和框架,而是选择适合目标应用拓扑的 Harness。
工作流程:
- 选择 Harness 模板(如”电商后端 Harness”)
- 根据具体需求调整
- 随时间演进
挑战:分叉和同步
问题:
- 团队 A 改进了 Harness
- 团队 B 也想用这些改进
- 但团队 B 已经做了很多定制
类比:
- 类似于今天服务模板的更新挑战
- 可能需要的解决方案:
- 可插拔的 Harness 组件
- 语义化版本管理
- 自动化的 Harness 升级工具
技术栈收敛的趋势
当前:技术栈爆炸
- 前端:React、Vue、Svelte、Angular…
- 后端:Node、Python、Go、Rust…
- 数据库:PostgreSQL、MongoDB、Redis…
- 每个团队都有自己的偏好
未来:Harness 驱动的收敛
驱动力:
- Agent 友好性优先
- 人类开发者口味的重要性下降
- “Agent 能理解和生成”成为关键标准
- 框架的 AI 友好性比语法糖更重要
- Harness 生态系统的网络效应
- 好的 Harness 吸引更多用户
- 更多用户贡献改进
- 形成正反馈循环
- 效率压倒偏好
- 小效率和怪癖不再重要
- 因为开发者不直接处理这些细节
- 选择标准:Harness 质量 > 个人喜好
预测:
我们可能会看到技术栈收敛到少数几个有高质量 Harness 支持的选项。
实践建议:构建你的第一个 Harness
第一步:识别关键约束
问自己:
- 我的项目最重要的是什么?(性能?安全?可维护性?)
- 什么错误是最不能容忍的?
- 什么样的代码结构会让未来的维护更容易?
第二步:从简单开始
最小可行 Harness:
项目根目录
├── .harness/
│ ├── rules/ # 规则文件
│ ├── context/ # 上下文文档
│ └── agents/ # 专用 Agent 配置
├── src/
└── tests/
第三步:逐步增强
阶段 1:基本 Linter 和测试 阶段 2:上下文文档和示例 阶段 3:自动化质量检查 阶段 4:自主修复 Agent
示例:最小 Harness
# .harness/config.yaml
name: "My Project Harness"
version: "1.0.0"
# 架构约束
architecture:
pattern: "layered"
layers:
- name: "api"
allowed_dependencies: ["service"]
- name: "service"
allowed_dependencies: ["repository"]
- name: "repository"
allowed_dependencies: ["model"]
# 质量规则
quality_rules:
- name: "test_coverage"
threshold: 80%
- name: "documentation"
required: ["api", "service"]
# 上下文
context:
knowledge_base: ".harness/context/knowledge.md"
dynamic_sources:
- type: "observability"
endpoint: "..."
结论:可控的 AI 自主
Harness Engineering 代表了一种新的工程范式:
不是让 AI 完全自主,而是让 AI 在精心设计的约束下自主。
核心原则
- Context is King
- 投资上下文工程
- 让 AI 知道它需要知道的一切
- Constraints Enable Freedom
- 约束不是限制,而是保护
- 在边界内,AI 可以更自信地行动
- Automated Maintenance
- 把代码健康当作基础设施
- 让 Agent 自动对抗腐烂
- Iterative Improvement
- Harness 不是一次性构建
- 当 AI 遇到困难时,改进 Harness
对开发者的意义
- 从编码到策展:工作重心从写代码转向设计约束
- 从工具到系统:关注整体系统而不仅是功能实现
- 从个体到团队:Harness 是团队协作的基础设施
最后思考
OpenAI 的百万行代码实验证明了一点:
AI 可以构建大规模、可维护的软件系统——但前提是我们构建了正确的 Harness。
这不是 AI 取代开发者的故事,而是开发者角色进化的故事。
Harness Engineer 可能成为新的专业角色——专门设计和维护让 AI 高效工作的系统。
参考与延伸阅读
- Harness Engineering: Leveraging Codex in an Agent-First World - OpenAI
- Harness Engineering - Martin Fowler - 本文解读来源
- Mitchell Hashimoto: My AI Adoption Journey - Harness 概念来源
- Building Effective Agents - Anthropic
本文基于 Martin Fowler 对 OpenAI Harness Engineering 文章的深度解读。
💬 评论
💡 使用 GitHub 账号登录 即可参与讨论