1. 什么是 Agent Harness
这是什么:Harness(脚手架) = 跑在模型外面的一层运行时,负责拼上下文、给工具、管权限、验结果、兜故障。
为什么用:同一套模型换个框架,编码评测能差出十倍。Agent 的水平不只由模型决定,很大一块由外面这层壳决定。
如何用:本章把「模型做不到什么」逐条列出来当检查表,再给出六层架构和成熟度分级,让你知道自己缺哪块。
1.1 模型做不到的那几件事
想知道 Harness 里该放什么,反过来问:模型做不到什么?
大模型看起来能写代码、能推理、能聊,但从系统角度看它主要是个输入输出函数。它不记历史、不跑命令、不知道自己干得对不对。
| 模型做不到的事 | Harness 怎么补 | 对应组件 |
|---|---|---|
| 记住多轮对话历史 | 维护对话历史,每次请求时拼进上下文 | 记忆系统 |
| 执行代码、跑命令 | 提供 Bash 和代码执行环境 | 通用执行环境 |
| 获取实时信息(新库版本、API 变化) | 接入 Web Search、MCP 工具 | 外部知识获取 |
| 操作文件和环境 | 抽象文件系统,引入 Git 版本控制 | 文件系统 |
| 判断自己有没有做对 | 提供沙箱、测试工具、浏览器自动化 | 验证闭环 |
| 长任务中保持连贯 | 做上下文压缩、记忆文件、进度追踪 | 上下文管理 |
这张表就是 Harness 的组件清单。 排查问题时也用它:先列模型能做的事,再逐项补它做不到的部分,问题会落到具体缺口上——工具结果是否可读、任务状态是否持久化、失败后是否给出了可执行的修复信息。
1.2 Agent = Model + Harness
工程上常用的切分是 Agent = Model + Harness:
用户请求
│
▼
┌──────────────────────────────────────────────┐
│ Harness │
│ ├─ 组装上下文(系统提示 + 历史 + 资料 + 状态)│
│ ├─ 暴露工具(读文件 / 跑命令 / 调 API) │
│ ├─ 执行工具,收集结果 │
│ ├─ 管权限与沙箱 │
│ └─ 验证结果、失败恢复、循环直到收敛 │
└──────────────────┬───────────────────────────┘
│ 一次请求 = 上下文 + 工具清单
▼
┌─────────┐
│ 模型 │ → 文本 或 工具调用
└─────────┘
模型的输出分两种:文本(直接回给用户)和工具调用(交给 Harness 执行)。Harness 负责把工具调用的结果塞回上下文,让模型看到自己刚做了什么。
一个最小 Harness 长这样(Python,沿用 LLM 教程 的 SDK 写法):
messages = [{"role": "system", "content": SYSTEM_PROMPT}]
while True:
resp = client.chat.completions.create(
model=MODEL, messages=messages, tools=TOOL_SCHEMAS
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls: # 模型不再要工具 → 收敛
print(msg.content)
break
for call in msg.tool_calls: # 执行工具,把结果塞回上下文
result = run_tool(call.function.name, json.loads(call.function.arguments))
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result, # ← 关键:结果要可读
})
这三十行就是 Harness 的最小内核。它比模型简单,但决定了模型能干成什么样。
1.3 Prompt / Context / Harness Engineering
这三者不是并列关系,而是一层套一层,处理的问题范围越来越大:
| 层级 | 解决的问题 | 典型工作 |
|---|---|---|
| Prompt Engineering | 怎么把指令说清楚 | 系统提示词设计、Few-shot、思维链引导 |
| Context Engineering | 该给 Agent 看什么 | 上下文管理、RAG、记忆注入、Token 优化 |
| Harness Engineering | 系统怎么持续执行、纠偏、观测和恢复 | 文件系统、沙箱、约束执行、反馈回路、观测 |
简单任务里,Prompt 可能就够了——改一句文案,提示词说清楚,效果通常不差。
需要外部知识时,Context 更重要:你得把资料、检索结果、历史状态放到合适位置。
到了长链路、可执行、低容错的场景,Harness 才成为主要矛盾——Agent 需要的不只是「会回答」,还要能执行、验证、回滚、继续推进。
一句话:Prompt 能澄清局部指令,但提供不了文件访问、测试执行、状态保存和失败恢复。这些执行问题只能由 Harness 承担。
1.4 六层架构
从系统设计视角看,成熟的 Harness 通常有清晰分层。这是分析框架,不是业界统一协议,但拿来查缺项很好用:
| 层级 | 名称 | 解决什么问题 | 关键设计 |
|---|---|---|---|
| L1 | 信息边界层 | Agent 该知道什么、不该知道什么 | 定义角色与目标,裁剪无关信息,结构化组织任务状态 |
| L2 | 工具系统层 | Agent 怎么和外部世界交互 | 选择工具、控制调用时机、提炼工具结果并反馈 |
| L3 | 执行编排层 | 多步骤任务怎么串起来 | 让模型按「理解目标 → 判断信息 → 分析 → 生成 → 检查」推进 |
| L4 | 记忆与状态层 | 长任务中间结果怎么管理 | 独立管理任务状态、中间产物和长期记忆,不混在一起 |
| L5 | 评估与观测层 | Agent 怎么知道自己做对了没有 | 建立独立于生成过程的验证机制 |
| L6 | 约束、校验与恢复层 | 出错了怎么办 | 预设规则拦截错误,失败时重试、回滚或降级 |
可以想成给新员工搭工作环境:L1 是岗位说明,L2 是办公工具,L3 是标准操作流程,L4 是项目管理系统,L6 是红线规则和应急预案。
起步不需要一次建齐六层。先补 L1 和 L6:前者明确任务边界与输入,后者在越权、失败或结果不合格时拦截并恢复。等任务进入多步骤执行、需要保存中间产物或反复验证时,再补 L2~L5。
1.5 瓶颈常常不在模型
两个公开实验说明问题:
| 实验 | 做法 | 结果 |
|---|---|---|
| Can.ac 编码评测 | 模型不动,只替换文件编辑接口 | 得分 6.7% → 68.3% |
| LangChain Terminal Bench 2.0 | 模型不动,调系统提示、工具和中间件 | 得分 52.8% → 66.5%,进前 5 |
模型参数没变,差别出在:接口提供了什么操作、结果怎么返回、错误能不能被下一步利用。
这解释了常见的 Agent 故障:重复调工具、忽略约束、长任务里丢状态——往往不能靠换模型或补一句提示词解决。
还要注意 model-harness 耦合:Claude Code、Codex 这类产品会同时调优模型和工具逻辑,模型熟悉某套工具后,换到另一套 Harness 效果可能下降。最适合当前任务的 Harness,不一定是模型后训练时用的那一套——选型应该看任务的工具、约束和验证需求。
1.6 成熟度分级
拿来自检用的阶梯:
| 阶段 | 特征 | 工程师角色 |
|---|---|---|
| Level 0:无 Harness | 直接给 Agent 提示词,没有结构化约束 | 手动写代码,偶尔用 AI |
| Level 1:基础约束 | AGENTS.md、基础 Linter、手动测试 |
主要写代码,AI 辅助 |
| Level 2:反馈回路 | CI/CD 集成、自动化测试、进度追踪 | 规划和审查为主 |
| Level 3:专业化 Agent | 多 Agent 分工、分层上下文、持久化记忆 | 设计环境、管理执行过程 |
| Level 4:自治循环 | 无人值守并行化、自动清理、自修复 | 架构设计和质量把关 |
别从 Level 4 起步。 Level 0 升到 Level 1 之后,AGENTS.md、基础 Linter 和手动测试就已经能覆盖一大半高频错误了。
🤝 记忆口诀:模型负责想,Harness 负责让它做得到。
动手改
- 拿你现在用的 AI 编码工具,在纸上列出「模型做不到但工具替它做到了」的五件事,对照第 1.1 节那张表
- 找出你的项目里 Agent 最容易翻车的三次经历,判断分别缺的是六层里的哪一层
- 给项目写一句定位:现在处于 Level 0 还是 Level 1?下一个要补的那一块是什么
小结
Agent = Model + Harness:模型是输入输出函数,Harness 补齐它做不到的部分- Harness 的组件清单可以反推:列模型做不到的事,逐项补上
- Prompt → Context → Harness 是三层递进,不是并列
- 六层架构:信息边界、工具系统、执行编排、记忆与状态、评估观测、约束与恢复
- 瓶颈常常不在模型——换 Harness 就能让同一模型分数翻几倍
- 成熟度 Level 0~4,从 Level 1 起步最划算
下一章:信息边界与上下文,先管住「它到底该看到什么」 🐸