Harness Engineering - 是什么、怎么设计、往哪走

Harness Engineering - 是什么、怎么设计、往哪走

本文核心知识来自addyosmani 的文章 Harness Engineering

前言

LangChain 的 Viv 有句话:

Agent = Model + Harness。如果你不是模型,那你就是 Harness。

原始大模型不是 Agent。只有赋予它工具、反馈循环和约束,它才可靠。这就是 Harness Engineering 要解决的问题。

本文从三个角度展开:Harness 是什么、怎么设计、往哪走

什么是harness?

Viv 的一句话:

Agent = Model + Harness. If you're not the model, you're the harness.

harness是指除模型本身之外的所有代码、配置和执行逻辑 。原始模型并非agent。只有当harness赋予它状态、工具执行、反馈循环和可强制执行的约束时,它才成agent。

具体而言,harness包括:

  • 指令与行为约束层 :System prompts, CLAUDE.md, AGENTS.md, skill , subagent prompts;

这些内容定义 Agent 的角色、行为规范以及项目上下文。

  • 能力扩展层:Tools, skills, MCP servers, and their descriptions;

  • 运行基础设施:filesystem, sandbox, browser

这些决定Agent 在哪里运行,以及它拥有怎样的执行能力。

  • **编排层: **subagent spawning, handoffs, model routing

一个复杂开发任务, 如何拆分任务、如何分配 Agent、如何传递上下文,都属于 Harness 的职责。

  • Hooks 和 Middleware

用于确定性执行,不完全依赖 Model 自己决定下一步,而是通过系统规则约束 Agent 行为。例如: Agent 修改代码 -> Hook 自动触发 -> 运行 lint/test ->反馈错误 -> Agent 修复

  • 可观测性:logs, traces, cost and latency metering

Filesystem 与 Git:持久化状态

Filesystem 是 Agent Harness 中最基础的能力之一,但因为它很普通,往往容易被低估。

Model 只能直接操作 Context 中的信息。如果没有 Filesystem,Agent 本质上只能在聊天窗口里复制粘贴内容,而无法形成真正的工作流。

引入 Filesystem 后,Agent 获得了存放代码、数据、文档的工作空间; 能将中间结果移出 Context,减少上下文压力;

在此基础上加入 Git,则进一步提供:版本管理,错误回滚,实验分支。

实际上,大多数 Harness 能力最终都会依赖 Filesystem:

Filesystem 是 Agent 持久化状态和持续工作的基础设施。

Bash 和 Code Execution:通用能力工具

当前主流 Agent 的执行方式通常是 ReAct Loop:

Plain 复制代码
Reason
 ↓
Action / Tool Call
 ↓
Observation
 ↓
Repeat

Simon Willison 认为,现在的 Agent 已经非常擅长执行 Shell 命令,大量任务都可以通过少量精心设计的命令完成。

因此:

Bash + Code Execution 正逐渐成为 Agent 最通用的工具接口。

这类似于:

给一个人几个专用厨房工具;

或者直接给他一个完整厨房。

后者虽然复杂,但提供了更强的自主解决问题能力。

Simon Willison是 Django 框架的联合创始人,也是当下 AI 应用开发领域最具影响力的独立实践者和意见领袖。他从 Python Web 开发顶流成功转型,目前专注于 LLM 应用、提示工程和 AI Agent 安全研究,凭借高频率的实战博客和开源工具(如 llm、Datasette),在 AI 编程圈拥有极高的声誉。

Sandbox:让 Agent 安全执行

Bash 只有在安全环境里运行才有价值。直接在个人电脑上执行 agent生成的代码存在风险。

sandbox 为 agent 提供隔离的运行环境,使其可以:执行 code,检查文件,安装 依赖,验证工作成果,通过 allow-list 限制 commands,使用 network isolation,按需创建或销毁环境。

优秀 sandbox 还应具有良好默认配置,例如预装 language runtimes、packages、Git、test CLIs 和 headless browser。browser、logs、screenshots 和 test runners 使 agent 能观察自己的成果,从而闭合 self-verification loop。

Memory 和 Search:让 Agent 持续积累知识

Model 的知识来源主要有两个:

  1. Training weights

  2. Current Context

当无法修改 Model 权重时,扩展知识最主要的方法就是:

Context Injection

文件系统成为一种简单但有效的 Memory 机制。

文件系统再次成为基础。AGENTS.md 等 memory files 可以在每次启动时注入 context;agent 更新这些文件后,harness 在后续 session 中重新加载,从而让一个 session 中获得的知识传递到下一个 session。这是比较粗糙,但确实有效的 continual learning。

对于 模型训练之后的信息,例如新仓库版本、最新 文档 或当天数据,则需要 web search等 MCP tools。这些能力应当直接纳入 harness,而不是每次都由用户临时提供。

Battling context rot

context rot 指的是:随着 context window 不断被填满,model 的 reasoning 和任务完成能力逐渐下降。

context 是稀缺资源,因此 harness 在很大程度上就是 context engineering 的 delivery mechanism。常见技术包括:

Compaction

当 context 接近上限时,harness 对旧内容进行总结,并把部分信息 offload 到其他位置,让 agent 能继续工作,而不是等 API 因超出限制而失败。

Tool-call offloading

两千行 logs 之类的大型 tool result 会占据大量 context,却未必带来同等信息量。harness 可以只保留 result 的开头与结尾,把完整内容存入 文件系统,让 agent 在真正需要时读取。

Skills with progressive disclosure

如果启动时把所有 tools 和 MCP instructions 全部放入 context,agent 还未行动,性能就已经受到影响。skills 可以只在任务需要时暴露相关 instructions 和 tools。

Full context resets

Anthropic 在 long-running harness 中还使用完整的 context reset:结束当前 session,根据简洁、结构化的 hand-off 文件 重建一个新 session。

对于特别长的任务,仅靠 compaction 并不足够。有时需要像给新工程师进行 onboarding 一样,用一份清晰 brief 重新开始。

Hooks:强制执行层

Hooks 是区分 "告诉 Agent 应该做什么""系统强制 Agent 做什么" 的关键机制。

它本质上是一段在 Agent 生命周期特定节点自动执行的脚本,例如:

  • Tool Call 前;

  • 文件修改后;

  • Commit 前;

  • Session 启动时。

Hooks 适合处理那些 Agent 不应该忘记、但又经常遗漏的事情。例如:

  • 每次修改代码后自动执行 Type Check、Lint、Test;

  • 阻止危险命令(如 rm -rfgit push --forceDROP TABLE);

  • 提交代码或创建 PR 前要求人工审批;

  • 写入文件后自动格式化代码。

HumanLayer 提出的一个重要原则是:

Success is silent, failures are verbose.(成功保持安静,失败提供详细反馈)

也就是说,验证通过时不要额外消耗 Context;只有失败时,才将错误信息注入 Agent Loop,让 Agent 根据反馈自动修正。

因此,Hooks 本质上是在 Harness 中建立一个低成本、高反馈的控制机制

不依赖 Agent 自觉遵守规则,而是通过系统约束和反馈循环,让 Agent 在错误发生时能够自动发现并修复。

AGENTS.md 与 Tool 选择

AGENTS.md 是 Agent Harness 中高杠杆的配置点,会在每轮对话中注入 System Prompt,用于定义项目规则(如代码规范、测试方式、目录约束等)。

设计原则:

  • 保持简短:它应该像 Checklist,而不是完整的 Style Guide。规则越多,单条规则的注意力越低。

  • 基于真实问题迭代:每条规则都应该来自过去的错误或明确约束,而不是提前猜测。

Tool 设计同样如此。Tool 的 Name、Description、Schema 都会进入 Prompt,因此少量高质量 Tool 往往优于大量重复 Tool。

同时,Tool Description 本身也是 Prompt 的一部分,MCP Server 的内容会直接影响 Agent 行为,因此 Tool 设计不仅决定能力,也决定安全边界。

核心原则:

少而精的规则 + 清晰的 Tool 定义,比堆积 Instructions 和工具更能提升 Agent 可靠性。

从行为反推 Harness 设计

Viv 提出的一个最有价值的设计方法是:

不要从"我要构建什么 Harness"出发,而应该从"希望 Agent 表现出什么行为"出发,再反推需要哪些 Harness 能力。

即: 目标行为 → Harness 设计

每一个 Harness 组件,都应该对应 Model 本身无法可靠完成的一类行为。

例如:

  • 需要持久化处理真实数据

    → Filesystem + Git

  • 需要编写并执行代码

    → Bash + Code Execution

  • 需要安全执行任务

    → Sandbox + 默认工具环境

  • 需要记住新知识

    → Memory Files、Web Search、MCP

  • 需要处理长 Context

    → Compaction、Tool Offloading、Skills

  • 需要完成长期任务

    → Ralph Loop、Planning、Verification

这种设计方式的价值在于:每个 Harness 组件都有明确职责。

如果一个组件无法回答:

"它解决了 Agent 的什么具体行为问题?"

那么它很可能是不必要的复杂度。

核心原则:

不要为了堆叠 Harness 能力而设计 Harness,而应该围绕 Agent 想要实现的行为,反向构建所需能力。

Long-horizon Execution:长程任务

长程任务是 Agent 最具价值、也是最难实现的能力之一。目前 Model 仍容易出现:

  • Early stopping(提前结束);

  • 复杂任务拆解能力不足;

  • 跨多个 Context Window 后失去连续性。

因此,需要通过 Harness 设计来解决这些问题。

**Ralph Loop **的核心思路是:当 Agent 试图结束任务时,由 Hook 拦截退出,并将原始目标重新注入新的 Context Window,迫使 Agent 继续执行。每轮 iteration 使用新的 Context,但通过文件系统读取上一轮 State,从而将 Single-session Agent 转变为 Multi-session Agent。

**Planning **则是让 Agent 先将目标拆解为多个步骤,并保存为 Plan File。执行过程中,Agent 根据计划推进,每完成一步,通过 Self-verification 检查结果;如果失败,Hook 将错误信息反馈回 Agent,让其修正。

此外,Anthropic 的实践表明,将 Generator(生成)Evaluator(评估) 分离,通常比让 Agent 自我评估更可靠,因为 Agent 往往会高估自己的结果。

类似的模式还有 Sprint Contract:在开始执行前,先明确"完成"的标准(Done Condition),减少任务范围漂移(Scope Drift)。

核心思想:

长程 Agent 的关键不是单纯提升 Model 能力,而是通过 Planning、Verification 和 Feedback Loop,让 Harness 帮助 Agent 持续完成复杂任务

Harness 决定 Agent 能力的释放上限

模型能力决定 Agent 的理论上限,而 Harness 决定这些能力能够被释放多少

很多开发者遇到 Agent 失败时,会默认认为:

Agent 表现不好,是因为 Model 不够强,需要等待下一代模型。

但 Harness Engineering 认为,很多问题并不是 Model 的限制,而是 Harness 设计不足。

例如:

  • Agent 不知道项目规范 → 将规则加入 AGENTS.md

  • Agent 执行危险操作 → 通过 Hook 和 Permission Gate 拦截;

  • Agent 在复杂任务中迷失 → 引入 Planner / Executor 分离;

  • Agent 生成错误代码 → 加入 Type Check、Test 等 Feedback Loop。

正如 HumanLayer 所说:

"这不是 Model 问题,而是配置问题。"

一个典型案例是 Terminal Bench 2.0:同一个 Claude Opus 4.6 模型,在不同 Harness 环境下表现差异巨大。Viv 的团队仅通过优化 Harness,就将 Coding Agent 排名从 Top 30 提升到 Top 5。

他们没有更换 Model,而是优化:Tools、System Prompt、Verification、Feedback Loop。

这说明当前 Agent 的关键瓶颈,往往不是 Model 能力不足,而是 Model 与实际应用之间存在 Harness Gap

未来 Agent Engineering 的竞争,不只是等待更强的模型,而是通过更优秀的 Harness,让现有 Model 发挥更接近理论上限的能力。

Harness 不会消失,它会移动

一种常见但过于简单的观点是:随着 Model 能力不断增强,Harness 的重要性会逐渐降低。

但实际情况更加复杂。Model 的进步确实会让部分旧的 scaffolding(辅助机制)失去必要性。例如,Opus 4.6 显著缓解了 context anxiety(上下文焦虑)问题。过去,Sonnet 4.5 在接近 context limit 时,容易因为误判剩余上下文空间不足而提前结束任务。随着这一能力缺陷被 Model 自身修复,原本用于缓解该问题的 anxiety-mitigation scaffolding(焦虑缓解机制)便可以被移除。

然而,这并不意味着 Harness 变得不重要,而是意味着 Harness 的关注点会向新的复杂问题迁移。

图中显示的就是

  • GEN N: Harness: 规划 + 工具 + 验证

  • GEN N+1: Model吸收: 规划 + 验证 ; Harness新增: 长期记忆 + 多Agent

  • GEN N+2: Model吸收更多 ; Harness新增: 动态Context + 自调试 ;

模型越来越聪明,会吞掉旧 Harness 的"智能部分";但 Harness 不会消失,而会向更复杂的系统工程方向发展:记忆、协作、评估、上下文管理、可靠执行

Harness-as-a-Service(HaaS)

Viv 提出 Harness-as-a-Service :Agent 开发正在从 LLM API 转向 Harness API

过去:

LLM API 只提供模型能力,开发者需要自己实现 Loop、Tool Calling、State、Approval Flow。

现在:

Harness API(如 Claude Agent SDK、Codex SDK、OpenAI Agents SDK)直接提供 Agent Runtime,包括 Loop、Tools、Context Management、Hooks 和 Sandbox,开发者只需进行业务定制。

Agent 开发模式也从:

自己构建 Agent Runtime

转变为:

选择 Harness Framework,围绕 System Prompt、Tools、Context、Subagents 四个核心进行优化。

这样 Agent 出问题时,不需要重新造一个 Agent,而是在已有 Harness 上迭代配置。

Viv 的观点:

Good agent building is an exercise in iteration. You can't do iterations if you don't have a v0.1.

优秀 Agent 不是一次设计出来的,而是在 v0.1 基础上,通过持续反馈不断优化 Harness。

生产环境中的 Harness 形态

目前公开资料中,对成熟 Harness 架构描述最清晰的案例之一,是 Fareed Khan 对 Claude Code 架构的拆解。

Claude Code 的整体架构可以分为多个层:

  • Input Layer(输入层):负责用户交互,包括 User Interface、Session Manager、Permission Gate;

  • Knowledge Layer(知识层):负责上下文和知识管理,包括 Skill Registry、Context Compressor、Task Graph、Memory Store;

  • Integration Layer(集成层):负责 MCP Runtime 和外部服务接入;

  • Execution Layer(执行层):负责 Tool Dispatch、Streaming Runtime、Prompt Cache;

  • Output Layer(输出层):返回经过验证的任务结果;

  • Observability Layer(可观测层):包括 Event Bus 和 Background Executor;

  • Multi-agent Layer(多 Agent 层):负责 Subagent Spawn、Mailbox、FSM Protocol、Autonomous Board 和 Worktree Isolator。

整个系统的核心是 Agent Loop,各个层围绕它提供能力支持。

前文讨论的 Harness 概念,几乎都能在这张架构图中找到对应组件:

  • Context Injection → Knowledge Layer;

  • Loop State → Memory Store 和 Worktree Isolator;

  • Destructive-action Hooks → Permission Gate;

  • Subagent Context Firewall → Multi-agent Layer;

  • Tool Dispatch Registry → MCP Servers 和 Bash 的统一入口。

Khan 的观点与 Viv 的核心思想一致,只是通过一个真实产品进行验证:

Claude Code 的演进,不仅取决于底层 Model 能力,更取决于围绕 Model 构建的 Harness。

换句话说,优秀 Agent 的竞争,不只是"使用什么模型",而是"如何构建让模型发挥能力的运行环境"。

结语

总结开头的问题harness是什么、怎么设计、往哪走;

从最简单的来看,**Agent = Model + Harness。**harness就是除了模型之外的所有东西,包括工具,约束,提示词等,有了这些模型之外的东西,才组成了能帮我们稳定完成任务的agent;

而我们需要设计harness的目的正是出于,模型的输出本质是概率性事件harness是我们对模型不确定性,不信任部分的具像化,所以我们也应该从这些不信任的行为反推harness的设计;

对于harness往哪走,随着模型的发展,有一部分harness的能力会被模型吸收,但是在这过程中,又会有新的问题需要harness解决;

相关推荐
武子康1 小时前
GPT-5.6 Sol 的 ARC-AGI-3 分数为何翻近三倍:Agent 评测必须记录整套运行合同
人工智能·chatgpt·agent
VIP_CQCRE2 小时前
用 Ace Data Cloud 搭建自动化内容营销系统:让 AI 每天搜索热点、写文章、配图并发布
ai·自动化·内容营销·mcp·acedatacloud
weixin_431600442 小时前
做 Agent 会用到的 Node API(4):取消与 AbortController
前端·学习·ai·agent·ai编程
苏灿烤鱼2 小时前
今日 GitHub 热门|Agent 云端电脑登顶,+1,891 项目却只排第三(08.06)
github·agent·资讯
苏灿烤鱼2 小时前
GitHub Trending 榜首|GitHub #1 拆解|为什么「持久工作台」比临时沙箱更值得关注?(08.06)技术拆解
人工智能·typescript·agent
神奇霸王龙2 小时前
Agent 5 场景屠夫:跨厂商基座横评
人工智能·windows·ai·dubbo·agent·ai编程·阿里
宋哥转AI2 小时前
深入理解 AI Agent 03|RAG评估体系:量化检索增强效果,精准定位系统短板
人工智能·后端·agent
Loveyourself2 小时前
cc中snipCompact实现机制解析
agent
jsl_jsl_jsl3 小时前
claudecode学习 第 8 章 · Slash Commands
agent