工具手册 T14 · 工具选择

Harness Engineering实战

OpenAI的Agent工程化方法论——如何用结构化思维驯服AI Agent

01 · 什么是Harness Engineering

2026年2月,OpenAI工程师Ryan Lopopolo发表了一份实践报告,讲述一个3人团队如何在5个月内用Codex Agent生成了100万行代码。标题就叫《Harness Engineering》——"驾驭工程学"。

这个"驾驭"这个词很关键。它不是说AI Agent有多强,而是说如何围绕Agent构建结构、工具、反馈机制,使得Agent能够高效、可靠地完成复杂工作。

这份报告揭示了一个核心真相:AI Agent的瓶颈不在模型本身的能力,而在于它周围的生态。你给Agent什么样的环境、什么样的指导、什么样的反馈机制,它就会有什么样的表现。

核心洞察:要让AI Agent在真实工作中可靠地工作,关键不是选择最强的模型,而是设计一个系统化的"驾驭框架"。这个框架包括文件组织、信息结构、错误反馈、自动化质控等维度。

本章就是对这份报告的深入解读,并将其方法论应用到你的日常AI工作流中。

02 · 五大核心实践

Harness Engineering的核心是五个实践,分别解决Agent工作的五个关键问题:存储、导航、学习、结构、维护。

① 文件系统即持久化

问题:Context Window(对话窗口)是有限的。如果所有信息都存在对话中,超过窗口大小后就会被遗忘。Agent无法积累知识。

解决方案:把重要信息写入文件系统。把对话窗口当作"RAM"(临时内存),把文件系统当作"硬盘"(持久化存储)。

具体怎么做?在你的Agent工作目录建立这样的结构:

目录结构示例
project/ ├── .plans/ ← Agent的工作日志 │ ├── 2026-03-25-task-001.md │ ├── 2026-03-25-task-002.md │ └── current.md ├── docs/ ← 项目文档(供Agent查阅) │ ├── architecture.md │ ├── API-reference.md │ └── known-issues.md ├── src/ ← 代码 └── tests/ ← 测试

.plans目录的妙处:

② 给地图不给手册

问题:Agent会被巨大的信息量淹没。一个项目的完整文档可能有1000行,Agent无法高效地处理。

解决方案:给Agent一个简短的"导航索引"而不是完整的手册。索引告诉它"有什么"和"在哪里",让它自己去查。

对比一下:

❌ 坏做法

把800行的API文档全部给Agent:

POST /api/users POST /api/users/{id} GET /api/users DELETE /api/users/{id} ... [重复700行]

结果:Agent淹没在细节中,搜索困难,容易出错。

✓ 好做法

给Agent一个100行的索引:

# API Index - Users: docs/api/users.md - Auth: docs/api/auth.md - Data: docs/api/data.md

Agent需要什么就查什么。索引本身很短,容易管理。

③ Linter即教师

问题:Agent犯了错,怎么让它学习?靠语言说教很低效。

解决方案:定义自定义的Linter规则。当Agent生成的代码违反规则时,Linter会给出明确的错误信息和修复建议。

例如,在一个TypeScript项目中,你可以定义这样的规则:

自定义Linter规则示例
// Rule: 所有API调用必须有超时设置 - ✗ 错: const result = await api.fetch(url); - ✓ 对: const result = await api.fetch(url, {timeout: 5000}); // Rule: 错误处理必须记日志 - ✗ 错: try { ... } catch (e) { } - ✓ 对: try { ... } catch (e) { logger.error(e); } // Rule: 不允许使用var,必须用const/let - ✗ 错: var x = 1; - ✓ 对: const x = 1;

当Agent的代码违反这些规则时,你的Linter会输出:

Linter输出
Error in fetch.ts:23 Missing timeout configuration on API call. Expected: await api.fetch(url, {timeout: 5000}) Reference: docs/style-guide.md#api-timeouts

这样做的好处:

④ 严格分层架构

问题:如果整个代码库结构混乱,Agent很难理解"这个改动会影响什么"。它容易做出看起来对但实际上破坏了其他地方的改动。

解决方案:强制清晰的分层架构。每一层都有明确的职责,层之间有清晰的边界。

OpenAI的报告中提到的架构分层:

Types(类型定义)
所有数据结构的TypeScript接口或类定义。这是最底层,所有其他层都依赖它。
Config(配置)
常量配置、环境变量、系统参数。Agent修改了配置后,其他部分应该自动适应。
Repo(数据仓库)
数据访问层。所有的数据操作(读写、查询、持久化)都通过这一层。
Service(业务逻辑)
应用的核心逻辑。不直接操作数据,而是调用Repo层,然后处理业务规则。
Runtime(运行时)
服务启动、初始化、事件循环的代码。
UI(用户界面)
最上层,调用Service提供的接口。

这样的分层有什么好处?Agent可以明确地理解:

⑤ 自动化垃圾回收

问题:Agent在工作过程中会产生"扫描偏差"——某些决策是基于过时的信息或错误的假设做的。这些偏差会在代码中积累。

解决方案:定期运行自动化扫描,发现代码质量问题,自动生成修复PR。这样能防止技术债快速堆积。

具体做法:

03 · 三大工程纪律协议

除了那五个实践,OpenAI还提出了三个"工程纪律"——遵守这些规则能显著提高Agent工作的可靠性。

协议1:2-Action Rule

规则:每当Agent进行搜索或查询时,在进行第3次搜索之前,必须停下来写一次"findings"(发现总结)。

为什么?信息膨胀。Agent搜索了10次,积累了大量的片段信息,最后可能根本记不清哪些是关键的。定期的总结强制Agent整理思路,防止信息爆炸。

2-Action Rule示例
搜索1:查询API文档 ✓ 搜索2:查询代码示例 ✓ 📝 Findings总结: - API支持X和Y两种调用方式 - 推荐方式是Y(更高效) - 需要传入token参数 搜索3:查询错误处理 ✓ 搜索4:查询超时配置 ✓ 📝 再次Findings总结: - 错误code有3种:A, B, C - 默认超时是5秒 - 推荐设置为10秒 然后才能进行实现

协议2:3-Strike Escalation

规则:如果Agent连续3次尝试同一个问题都失败了,必须升级策略(问人、查文档、换方法)。

为什么?防止无限循环。Agent有时候会陷入"卡壳"状态——不停地尝试同一种方法,就是不成功。3次失败应该是触发"我的策略有问题"的信号。

3-Strike规则执行
尝试1:用方法A修复测试 → 失败 尝试2:用方法A修复测试 → 失败 尝试3:用方法A修复测试 → 失败 ❌ 触发3-Strike Rule 升级策略: ① 查阅docs/troubleshooting.md ② 搜索同类问题的历史解决方案 ③ 如果还是失败,标记为"需要人工介入"

协议3:Doc-Code Sync

规则:每当修改API接口、函数签名或配置结构时,必须同时更新文档。不更新文档的改动不算完成。

为什么?代码和文档的不一致是Agent(和人类)犯错的常见原因。强制同时更新能让这个问题永不出现。

怎么实施?在你的CI/CD中加一个检查:

Doc-Code Sync检查
// 检查规则 if (修改了src/api.ts) { if (未修改 docs/api-reference.md) { ❌ 拒绝合并。错误信息: "API改动必须同步更新 docs/api-reference.md" } }

04 · 对非程序员的启示

上面的内容是针对软件开发的,但Harness Engineering的原则完全可以应用到你的日常AI工作流中。不管你是写手、分析师、学生还是企业员工。

原则转化1:重要信息写入文件,不只存在对话中

编程世界的原则:用文件系统做持久化存储。
你的应用:每当AI给了你一个有价值的信息(数据、观点、框架),把它记在笔记或知识库中。不要只靠对话历史,那是易失的。

具体做法:

原则转化2:给AI简短索引,不是巨大的上下文

编程世界的原则:给Agent导航索引而不是完整手册。
你的应用:不要在每次对话中都粘贴整个项目文档。相反,先告诉AI"有什么",让它按需查阅。

具体做法:

好的上下文结构
我有一个营销项目,结构如下: - Brand Guidelines: 〜200字的品牌定位 - Product Catalog: 产品列表 - Campaign History: 过去的营销案例 我现在需要<做什么>。 请问需要我提供什么具体信息吗?

而不是一上来就粘贴5000字的品牌手册。

原则转化3:每次失败都记录成未来的护栏

编程世界的原则:自定义Linter规则,把犯过的错"编码"成检查。
你的应用:每当AI给了你一个不满意的回答,分析一下"为什么不满意"。下次对话时,提前说明这个限制。

具体做法:

建立个人的AI使用"Linter"
过去的失败1: AI写的文案太学术,不够通俗 → 现在每次都加:(用第8年级学生能理解的语言写) 过去的失败2: AI忽视了时间限制 → 现在每次都说:(这个项目的deadline是...) 过去的失败3: AI的建议太理想化,没考虑成本 → 现在每次都提:(我们的预算是...)

原则转化4:按功能纵切而不是按步骤横切

编程世界的原则:严格的分层架构让Agent清楚地理解影响范围。
你的应用:将大任务分解时,按"功能模块"而不是"时间步骤"来分。

❌ 步骤横切

第1步:收集信息
第2步:整理数据
第3步:分析数据
第4步:写报告

问题:步骤之间有依赖,不清楚每步的边界。

✓ 功能纵切

模块A:财务数据整理
模块B:市场数据整理
模块C:财务分析
模块D:报告生成

优势:每个模块独立,AI可以并行处理或选择性修改。

05 · 实战应用案例

让我们看三个具体的例子,展示如何把Harness Engineering的原则应用到真实工作中。

案例1:写手的AI辅助工作流

场景:你每月要写10篇文章,用AI来加速创作过程。

应用Harness原则:

  • 文件系统持久化:建一个/articles目录,存放每篇文章的大纲、初稿、修改历史。别只在对话里。
  • 导航索引:建一个/guidelines目录,里面有:
    • tone-of-voice.md(你的文风指南)
    • target-audience.md(目标读者)
    • past-articles-summary.md(过去5篇文章的总结,让AI学习你的风格)
  • Linter规则:你发现AI经常犯的错:
    • 过度使用"很"、"非常"这样的词
    • 开头段落太长
    • 用词过于正式
    → 每次都提前说明这些点。

案例2:学生的论文研究辅助

场景:你在写一篇学位论文,需要整理大量文献、提取关键观点。

应用Harness原则:

  • .plans日志:每次文献阅读完成后,写一个文件:
    • 2026-03-25-paper-001.md:关键观点、引用、与其他文献的关系
    • 2026-03-26-paper-002.md:类似格式
  • 文档索引:
    • research-questions.md(你的核心研究问题)
    • methodology.md(你采用的研究方法)
    • key-concepts.md(领域的关键概念定义)
  • 2-Action Rule:每读2篇论文后,停下来写一个"当前的理解"总结,防止信息爆炸。

案例3:产品经理的功能规划

场景:你用AI来帮助规划新产品功能、做用户研究分析。

应用Harness原则:

  • 分层架构思维:
    • Types(用户需求的类型分类)
    • Config(产品的约束条件:预算、时间、技术限制)
    • Service(功能优先级评分逻辑)
    • UI(最终的功能清单)
  • Doc-Code Sync:每当改变功能需求时,同时更新用户需求文档。让AI能始终看到最新的需求。
  • 3-Strike Rule:如果AI提的方案连续3次都不符合你的要求,停下来问自己:"我的需求描述是不是有问题?"

06 · 总结与展望

Harness Engineering不是关于如何选择最强的模型,也不是关于如何写最复杂的提示词。

它是关于系统思维。当你在和AI一起工作时,不要把它当作一个黑盒——输入问题,得到答案就完事。相反,要设计一个完整的工作系统:

这样的系统不仅能让AI更高效,也能让更清楚地思考自己的工作是怎么做的。

关键要点:AI工程化的未来方向,不是让AI越来越聪明,而是让AI周围的系统越来越清晰。清晰的系统让普通的AI能做出杰出的工作。

练习:为你的一个AI项目设计.plans目录结构

选择你当前正在进行的一个AI辅助项目(写作、学习、工作任务都可以),按照本章的方法论,设计一个简单的文件组织方案。

  1. 定义你的项目名称和目标
  2. 列出这个项目会产生哪些"重要信息"(数据、决策、发现)
  3. 设计一个.plans目录的命名规则(比如日期+任务名)
  4. 定义一个"findings总结"的模板(包括哪些字段)
  5. 列出3-5个"Linter规则"(AI常犯的错误,你想要防止)

建议:先从一个小项目试验一周,体验一下这套系统的效果。