Agent Harness Design: 3 Patterns for Harnessing Claude's Intelligence(Agent Harness 设计的三种模式)
- 原文标题
- Agent Harness Design: 3 Patterns for Harnessing Claude's Intelligence(Agent Harness 设计的三种模式)
- 原文链接
- https://claude.com/blog/harnessing-claudes-intelligence
- 作者
- Lance Martin(Claude Platform 团队)
- 发布日期
- 2026-04-02
🎯 一句话
三种 Harness 骨架:ReAct 式循环、计划-执行、反思-重试。⭐ 它们不是互斥的,实际系统通常是三者的组合。
📑 本页目录
随着 Claude 能力的演进,围绕模型的软件脚手架(agent harness)也必须随之调整。开发者应当持续重新评估:哪些功能应该留在 harness 里,哪些 Claude 已经能独立胜任,并在智能收益与延迟、成本之间取得平衡。
什么是 Agent Harness
Agent harness 指把原始模型智能转化为可用 Agent 的那一整套东西:循环(loop)、工具、上下文管理和护栏(guardrails)。Harness 设计是一门持续的实践——随着模型进步,不断判断哪些脚手架仍然必要。
模式一:依靠模型,而非 Harness(Lean on the Model, Not the Harness)
核心思想: 用 Claude 已经深度掌握的工具来构建应用。
- Claude 3.5 Sonnet 仅用 bash 和文本编辑器两个工具就在 SWE-bench Verified 上达到 49%
- 这些通用工具可以组合出专门化的模式:Agent Skills、程序化工具调用(programmatic tool calling)、记忆工具
- Claude 对熟悉的工具会随时间自然变强,与其发明任务专用工具,不如利用模型精通的通用工具
- 例子: Claude Code 本身就依赖 bash 和文本编辑器,说明简单且被模型深刻理解的工具胜过复杂的定制方案
模式二:给 Harness 做减法(Strip Down Agent Harnesses)
核心思想: 持续追问哪些 harness 功能 Claude 现在已经可以自己管理。
2A. 让 Claude 编排自己的动作
- 问题: 传统 harness 把每个工具结果都送回 Claude 的上下文窗口,不需要的数据也消耗 token
- 方案: 提供代码执行工具(bash、语言 REPL),让 Claude 自行过滤、管道化、串联工具输出,而不膨胀上下文
- 效果: 在 BrowseComp 基准上,给 Opus 4.6 输出过滤能力后,准确率从 45.3% 提升到 61.6%
2B. 让 Claude 管理自己的上下文
- 问题: 手工编写的系统提示词让每一轮都背着大量很少用到的指令
- 方案: 用带 YAML frontmatter 的 skills 实现渐进式披露(Claude 按需读文件);用 context editing 移除过期信息
- 进阶: 子 Agent(subagents)让 Claude 为独立任务开启全新上下文窗口,在 BrowseComp 上带来 2.8% 提升
2C. 让 Claude 持久化自己的上下文
- 问题: 长时运行的 Agent 会超出单个上下文窗口的容量
- 方案:
- 压缩(Compaction): Claude 摘要历史上下文以保持连续性(Opus 4.6 在长任务上达到 84% 准确率)
- 记忆文件夹(Memory folders): Claude 写文件供日后检索(把 Sonnet 4.5 在 BrowseComp-Plus 上的准确率从 60.4% 提升到 67.2%)
宝可梦游戏案例: Sonnet 3.5 玩了 14,000 步后把记忆当成流水账(31 个文件,还停留在第 2 个镇子);Opus 4.6 则把战术笔记组织成 10 个有条理的文件,拿到 3 个道馆徽章,并从失败中总结经验——体现了模型在信息取舍上的判断力进步。
模式三:谨慎设置 Harness 的边界(Set Boundaries Carefully)
3A. 设计上下文以最大化缓存命中
Prompt caching 可以把缓存 token 的成本降到输入 token 的 10%。优化原则: - 稳定内容(系统提示、工具定义)放在动态内容之前 - 用追加消息的方式注入 system reminder,而不是修改系统提示 - 避免切换模型(缓存是模型专属的) - 用 tool search 做动态工具发现,保持缓存完整性 - 多轮应用中把缓存断点(breakpoint)移到最新消息上
3B. 用声明式工具服务于 UX、可观测性与安全
- 安全边界: bash 杠杆大但可观测性差;专用工具有类型化参数,harness 可以拦截和把关
- 可逆性准则: 难以撤销的动作(外部 API 调用)值得用户确认;写操作可以加过期检查(staleness check)
- UX 渲染: 工具可以呈现弹窗、选项,或阻塞循环等待用户反馈
- 可观测性: 结构化的工具参数支持日志、追踪和回放
- 注意: 安全边界的必要性也可能下降——例如 Claude Code 的自动模式用第二个 Claude 模型判断 bash 命令的安全性,可能减少对专用工具的依赖
关键技术概念
| 概念 | 说明 |
|---|---|
| 上下文窗口管理 | Claude 无法自带对话历史,harness 每轮都要重新打包上下文,因此缓存至关重要 |
| Breakpoints | 提示词内的缓存检查点;新请求与已缓存内容前缀匹配时命中缓存 |
| Compaction | Claude 摘要历史上下文,在长交互中保持任务连续性 |
| Tool Search | 动态工具发现机制,以追加方式工作,不破坏缓存 |
| Subagents | 独立的 Claude 实例,用全新上下文窗口处理隔离任务 |
基准数据一览
- SWE-bench Verified: Sonnet 仅用极简工具达到 49%
- BrowseComp: 输出过滤让 Opus 4.6 从 45.3% → 61.6%;子 Agent 再加 2.8%;压缩让 Opus 4.6 达到 84%
- BrowseComp-Plus: 记忆文件夹让 Sonnet 4.5 从 60.4% → 67.2%
结论与建议
- 持续重估: 随模型能力提升,定期检验关于其局限的假设。例如 Sonnet 4.5 需要的「上下文焦虑重置」到 Opus 4.5 就不再需要——变成了 harness 里的「死重」。
- 大胆修剪: 常问「我可以停止做什么?」,移除拖累性能的过时脚手架。
- 通用工具的复利: 编码基准上的强表现会迁移为通用 Agent 能力,因为代码是通用的编排语言。
- 渐进式披露原则: 不要预加载全部上下文,让 Claude 通过文件工具和 skills 按需获取信息。
- 资源效率: 善用缓存、context editing 和输出过滤,在保持性能的同时降低 token 消耗。
Harness 设计不是一次成型的,而是一门随模型智能演进而不断调整脚手架的持续学科——永远在问:这项职责应该归 harness 还是归模型?
✅ 检查点
- 三种模式各自的形态和适用场景?
- 计划-执行相比纯 ReAct 的好处和风险各是什么?
- 反思机制什么时候有效、什么时候是浪费?
👀 答案
- ReAct 式循环:思考→行动→观察,不断重复,适合探索性、路径未知的任务;计划-执行:先出完整计划再逐条执行,适合步骤多、需要人工审核计划的任务;反思-重试:产出后自我检查、不合格就改,适合有明确质量标准的产出。
- ⭐ 好处:计划可以被人审核,且执行阶段不容易走偏——你在开始烧 token 之前就能发现方向错了。风险:计划是在信息最少的时候做的,如果执行中发现现实和计划不符,僵硬地照计划走反而更糟。所以要允许在执行中触发重新规划。
- ⭐ 有效的前提是反思能拿到新信息——比如测试结果、编译报错、检索到的新资料。如果只是让模型「再看一遍自己的输出」,它大概率会确认自己是对的,这时反思只是在烧 token。判据:这一轮反思有没有引入模型上一轮不知道的东西?
🛑 可以停在这里
⚡ 走神救援
三种骨架:ReAct 式循环(思考→行动→观察,适合路径未知的探索任务)、计划-执行(先出完整计划再逐条执行,适合步骤多、计划需人工审核的)、反思-重试(产出后自查不合格就改,适合有明确质量标准的产出);实际系统通常是三者组合。计划-执行的好处:计划可被人审核、执行不易走偏,在开始烧 token 前就能发现方向错了;⚠️风险是计划在信息最少时做出,执行中发现现实和计划不符时僵硬照做反而更糟 → 要允许触发重新规划。⭐⭐反思有效的前提是它能拿到新信息(测试结果/编译报错/新检索到的资料);只让模型「再看一遍自己的输出」,它大概率会确认自己是对的,这时反思只是烧 token;判据:这轮反思有没有引入模型上一轮不知道的东西?