Harness Engineering - 驾驭AI工程
不只是让AI干活,而是让AI在系统中可靠、可维护地干活
🎯 核心理念
什么是Harness Engineering?
Harness(缰绳、马具):不是马本身,而是套在马身上让它能拉车、能被引导的那整套东西。
Harness Engineering:构建完整的约束、反馈、管理系统,让AI在可控的框架内发挥最大能力。
三层关系
Prompt Engineering → 你对马说的话:"向左转、跑快点"
Context Engineering → 帮马看路的一切:地图、路标、地形
Harness Engineering → 缰绳、马鞍、围栏和道路本身关键区别:
- Prompt是建议:"请注意代码规范"
- Harness是约束:linting不通过就不让提交
💡 为什么需要Harness?
问题:AI很强,但不靠谱
典型场景:
1. AI生成代码 → 编译不通过
2. AI写文档 → 风格不一致
3. AI做重构 → 破坏现有功能
4. AI自动提交 → 出现严重bug根本原因:
- AI只解决眼前任务,不考虑长期维护
- AI不会自我检查,经常犯错而不自知
- AI缺乏系统视角,不了解整体架构
解决:用Harness管住AI
LangChain案例:
- 模型完全没换
- 只改了系统提示词、工具配置、钩子
- 成绩从52.8%涨到66.5%
- 排名从Top 30跳到Top 5
结论:模型可能已经不是瓶颈了,瓶颈是你给它搭了个什么样的环境。
🏗️ Harness的三大支柱
1. 上下文工程(Context Engineering)
核心原则:给模型一张地图,不是一本1000页的说明书。
关键要素:
- 持续更新的知识库:代码库、文档、架构设计
- 实时系统状态:当前环境、依赖版本、运行状态
- 上下文压缩:精简信息,避免"上下文焦虑"
Claude的上下文焦虑:
- 上下文太多,表现反而变差
- 必须定期清空重来
- 压缩不够,效率下降
实践建议:
✅ 好的上下文:
- 项目结构总览
- 关键约束清单
- 当前任务相关文件
- 最近变更记录
❌ 坏的上下文:
- 所有历史记录
- 无关的文档
- 未压缩的日志
- 冗余的信息2. 架构约束(Architecture Constraints)
核心原则:不光靠AI自己检查,还有硬规则在旁边盯着。
约束类型:
编译时约束:
- TypeScript类型检查
- ESLint规则
- 单元测试
- 构建验证
运行时约束:
- API schema验证
- 性能阈值
- 安全策略
- 权限控制
流程约束:
- Git hooks
- CI/CD检查
- Code review要求
- 部署审批
示例:
# Git pre-commit hook
npm run lint # 代码风格检查
npm run test # 单元测试
npm run type-check # 类型检查
# 任一失败,提交被阻止3. 垃圾回收(Garbage Collection)
核心原则:专门有个agent周期性运行,不写代码不做功能,就干一件事:找茬。
Anthropic的三agent架构:
┌─────────────┐
│ Planner │ 规划者:把简单指令扩展成详细规格
└──────┬──────┘
│
┌──────▼──────┐
│ Generator │ 生成者:按迭代一次做一个功能
└──────┬──────┘
│
┌──────▼──────┐
│ Evaluator │ 评估者:跑端到端测试,专门挑刺
└─────────────┘为什么需要独立评估者:
- 谁都不擅长批评自己,AI也一样
- GAN(生成对抗网络)思路
- 专门训练一个挑刺的AI比让生成者自查管用得多
实践方法:
# 简单实现:AI查AI
# 第一个AI完成任务后
claude --task "审查代码质量" --input "output_from_first_ai.md"
# 或者自动化脚本
npm run ai-generate # AI生成
npm run ai-review # AI审查
npm run ai-fix # AI修复🚀 实战案例
案例1:OpenAI Codex百万行代码项目
背景:
- 3-7个工程师,5个月
- 100万行代码的beta产品
- 零行人工手写
- 每人每天3.5个PR
- 估算速度是传统方式的10倍
他们的Harness:
上下文管理:
- 维护代码库知识库
- 实时更新架构文档
- 自动提取API规范
约束系统:
- 类型检查必须通过
- 单元测试必须覆盖
- 集成测试必须通过
质量保证:
- 多agent交叉验证
- 自动代码审查
- 端到端测试
未解问题:
- 速度快了10倍,但产出质量如何?
- 六个月后维护成本如何?
- AI写的代码是否好改?
启示:
- ✅ Harness能让AI写得快
- ⚠️ 但长期维护还需要时间验证
案例2:Mitchell Hashimoto的Ghostty项目
方法:极其朴素的进化策略
每次agent犯错
→ 工程化一个方案
→ 让它再也犯不了同样的错
→ 加到配置文件里结果:
- 配置文件每一行都对应agent过去犯过的一次错
- 文件是活的,一直在长
- 高度定制,因为全是真实场景里出过的问题
关键洞察:
- 不要试图一开始就设计完美的Harness
- 从空文件开始
- 让Harness在实战中自然生长
案例3:花叔的Claude Code工作流
架构设计:
CLAUDE.md(路由器)
↓ 判断任务类型
↓ 加载对应规则集
↓
Hooks(拦截器)
↓ 编辑前自动linting
↓ 生成后自动类型检查
↓
Skills(能力包)
↓ 小红书配图生成
↓ 飞书文档同步
↓
知识库(地图)
└ 项目结构、编码规范、历史决策核心组件:
1. CLAUDE.md作为路由器
# 任务路由
- 写公众号 → 加载公众号规则
- iOS开发 → 加载Swift规则
- Web开发 → 加载React规则2. Hooks作为硬约束
# 编辑文件前
pre-edit: npm run lint
# 代码生成后
post-generate: npm run type-check
# 提交前
pre-commit: npm run test3. Skills作为模块化能力
- 独立的能力包
- 平时不占context
- 需要时才调用
📐 设计原则
原则1:给地图不给说明书
✅ 好的CLAUDE.md:
# 项目结构
- src/components/ - React组件
- src/utils/ - 工具函数
- src/styles/ - 样式文件
# 关键约束
- 使用函数式组件
- 遵循Airbnb风格
- 测试覆盖率 > 80%
# 编码规范
[链接到详细规范文档]❌ 坏的CLAUDE.md:
# 第一步
创建文件src/components/Button.tsx
# 第二步
写入以下代码:
import React from 'react';
...为什么:
- AI需要方向感,不需要僵化步骤
- 说明书写死了,失去灵活性
- 地图提供全局视角,AI自己找路
原则2:每次犯错加一条规则
工作流:
AI犯错
→ 分析原因
→ 设计规则
→ 加到Harness
→ 测试验证示例:
# AI犯了:忘记导入依赖
# 解决:pre-generate hook自动检查imports
# AI犯了:破坏了现有功能
# 解决:pre-commit hook强制运行测试
# AI犯了:生成了不兼容的API
# 解决:API schema验证三个月后:
- 那个文件就是你的Harness
- 高度定制
- 全是真实场景里出过的问题
原则3:让AI查AI
简单实现:
# 第一个AI完成任务
claude --task "写一个React组件" > output.md
# 开一个新对话
# 让第二个AI审查
claude --task "找出所有问题" --input output.md你会惊讶:
- 第二个AI能发现多少第一个漏掉的
- 批评别人比自我批评容易
- AI也一样
进阶实现:
- Anthropic的Evaluator agent
- 专门的评估模型
- 自动化测试pipeline
⚠️ 关键挑战
挑战1:经验传承问题
Martin Fowler的担忧:
如果太早把人类从"in the loop"移到"on the loop", 将来可能没人真正懂得怎么回事,也就没人能设计好的harness。
现状:
- 现在设计Harness的人,都是写过很多年代码的老手
- Mitchell Hashimoto能给Ghostty写好harness,因为他理解终端模拟器的每个细节
- OpenAI工程师能驾驭百万行代码,因为他们知道什么架构是好的
问题:
- 下一代呢?
- 新手程序员从第一天起就不写代码,只写CLAUDE.md
- 他能设计出好的harness吗?
挑战2:经验能否迁移
花叔的案例:
- 从没手写过代码
- 所有产品都是AI写的
- 小猫补光灯上了AppStore付费榜Top 1
- Harness从零开始,在和AI互动中长出来
关键洞察:
- 能设计harness,不是因为有编程经验
- 而是有和AI反复较劲的经验
- 观察到AI的行为模式:什么时候偷懒、什么时候幻觉、什么时候需要硬约束
问题:
- 这种经验能教吗?
- 很多决定是直觉做的
- 直觉来自踩坑,踩坑来自时间
挑战3:长期维护成本
OpenAI实验的未解问题:
- 速度快了10倍,质量如何?
- 六个月后好改吗?
- AI写的代码有人写的代码好维护吗?
关键区别:
- 人写代码时会无意识地留下结构线索
- 方便将来的自己理解
- AI不会,只解决眼前任务
- 不考虑六个月后维护这段代码的人会不会骂娘
🎯 实践指南
从零开始构建Harness
第一周:最小系统
# 1. 创建CLAUDE.md
echo "# 项目规则" > CLAUDE.md
# 2. 加第一个hook
# .git/hooks/pre-commit
npm run lint && npm run test
# 3. 开始用AI
# 每次犯错就记录第二周:观察模式
记录AI常犯的错误:
- 忘记导入
- 破坏现有功能
- 风格不一致
- 类型错误第三周:逐步增强
针对每个错误:
- 设计规则
- 加到CLAUDE.md
- 加hook验证
- 测试效果三个月后:
- 你有了自己的Harness
- 高度定制
- 稳定可靠
已有项目的Harness设计
第一步:分析现状
- 项目结构
- 关键约束
- 常见问题
- 团队规范第二步:设计架构
- CLAUDE.md结构
- Hooks配置
- Skills拆分
- 知识库组织第三步:逐步实施
- 先加最关键的约束
- 观察效果
- 持续优化🔮 未来展望
Harness Engineering的演进
趋势:
- 从手动配置到自动生成
- 从单一agent到多agent协作
- 从规则约束到智能约束
- 从人工监督到AI监督
可能的方向:
- Harness即服务(HaaS)
- 可视化Harness设计工具
- Harness模板市场
- AI自动优化Harness
经验工程(Experience Engineering)
新问题:
- 如何在AI写所有代码的时代培养新人?
- 如何传承设计Harness的经验?
- 如何让新手快速积累"AI协作经验"?
可能的方向:
- AI协作训练营
- Harness设计pattern库
- 实战案例库
- 导师制(老手带新手)
总结
Harness Engineering标志着我们与AI协作方式的升级:
核心价值:
- ✅ 让AI可靠地工作
- ✅ 让AI可维护地产出
- ✅ 让AI规模化地应用
关键原则:
- 给地图不给说明书
- 每次犯错加一条规则
- 让AI查AI
记住:
- Harness是活的系统,持续进化
- 没有完美的设计,只有不断改进
- 问题驱动,不要过度设计
最重要的:
- 不要为了技术而技术
- 让真实问题驱动解决方案
- 让Harness自然生长
下一步:从你当前遇到的问题开始,构建你的第一个Harness 🚀