Harness Engineering 源码拆解
1. 项目定位
Harness Engineering 的核心是把大模型从"回答问题的模型"工程化为"可执行、可约束、可观察、可验证、可协作的业务 Agent Runtime"。
一句话定义:
> Harness 是包在 LLM 外面的 Agent Runtime。模型负责思考和决策,Harness 负责上下文、工具、权限、记忆、验证、多 Agent 调度和外部系统接入。
Harness 不是某一个 prompt,也不是单纯 function calling,而是:
Agent = LLM + Harness
Harness =
Runtime
+ Context Assembly
+ Agent Loop
+ Tool Registry
+ Permission Checker
+ Skills
+ Hooks / Plugins / MCP
+ Memory / Compaction
+ Multi-Agent Coordinator
+ Verification Feedback LoopOpenAI 的 Harness Engineering 文章强调:团队的工作不再只是手写代码,而是设计环境、指定意图、构建反馈循环,让 Codex agents 能可靠完成工作。
2. 整体架构
Harness Engineering 的架构可以拆成九层:
M1:Runtime Bootstrap 启动层
负责加载配置、选择模型 Provider、初始化工具注册表、加载插件和 Skills、初始化权限系统、创建 Agent Executor / QueryEngine。它根据用户、租户、业务场景和执行模式构建一次 Agent 会话所需的完整运行环境。
M2:Context Assembly 上下文层
负责组装 system prompt、注入项目规则、注入当前任务上下文、注入相关 memory、暴露 available skills、控制模型每轮能看到什么。不把所有规则、记忆、技能、文档都塞进 system prompt,而是分层组装:
- Base System Prompt
- Environment Info
- Project Rules
- Available Skills Index
- Relevant Memories
- Current Task Context
- Tool Results
- Compaction Summary
M3:Agent Loop 执行循环层
采用 Think-Act-Observe 的循环结构。模型负责提出工具调用意图,Harness 负责执行工具并将结果回灌给模型,使 Agent 能够基于外部观察不断修正推理和行动。
M4:Tool Gateway 工具网关层
统一封装业务工具、定义输入 schema、注册工具、校验参数、返回标准 ToolResult。所有工具通过 schema 暴露给模型,并在执行前进行参数校验和权限检查。
M5:Permission & Governance 权限治理层
区分只读工具和变更工具、检查用户权限、检查租户权限、检查敏感动作、决定自动执行/人工确认或拒绝、记录审计日志。根据工具类型、用户角色、业务风险等级和操作对象,决定该工具调用的执行策略。
M6:Skills Workflow 技能流程层
沉淀可复用任务流程、按需加载任务说明、指导 Agent 标准化执行。把复杂工作流从 prompt 中抽离出来,变成可版本化、可复用、按需加载的任务手册。
M7:Hooks / Plugins / MCP 扩展层
工具调用前拦截、工具调用后审计、插件化扩展能力、接入外部系统。通过 Hooks 在生命周期节点插入风控、审计、记忆更新和自动化逻辑;通过 Plugins 打包复用 Skills、Hooks、Tools 和 Agents;通过 MCP 或适配器机制接入外部业务系统。
M8:Memory & Compaction 记忆压缩层
区分长期记忆和短期任务状态。长期记忆保存稳定偏好、项目事实和可复用经验;上下文压缩则在长任务中保留目标、关键证据、已完成步骤和下一步计划,防止上下文溢出导致任务中断。
M9:Multi-Agent Coordinator 多 Agent 编排层
负责复杂任务的拆解和调度。Coordinator Agent 根据任务目标分派专职 Agent 执行子任务,并统一收集、审查和汇总结果。
3. 核心执行链路
完整架构流程
用户 / API / 前端
↓
M1 Runtime Bootstrap
↓
M2 Context Assembly
↓
M3 Agent Loop
↓
M4 Tool Gateway
↓
M5 Permission & Governance
↓
M6 Skills Workflow
↓
M7 Hooks / Plugins / MCP
↓
M8 Memory & Compaction
↓
M9 Multi-Agent Coordinator
↓
业务系统 / 数据库 / 知识库 / 审批系统多 Agent 核心流程
- 理解目标
- 拆解任务
- 分派 Worker
- 收集结果
- 独立验证
- 汇总输出
完整链路:
用户目标
↓
Coordinator 分析任务
↓
拆成多个子任务
↓
派发 Worker Agent
↓
Worker 使用自己的工具执行
↓
Coordinator 读取 Worker 输出
↓
必要时派 Reviewer 复查
↓
Coordinator 汇总最终答案核心原则:Coordinator 负责"管理认知流程",Worker 负责"执行局部任务"。
4. 关键模块拆解
Runtime Bootstrap(M1)
职责: 构建一次 Agent 会话所需的完整运行环境。
输入: 用户、租户、业务场景、执行模式配置。
输出: 初始化好的 Agent Runtime 实例。
关键设计: 把模型客户端、工具注册表、权限检查器、上下文构造器、记忆模块和多 Agent 调度器统一初始化,让后续模块不需要关心基础设施细节。
可迁移点: 项目启动时统一初始化所有 Agent 基础设施,而不是在运行时懒加载。
Context Assembly(M2)
职责: 动态组装模型上下文,避免将所有知识一次性塞入 prompt。
输入: 基础行为规则、当前任务信息、业务约束、相关记忆、可用技能和工具说明。
输出: 组装好的 system prompt 和 API messages。
关键设计: 分层组装,减少上下文浪费、降低规则冲突、让不同来源的信息可治理、可替换、可压缩。
可迁移点: 稳定层(role prompt、tool guidance、business rules)和临时层(本轮查询结果、RAG 片段)必须分开管理。
Agent Loop(M3)
职责: Think-Act-Observe 循环,驱动 Agent 持续执行直到任务完成。
输入: 用户任务、组装好的上下文。
输出: 任务执行结果。
关键设计: 模型负责提出工具调用意图,Harness 负责执行工具并将结果回灌给模型。循环条件由 iteration budget 硬控。
可迁移点: Agent 循环必须有硬限制(max iterations、budget),不能只靠提示词防止无限循环。
Tool Gateway(M4)
职责: 统一封装外部能力为结构化工具。
输入: 工具注册声明(name、schema、handler)。
输出: 标准化的 ToolResult。
关键设计: 所有工具通过 schema 暴露给模型,执行前进行参数校验和权限检查。工具结果标准化,包含成功/失败标记、结果数据、错误信息。
可迁移点: Agent 不直接调用外部系统,而是通过 Tool Gateway 统一封装,方便权限控制和审计。
Permission & Governance(M5)
职责: 工具执行前的风险控制。
输入: 工具调用请求、用户角色、操作对象。
输出: 执行决策(自动允许、人工确认、进入审批、拒绝)。
关键设计:
- 查询类动作:自动允许
- 变更类动作:需要确认
- 高风险动作:强制审批
- 敏感动作:直接禁止
可迁移点: 权限系统让 Agent 从"能做事"变成"能安全做事"。不要指望模型自己克制,应该从配置上让它没有危险能力,或者危险能力必须审批。
Skills Workflow(M6)
职责: 把可复用流程沉淀成"任务说明书"。
输入: 任务类型匹配。
输出: 加载的 Skill 流程说明。
关键设计: Tool 是动作,Skill 是方法。Skill 把复杂工作流从 prompt 中抽离出来,变成可版本化、可复用、按需加载的任务手册。模型在系统提示中只看到技能目录,当任务匹配某个 Skill 时,再按需加载完整流程说明。
可迁移点: 运营日报生成 Skill、用户分群分析 Skill、活动复盘 Skill、异常指标诊断 Skill 等,每个 Skill 包含任务边界、分析步骤、需要调用哪些工具、输出格式、质量检查清单。
Multi-Agent Coordinator(M9)
职责: 复杂任务的拆解和调度。
输入: 复杂任务目标。
输出: 汇总后的最终结果。
关键设计:
多 Agent 的基本角色:
- Coordinator Agent:总控,负责理解目标、拆任务、派发 Worker、汇总结果
- Worker Agent:执行具体子任务
- Reviewer Agent:独立审查结果,检查错误、遗漏、风险
- Specialist Agent:专门处理某个领域
任务类型分类:
- Research Task(研究型):只读、适合并行、冲突风险低
- Execution Task(执行型):会改变状态、需要权限控制、最好串行或明确边界
- Review Task(审查型):应该独立于执行者、最好只读
核心原则:Research 可以并行,Execution 要控边界,Review 要独立。
可迁移点: 多 Agent 不是绕过权限,每个 Agent 都应该有自己的最小权限集。
5. 工程化亮点
工程师角色变化
传统开发是"人写代码 → 人测试 → 人修 bug"。Harness Engineering 是"人定义目标、环境、规则、反馈闭环 → Agent 读上下文、调工具、写代码、跑测试、修复问题 → 人审查关键决策和高风险动作"。
人不再把时间主要花在"执行代码细节",而是花在"让 Agent 能可靠执行"的系统设计上。
从 Prompt Engineering 升级为 Runtime Engineering
Prompt Engineering 解决"怎么问模型"。Harness Engineering 解决"模型在哪个环境里工作?能看到哪些上下文?能调用哪些工具?哪些动作需要权限?工具结果如何回灌?上下文满了怎么办?多个 Agent 怎么协作?结果怎么验证?"
核心创新是把 Agent 执行过程工程化、运行时化、可控化。
模型决策权和执行权分离
模型可以提出 tool_use,但真正执行工具的是 Harness。Harness 决定:工具是否存在?参数是否合法?是否只读?是否命中敏感路径?当前用户是否有权限?是否需要人工确认?是否要拒绝执行?
这是 Agent 能落地到真实业务系统的基础。
Trace 与 Evaluation 闭环
Agent 项目如果没有执行记录和质量评估,就很难从 Demo 走向可维护系统。Agent 不仅要能完成任务,还要能记录它怎么完成、哪里失败、后续如何改进。
Trace 记录每次执行的完整轨迹(关键决策摘要、工具调用记录、状态变化记录、执行轨迹),Evaluator 量化结果质量,失败样本沉淀为优化依据——这三者构成了 Agent 工程化的闭环。
执行结果和评估结果分离
执行结果是 Agent 的输出,评估结果是对输出质量的判断,两者应该分开存储。这样做的好处是:同一个执行结果可以被多次评估(比如用不同的评估标准),评估标准可以随时间变化而不需要重新执行任务。
失败样本沉淀为评测集
每次失败都应该被记录、归类、分析,沉淀为评测样本。用失败样本做回归测试,用失败样本衡量改进效果,用失败样本发现系统弱点。
6. 可迁移到个人项目的设计
- 为每次执行生成 run id:唯一标识一次执行,方便关联 Trace、日志和评测结果
- 记录完整的执行轨迹:记录输入、输出、工具调用记录、状态变化记录和关键决策摘要
- 执行结果和评估结果分离:执行结果和评估结果分开存储,各自独立演进
- 失败样本沉淀为优化依据:每次失败都应该被记录、归类、分析,转化为具体的优化行动
- 评测集防止回退:用评测集持续监控质量,每次修改后用回归测试确保没有引入新问题
- Skills 沉淀可复用流程:把复杂业务流程抽象为可版本化、可复用的 Skill
- 权限分级控制:查询类自动允许、变更类需要确认、高风险强制审批、敏感动作直接禁止
- Coordinator 编排多 Agent:任务拆解、Worker 分派、Reviewer 审查、最终汇总
7. 面试表达
表达一:Harness 的核心
> 我对 Agent 的理解不是单纯调大模型,而是要构建一套 Harness Runtime。模型本身只负责推理和决策,真正让它能够在业务系统中可靠工作的,是外层 Harness。我把 Harness 拆成九层:Runtime Bootstrap 负责初始化运行环境,Context Assembly 负责动态组装上下文,Agent Loop 负责 Think-Act-Observe 循环,Tool Gateway 负责封装外部能力,Permission Checker 负责风险控制,Skills 把可复用流程沉淀成任务说明书,Hooks/Plugins/MCP 负责生命周期治理和外部扩展,Memory/Compaction 负责长期经验复用和上下文压缩,Multi-Agent Coordinator 负责任务拆解和调度。
表达二:工程化创新
> Harness Engineering 最核心的创新是把大模型从"回答问题的模型"工程化为"可执行、可约束、可观察、可验证、可协作的业务 Agent Runtime"。具体来说有三个关键设计:第一,模型决策权和执行权分离——模型可以提出 tool_use,但 Harness 负责校验、限流、权限检查和执行;第二,执行结果和评估结果分离——同一个执行结果可以被多次评估,评估标准可以独立演进;第三,失败样本沉淀为评测集——每次失败都被记录、归类、分析,转化为回归测试用例,防止同样的问题再次出现。
8. 后续 TODO
- 待补充 OpenHarness 的真实源码文件路径和关键函数
- 待补充 Runtime Bootstrap 的初始化流程细节
- 待补充 Tool Gateway 的 schema 校验和权限检查实现
- 待补充 Evaluator 的具体评分机制
- 待补充 Multi-Agent Coordinator 的调度实现
- 待补充 Compaction 的具体压缩策略
安全表述说明
不要记录或暴露模型不可见的完整中间分析过程。统一使用以下工程化表述:关键决策摘要、模型输出摘要、工具调用记录、状态变化记录、执行轨迹。