一、Harness 基本概念

1. Harness 是什么?

Agent = Model + Harness。你不是模型,那你做的东西大概率就是 Harness。

  • Model(CPU):只提供推理和生成能力,是一个输入输出函数;
  • Harness(OS):模型之外的整套系统——系统提示词、工具调用、文件系统、沙箱环境、编排逻辑、钩子中间件、反馈回路、约束机制。

Harness 把状态、工具、反馈、执行环境和安全边界串起来,Agent 才能真正开始干活。CPU 再强,OS 天天崩,体验也不会好。

关键实验:同一个模型,只换了文件编辑接口的调用方式,编码基准分数从 6.7% 跳到 68.3%。模型没变,变的是它外面那套系统。

2. Harness vs Prompt Engineering vs Context Engineering

三者是一层套一层的关系,处理的问题范围越来越大:

层级解决的问题关注点典型工作
Prompt Engineering怎么把指令说清楚让模型理解意图,减少局部歧义系统提示词、Few-shot、思维链引导
Context Engineering该给 Agent 看什么在合适时机提供正确且必要的信息上下文管理、RAG、记忆注入、Token 优化
Harness Engineering系统怎么持续执行、纠偏、观测和恢复长链路任务中的持续正确、偏差修正、故障恢复文件系统、沙箱、约束执行、反馈回路、观测

模型决定上限,Harness 决定底线。
简单任务 Prompt 就够;需要外部知识时 Context 更重要;到了长链路、可执行、低容错的商业场景,Harness 才是主要矛盾。

3. Harness 包含哪些组件?

反过来问:模型做不到什么?

模型做不到的事Harness 怎么补对应组件
记住多轮对话历史维护对话历史,每次请求拼进上下文记忆系统
执行代码、跑命令提供 Bash 和代码执行环境通用执行环境
获取实时信息接入 Web Search、MCP 工具外部知识获取
操作文件和环境抽象文件系统,引入 Git 版本控制文件系统
判断自己有没有做对提供沙箱、测试工具、浏览器自动化验证闭环
长任务中保持连贯上下文压缩、记忆文件、进度追踪上下文管理

二、Harness 进阶

1. 六层架构

层级名称解决什么问题关键设计
L1信息边界层Agent 该知道什么、不该知道什么定义角色与目标,裁剪无关信息,结构化组织任务状态
L2工具系统层Agent 怎么和外部世界交互选择工具、控制调用时机、提炼工具结果并反馈
L3执行编排层多步骤任务怎么串起来让模型按"理解目标→判断信息→分析→生成→检查"推进
L4记忆与状态层长任务中间结果怎么管理独立管理当前任务状态、中间产物和长期记忆,避免状态混在一起
L5评估与观测层Agent 怎么知道自己做对了没有建立独立于生成过程的验证机制
L6约束、校验与恢复层出错了怎么办预设规则拦截错误,失败时提供重试、回滚或降级

落地建议:不要一上来就搭齐六层。先做 L1(信息边界)和 L6(约束恢复),投入不高但最容易见效;中间几层随项目复杂度慢慢补。

2. 为什么瓶颈经常不在模型?

  • Can.ac 实验:同一模型只换工具调用格式,效果差十倍;
  • LangChain 实践:优化 Agent 运行环境(文档组织、验证回路、追踪系统),Terminal Bench 2.0 从全球第 30 名升到第 5 名,得分 52.8% → 66.5%,模型没换;
  • model-harness 耦合现象:Claude Code、Codex 等产品的模型和 Harness 是一起调优的,会过拟合。Opus 在 Claude Code 的 Harness 下得分远低于其他 Harness。
  • 结论:the best harness for your task is not necessarily the one a model was post-trained with。

3. 为什么上下文喂越多,Agent 反而越蠢?

Dex Horthy 观察:168K token 上下文窗口,用到约 40% 时输出质量开始明显下降。

区间占比表现
Smart Zone0 ~ 40%推理聚焦、工具调用准确、代码质量高
Dumb Zone超过 40%幻觉增多、兜圈子、格式混乱、代码变差

Anthropic 称之为"上下文焦虑":Sonnet 4.5 上下文快填满时会变得犹豫,甚至提前收工。单靠压缩不够,他们采用 context resets:清空上下文窗口,通过结构化交接文档保留关键状态,启动新的干净 Agent 继续。

生产建议:把 40% 当成告警线,超过后触发压缩、分段执行或任务交接。等 Agent 已经开始兜圈子再处理就被动了。

4. 从哪里开始搭 Harness?(P0 / P1 / P2 优先级)

P0:可以马上做
行动为什么参考实践
创建 AGENTS.md 并持续维护Agent 每次启动自动加载,犯错后更新,形成反馈循环Hashimoto 每一行对应一个历史失败案例
写自定义 Linter + 修复指令错误消息直接告诉 Agent 怎么改OpenAI 的 Linter 报错自带修复方法
把团队知识放进仓库Slack、Wiki、Docs 里的知识对 Agent 很难稳定可见OpenAI 把仓库作为事实来源

坑:不要把 AGENTS.md 写成超级 System Prompt。OpenAI 的做法更克制——AGENTS.md 只当目录用,约 100 行,详细规则放到子文档按需加载。

P1:P0 稳了之后再补
行动为什么参考实践
分层管理上下文避免所有信息塞进一个文件,按需披露OpenAI 把 AGENTS.md 当目录用
建立进度文件和功能列表用 JSON 追踪功能状态,Agent 不太容易乱改结构化数据Anthropic 初始化 Agent + 编码 Agent 两阶段
给 Agent 端到端验证能力让 Agent 像用户一样验证功能Anthropic 使用 Playwright / Puppeteer MCP
控制上下文利用率尽量不超过 40%,用增量执行降低污染Dex Horthy 的 Smart Zone / Dumb Zone
P2:有余力再考虑
行动为什么参考实践
Agent 专业化分工每个 Agent 携带更少无关信息,留在 Smart ZoneCarlini 的去重、优化、文档 Agent
定期垃圾回收清理速度要跟得上生成速度OpenAI 的后台清理 Agent
可观测性集成把性能优化从感觉问题变成可测量的问题OpenAI 接入 Chrome DevTools

5. Harness 成熟度阶段

阶段特征工程师角色
Level 0:无 Harness直接给 Agent Prompt,没有结构化约束手动写代码,偶尔使用 AI
Level 1:基础约束AGENTS.md、基础 Linter、手动测试主要写代码,AI 辅助
Level 2:反馈回路CI/CD 集成、自动化测试、进度追踪规划和审查为主
Level 3:专业化 Agent多 Agent 分工、分层上下文、持久化记忆设计环境和管理执行过程
Level 4:自治循环无人值守并行化、自动清理、自修复架构设计和质量把关

不需要追求一步到 Level 4,很多团队从 Level 0 到 Level 1 收益就已经很明显。

三、Harness 还没解决的问题

问题现状谁在关注
棕地项目怎么改造公开成功案例几乎都是绿地项目,缺少成熟方法论Böckeler 比作"在从没用过静态分析的代码库上跑静态分析";提出 Ambient Affordances:环境本身的结构特性(类型系统、模块边界、框架抽象)会影响 Harness 能做到什么程度
怎么验证 Agent 做对了事更擅长限制别做错,但验证功能正确性还很弱Böckeler 批评:用 AI 生成的测试验证 AI 生成的代码,像"用同一双眼睛检查自己的作业"
AI 生成代码的长期可维护性LLM 代码经常重新实现已有功能,长期效果还不好判断Greg Brockman 提出过,但目前没有清晰答案
Harness 该做厚还是做薄Manus 五次重写越做越简单,OpenAI 五个月越做越复杂场景决定:通用产品追求最小化,特定产品可高度定制;模型变强后 Harness 应定期简化
单 Agent 还是多 AgentHashimoto 坚持单 Agent,Carlini 使用 16 个并行 Agent规模决定:小项目单 Agent 够用,大项目走向专业化分工

绿地项目:从零开始的新项目,无历史包袱;棕地项目:在已有代码库上改造,有历史架构和技术债。目前公开案例基本都是绿地项目,棕地改造是最大挑战。

四、一线团队实战案例

1. OpenAI:三个人,五个月,一百万行,零手写代码

指标数值
团队规模3 名工程师,后扩至 7 人
持续时间5 个月(2025 年 8 月起)
代码规模约 100 万行
手写代码0 行,只做设计约束
合并 PR 数约 1,500 个
日均 PR/人3.5 个
效率提升约 10 倍

核心做法:

  1. 给 Agent 一张地图,不要塞一本千页手册:AGENTS.md 约 100 行当目录,指向 docs/ 下深层设计文档,即渐进式披露。Agent Skills 也是这个思路的标准化实现。
  2. 架构约束要靠工具执行:定义固定分层 Types → Config → Repo → Service → Runtime → UI,依赖方向不能反,靠自定义 Linter 和结构测试保证。违反规则时工具不只是报错,还告诉 Agent 怎么改。

    原话:If it cannot be enforced mechanically, agents will deviate. 只写在文档里的约束不够。

  3. 可观测性也要给 Agent 看:接入 Chrome DevTools Protocol,Agent 可自己抓 DOM 快照和截图;日志、指标、链路追踪通过本地可观测性栈暴露。"把启动时间降到 800ms 以下"变成 Agent 可自己测量验证的目标。
  4. 熵不会自己消失:AI 生成代码越多,低质量实现、重复逻辑、文档不一致也越多。一开始每周五花 20% 时间手动清理,后来自动化:后台 Agent 定期扫描并自动提交清理 PR。
  5. Slack 里的知识 Agent 很难稳定用上:把团队知识作为版本控制制品放进仓库,让仓库成为可追踪、可引用的事实来源。

OpenAI 自己也说:这个结果不应被假设为在缺少类似投入的情况下可以复现。普通团队先学地图式文档、机械化约束和主动清理这些思路。

2. Anthropic:从上下文焦虑到三智能体架构

案例 A:Carlini 用 16 个 Agent 写 C 编译器
指标数值
持续时间约 2 周
并行 Agent 数16 个 Claude Opus 实例
会话数约 2,000 个
产出10 万行 Rust 代码
GCC torture test99% 通过率
可编译项目PostgreSQL、Redis、FFmpeg、CPython、Linux 6.9 Kernel 等 150+
API 成本约 2 万美元

Harness 细节:

  • 日志不打控制台,全部写文件,用 grep 友好的单行格式(如 ERROR: [reason]),主动减少上下文污染;
  • 测试不全部跑:每个 Agent 只跑随机 1-10% 测试子集,单次运行内确定,跨 VM 随机,整体覆盖全部测试,单个 Agent 不会耗几小时;
  • Agent 角色逐渐专业化:核心编译器、去重、性能优化、代码质量、文档。LLM 经常重新实现已有功能,专门做去重很有必要。

Carlini 原话:"我必须不断提醒自己,我是在为 Claude 写这个测试框架,不是为自己写。"Harness 的服务对象首先是 Agent。

案例 B:借鉴 GAN 的三智能体架构
  • Planner:拿 1-4 句产品描述,扩展成完整产品规格,被要求"在范围上要大胆";
  • Generator:按功能一个个做 Sprint,每个 Sprint 有明确完成标准;
  • Evaluator:用 Playwright MCP 实际点击运行中的应用,按产品设计深度、功能性、视觉设计、代码质量等维度打分。

解决两个问题:

问题表现解法
上下文焦虑Sonnet 4.5 快到上下文上限时草草收尾context resets + 结构化交接,单靠压缩不够
自我评价偏差Agent 自信地夸自己做得好,实际质量一般生成和评估交给两个独立 Agent

打分权重设计:前端设计里设计质量和原创性权重故意调得比功能性和代码质量更高,因为模型很容易做出"功能齐全但长相平庸"的东西。

context resets:遇到上下文焦虑选择重启

当 Agent 上下文接近饱和时:先把当前任务状态、已完成工作、待办事项结构化提取 → 启动新的干净 Agent → 把交接文档给它 → 新 Agent 从干净状态继续。

类似程序遇到内存泄漏时重启进程再从检查点恢复。长任务里,一个干净的新 Agent 往往比塞满历史信息的 Agent 表现更好。

两种配置成本对比:

配置耗时花费效果
Solo Harness(单 Agent + 最少工具)20 分钟$9跑不起来的半成品
Full Harness(三 Agent + 完整工具链)6 小时$200完整可用的应用

重要发现:把模型从 Sonnet 4.5 换成 Opus 4.6 后,Sprint 机制可以完全移除,Evaluator 从每个 Sprint 检查变成最后只检查一次。

Every component in a harness encodes an assumption about what the model can’t do on its own, and those assumptions are worth stress testing.
Harness 里每个组件都在假设"模型自己做不到这个",模型变强后这些假设要重新测试,Harness 也要定期简化。

3. Stripe:每周 1300+ 个 PR 的无人值守模式

Minions 系统:开发者发一条 Slack 消息,Agent 从写代码、跑 CI 到提 PR 全部完成,人只在最后审查。每周 1300+ 个完全由 Minions 生产、无人类手写代码的 PR 被合并。

组件作用关键设计
Devbox开发环境AWS EC2 预装源码和服务,预热池分配,启动约 10 秒,“牲口不是宠物”
编排状态机流程控制混合确定性节点(lint、push)和 Agent 节点(实现功能、修 CI)
Toolshed MCP工具服务集中式 MCP 服务,近 500 个工具,每个 Minion 拿到筛选后的子集
反馈回路质量保障Pre-push hook 秒级修 lint;推送后最多 2 轮 CI,覆盖 300 万+ 测试

理念:What’s good for humans is good for agents。过去为人类工程师投入的 Devbox、工具链和开发者体验,在 Agent 上也直接产生回报。Agent 不需要一套完全独立的基础设施,更应被当作开发环境中的一等公民。

4. Mitchell Hashimoto:一个人的 Harness 工程学

Vagrant、Terraform、Ghostty 作者。坚持一次只跑一个 Agent,保持深度参与:“我不打算跑多个 Agent,也不想跑。”

步骤名称做法
1放弃聊天模式让 Agent 在能读文件、跑程序、发 HTTP 请求的环境里直接干活
2复现自己的工作每件事做两次,一次自己做,一次让 Agent 做,“痛苦至极”
3下班前启动 Agent每天最后 30 分钟布置任务(深度调研、模糊探索、Issue 分拣)
4外包确定性任务挑出 Agent 几乎一定能做好的任务后台跑,关掉桌面通知避免上下文切换
5工程化 HarnessAgent 每犯一次错,就工程化一个方案,让它以后不再犯同类错误
6始终有 Agent 在跑目标是 10-20% 的工作时间有后台 Agent 运行

Ghostty 的 AGENTS.md 每一行都对应一个过去的 Agent 失败案例,是一个持续积累的防错系统。

5. Birgitta Böckeler:对 Harness 的结构化梳理

Thoughtworks Distinguished Engineer,把 Harness 组件归为三类:

归类关注点典型实践
Context Engineering管理 Agent 看到什么、什么时候看到从巨大 AGENTS.md 演化为入口文件 + 分层文档
Architectural Constraints确保 Agent 不跑偏自定义 Linter、结构测试、LLM Agent 充当约束
Garbage Collection对抗熵积累定期运行清理 Agent,扫描不一致和违规

关键判断:

  • Harness 可能变成新的服务模板:未来团队可能从一组预制 Harness 中选择,就像今天从服务模板创建新服务;
  • 棕地项目改造是最大挑战;
  • 功能验证体系还很薄:用 AI 生成的测试验证 AI 生成的代码,仍然缺少独立验证视角。

五、核心总结

  1. Agent = Model + Harness,模型是 CPU,Harness 是 OS;很多时候瓶颈不在模型,而在模型之外的工作环境。
  2. Prompt ⊂ Context ⊂ Harness:简单任务靠 Prompt,外部知识任务靠 Context,长链路商业场景靠 Harness。模型决定上限,Harness 决定底线。
  3. 六层架构:信息边界→工具系统→执行编排→记忆状态→评估观测→约束恢复。落地先做 L1 和 L6,最容易见效。
  4. 上下文不是越多越好:超过窗口 40% 进入 Dumb Zone,质量明显下降;用 context resets(重启+结构化交接)对抗上下文焦虑。
  5. 落地路径:P0(AGENTS.md + Linter + 知识入库)→ P1(分层上下文 + 进度追踪 + 端到端验证 + 上下文利用率控制)→ P2(Agent 专业化 + 垃圾回收 + 可观测性)。
  6. 约束必须机械化执行:只写在文档里的约束不够,If it cannot be enforced mechanically, agents will deviate。
  7. 熵不会自己消失:生成速度上来了,清理速度必须跟上,否则项目被自己的产物拖垮。
  8. Harness 要定期简化:每个组件都在假设"模型做不到这个",模型变强后这些假设要重新测试。
  9. 共性问题:上下文污染、代码熵积累、工具调用可靠性,这三道坎几乎所有团队都会遇到;区别在于出问题后补救,还是一开始就把约束、验证、清理放进 Harness。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐