Skip to content

Agent Harness:让AI从聊天机器人变成真正的智能体

摘要

Harness 是包裹 LLM 的完整软件基础设施,让 AI 从聊天机器人变成真正的智能体。

核心公式:"如果你不是模型,你就是 harness"

三大工程层:提示词工程、上下文工程、Harness 工程

12个生产级组件:编排循环、工具、记忆、上下文管理、输出解析、状态管理、错误处理、防护栏、验证循环、子智能体编排

关键发现:只改 harness 不改模型,TerminalBench 排名提升了 20+ 位


核心概念

Agent Harness 是包裹 LLM 的完整软件基础设施,包括:编排循环、工具、记忆、上下文管理、状态持久化、错误处理和安全防护。

类比:原始 LLM 如同没有内存、没有硬盘、没有 I/O 的 CPU。

  • 上下文窗口 = RAM(快但有限)
  • 外部数据库 = 硬盘(大但慢)
  • 工具集成 = 设备驱动
  • Harness = 操作系统

三层工程体系

  1. 提示词工程:精心制作模型接收的指令
  2. 上下文工程:管理模型看到什么、何时看到
  3. Harness 工程:涵盖前两者 + 完整应用基础设施

12个生产级组件

1. 编排循环(Orchestration Loop)

实现 TAO 循环(思考-行动-观察),即 ReAct 循环。

循环流程:组装提示词 → 调用 LLM → 解析输出 → 执行工具调用 → 反馈结果 → 重复直到完成

Anthropic 将其运行时描述为"哑循环"——所有智能都在模型里,harness 只管理回合。

2. 工具(Tools)

工具被定义为模式(名称、描述、参数类型),注入到 LLM 的上下文中。

Claude Code 六类工具:文件操作、搜索、执行、网络访问、代码智能和子智能体生成

3. 记忆(Memory)

  • 短期记忆:单个会话内的对话历史
  • 长期记忆:跨会话持久化

Claude Code 三层层次结构:

  • 轻量级索引(每条约 150 字符,始终加载)
  • 按需拉取的详细文件
  • 仅通过搜索访问的原始记录

关键设计原则:Agent 把自己的记忆当作"提示",在行动前会对照实际状态验证。

4. 上下文管理(Context Management)

核心问题:上下文腐烂——关键内容落在窗口中间位置时,模型性能下降 30% 以上。

生产策略

  • 压缩:总结对话历史,保留架构决策和未解决的 bug
  • 观察遮蔽:隐藏旧的工具输出,但保持工具调用可见
  • 即时检索:使用 grep、glob、head、tail 而不是加载完整文件
  • 子智能体委托:每个子智能体广泛探索,但只返回 1000-2000 token 的压缩摘要

5. 提示词构建(Prompt Construction)

分层的组装:系统提示词 → 工具定义 → 记忆文件 → 对话历史 → 当前用户消息

OpenAI Codex 优先级栈:服务器系统消息(最高)→ 工具定义 → 开发者指令 → 用户指令(级联 AGENTS.md)→ 对话历史

6. 输出解析(Output Parsing)

现代 harness 依赖原生工具调用,模型返回结构化的 tool_calls 对象。

检查逻辑:

  • 有工具调用?执行并循环
  • 没有工具调用?最终答案

7. 状态管理(State Management)

LangGraph 将状态建模为流经图节点的类型化字典,用 reducer 合并更新。检查点发生在超级步骤边界,支持中断后恢复和时间旅行调试。

OpenAI 四种策略:应用程序内存、SDK 会话、服务器端 Conversations API、轻量级 previous_response_id 链接

8. 错误处理(Error Handling)

关键数据:一个 10 步流程,每步 99% 成功率,端到端成功率仍然只有约 90.4%。错误会快速复合。

LangGraph 四种错误类型:

  • 瞬态错误:带退避重试
  • LLM 可恢复错误:将错误作为 ToolMessage 返回,让模型调整
  • 用户可修复错误:中断等待人工输入
  • 意外错误:冒泡用于调试

Stripe 将重试尝试上限设为两次。

9. 防护栏和安全(Guardrails and Safety)

OpenAI SDK 三个级别:

  • 输入防护栏(在第一个 agent 上运行)
  • 输出防护栏(在最终输出上运行)
  • 工具防护栏(在每次工具调用时运行)

Anthropic 将权限执行与模型推理分离:模型决定尝试什么,工具系统决定允许什么。

Claude Code 独立管理约 40 个离散工具能力,分三阶段:项目加载时建立信任 → 每次工具调用前权限检查 → 高风险操作明确用户确认

10. 验证循环(Verification Loops)

这是区分玩具演示和生产 agent 的关键。

三种方法

  • 基于规则的反馈:测试、linter、类型检查器
  • 视觉反馈:通过 Playwright 截图用于 UI 任务
  • LLM 作为评判者:单独的子智能体评估输出

关键洞察:给模型一种验证其工作的方法,质量提高 2 到 3 倍

11. 子智能体编排(Subagent Orchestration)

Claude Code 三种执行模型:

  • Fork:父上下文的字节相同副本
  • Teammate:带有基于文件的邮箱通信的单独终端窗格
  • Worktree:自己的 git 工作树,每个 agent 一个独立分支

OpenAI SDK:智能体作为工具(专家处理有界子任务)和交接(专家获得完全控制)

LangGraph:子智能体实现为嵌套状态图

12. 输出解析 / 状态管理(见上)


单循环工作流

步骤 1(提示词组装):构建完整输入,重要上下文放在开头和结尾("Lost in the Middle"发现)

步骤 2(LLM 推理):组装的提示词发送到模型 API

步骤 3(输出分类):有工具调用?继续执行。没有?循环结束

步骤 4(工具执行):验证参数 → 检查权限 → 在沙盒环境中执行

  • 只读操作可以并发运行
  • 变更操作串行运行

步骤 5(结果打包):格式化为 LLM 可读消息,错误被捕获并作为错误结果返回

步骤 6(上下文更新):结果附加到对话历史,接近窗口限制时触发压缩

步骤 7(循环):返回步骤 1,重复直到终止

终止条件(分层):

  • 模型产生没有工具调用的响应
  • 超过最大回合限制
  • token 预算耗尽
  • 防护栏触发
  • 用户中断
  • 返回安全拒绝

真实框架实现

Anthropic Claude Agent SDK

通过单个 query() 函数暴露 harness,运行时是"哑循环",所有智能都在模型里。Claude Code 使用收集-行动-验证循环。

OpenAI Agents SDK

通过 Runner 类实现 harness,三种模式:异步、同步和流式。SDK 是"代码优先":工作流逻辑用原生 Python 表达。Codex harness 三层:Codex Core、App Server(双向 JSON-RPC API)、客户端界面。

LangGraph

将 harness 建模为显式状态图,两个节点(llm_call 和 tool_node)通过条件边连接。

CrewAI

实现基于角色的多智能体架构:Agent(围绕 LLM 的 harness)、Task(工作单元)、Crew(智能体集合)。Flows 层添加"具有智能的确定性骨干"。

AutoGen(Microsoft)

三层架构(Core、AgentChat、Extensions)支持五种编排模式:顺序、并发(扇出/扇入)、群聊、交接和 magentic(管理器 agent 维护动态任务分类账)


定义 Harness 的七个决策

  1. 单智能体 vs. 多智能体 首先最大化单个 agent。多智能体只在工具过载超过约 10 个重叠工具或存在明显独立任务域时才拆分。

  2. ReAct vs. 计划-执行 ReAct 在每一步交织推理和行动(灵活但每步成本更高)。计划-执行将规划与执行分离。LLMCompiler 报告比顺序 ReAct 快 3.6 倍。

  3. 上下文窗口管理策略 五种方法:基于时间的清除、对话总结、观察遮蔽、结构化笔记、子智能体委托。ACON 研究显示 token 减少 26-54%,同时保持 95% 以上准确性。

  4. 验证循环设计

    • 计算验证:确定性真相
    • 推理验证:捕获语义问题但增加延迟
    • 可分为前馈(行动前引导)和传感器(行动后观察)
  5. 权限和安全架构

    • 宽松(快但有风险,自动批准大多数操作)
    • 限制性(安全但慢,每个操作都需要批准)
  6. 工具范围策略 更多工具通常意味着更差的性能。Vercel 从 v0 中删除了 80% 的工具,获得了更好的结果。Claude Code 通过延迟加载实现 95% 的上下文减少。

    原则:暴露当前步骤所需的最小工具集

  7. Harness 厚度 Anthropic 押注于薄 harness 和模型改进。基于图的框架押注于显式控制。


脚手架隐喻与协同进化

建筑脚手架是临时基础设施,使工人能够建造他们无法触及的结构。它不做建造,但没有它,工人无法到达上层。建筑完成后,脚手架会被拆除。

随着模型改进,harness 复杂性应该降低。Manus 在六个月内重建了五次,每次重写都删除了复杂性。

Harness 设计的"未来验证测试":如果性能随着更强大的模型扩展而不增加 harness 复杂性,设计就是合理的。


结论

使用相同模型的两个产品,仅基于 harness 设计就可以有截然不同的性能。TerminalBench 的证据很清楚:仅改变 harness 就使 agent 移动了 20+ 个排名位置。

Harness 不是已解决的问题或商品层。这是艰苦工程的所在

  • 将上下文作为稀缺资源管理
  • 设计在失败复合之前捕获失败的验证循环
  • 构建提供连续性而不产生幻觉的记忆系统
  • 在构建多少脚手架与留给模型多少之间做出架构押注

该领域正朝着更薄的 harness 发展,因为模型在改进。但 harness 本身不会消失。即使是最有能力的模型也需要:管理上下文窗口、执行工具调用、持久化状态、验证工作。


一句话总结

"如果你不是模型,你就是 harness"