
图 2:Context Packet 不是资料仓库的副本,而是为“下一步决定”筛选出的最小充分信息。
我会用五个问题检查一份 Context:
2.3 Context Engineering 解决不了什么
即使把相关组件、API 响应和错误日志都给模型看,它仍然可能只能告诉你:
“可能是请求没有触发,建议检查
useEffect的依赖。”
它还没有真正打开文件、修改代码、运行测试或重新操作浏览器。
Context 让模型看得更清楚,但不自动给它手、工作台和安全边界。
这就进入 Harness Engineering。
3. Harness Engineering:给模型一套可行动的工作环境
Harness 原本就有“把能力连接、约束并投入使用的装置”这一含义。在 Agent 语境中,可以把它理解成模型外面的运行系统。
OpenAI 的 Harness Engineering 实践强调了几类工作:让仓库知识对 Agent 可读,提供可以直接使用的工具和可观察信号,用规则与测试机械地约束边界,并把失败反馈重新编码进环境。
一个简化 Harness 通常包含:

图 3:模型负责在当前 Context 下做决定;Harness 负责准备输入、执行动作、限制权限并返回真实观察。
3.1 Harness 不是工具数量
给 Agent 接入 100 个工具,不等于 Harness 设计得好。
一个有用的工具至少要做到:
-
名称和描述能让模型判断什么时候调用; -
输入输出有稳定结构,而不是难以解析的一大段文本; -
失败时返回可恢复的信息; -
权限范围明确; -
结果能再次进入 Context; -
高风险动作不能只靠模型“自觉谨慎”。
回到分类下拉 Bug,一个最低可用的编码 Harness 可能只需要:
工具不算多,但已经形成了完整工作面。
3.2 Context 与 Harness 的关系
这两个概念会重叠,因为 Harness 负责构建和维护 Context。
可以这样区分:
例如:
AGENTS.md
的内容属于 Context; -
Harness 负责发现并按作用域加载 AGENTS.md; -
测试输出属于 Context; -
Harness 负责执行测试、截断噪声并返回退出码; -
浏览器截图属于 Context; -
Harness 负责启动页面、控制浏览器和保存截图。
3.3 Harness 仍然不等于任务完成
现在 Agent 已经有工具了,但如果运行方式是:
它依然可能没有复现 Bug,也没有确认修复是否有效。
工具只是能力。要让能力围绕目标持续工作,还需要 Loop。
4. Loop Engineering:让行动获得反馈并收敛
Agent Loop 是 Agent 最核心的运行机制之一。
OpenAI 对 Codex Loop 的简化描述是:
这个过程可能在一次用户对话回合中重复很多次。
但从工程角度看,“模型还在调用工具”只是最小循环。一个可靠的任务 Loop 还应该有目标、状态、验证和停止条件:

图 4:Loop 的价值不在“多跑几轮”,而在每轮都获得新证据,并能够通过、重试或升级给人工。
4.1 一个可收敛的 Bug 修复 Loop
分类下拉问题可以被组织成:
- Observe:
在浏览器复现下拉为空,记录控制台和网络请求。 - Decide:
根据证据定位数据是否没有请求、请求失败或渲染被过滤。 - Act:
做最小修改。 - Observe:
重新加载页面,读取新的请求与 DOM。 - Verify:
分类选项可见;已有分类能正确回显;Lint 与构建通过。 - Stop:
验收条件全部满足。 - Retry:
若失败,只根据新证据修正假设。 - Escalate:
需要生产数据、账号权限或产品决策时交还给人。
这里最重要的不是步骤数量,而是每轮必须产生信息增量。
4.2 四种看似在循环、实际没有进展的情况
重复同一个猜测。
没有新增日志、文件或测试结果,只是换一种说法再次尝试。
用作者身份自我验收。
同一段上下文刚写完代码,马上说“看起来没问题”,却没有运行真实检查。
没有停止条件。
即使验收已经通过,仍继续重构和润色;或者连续失败后也不升级给人。
把动作次数当成质量。
调用了 30 次工具不代表比 5 次更可靠。关键是证据是否减少了不确定性。
因此,一个简单的 Loop Contract 应该提前写出:
4.3 Loop Engineering 解决不了什么
单 Loop 很适合目标明确、上下文相对统一、修改范围可控的任务。
但如果任务变成:
同时检查前端表单、后台分类 API、历史数据迁移和线上权限配置;各部分要独立验证,最后才能发布。
一个 Agent 把所有内容塞在同一段历史里,会开始面临:
-
不同子任务互相污染上下文; -
有些工作可以并行,却被迫串行; -
同一个角色既实现又验收; -
发布必须等待多个真实依赖; -
某个分支失败后,不清楚应该重跑哪里。
这不是“再循环几轮”就一定能解决的问题。此时才需要考虑 Graph。
5. Graph Engineering:组织多个局部 Loop
Graph Engineering 关注的不再只是一个 Agent 下一步做什么,而是:
一张 Agent 工作图可以包含:
-
会调用模型和工具的 Agent 节点; -
只执行脚本的确定性函数; -
测试、静态分析和策略校验器; -
等待人工判断的批准节点; -
多个节点之间传递的结构化状态; -
节点内部各自运行的 Loop。

图 5:Graph 增加的是职责与依赖结构。研究、实现和验证节点可以各自有局部 Loop,发布仍由明确闸门控制。
5.1 Graph 不是“多开几个 Agent”
假设我们把分类 Bug 拆成三个 Agent:
如果三个 Agent:
-
收到完全相同的模糊任务; -
不知道彼此输出格式; -
下游不消费上游结果; -
最后由第四个 Agent 随意拼接;
这只是并发聊天,不是一张工程化工作图。
Graph 至少要把依赖写清楚:
而且,这个图是否值得存在,要由任务决定。
对于一个只涉及前端状态初始化的小 Bug,单 Agent Loop 通常更简单、更快。只有当检查确实独立、上下文需要隔离、依赖必须显式管理或风险需要独立验证时,Graph 才开始提供净收益。
5.2 Graph 与 Loop 的准确关系
可以把二者想成时间控制与结构控制:
所以,不要把二者理解成:
简单任务完全可以只有一个 Loop,没有 Graph;Graph 中也并非每个节点都需要模型。
6. 把四层放回同一张系统图
现在可以给四层一个更精确的位置:
这四层不是严格的代码目录。实际框架常把它们混在一起:
-
Codex CLI 的 Harness 内部实现 Agent Loop,也管理 Context; -
LangGraph 用 State、Node 和 Edge 表示工作流,但每个节点内部仍可调用一个完整 Agent; -
Claude Code 的工具、权限、Skills 和上下文压缩属于 Harness 的不同部分; -
一个普通脚本也可以成为 Graph 节点,不需要模型参与。
文章把它们拆开,是为了排错时能问对问题。
7. 同一个 Bug,四层分别做了什么
下面把分类下拉 Bug 从头走一遍。
只有 Prompt
模型只能依据常见经验猜测。输出可能合理,但没有项目证据。
加入 Context
模型可以形成更贴近项目的判断,但仍可能只给建议。
放进 Harness
Agent 现在能够:
-
打开真实页面; -
搜索组件和 API; -
读取请求结果; -
修改工作区文件; -
运行 Lint 和构建; -
在越权或生产操作前请求批准。
模型从“顾问”变成能在受控环境中行动的执行者。
运行 Loop
Agent 按“复现 → 定位 → 修改 → 重新加载 → 验收”循环,直到通过或触发停止条件。
任务开始具备闭环。
是否升级 Graph
先问:
-
是否真的有多个能独立推进的子任务? -
是否需要上下文隔离? -
是否存在必须等待的真实依赖? -
是否需要独立验证或人工发布权?
如果答案都是否,停在单 Loop 就够了。
这一步很关键:四层地图不是让你每次都把系统搭到第四层,而是帮助你停在刚好够用的位置。
8. Agent 失败时,先诊断哪一层
看到 Agent 失败,很多人的第一反应是换模型、重写 Prompt 或增加 Agent。可以先用下面这张诊断卡。
症状一:回答偏题、遗漏约束、引用旧版本
优先检查 Context:
-
关键文件是否真的进入可见范围; -
指令是否互相冲突; -
当前状态是否被旧对话淹没; -
是否应该按需检索,而不是一次加载所有资料。
症状二:知道该做什么,却无法复现或验证
优先检查 Harness:
-
是否缺浏览器、日志、数据库只读查询或测试工具; -
工具输出是否稳定可解析; -
工作目录和权限是否正确; -
Agent 是否能看到真实运行状态。
症状三:改一次就停,或者反复试却不收敛
优先检查 Loop:
-
是否有明确 Verify; -
每次失败是否带来新证据; -
是否设置最大轮次、超时和成本; -
什么时候应该停止并交还给人。
症状四:多个子任务互相覆盖,合并后才发现冲突
优先检查 Graph:
-
边是否代表真实数据依赖; -
节点是否有清晰输入输出; -
是否有唯一写入者; -
验证器是否独立; -
并行工作区是否隔离。
症状五:信息、工具、循环和结构都合理,结果仍不稳定
这时才更有理由检查:
-
模型是否具备任务所需能力; -
任务是否本身缺少可判定标准; -
环境是否存在不可观察的外部状态; -
是否需要人工专业判断。
框架不能弥补不可判定的问题,更多 Agent 也不会自动创造事实。
9. 三种任务,应该停在哪一层
还可以用一个更保守的升级顺序:
每次升级都会带来成本:
如果说不清新增收益,就先不要升级。
10. 四个可以直接复用的最小模板
10.1 Context Packet
10.2 Harness Checklist
10.3 Loop Contract
10.4 Graph Upgrade Questions
如果第 1、3、7 题都答不清楚,通常还不适合升级 Graph。
11. 五个最常见的概念误区
误区一:Context Engineering 就是长 Prompt
长 Prompt 只是更多文本。Context Engineering 还包括按需检索、状态维护、来源选择、工具结果、压缩和遗忘。
误区二:接入 MCP 就完成了 Harness Engineering
MCP 可以提供工具和资源接口,但 Harness 还要处理执行、权限、状态、反馈、停止、日志和评估。连接能力只是其中一部分。
误区三:Agent 多调用几次工具就是可靠 Loop
如果没有验收标准、预算和信息增量,多轮只是更昂贵的随机游走。
误区四:Graph Engineering 必然等于多 Agent
Graph 节点可以是普通函数、测试、检索、人工审批或单个 Agent。很多可靠工作图会刻意把确定性判断留给代码。
误区五:层级越高,系统越先进
一个稳定的单 Loop 往往比一张依赖不真实、状态不清楚的多 Agent 图更可靠。复杂度只有在解决具体约束时才有价值。
12. 20 分钟练习:给自己的任务画四层地图
选一个你最近真的会交给 Codex 或 Claude Code 的任务,例如:
然后完成四步。
第一步:只写 Context
列出目标、当前状态、相关资料、约束和验收标准。
删除所有“看起来有用、但不会改变下一步判断”的材料。
第二步:画 Harness 边界
写出 Agent 必须观察和调用的工具,以及明确禁止的操作。
至少保留一个真实验证信号。
第三步:写 Loop Contract
明确每一轮怎样获得新证据,什么情况通过、失败或升级给人。
把最大轮次或时间预算写出来。
第四步:尝试不使用 Graph
先问单 Agent Loop 能否完成。
只有发现上下文隔离、真实并行、独立验证或权限治理需求时,才画节点和边。
练习完成后,你应该能用一句话解释自己的系统:
如果这四个空都能填清楚,概念就已经从名词变成了设计判断。
13. 收藏清单
最后把全文压缩成一张检查表。
Context
-
模型是否看到了完成下一步所需的最小充分信息? -
信息是否相关、当前、可信,并且没有被噪声淹没?
Harness
-
Agent 是否有观察、行动和验证所需的工具? -
权限、Sandbox、批准和敏感信息边界是否明确?
Loop
-
每轮是否产生新证据? -
是否有验证、预算、停止和人工升级条件?
Graph
-
是否存在真实独立职责和依赖? -
节点输入输出、写入权、验证器和人工闸门是否清楚?
总原则
如果你已经能分清这四层,下一篇《Graph Engineering:从单 Agent 循环到可验证的工作图》会继续讨论真实依赖、Diamond Pattern、共享状态、独立验证器、预算、并发隔离和人工闸门。
参考资料
官方资料
-
Anthropic:Effective context engineering for AI agents -
Anthropic:Building effective agents -
OpenAI:Unrolling the Codex agent loop -
OpenAI:Harness engineering: leveraging Codex in an agent-first world -
OpenAI:Unlocking the Codex harness -
LangChain:Context engineering in agents -
LangGraph:Graph API overview
延伸说明
-
本文四层模型是为了教学和故障定位做的归纳,不是上述厂商共同发布的标准。 Graph Engineering
的术语来源、社区讨论和框架映射,已经在进阶篇中单独整理。
订阅智宅客
AI / 技术 / 数字生活方式,新文章第一时间送到邮箱。










