工程化 / Harness Engineering
1. 智能体运行环境工程是什么
原文备份 · 第 2 / 11 篇 · 查看极客时间原知识库 ↗
本篇目录 · 15 节
预计阅读时间:25 分钟
本篇目标:理解 Harness Engineering 优化的到底是什么,分清它与 Prompt Engineering、Context Engineering 和 Loop Engineering 的边界,并能对一个现有项目做第一次 Harness 体检。
你大概见过这样的场面:同一个 Agent,在演示视频里能连续工作几个小时,到了自己的项目却连启动命令都找不到;让它改一个筛选功能,它先猜技术栈,再猜目录结构,最后改完一句“已经完成”,却没有真正打开页面验证。
遇到这种情况,最自然的反应是继续改提示词:把要求写得更详细,强调“认真检查”,甚至换一个更强的模型。这样有时有效,但它解决不了一个更基础的问题——Agent 所在的工作环境,究竟有没有给它完成任务所需的条件?
Harness Engineering 关心的就是这个问题。
一、先把 Harness 想成“Agent 的工作台”
harness 原本有“挽具、线束、控制装置”的意思。在 Agent 系统里,它通常指包围模型、让模型能够实际工作的那层系统:怎样提供上下文,开放哪些工具,把它放进什么环境,怎样收集运行结果,又用什么规则判断它做完了。
如果把模型比作一位刚加入项目的工程师,那么 Harness 就是他拿到的整套工作条件:
- 入职资料是否说清楚产品和架构;
- 仓库是否容易导航;
- 电脑和依赖能否顺利准备好;
- 启动、测试和检查有没有稳定入口;
- 出错时能否看到日志和运行状态;
- 哪些操作允许直接做,哪些必须先确认;
- 怎样证明一项工作真的完成了。
因此,Harness 不是单独一个文件,也不是某款工具的专有功能。它是一组彼此配合的条件。
我们在这套教程中使用下面这个工作定义:
Harness Engineering,是围绕 Agent 的一次实际运行,系统地设计知识、工具、执行环境、反馈、验证和权限边界,让 Agent 能够更可靠地理解任务、采取行动并证明结果。
OpenAI 在 2026 年发布的 Harness Engineering 实践总结 中提到,他们早期推进缓慢,并不只是 Codex 能力不够,而是环境缺少完成高层目标所需的工具、抽象和内部结构。团队处理失败的方式,也不再只是让 Agent “再努力一点”,而是追问缺少了什么能力,以及怎样让这种能力对 Agent 可见并可执行。
这句话非常重要。Harness Engineering 的起点不是“怎样写出一句万能指令”,而是把一次失败当成环境诊断信号。
二、一次 Agent 运行里,究竟有哪些东西
先看一个简化模型:
┌─────────────────────────────────────────────┐
│ 用户目标 │
└──────────────────────┬──────────────────────┘
│ 指令 + 可发现的项目知识
▼
┌─────────────────────────────────────────────────────────────────┐
│ 模型(决策) │
└───────────────┬───────────────────────────────┬─────────────────┘
│ 调用 │ 观察结果
▼ ▲
┌─────────────────┐ │
│ 工具 │ │
│ 文件 / 终端 / │ │
│ 浏览器 / 服务 │ │
└────────┬────────┘ │
│ 实际执行 │ 反馈
▼ │
┌─────────────────────────────────────────────────────────────────┐
│ 运行环境 与 权限边界(约束能做什么) │
└───────────────┬─────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 反馈层:测试 / 日志 / 页面 / 检查器 │
└───────────────┬─────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 可验证的结果 或 明确停止并求助 │
└─────────────────────────────────────────────────────────────────┘
这里至少有六类 Harness 组件。后面的课程会逐一改造它们。
1. 知识:Agent 能否找到项目事实
Agent 需要知道项目做什么、代码怎样组织、哪些规则不能破坏,以及当前任务怎样才算完成。知识可能出现在 AGENTS.md、架构文档、产品规则、代码注释、Schema 和任务说明中。
关键不只是“有没有写”,还包括能否被发现、是否与代码一致、是否适合按需读取。把三万字规范全部塞进一段系统提示,并不比完全没有文档高明多少。
2. 工具:Agent 能否采取必要行动
只让 Agent 看源码,却不给它终端、文件编辑、浏览器或日志查询能力,它就只能根据静态文本猜测运行结果。工具也不是越多越好:每一种工具都需要清楚的用途、输入、输出和权限。
例如,修改一个网页功能至少可能需要:搜索代码、编辑文件、运行测试、启动服务、操作页面、读取控制台错误。缺少其中任何一环,都可能迫使 Agent 用猜测填空。
3. 环境:工具是否真的能稳定运行
同样一条 npm test,在人类电脑上能运行,不代表 Agent 的隔离工作区也能运行。隐含的环境变量、手工安装的全局依赖、只存在于某个人电脑的数据库和未写入仓库的初始化步骤,都会让 Agent 卡住。
Agent 友好的环境应该能重复创建,并且失败时给出足够明确的原因。
4. 反馈:Agent 能否观察到行动的后果
代码改了不等于行为改对了。Agent 需要看得见测试结果、页面状态、结构化日志、网络请求、性能指标或其他运行证据。
OpenAI 的案例中,团队让应用能够在每个 Git worktree 独立启动,并把 DOM、截图、日志、指标和链路追踪暴露给 Agent。这样,“修复页面故障”才不再只是改完代码后的一句自我判断。
5. 验证:谁来定义“完成”
“请把功能做好并仔细检查”不是验证机制。可靠的 Harness 会把关键验收条件变成可重复执行的测试、静态检查、结构检查或用户行为脚本。
更重要的是,执行 Agent 不能拥有随意降低验收标准的权力。否则它可能通过删除测试、弱化断言或跳过检查,让结果表面上变绿。
6. 权限:Agent 能做什么、不能做什么
Harness 还要决定文件访问范围、网络访问、凭据使用、危险命令和外部系统写操作。权限太少,Agent 无法完成任务;权限无限,错误的代价又会被放大。
好的边界不是笼统地写一句“请谨慎”,而是把允许、需要确认和禁止的操作分开,并尽量由沙箱、命令白名单、凭据隔离或审批机制执行。
把这六类放在一起,你就会发现:AGENTS.md 很重要,但它只是知识入口,不是 Harness 的全部。
三、Harness Engineering 与三种相邻概念的区别
这几个术语经常混在一起。与其争论唯一正确的定义,不如看它们分别优化哪一层。
| 方法 | 主要问题 | 典型产物 |
|---|---|---|
| Prompt Engineering | 这一轮怎样把意图表达清楚 | 一段更明确的任务指令、示例、输出要求 |
| Context Engineering | 模型在当前决策前应该看到什么 | 检索、记忆、上下文选择与压缩策略 |
| Harness Engineering | Agent 怎样在真实环境里完成并验证一次任务 | 仓库知识、工具、环境、反馈、验证与权限 |
| Loop Engineering | 多次 Agent 运行怎样持续推进、恢复和停止 | 触发器、持久状态、预算、重试、升级与停止条件 |
它们不是互斥关系。
假设你让 Agent 给 ShelfCare 增加“按标签筛选藏书”功能:
- 把需求、限制和验收条件说清楚,是 Prompt Engineering;
- 决定本轮要加载哪些产品规则、相关代码和历史决策,是 Context Engineering;
- 让 Agent 找得到架构说明,能启动应用、操作页面、运行测试并受权限约束,是 Harness Engineering;
- 如果任务失败后要自动记录状态、重新规划、换一个隔离工作区继续,并在三次失败后转人工,这是 Loop Engineering。
本教程只聚焦第三层。我们会让一次 Agent 运行获得更好的工作条件,但不会搭建无人值守的长期任务循环。这样也能避免把“Agent 内部为了完成一项任务而反复调用工具”和“外部系统反复启动多个 Agent 运行”混为一谈。
四、Harness Engineering 优化的是“一次运行”
这里的“一次运行”不一定只有一个模型请求。编码 Agent 可能在一次任务中连续搜索文件、运行命令、修改代码和重新测试几十次。只要这些动作仍服务于同一个任务,并共享同一段运行上下文,我们就把它看作一次 Agent 运行。
Harness Engineering 想让这次运行具备四个阶段:
理解:找到目标、规则和相关代码
↓
行动:在受控环境中使用合适工具
↓
观察:读取命令、页面、日志和状态反馈
↓
验证:用独立证据判断完成、失败或需要求助
很多糟糕体验并不是 Agent 完全不会写代码,而是链条在中间断了:
- 只有行动,没有理解:改错目录或违背产品规则;
- 只有源码,没有环境:无法复现故障;
- 只有修改,没有观察:不知道页面是否真的可用;
- 只有自述,没有验证:一句“已完成”替代了证据;
- 有工具,没有权限边界:为了通过任务做出越界操作。
所以,衡量 Harness 不能只看最终代码能不能编译。还要看 Agent 是否少走弯路、是否能独立收集证据、是否知道何时停止,以及人在过程中被迫补充了多少隐含信息。
五、一个很常见的误区:什么都写进 AGENTS.md
当人们意识到 Agent 缺上下文时,第一反应往往是写一份越来越长的 AGENTS.md:安装命令、架构细节、所有业务规则、历史坑点、编码风格和当前任务,全堆在一个文件里。
这比没有入口好,但很快会出现三个问题:
- 重要信息被淹没。 每次任务都加载大量无关内容,真正关键的边界反而不突出。
- 文档会过期。 命令和代码已经变化,长文档里的旧说法仍在影响 Agent。
- 文字无法强制执行。 “不要跨层访问数据库”写十遍,也不如一个结构测试可靠。
更有效的做法是把 AGENTS.md 变成一张短地图:告诉 Agent 从哪里开始、常用命令是什么、不同主题应该继续读哪份文档。能由脚本和测试执行的规则,就不要只停留在文字里。
第三篇会专门完成这项改造。现在先记住一句话:文档负责让规则可见,工具负责让规则可执行。
六、先给一个项目做 Harness 体检
在接触 ShelfCare 之前,可以先拿你熟悉的任意仓库做一个十分钟练习。不要启动 Agent,只站在“第一次看到这个项目的人”的角度回答下面的问题。
| 检查项 | 你能否在仓库里找到明确答案 |
|---|---|
| 项目解决什么问题,核心用户行为是什么 | 是 / 否 |
| 从零开始需要安装什么,支持哪些运行环境 | 是 / 否 |
| 一条命令能否启动项目 | 是 / 否 |
| 一条命令能否运行与当前修改相关的快速测试 | 是 / 否 |
| 完整检查入口是否清楚 | 是 / 否 |
| 主要目录和依赖方向是否有说明 | 是 / 否 |
| 关键产品规则是否写在仓库中 | 是 / 否 |
| 本地示例数据是否可重复创建 | 是 / 否 |
| 页面故障能否从日志或诊断命令中看到 | 是 / 否 |
| 功能完成是否有机器可检查的验收证据 | 是 / 否 |
| 哪些命令或文件属于高风险区域是否明确 | 是 / 否 |
| 文档、命令和实际代码是否有人持续校验 | 是 / 否 |
这里不需要计算一个看似科学的总分。更有用的是把所有“否”按六类标记:知识、工具、环境、反馈、验证、权限。
如果大部分问题都答不上来,那么 Agent 每次工作都要临时猜测,或者等人类在对话里补充。换一个更强模型可能缓解部分问题,却不会把这些隐含知识自动变成稳定的项目能力。
反过来,如果仓库的入口清楚、环境可复现、反馈可读取、规则可执行,同一个模型往往就能承担更长的任务。这也是 Harness Engineering 最值得投入的地方:改造结果会被后续很多次运行重复使用,而不是随着一次对话结束而消失。
七、这套教程如何做实战
接下来我们会使用一个叫 ShelfCare 的本地个人藏书管理应用。它不是大型企业系统,功能很直观:记录书名、作者、阅读状态和标签,并支持搜索与筛选。
初始仓库故意保留一些现实中常见的问题:
- 启动方式依赖口头经验;
- 测试命令不够容易发现;
- 业务规则散落在代码和人的脑子里;
- Agent 看得见源码,却看不见页面行为和关键日志;
- 架构边界写在说明里,却没有机器检查;
- “功能完成”的标准模糊。
第二篇,我们会用一个具体任务建立基线:让 Agent 增加“按标签筛选藏书”功能。你需要保留它的操作记录、人工补充、命令失败和最终验证证据。此时不要急着替它修环境,因为我们需要先看清问题。
之后每一篇只改造一层:
第 2 篇:记录失败,建立基线
第 3 篇:整理仓库知识与导航
第 4 篇:统一 setup、dev、test、check 入口
第 5 篇:建立可重复的验收链路
第 6 篇:暴露页面、日志与运行状态
第 7 篇:把架构、安全和偏好变成机器约束
第 8 篇:用原始任务重新测试并做前后对照
最后一篇仍然使用同一个 Agent、同一版模型和同一段任务描述。只有这样,我们才能比较 Harness 改造本身带来的变化,而不是把结果差异偷偷归功于换模型或改提示词。
八、Harness 不是万能药
最后也要把边界说清楚。
Harness 可以帮助 Agent 找到知识、正确使用工具、观察结果和遵守规则,但它不能把模型没有的能力凭空造出来。一个任务如果本身目标含糊、需要重大产品判断、缺少合法数据,或者超出当前模型能处理的复杂度,环境再完善也不保证成功。
同样,不是每个小项目都需要搭建复杂平台。一个人维护的脚本,可能只需要短 README、稳定命令和几条测试;多人协作且大量使用 Agent 的仓库,才值得投入更完整的日志、结构检查、隔离环境和自动验证。
Harness Engineering 的原则不是“组件越多越专业”,而是让每一项投入都对应一种重复出现的失败:
找不到事实 -> 改善知识入口
命令经常失败 -> 改善环境与脚本
不知道改没改对 -> 增加可观察反馈
完成标准含糊 -> 增加独立验证
频繁破坏边界 -> 增加机器约束
操作风险过大 -> 收紧权限并设置确认点
如果一种失败只出现一次,修好任务就够了;如果它会让后续 Agent 一再跌倒,就应该把修复沉淀进 Harness。
本篇检查
读完后,你应该能用自己的话回答四个问题:
- 为什么 Harness 不等于 Prompt,也不等于
AGENTS.md? - 知识、工具、环境、反馈、验证和权限分别解决什么问题?
- Harness Engineering 与 Loop Engineering 的优化对象有什么不同?
- 当 Agent 失败时,怎样判断应该改提示词、补 Harness,还是承认任务超出模型能力?
如果这四点已经清楚,就不要继续停留在概念里。下一篇我们会故意给 Agent 一个不友好的项目,让它先失败一次。那次失败不是翻车,而是整套改造最重要的基线。