Harness Engineering:如何让 AI 编程 Agent 可靠地工作
你订阅了 Claude Pro,手握 GPT-4o API key,SWE-bench 排行榜数字倒背如流。某天你终于把一个真实项目交给 AI agent,信心满满。结果呢?它加了一个功能却破坏了测试,修复了一个 bug 却引入两个新的,运行了 20 分钟骄傲地宣布"完成了"——然后你一看代码,根本不是你要求的。
你的第一反应?"模型还不够好,升级吧。"停一下。截至 2025 年底,SWE-bench Verified 上最强的编程 agent 正确率大约只有 50-60%,而且那是在精心挑选的任务上。切换到你的日常开发环境——模糊的需求、没有测试、散布各处的隐式业务规则——这个数字只会更低。
2026 年 3 月,LangChain 工程团队在 Terminal Bench 2.0 排行榜上从第 30 名跃升至第 5 名,完全没有更换底层模型——所有提升都来自 harness 的优化。这是 Harness Engineering ROI 的最直接证据。
什么是 Harness?
Harness(挽具/驾驭框架)泛指模型权重之外的一切工程基础设施——指令、工具、环境、状态管理、验证反馈。类比:纯种马没有鞍子也能骑,但骑不远、骑不快。Harness 就是那个鞍子。
如果不是模型权重,就是 Harness。
Faros AI 的 2026 年工程报告将 AI 工程成熟度划分为三个阶段:
| 阶段 | 时期 | 核心问题 | 输出形式 |
|---|---|---|---|
| Prompt Engineering | 2022–2023 | 怎么跟模型说话 | 代码片段、自动补全 |
| Context Engineering | 2024–2025 | 模型知道什么 | 文件级编辑、上下文感知更新 |
| Harness Engineering | 2026 | 模型被允许怎么行动和自我修正 | 端到端自主任务执行与验证 |
Mitchell Hashimoto(HashiCorp 联合创始人)在 2026 年初提出的核心原则:每当发现 agent 犯错,就花时间工程化一个解决方案,让 agent 永远不再犯同样的错。大多数时候,这个解决方案就是对 harness 的改进。
Context Engineering 与 Harness 的关系
两者经常被混淆,但关注点不同。Context Engineering 解决"模型知道什么"——如何把正确的信息送入模型的上下文窗口(RAG、MCP、文件索引等)。Harness Engineering 解决"模型怎么行动"——在拥有信息的基础上,如何约束、验证、追踪 agent 的行为。Context 是 feedforward 的一部分,Harness 是完整的 feedforward + feedback 闭环。
Harness 被拆解为五个子系统,每个都有明确的职责:
| 子系统 | 核心职责 | 典型产出 |
|---|---|---|
| Instructions(指令) | 项目背景、硬约束、路由 | AGENTS.md / CLAUDE.md |
| Tools(工具) | Agent 可执行的工具权限 | Shell、编辑器、测试运行器 |
| Environment(环境) | 可复现的执行环境 | pyproject.toml / package.json / Docker |
| State(状态) | 跨会话的进度和决策记录 | PROGRESS.md / feature_list.json |
| Feedback(反馈) | 验证命令和结果 | 测试、lint、类型检查、smoke run |
ROI 排序
反馈子系统通常投资最小、回报最高——优先把验证命令写对。团队四阶段演进数据(同一模型 GPT-4o,~20K 行 TypeScript):基本 README → 成功率 20%;加 AGENTS.md → 60%;加验证命令 → 80%;加进度文件模板 → 80-100%。
关键术语表
| 术语 | 定义 |
|---|---|
| 能力差距 | 模型在基准测试上的表现与真实任务表现之间的差距 |
| 验证缺口 | Agent 自述完成度与实际正确性之间的差距 |
| 知识可见性缺口 | 总项目中知识不在代码库中的比例。缺口越大,Agent 失败率越高 |
| 重建成本 | 新会话恢复到可执行状态所需的时间。好的 Harness 能从 15 分钟压到 3 分钟 |
| 上下文焦虑 | Agent 感知上下文快用完时仓促收尾、跳过验证 |
| 漂移 | Agent 理解与代码仓库实际状态之间的偏差 |
| 信噪比(SNR) | 指令文件中与当前任务相关的指令占比 |
| WIP=1 | 任何时刻只允许一个功能处于活跃状态。功能完成率与代码行数呈负相关 |
来源:Birgitta Böckeler, Martin Fowler, 2026.04
Thoughtworks 杰出工程师 Birgitta Böckeler 提出了 Harness 的控制论框架。
两条控制线
Guides(前馈控制):在 agent 行动之前预见并防止问题——AGENTS.md、Skills、项目文档。提高首次尝试就正确的概率。
Sensors(反馈控制):在 agent 行动之后观察并帮助自我修正——测试、lint、AI 代码审查。让 agent 在问题到达人类之前自行修复。
只靠前馈 → agent 编码了规则但永远不知道是否奏效。只靠反馈 → agent 不停重复相同的错误。两者必须配合。
计算型 vs 推理型
| 类型 | 特点 | 速度 | 确定性 | 典型实现 |
|---|---|---|---|---|
| Computational | CPU 执行 | 毫秒~秒 | 高 | lint、类型检查、ArchUnit |
| Inferential | GPU/NPU,语义分析 | 慢、贵 | 非确定性 | AI 代码审查、LLM as Judge |
最佳策略是将计算型传感器作为基线、推理型传感器作为补充。特别有力量的是那些为 LLM 消费优化的自定义 lint 消息——包含修正指令的 lint 输出,等于一种正向的"prompt injection"。
三大治理维度
| 维度 | 目标 | 工具成熟度 | 当前可靠性 |
|---|---|---|---|
| Maintainability | 内部代码质量 | 高 | 高——计算型传感器可靠 |
| Architecture Fitness | 架构特征 | 中 | 中——需团队定制 |
| Behaviour | 功能行为正确性 | 低 | 低——当前最大缺口 |
来源:WalkingLabs Lecture 01 + Anthropic
Anthropic 的对照实验
同一个提示("构建一个 2D 复古游戏制作工具")、同一个模型(Opus 4.5):
| 实验条件 | 耗时 | 成本 | 结果 |
|---|---|---|---|
| 裸环境,无支持 | 20 分钟 | $9 | 游戏核心功能完全不工作 |
| 完整 harness(三 agent 架构) | 6 小时 | $200 | 游戏可玩 |
六种典型失败模式
- 任务定义模糊:没有清楚定义任务边界,agent 靠猜测行事。你说"加一个搜索功能",agent 的理解和你的完全不同。
- 隐式架构规则:项目约定只存在于工程师脑中。Agent 看不见的信息 = 不存在的信息。
- 环境缺陷:依赖不完整、工具版本错误,agent 在配置上消耗大量上下文窗口。
- 无法验证:没有测试、没有 lint,agent 在"感觉可以"时收尾——产生验证缺口。
- 上下文焦虑:agent 感知上下文快用完时仓促收尾、跳过验证、选择简单解法。Anthropic 独家发现的独特现象。
- 跨会话状态断裂:长任务中上一 session 的所有发现都丢失,新 session 需要重新探索。
核心原则
当事情失败时,不要第一时间换模型——先检查 harness。就像汽车抛锚时,你不会首先怀疑发动机,而是先检查有没有汽油。
来源:Anthropic: Harness design for long-running application development
Anthropic 受 GAN(生成对抗网络)的启发,将生成器和判别器互相博弈的模式迁移到软件开发,演化出三 agent 系统:
| 角色 | 输入 | 输出 | 核心约束 |
|---|---|---|---|
| Planner(规划者) | 1-4 句用户 prompt | 完整产品规格文档 | 只关注产品上下文 + 高层设计,避免深入技术实现 |
| Generator(生成者) | Sprint contract | 可运行代码 | 按 sprint 逐 feature 实现,每个 sprint 结束自检 |
| Evaluator(评估者) | Generator 的产出 | 多维度评分 + 详细反馈 | 用 Playwright 像真实用户一样操作应用 |
Sprint Contract——最关键的设计机制
产品规格被故意保持高层级,需要一个步骤来桥接 user stories 和可测试的实现。流程:Generator 提出构建计划 → Evaluator 审查提案 → 两者迭代直到达成一致。单个 Sprint 可包含 27 个合同标准。
Evaluator 的调优难题
Claude 默认是一个糟糕的 QA agent——会先识别出合法问题,然后自我说服"这不是大问题"并批准工作。解决方案:读取 evaluator 日志,找到判断偏离预期的例子,更新 QA prompt,经过 3-5 轮调参后评判才趋于合理。
课程将数据库的 ACID 原则类比到 agent 状态管理:
| 原则 | 在 Agent 状态管理中的含义 |
|---|---|
| Atomicity(原子性) | 每次逻辑操作对应一个 git commit |
| Consistency(一致性) | 每次操作后运行验证 |
| Isolation(隔离性) | 多 Agent 并发时用分支或独立进度文件 |
| Durability(持久性) | 关键知识必须写入 git 追踪的文件 |
Feature List 作为 Harness 基元
Feature List 不是给人看的备忘录,而是整个 Harness 的基础结构——调度器靠它选任务、验证器靠它判完成、交接器靠它生成报告。采用 JSON 格式(而非 Markdown)因为模型对 JSON 的不当修改倾向更低。
状态机:每个功能项有四个状态:not_started → active → blocked / passing。PASS 状态门控:功能只能通过验证命令成功执行才能从 active 进入 passing——唯一的上行路径,不可逆。
上下文焦虑的应对策略
| 策略 | 机制 | 优势 | 劣势 |
|---|---|---|---|
| Compaction(压缩) | 在原位总结前面对话,上下文缩短后继续 | 保持连续性 | 不提供干净的 slate,焦虑可能持续 |
| Context Reset(重置) | 清空上下文,用新 agent 实例 + 结构化交接文档 | 干净的 slate | 编排复杂度↑、token 开销↑ |
时效性陷阱
Harness 的假设会过期。Anthropic 发现 Sonnet 4.5 需要 context reset 来应对上下文焦虑,但 Opus 4.5 上这个行为消失了——重置变成了死重。每月挑一个 Harness 组件,禁用后跑基准任务——若结果未退化则永久移除。
来源:Anthropic: Scaling Managed Agents(2026.05)
Anthropic 的 Managed Agents 借鉴了操作系统的设计哲学:OS 通过虚拟化硬件(进程、文件)来容纳"尚未设想的程序"。Managed Agents 将 agent 组件虚拟化为三个核心接口:
| 接口 | 职责 | 类比 |
|---|---|---|
| Session | 一切已发生事件的追加日志 | 进程的地址空间 |
| Harness | 调用 Claude 并路由工具调用的循环 | 调度器 |
| Sandbox | 执行代码和编辑文件的环境 | 隔离的执行环境 |
Pets vs Cattle
早期所有组件共享一个容器——session、harness、sandbox 全部耦合,容器变成"宠物"(挂了就得抢救)。解耦后:harness 通过 execute(name, input) → string 调用 sandbox。容器变成了"牲畜"——挂了就起一个新的。Harness 本身也是牲畜——崩溃后新的 harness 可以通过 wake(sessionId) 恢复。
性能收益
解耦大脑和双手:p50 首 token 延迟(TTFT)降低约 60%,p95 降低超过 90%。因为不再需要为每个 session 提前 provision 容器。
来源:Awesome Harness Engineering + OpenDev 论文 + LangChain
| # | 模式 | 核心思想 | 来源 |
|---|---|---|---|
| 1 | PEV 循环 | Plan → Execute → Verify 闭环,Verify 结果反馈给 Plan | AugmentCode |
| 2 | 多 Agent 角色分离 | 不同 agent 负责规划、执行、评估,避免单 agent 自己审自己 | Anthropic |
| 3 | Ralph Loop(自验证循环) | Agent 写代码 → 自建测试 → 运行测试 → 修复 → 重复直到通过 | LangChain |
| 4 | 功能清单驱动的 WIP 门控 | 任何时刻只有一个 feature 处于 active,验证通过才能接下一个 | WalkingLabs |
| 5 | 上下文工程优先 | 先解决 agent"知道什么",再解决"怎么行动"。知识邻近性原则 | OpenDev |
| 6 | 渐进式指令披露 | 大文档拆为专题小文件,agent 按需读取而非一次性注入全部 | WalkingLabs |
| 7 | Sprint Contract | 编码前 Generator 和 Evaluator 协商短期协议,定义范围和验证标准 | Anthropic |
| 8 | 三层终止验证 | 语法+静态分析 → 运行时行为 → 系统级确认,逐层通过不许跳级 | WalkingLabs |
| 9 | 验证金字塔 | DST(确定性模拟测试)为核心,TLA+/Kani 形式化保证,telemetry 经验验证 | Datadog |
| 10 | Doom Loop 检测与衰减注入 | 追踪文件编辑次数/迭代次数,超阈值注入"重新评估策略"提醒 | OpenDev |
| 11 | 工具注册与懒发现 | 通过注册表管理工具,MCP 按需发现而非启动时全量加载 | MCP 协议 |
| 12 | 跨会话记忆系统 | 持久化 agent 学到的知识,未来会话恢复。原则:entropy-reduction + minimal sufficiency | LangChain / OpenDev |
规则文件标准(跨工具)
| 工具 | 文件 | 作用域 |
|---|---|---|
| OpenAI Codex | AGENTS.md | 层级化(Git root → CWD) |
| Claude Code | CLAUDE.md | 项目根 + ~/.claude |
| Cursor | .cursor/rules/*.mdc | 项目级 |
| GitHub Copilot | .github/copilot-instructions.md | 仓库级 + 路径特定 |
| 通用 | SKILL.md (OpenDev) | 三层技能系统 |
验证工具链
| 层级 | 工具 | 用途 |
|---|---|---|
| 计算型验证 | ESLint / semgrep | 结构/风格 linter |
| ArchUnit | 架构边界测试 | |
| mypy / tsc | 类型安全 | |
| 模拟测试 | DST | 确定性模拟 + 故障注入 |
| 形式化验证 | TLA+ / Kani | 规格建模 / 有界模型检查 |
| 基准测试 | SWE-bench Verified / Terminal Bench 2.0 / OSWorld | Agent 评估 |
MCP 在 Harness 中的角色
MCP(Model Context Protocol)作为 Harness 和外部工具系统之间的标准化连接层,核心价值是将工具发现从"启动时全量加载"变为"运行时按需发现"——缓解上下文膨胀的关键机制。团队可通过 MCP Servers 接入内部 API、数据库、ticket 系统等,而 agent 不需要在初始上下文中预加载所有工具描述。
来源:WalkingLabs 课程 + Martin Fowler
每个失败都应归因到特定层:
- Task specification(任务规范层):任务定义是否清晰、Definition of Done 是否明确
- Context provision(上下文提供层):agent 是否能感知必要的项目信息
- Execution environment(执行环境层):依赖、工具版本、环境完整性
- Verification feedback(验证反馈层):是否有测试、lint、验证命令
- State management(状态管理层):跨会话状态是否丢失
Martin Fowler 在此基础上增加了Steering Loop(转向循环):每当问题反复出现,就改进前馈和反馈控制。人类的工作不是审查每一行代码,而是设计、维护和迭代 harness 本身。
Natural-Language Agent Harnesses(清华 / 哈工大深圳,arxiv:2603.25723)
提出将 harness 逻辑从硬编码变为可编辑的自然语言文本(NLAH),由共享的 Intelligent Harness Runtime 解释执行。关键发现:NLAH 在 SWE-bench Verified(73%)、Terminal Bench 2.0(53.9%)、OSWorld(46.3%)达到与代码 harness 相当的性能,但静态策略文本缩短 3-10 倍。Harness 设计从此可以版本控制、code review、转移复用。
OpenDev:终端原生 Coding Agent(arxiv:2603.05344)
第一个系统性的终端原生 agent 技术报告(Rust 实现)。提出 Scaffolding + Harness 的两阶段边界定义。五项贡献:per-workflow LLM 配置、Extended ReAct、事件驱动提醒、五层安全、上下文工程优先。证明复合 AI 系统架构的工程可行性。
Meta REA / KernelEvolve:生产级 Harness
Ranking Engineer Agent 实现多日 ML pipeline 自动化,休眠-唤醒检查点可恢复被中断的 6 小时任务。KernelEvolve 将 kernel 优化变成搜索问题——60%+ inference throughput 提升(NVIDIA GPU),25%+ training throughput 提升(MTIA silicon)。证明 harness-first 设计的商业价值:weeks → hours。
| 维度 | Harness Engineering | LangChain / AutoGPT | Copilot | Managed Agents |
|---|---|---|---|---|
| 核心关注 | 工程基础设施 | 编排/工作流 | IDE 辅助 | 托管式 agent 运行 |
| 模型关系 | 模型中立 | 模型可替换 | 模型固化 | 模型绑定(Claude) |
| 验证机制 | 内置 + 显式 | 弱 | 弱 | 由 harness 实现 |
| 状态管理 | 持久化 + 跨会话 | 内存内 | 无 | Session 日志独立 |
| 适用场景 | 长期产品开发 | 探索/原型 | 实时辅助 | 生产级长时任务 |
这些并非互斥。Claude Code 本身就是一个优秀的 harness,Managed Agents 是一个 meta-harness。团队通常在预置 harness 上叠加自定义层。
过度适配警告
LangChain 发现模型在特定 harness 中训练会产生过度适配。Terminal Bench 2.0 上,Opus 4.6 在 Claude Code 中得分远低于在其他 harness 中——"最佳 harness 不是模型 post-training 时用的那个"。
来源:OpenAI: Harness engineering
2025 年 OpenAI 用 Codex 从空 git 仓库构建完整内部产品。五个月后,约 100 万行代码,三名工程师开关合并约 1500 个 PR,平均每人每天 3.5 个。人类从不直接写代码。工程师的主要工作变成了设计环境、表达意图、构建反馈循环。
接地气的案例
某团队用 Claude Sonnet 为中等规模 Python Web 应用(FastAPI + PostgreSQL + Redis,~15K 行)添加 API 端点。
只给一句话指令:40% 上下文用于探索仓库、代码不符合错误处理模式、旧版 SQLAlchemy 语法、运行时错误。
加入 AGENTS.md + 显式验证命令 + 架构决策记录:三次独立运行全部成功,上下文效率提升约 60%。
他们没有换模型。他们改变了 harness。
Harness Engineering 的核心洞见是:模型能力和执行可靠性是两回事。纯种马仍然需要一个好鞍子。
从更宏观的视角看,Anthropic 的 Managed Agents 揭示了一个深层设计哲学:操作系统的抽象(进程、文件)比任何一代硬件都长寿。同样,Harness 的接口设计应该比任何一代模型都持久。Faros AI 的数据表明,AI 生成代码的 blast radius 正在扩大,而审查疲劳也在加剧——这恰恰是 Harness Engineering 最有价值的场景。
立即可执行的高 ROI 步骤:
- 在项目根目录创建 AGENTS.md 或 CLAUDE.md(总长 50-200 行,硬约束不超过 15 条)
- 为每个任务写明确的 Definition of Done——机器可验证的完成条件
- 建立 Diagnostic Loop——每次失败记录归因层,几轮后就知道瓶颈在哪
- 使用 claude-progress.md 实现跨会话状态持久化
- 区分前馈(指南)和反馈(传感器),两者缺一不可
- 定期审查 harness 时效性——模型升级后哪些假设已过期
参考来源
- WalkingLabs: Learn Harness Engineering 课程(12 Lectures + 6 Projects)
- Birgitta Böckeler: Harness engineering for coding agent users(Martin Fowler, 2026.04)
- Anthropic: Scaling Managed Agents — Decoupling the brain from the hands(2026.05)
- OpenAI: Harness engineering: leveraging Codex in an agent-first world
- Anthropic: Effective harnesses for long-running agents
- Anthropic: Harness design for long-running application development
- Faros AI: Harness Engineering — Agent = Model + Harness
- LangChain: The Anatomy of an Agent Harness
- Awesome Harness Engineering 资源列表
- Natural-Language Agent Harnesses(arxiv:2603.25723)
- Building AI Coding Agents for the Terminal(arxiv:2603.05344)