PART 5 · Harness 与自我改进
Harness 的三大设计模式
好的 Harness 不是一堆脚本拼起来——它有清晰的模式语言。三个核心模式,覆盖了当前最强 Agent 系统 90% 的架构决策。
Pattern 1
1
Workflow Automation
工作流自动化
核心思想:Agent 不是执行一次就结束的脚本,而是一个目标导向的循环。
- Plan → Execute → Observe/Test → Improve → Execute again——每一轮生成不是终点,而是下一轮优化的起点。
- 分析自身轨迹:优秀的 Agent 会回头看自己前几轮做了什么、哪里失败了、为什么失败——然后调整策略,而不是重复同一个 Prompt。
- 强调运行时迭代:改进发生在 Agent 执行过程中,而非依赖人类事先写好的静态模板。Agent 在每次执行中学习、适应、优化。
- 失败是信号,不是终止:测试不通过、命令报错、输出不符合预期——这些都是 Agent 自我纠正的触发条件。
Agent 工作流循环:plan → execute → observe → improve → execute again(来源:OpenAI Codex Agent Loop)
设计启示
不要把 Agent 设计成"一次性回答器"。让它拥有自己审查自己的能力:看到测试失败后自动分析原因、看到 linter 报错后自动修复、看到用户反馈后调整策略。这就是工作流自动化的核心——把反馈循环内置到系统里。
Pattern 2
2
File System as Persistent Memory
文件系统做持久记忆
核心问题:在长期运行的 Agent 中,制品会迅速超出上下文窗口。
- 制品种类繁多:实验日志、代码 diff、论文摘要、错误追踪记录、过去的完整执行轨迹——这些都是有价值的状态,但塞不进上下文。
- Harness 的正确做法:不要试图把全部工作历史压入 Prompt,而是把持久状态存在文件系统中——让 Agent 学会按需读写。
- 文件读写是 LLM 基础技能:读写文件系统不需要复杂的外部工具链,它受益于核心模型能力的提升。模型越聪明,文件管理越高效。
- 结构化存储:好的 Agent 会自己维护 scratchpad、todo 列表、实验记录,像人类程序员一样管理工作区。
上下文 vs 文件:何时放哪里?
放上下文中:当前正在处理的任务指令、即时的工具调用结果、最近 2-3 轮对话——需要即时参考的信息。
放文件系统中:历史实验结果、累积的错误日志、已完成子任务的摘要、长期策略和规则——需要持久保存但不必时刻在视野中的信息。
关键原则:上下文是工作记忆,文件系统是长期记忆。好的 Harness 像人脑一样,在两者之间智能地搬运信息。
放文件系统中:历史实验结果、累积的错误日志、已完成子任务的摘要、长期策略和规则——需要持久保存但不必时刻在视野中的信息。
关键原则:上下文是工作记忆,文件系统是长期记忆。好的 Harness 像人脑一样,在两者之间智能地搬运信息。
Pattern 3
3
Sub-agent and Backend Jobs
子 Agent 与后台任务
核心思想:一个 Agent 不够用时,生成多个子 Agent 并行执行,同时监控后台长任务。
- 父 Agent 作为进程管理器:启动子任务、检查日志和进度、取消失败的分支、合并成功的结果——这是操作系统层面的思维。
- 并行性必须显式且可检查:不能"发射后不管"。父 Agent 需要能查看每个子 Agent 的状态、输出和错误。
- 子 Agent 输出持久化:每个子 Agent 的结果存为文件、日志或状态记录(而不仅是返回到父 Agent 的上下文中),这样即使中断也能恢复。
- 容错与恢复:后台任务可能超时、崩溃或产出低质量结果。Harness 需要设计重试策略和优雅降级机制。
关键设计决策
子 Agent 模式的核心取舍:并行带来速度,但也带来复杂性。成功的实现(如 Cursor 的 Task 系统、Claude Code 的子进程)都遵循同一原则——让每个子 Agent 在独立的沙箱中工作,输出到明确的文件路径,父 Agent 通过轮询文件状态而非内存共享来协调。这极大简化了并发控制。
Case Study · 编码 Agent 的 Harness
主流编码 Agent 的核心工具接口
Claude Code、Codex、OpenCode、Cursor——当前最强的编码 Agent 都围绕相似的工具集构建 Harness。下表按功能分组对比它们的核心接口:
| 工具分组 | 核心能力 | 典型工具 |
|---|---|---|
| File System | 读、写、搜索、编辑文件;管理工作区状态 | Read, Write, Edit, Glob, Grep, StrReplace |
| Shell Execution | 执行终端命令、运行测试、安装依赖 | Shell, BashExec, RunCommand |
| I/O | 与用户交互、确认操作、展示结果 | Ask, UserConfirm, ShowResult |
| External Context | 获取外部信息、文档、API 响应 | WebFetch, ReadURL, DocSearch |
| Web Search | 搜索互联网获取最新信息 | WebSearch, BingSearch |
| Artifacts | 生成、管理和版本化制品 | CreateFile, SaveArtifact, VersionControl |
| Backend Processes | 后台运行长任务、监控进程状态 | BackgroundShell, AwaitProcess, Monitor |
| Agent Delegation | 生成子 Agent、分配并行任务、合并结果 | Task, Subagent, Fork, ParallelRun |
编码 Agent 的 Harness 循环:从用户意图到代码交付,工具接口编排全过程(来源:Lilian Weng, 2026)
交互体验:三种架构如何运行
就绪
Plan
Execute
Observe
Improve
↩ 循环
第 4 轮就开始丢信息
所有工具返回、历史轨迹全塞进上下文,窗口很快打满。Agent 开始遗忘早期信息,输出质量骤降。
三大模式如何协同
不是三选一,而是三层叠加
工作流自动化提供了执行的"脊椎"——循环结构和反馈机制。
文件系统记忆为循环提供了"硬盘"——让每轮迭代的成果不会丢失,即使上下文被清空。
子 Agent 并行为循环提供了"多核"——当任务可分解时,不再串行等待,而是并行加速。
三者组合,一个 Agent 就具备了迭代优化 × 长期记忆 × 并行扩展的能力——这正是当前最强编码 Agent 的共同架构。
文件系统记忆为循环提供了"硬盘"——让每轮迭代的成果不会丢失,即使上下文被清空。
子 Agent 并行为循环提供了"多核"——当任务可分解时,不再串行等待,而是并行加速。
三者组合,一个 Agent 就具备了迭代优化 × 长期记忆 × 并行扩展的能力——这正是当前最强编码 Agent 的共同架构。
核心观点:Harness 设计不是随机拼凑工具——它遵循三个结构性模式:目标导向的自动化循环(让 Agent 能自我纠错)、文件系统做长期记忆(突破上下文窗口限制)、子 Agent 做并行扩展(把串行瓶颈变成多线程)。理解这三个模式,就掌握了构建生产级 Agent 系统的架构语言。