再次了解 AI Harness

2 阅读8分钟

这其实是一次 tenantId 联调 bug,暴露了 AI 项目最缺的不是模型,而是Harness前面没整理完的关于Harness Engineering 的文章,为啥整理这一篇是因为这让我意识到一个趋势正在形成:AI 开发正在从"写提示词"转向"构建评估系统"。


什么是 Harness?

•❌ 不是业务逻辑•✅ 是"包在系统外面的一层控制系统"

二、这个词的来源(非常关键)

“harness”本来是个很形象的词:马具(给马套上的控制装置)

👉 核心隐喻:

核心本质:让一个"有能力但不可控"的系统变得可控

类比理解

类比 1:马具(Horse Harness)

Harness 的原意就是"马具"。

马很有能力,能跑能拉,但如果不加马具:

•你没法控制方向•你没法让它停下来•你没法让它拉车

马具 = 控制框架,让有能力但不可控的马,变成可控的生产力。

类比 2:赛车游戏的手柄

想象你在玩赛车游戏:

Prompt Engineering = 你告诉 AI"往左拐"•Context Engineering = 你给 AI 看地图、车速、油量•Harness Engineering = 你给它一个手柄,让它能实际操作,还能看仪表盘知道自己开得怎么样

手柄 + 仪表盘 + 赛道规则 = Harness

类比 3:你熟悉的 JUnit

写 Java 的同学都知道 JUnit:

@Test
public void testAdd() {
    assertEquals(4, calculator.add(2, 2));
}

JUnit 做了什么?

•控制测试的执行顺序•提供断言方法验证结果•收集测试结果生成报告

JUnit 就是一个 Test Harness

一句话定义

Harness = 用来控制、驱动、约束、评估一个系统行为的外部执行框架

它不是业务逻辑本身,而是包在业务逻辑外面的一套控制系统


二、为什么 AI 突然需要 Harness?

先理解 AI 和传统软件的区别

| 维度 | 传统软件 | AI(LLM) | | --- | --- | --- | | 确定性 | 同样的输入,永远同样的输出 | 同样的 prompt,可能不同结果 | | 可预测性 | bug 能复现 | "幻觉"随机出现 | | 验证方式 | assertEquals(expected, actual) | 输出是自然语言,难断言 | | 调试方式 | 打断点、看堆栈 | 不知道它"怎么想的" |

关键问题:AI 是个"黑盒概率系统",有能力,但不可控。

2025 年底发生了什么?

AI 从"聊天工具"变成了"自主干活的工人"。

Cursor 的实验[1]:让 AI 自主写浏览器,5 个月生成 100 万+ 行代码,人类零手写代码。

Anthropic 的实验[2]:16 个 Claude 并行工作,2 周从零写出 C 编译器。

OpenClaw:7x24 小时自主运行的 AI,不需要人类一直盯着。

新问题出现了

•AI 干到一半停了,下次怎么接上?•AI 说"我做完了",怎么验证真的做完了?•怎么保证 AI 不"跑偏",不乱改其他代码?•多个 AI 一起干活,怎么协作?

这些都不是 prompt 能解决的,需要 Harness。


三、AI Harness 的 6 个核心组件

一个完整的 AI Harness 包含以下 6 部分:

┌─────────────────────────────────────┐
│         AI Harness 架构             │
├─────────────────────────────────────┤
│  1. 可读环境(Legible Environment)  │
│     → AI 能读懂项目状态            │
├─────────────────────────────────────┤
│  2. 测试数据集(Test Dataset)       │
│     → 有标准答案才能评估           │
├─────────────────────────────────────┤
│  3. 执行器(Executor)               │
│     → 控制 AI 怎么运行             │
├─────────────────────────────────────┤
│  4. 评估器(Evaluator)              │
│     → 判断 AI 做得对不对           │
├─────────────────────────────────────┤
│  5. 端到端验证(E2E Verification)   │
│     → 防止 AI "假完成"             │
├─────────────────────────────────────┤
│  6. 工具设计(Tooling)              │
│     → 给 AI 用什么工具             │
└─────────────────────────────────────┘

组件 1:可读环境(最重要但最容易被忽视)

场景:AI 干到一半停了(断电、超时、出错),下个 AI 怎么接手?

反面教材

•项目里到处是 TODOFIXME,不知道哪个是真的待办•进度散落在聊天记录、个人笔记、脑子里•新 AI 花了半小时才搞懂"现在做到哪了"

正确做法:写清楚进度文件

project/
├── AGENTS.md          # 项目架构、技术栈、开发规范
├── features.json      # 功能清单和完成状态
│   └── [{"name""登录""status""done"}, ...]
├── progress.md        # 当前进度、阻塞项、下一步
│   └── "卡在微信支付签名,需要测试密钥"
└── init.sh           # 一键初始化环境

关键原则:每个新 AI 应该几分钟内读懂项目,而不是猜。

OpenAI 的实践证明[3]:结构化的进度跟踪文件,比复杂的记忆系统更有效

组件 2:测试数据集

核心问题:怎么判断 AI 做得好不好?

不能靠"感觉",需要有标准答案。

怎么做

1.收集 50-100 个真实场景的输入输出对2.覆盖正常 case、边界 case、错误 case3.每次改 Prompt 或换模型,跑一遍看准确率

示例(客服意图识别):

[
  {"input""这个太贵了""expected""价格异议"},
  {"input""能便宜点吗""expected""价格异议"},
  {"input""谢谢我先看看""expected""暂缓决策"},
  {"input""怎么退款""expected""售后问题"}
]

目的:把"感觉好不好"变成"指标好不好"(准确率 85% vs 92%)。

组件 3:执行器(Executor)

控制 AI 怎么运行:

•用哪个模型?(GPT-4 / Claude / DeepSeek)•温度参数多少?(0.2 稳定,0.8 有创意)•超时时间多长?•失败怎么重试?•要不要并行跑多个模型对比?

作用:让 AI 的执行过程可控、可复现。

组件 4:评估器(Evaluator)

AI 的输出怎么评分?

| 评估方式 | 适用场景 | 示例 | | --- | --- | --- | | 规则匹配 | 结构化输出 | JSON 字段存在、值在范围内 | | LLM 打分 | 主观质量 | 用 GPT-4 给回答打 1-10 分 | | 人工评审 | 复杂场景 | 抽样检查、关键路径 | | 混合评估 | 通用 | 规则先过滤,LLM 再评估 |

示例

请评估以下 AI 回复:
问题:"怎么重置密码?"
AI 回答:"..."

请从以下维度评分(1-10):
1. 准确性:步骤是否正确
2. 完整性:是否漏了关键步骤
3. 清晰度:用户能否看懂

组件 5:端到端验证(E2E)—— 防止"假完成"

最大的坑:AI 特别喜欢说"我做完了",其实有 bug。

为什么单元测试不够

•代码通过了测试,但功能不工作•实现了功能,但破坏了其他模块•API 能调通,但前端展示错了

怎么做

| 项目类型 | 验证方式 | | --- | --- | | Web 应用 | Playwright 自动跑一遍用户流程 | | API 服务 | 集成测试:调接口 → 查数据库 → 验状态 | | 代码生成 | 编译 + 运行 + 测试通过 | | 数据处理 | 输出格式 + 关键字段非空 + 无重复 |

反馈循环

AI 说完成 → 自动测试 → 发现 bug → 反馈给 AI → 修复 → 重新验证

这比人工检查快得多。

组件 6:工具设计——少即是多

Vercel 的真实案例[4]

原来:给 AI 20 个精细设计的专用工具

•查询用户工具、查询订单工具、更新状态工具...

问题:AI 经常选错工具,切换开销大。

改进后:删掉 80%,只留 2 个通用工具

1.bash 命令 - 文件操作2.SQL 执行 - 数据库查询

结果

•成功率:80% → 100%•速度:快 3.5 倍

为什么:模型对 bash、SQL 这类通用工具理解更深,不用猜"该用哪个工具"。

设计原则

优先给 AI 通用工具(文件、bash、SQL),别搞复杂的专用工具链。


四、真实数据:优化 Harness 比换模型更有效

案例 1:Hashline[5]——只改格式,模型没变

问题:AI 改代码时经常定位错行。

解法:不改模型,只改文件格式——每行加哈希

# 传统格式
function hello() {
  return "world";
}

# Hashline 格式  
1:a3|function hello() {
2:f1|  return "world";
3:0e|}

AI 通过哈希引用行("替换 2:f1"),不用精确重现字符串。

结果

•模型得分:6.7% → 68.3%(10 倍提升)•模型权重完全没变

案例 2:LangChain[6]——固定模型,只优化 Harness

条件:固定 GPT-5.2,只改进 Harness

改进:加了一个自动分析失败模式的工具

结果

•分数:52.8% → 66.5%•排名:30 名 → 5 名

结论

别急着买更贵的模型,先优化 Harness,ROI 更高。


五、给你的落地建议:5 步走

第一步:写 AGENTS.md

项目根目录放这个文件,内容包括:

•项目结构:目录怎么组织的•技术栈:用什么语言、框架、数据库•构建命令:怎么编译、怎么跑测试•常见坑:之前踩过什么坑、怎么规避

原则:每次 AI 犯错,就加一条规则防止再犯。

第二步:整理测试集

找 30-50 个真实场景的输入输出对:

•从生产日志里挑真实的•覆盖正常 case、边界 case、错误 case•存成 JSON,方便批量跑

第三步:加 E2E 验证

别让 AI 自己说"做完了",让它证明做完了:

•Web 项目:用 Playwright 自动跑核心流程•API 项目:写集成测试•代码生成:必须能编译、能跑通测试

第四步:简化工具链

检查你给 AI 用的工具:

•超过 10 个?考虑合并•能用 bash/SQL 解决的,别搞专用工具•优先用模型熟悉的通用工具

第五步:建进度看板

用简单的 markdown 跟踪:

## 已完成 ✅
- [x] 用户登录接口

## 进行中 🚧  
- [ ] 支付接口(卡在签名验证)

## 阻塞项 🛑
- 需要测试环境密钥

## 下一步 📋
1. 搞定签名
2. 写回调接口

相关阅读

•Anthropic:用并行 Claude 团队构建 C 编译器[7]•Mitchell Hashimoto:Harness Engineering 概念提出[8]

References

[1] Cursor 的实验:*cursor.com/blog/scalin… 的实验:*www.anthropic.com/engineering… 的实践证明:*openai.com/index/harne… 的真实案例:*vercel.com/blog/we-rem… Claude 团队构建 C 编译器:*www.anthropic.com/engineering… Hashimoto:Harness Engineering 概念提出: mitchellh.com/writing/my-…

原文链接阅读体验更优