ESC
输入关键词搜索文章
目录

Harness Engineering:如何让 AI 编程 Agent 可靠地工作

Harness Engineering 深度调研
Agent = Model + Harness
12理论讲座
6实战项目
5Harness 子系统
12设计模式
引言:为什么模型能力 ≠ 执行可靠性

你订阅了 Claude Pro,手握 GPT-4o API key,SWE-bench 排行榜数字倒背如流。某天你终于把一个真实项目交给 AI agent,信心满满。结果呢?它加了一个功能却破坏了测试,修复了一个 bug 却引入两个新的,运行了 20 分钟骄傲地宣布"完成了"——然后你一看代码,根本不是你要求的。

你的第一反应?"模型还不够好,升级吧。"停一下。截至 2025 年底,SWE-bench Verified 上最强的编程 agent 正确率大约只有 50-60%,而且那是在精心挑选的任务上。切换到你的日常开发环境——模糊的需求、没有测试、散布各处的隐式业务规则——这个数字只会更低。

核心洞见:同一模型在裸环境和完整 harness 中产生根本不同的输出。模型没有变,环境变了。公式化表达:Agent = Model + Harness。模型决定"能不能想",Harness 决定"能不能做对"。

2026 年 3 月,LangChain 工程团队在 Terminal Bench 2.0 排行榜上从第 30 名跃升至第 5 名,完全没有更换底层模型——所有提升都来自 harness 的优化。这是 Harness Engineering ROI 的最直接证据。

什么是 Harness?

Harness(挽具/驾驭框架)泛指模型权重之外的一切工程基础设施——指令、工具、环境、状态管理、验证反馈。类比:纯种马没有鞍子也能骑,但骑不远、骑不快。Harness 就是那个鞍子。

如果不是模型权重,就是 Harness。

演进背景
从 Prompt 到 Context 到 Harness:AI 工程的三个阶段

Faros AI 的 2026 年工程报告将 AI 工程成熟度划分为三个阶段:

阶段时期核心问题输出形式
Prompt Engineering2022–2023怎么跟模型说话代码片段、自动补全
Context Engineering2024–2025模型知道什么文件级编辑、上下文感知更新
Harness Engineering2026模型被允许怎么行动和自我修正端到端自主任务执行与验证

Mitchell Hashimoto(HashiCorp 联合创始人)在 2026 年初提出的核心原则:每当发现 agent 犯错,就花时间工程化一个解决方案,让 agent 永远不再犯同样的错。大多数时候,这个解决方案就是对 harness 的改进。

Context Engineering 与 Harness 的关系

两者经常被混淆,但关注点不同。Context Engineering 解决"模型知道什么"——如何把正确的信息送入模型的上下文窗口(RAG、MCP、文件索引等)。Harness Engineering 解决"模型怎么行动"——在拥有信息的基础上,如何约束、验证、追踪 agent 的行为。Context 是 feedforward 的一部分,Harness 是完整的 feedforward + feedback 闭环。

核心概念
五子系统模型

来源:WalkingLabs 课程 Lecture 02

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任何时刻只允许一个功能处于活跃状态。功能完成率与代码行数呈负相关
理论基础
Martin Fowler 的前馈/反馈控制论

来源: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 推理型

类型特点速度确定性典型实现
ComputationalCPU 执行毫秒~秒lint、类型检查、ArchUnit
InferentialGPU/NPU,语义分析慢、贵非确定性AI 代码审查、LLM as Judge

最佳策略是将计算型传感器作为基线、推理型传感器作为补充。特别有力量的是那些为 LLM 消费优化的自定义 lint 消息——包含修正指令的 lint 输出,等于一种正向的"prompt injection"。

三大治理维度

维度目标工具成熟度当前可靠性
Maintainability内部代码质量高——计算型传感器可靠
Architecture Fitness架构特征中——需团队定制
Behaviour功能行为正确性低——当前最大缺口
房间里的大象:计算型传感器能可靠捕获结构问题,LLM 可部分处理语义判断。但误诊问题、过度工程、误解指令等高影响问题——目前没有任何传感器能可靠捕获,这是人类审查仍不可替代的原因。
Agent 失败模式
为什么强大的 Agent 仍然会失败

来源:WalkingLabs Lecture 01 + Anthropic

Anthropic 的对照实验

同一个提示("构建一个 2D 复古游戏制作工具")、同一个模型(Opus 4.5):

实验条件耗时成本结果
裸环境,无支持20 分钟$9游戏核心功能完全不工作
完整 harness(三 agent 架构)6 小时$200游戏可玩

六种典型失败模式

  1. 任务定义模糊:没有清楚定义任务边界,agent 靠猜测行事。你说"加一个搜索功能",agent 的理解和你的完全不同。
  2. 隐式架构规则:项目约定只存在于工程师脑中。Agent 看不见的信息 = 不存在的信息。
  3. 环境缺陷:依赖不完整、工具版本错误,agent 在配置上消耗大量上下文窗口。
  4. 无法验证:没有测试、没有 lint,agent 在"感觉可以"时收尾——产生验证缺口
  5. 上下文焦虑:agent 感知上下文快用完时仓促收尾、跳过验证、选择简单解法。Anthropic 独家发现的独特现象。
  6. 跨会话状态断裂:长任务中上一 session 的所有发现都丢失,新 session 需要重新探索。

核心原则

当事情失败时,不要第一时间换模型——先检查 harness。就像汽车抛锚时,你不会首先怀疑发动机,而是先检查有没有汽油。

核心架构
三 Agent 架构:Planner / Generator / Evaluator

来源: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 轮调参后评判才趋于合理。

架构简化:Anthropic 在 Opus 4.6 上尝试移除 sprint 结构。发现没有 Planner → Generator scope 不足;没有 Evaluator → 质量无法保证。Sprint contract 协商仍然是性能的重要支撑。核心教训:harness 中的每个组件都编码了一个关于"模型自己做不到什么"的假设,这些假设需要被压力测试。
状态管理
ACID 原则与跨会话持久化

来源:WalkingLabs Lectures 06-08

课程将数据库的 ACID 原则类比到 agent 状态管理:

原则在 Agent 状态管理中的含义
Atomicity(原子性)每次逻辑操作对应一个 git commit
Consistency(一致性)每次操作后运行验证
Isolation(隔离性)多 Agent 并发时用分支或独立进度文件
Durability(持久性)关键知识必须写入 git 追踪的文件

Feature List 作为 Harness 基元

Feature List 不是给人看的备忘录,而是整个 Harness 的基础结构——调度器靠它选任务、验证器靠它判完成、交接器靠它生成报告。采用 JSON 格式(而非 Markdown)因为模型对 JSON 的不当修改倾向更低。

状态机:每个功能项有四个状态:not_startedactiveblocked / passingPASS 状态门控:功能只能通过验证命令成功执行才能从 active 进入 passing——唯一的上行路径,不可逆。

上下文焦虑的应对策略

策略机制优势劣势
Compaction(压缩)在原位总结前面对话,上下文缩短后继续保持连续性不提供干净的 slate,焦虑可能持续
Context Reset(重置)清空上下文,用新 agent 实例 + 结构化交接文档干净的 slate编排复杂度↑、token 开销↑

时效性陷阱

Harness 的假设会过期。Anthropic 发现 Sonnet 4.5 需要 context reset 来应对上下文焦虑,但 Opus 4.5 上这个行为消失了——重置变成了死重。每月挑一个 Harness 组件,禁用后跑基准任务——若结果未退化则永久移除。

架构演进
Anthropic Managed Agents:将大脑与双手解耦

来源: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 容器。

设计模式
12 种 Harness 设计模式

来源:Awesome Harness Engineering + OpenDev 论文 + LangChain

#模式核心思想来源
1PEV 循环Plan → Execute → Verify 闭环,Verify 结果反馈给 PlanAugmentCode
2多 Agent 角色分离不同 agent 负责规划、执行、评估,避免单 agent 自己审自己Anthropic
3Ralph Loop(自验证循环)Agent 写代码 → 自建测试 → 运行测试 → 修复 → 重复直到通过LangChain
4功能清单驱动的 WIP 门控任何时刻只有一个 feature 处于 active,验证通过才能接下一个WalkingLabs
5上下文工程优先先解决 agent"知道什么",再解决"怎么行动"。知识邻近性原则OpenDev
6渐进式指令披露大文档拆为专题小文件,agent 按需读取而非一次性注入全部WalkingLabs
7Sprint Contract编码前 Generator 和 Evaluator 协商短期协议,定义范围和验证标准Anthropic
8三层终止验证语法+静态分析 → 运行时行为 → 系统级确认,逐层通过不许跳级WalkingLabs
9验证金字塔DST(确定性模拟测试)为核心,TLA+/Kani 形式化保证,telemetry 经验验证Datadog
10Doom Loop 检测与衰减注入追踪文件编辑次数/迭代次数,超阈值注入"重新评估策略"提醒OpenDev
11工具注册与懒发现通过注册表管理工具,MCP 按需发现而非启动时全量加载MCP 协议
12跨会话记忆系统持久化 agent 学到的知识,未来会话恢复。原则:entropy-reduction + minimal sufficiencyLangChain / OpenDev
Datadog 的核心命题如果 harness 足够紧,LLM 可以自由探索,结果仍然可信。实操案例:redis-rust(87% 内存优化)、Helix(Kafka 兼容流引擎,93% 峰值磁盘吞吐),全部由 agent 在形式化验证的 harness 内自主完成。
工具生态
Harness 工具链全景

规则文件标准(跨工具)

工具文件作用域
OpenAI CodexAGENTS.md层级化(Git root → CWD)
Claude CodeCLAUDE.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 / OSWorldAgent 评估

MCP 在 Harness 中的角色

MCP(Model Context Protocol)作为 Harness 和外部工具系统之间的标准化连接层,核心价值是将工具发现从"启动时全量加载"变为"运行时按需发现"——缓解上下文膨胀的关键机制。团队可通过 MCP Servers 接入内部 API、数据库、ticket 系统等,而 agent 不需要在初始上下文中预加载所有工具描述。

方法论
Diagnostic Loop:五层故障归因

来源:WalkingLabs 课程 + Martin Fowler

每个失败都应归因到特定层:

  1. Task specification(任务规范层):任务定义是否清晰、Definition of Done 是否明确
  2. Context provision(上下文提供层):agent 是否能感知必要的项目信息
  3. Execution environment(执行环境层):依赖、工具版本、环境完整性
  4. Verification feedback(验证反馈层):是否有测试、lint、验证命令
  5. State management(状态管理层):跨会话状态是否丢失

Martin Fowler 在此基础上增加了Steering Loop(转向循环):每当问题反复出现,就改进前馈和反馈控制。人类的工作不是审查每一行代码,而是设计、维护和迭代 harness 本身

新鲜会话测试(Fresh Session Test):开一个全新的 Agent 会话,只给它看仓库内容,问五个问题——这是什么系统?结构怎样?怎么运行?怎么验证?当前进度?能回答多少个,就说明 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 vs 其他框架
维度Harness EngineeringLangChain / AutoGPTCopilotManaged 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 百万行代码实验

来源: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 步骤:

  1. 在项目根目录创建 AGENTS.md 或 CLAUDE.md(总长 50-200 行,硬约束不超过 15 条)
  2. 为每个任务写明确的 Definition of Done——机器可验证的完成条件
  3. 建立 Diagnostic Loop——每次失败记录归因层,几轮后就知道瓶颈在哪
  4. 使用 claude-progress.md 实现跨会话状态持久化
  5. 区分前馈(指南)和反馈(传感器),两者缺一不可
  6. 定期审查 harness 时效性——模型升级后哪些假设已过期