图解 AI Agent:Agent = 模型 + Harness
图解 AI Agent:Agent = 模型 + Harness
你好,这是《AI Agent 原理》系列的第 1 篇。这个系列我想做的事情很简单:把 Agent 的底层原理一次讲一个,讲透,所有概念都用当下的热门技术举例。今天先回答一个最基础的问题——大模型和 Agent,到底差在哪?
🐴 先从一个你大概率遇到过的场景说起
你对一个 chatbot 说:
"帮我把项目里那个登录报错的 bug 修了。"
它会非常认真地给你回一篇《修复方案》:分析原因、列出步骤、附上示例代码。写得头头是道——然后就没有然后了。bug 还在,它不会真的去打开你的文件。
问题出在哪?它只有脑子,没有手脚。
模型再聪明,它默认能做的只有一件事:接一段文字,吐一段文字。它不能读你的文件、不能执行命令、不能看到自己上一步干的结果。要让它真的干活,得在模型外面套一整套东西。这几年,行业给这套东西起了个名字:Harness。
🧩 Harness 是什么:一个比喻讲清楚
Harness 这个词,直译是"马匹的挽具"——套在马身上的那套皮带和挽索。这个词选得很准,因为这个比喻你能一直用下去:
一匹再壮的马,直接放出去是干不了活的;套上挽具,它的力气才能变成拉车、耕地。大模型也一样:
Agent = 模型 + Harness
- 模型(Model) :LLM 本体,负责"思考和决策",比如 DeepSeek-V4、GLM-5、Claude。它是"大脑"。
- Harness:模型之外的一切——系统提示词、工具、执行循环、记忆、沙箱……它是让大脑能持续干活的"身体"。
顺便交代一下这个词的来历,免得你后面看到相关文章犯嘀咕:它最早由 HashiCorp 创始人 Mitchell Hashimoto 在做编码 Agent 时带火[1],后来 Martin Fowler 专门写了专题文章,Thoughtworks 也做了同名播客[2]——如今已经是行业标准术语了。出处见文末,正文我们只关心它指什么。
🧠 一张图看懂差别
裸模型是这样的——一次性输出,说完就结束:
你的提问 ──────▶ ┌───────────┐ ──────▶ 一段文字
│ LLM │
└───────────┘
套上Harness之后:
┌────────────────────────────────────────────────┐
│ Harness │
│ │
│ 系统提示词 工具集 执行循环 │
│ 上下文管理 记忆系统 沙箱与权限 │
│ 子代理编排 Skills 反馈与观测 │
│ │
│ ┌───────────┐ │
│ │ Model │ ← 唯一的"大脑" │
│ └───────────┘ │
└────────────────────────────────────────────────┘
模型还是那个模型,但它被"装备"了起来:能读文件、能跑命令、能记住刚才干了什么、能一步一步迭代。
同一个模型,套不同成色的 Harness,表现天差地别。 这句话是全文最重要的一句,后面整个系列都是在展开它。
🔧 Harness 里装了什么?
我把主流 Agent 产品拆开,里面核心组件就是这 8 样。每个我都配了一个"好比什么",你先混个脸熟,系列后面会挨个细讲:
| 组件 | 一句话解释 | 好比 |
|---|---|---|
| 系统提示词 | 模型开工前先读的"岗位说明书",定义它是谁、能干什么、不能干什么 | 岗位职责 |
| 工具集 | 让模型能"动手"的接口:读写文件、执行命令、搜索网页 | 手和脚 |
| 执行循环 | 让"思考→动手→看结果"能一轮轮转下去的引擎 | 心跳 |
| 上下文管理 | 决定每一轮"模型能看到哪些信息"(上下文 = 模型当下的工作记忆) | 工作记忆 |
| 记忆系统 | 跨对话保存你的偏好、项目知识,下次开工不用重新交代 | 笔记本 |
| 沙箱与权限 | 隔离的执行环境 + 权限开关,限制 Agent 能动什么(沙箱 = 一个"出事也不波及系统"的隔离间) | 安全带 |
| 子代理编排 | 主 Agent 把子任务分给若干"小 Agent"(子代理)并行干,再汇总 | 带团队 |
| Skills | 打包好的标准能力包,插上就能用(相当于 Harness 上的"标准挂载点") | 工具箱套件 |
举两个当下的真实例子,让这张表落到产品上:
- Claude Code(Anthropic 的命令行编程 Agent,也是目前公认 Harness 做得最好的产品之一)把记忆系统明确分成四类:用户偏好、反馈、项目知识、参考资料[3]——这就是它在"记忆"这个组件上的设计取舍。
- DeepSeek-V4-Pro 提供思考/非思考双模式,还把思考强度分成低/中/高三档[4]。注意:这是模型侧留出来的调节旋钮;但"什么时候该思考、思考结果怎么用",依然由 Harness 侧决定。模型和 Harness 的边界,在这两个旋钮上看得非常清楚。
🔄 执行循环:Agent 的心跳
所有组件里最核心的是执行循环(Agentic Loop) 。不管什么 Agent 产品,心跳都是同一个循环:
┌────────────────────────────────────────┐
│ │
▼ │
┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ 思考 │ ───▶ │ 行动 │ ───▶ │ 观察 │─┘
│ (Reason) │ │ (Act) │ │(Observe)│
└─────────┘ └─────────┘ └─────────┘
│
└──▶ 目标完成了?──是──▶ 输出结果,退出循环
- 思考:模型根据当前信息决定"下一步干什么";
- 行动:Harness 执行模型选的工具(比如真的去跑一条命令);
- 观察:把执行结果塞回上下文,让模型看到效果,进入下一轮。
这个循环一点也不神秘,用 TypeScript 写个最小内核也就几十行(类型标注从简,聚焦原理;任何兼容 OpenAI 接口的服务都能跑):
import OpenAI from "openai";
import { execSync } from "node:child_process";
const client = new OpenAI({
baseURL: "https://api.deepseek.com", // 任何兼容 ChatCompletions 的服务都行
apiKey: process.env.DEEPSEEK_API_KEY,
});
// 注册一个工具:让模型能执行 shell 命令
const tools = [
{
type: "function",
function: {
name: "run_shell",
description: "执行一条 shell 命令并返回输出",
parameters: {
type: "object",
properties: { cmd: { type: "string" } },
required: ["cmd"],
},
},
},
];
function runShell(cmd: string): string {
const out = execSync(cmd, { encoding: "utf8", shell: true });
return out.slice(-2000); // 输出太长就截断,防止撑爆上下文
}
const messages: any[] = [
{ role: "system", content: "你是终端助手,必须用工具完成任务。" }, // Harness:系统提示词
{ role: "user", content: "看看当前目录有什么,并统计 py 文件数量" },
];
while (true) {
// ① 思考:模型看到全部上下文,决定下一步
const msg = (
await client.chat.completions.create({
model: "deepseek-v4-pro",
messages,
tools,
})
).choices[0].message;
messages.push(msg);
// 模型不再要求调工具 = 它认为任务完成了
if (!msg.tool_calls?.length) {
console.log(msg.content);
break;
}
// ② 行动 + ③ 观察:执行工具,把结果喂回上下文,进入下一轮
for (const call of msg.tool_calls) {
const { cmd } = JSON.parse(call.function.arguments);
const result = runShell(cmd);
messages.push({ role: "tool", tool_call_id: call.id, content: result });
}
}
对着代码看这张图,你会得到全文第二个关键结论:
模型只负责每一次的"决策",Harness 负责让决策能够"持续发生"。
你刚才写的那几十行——循环、工具执行、结果回喂——就是 Harness。Claude Code、Codex、开源的 opencode,内核都是这个循环的工程化放大版,差距只在组件成色:上下文管理更细、沙箱更严、工具更全。
📐 车道线与仪表盘:Harness 的两种零件
Fowler 在那篇专题文章里给 Harness 的日常工程做了个很好用的分类[1],我把它转述给你:
- Guides(引导) :告诉 Agent "该怎么走"。比如项目根目录的
AGENTS.md/CLAUDE.md——这是给 Agent 看的项目说明书,Agent 进场先读它,相当于新员工的入职手册。系统提示词、Skills 也属于这一类。 - Sensors(传感器) :告诉 Agent "走没走偏"。类型检查、lint 规则、单元测试、CI。Agent 改完代码,跑一遍测试,红还是绿,它立刻知道。
开车的类比:guides 是车道线,sensors 是仪表盘。车道线让它不出界,仪表盘让它随时知道对不对。
顺带澄清一个容易混的概念:上下文工程(Context Engineering) ——指围绕"模型该看到什么"做的系统性设计,是 Harness 工程里最核心的一块,Fowler 那篇文章的原文观点是:上下文工程就是把 guides 和 sensors 交付到 Agent 面前的手段[1]。但记住它只是"最核心的一块",不是 Harness 的全部,下面会讲为什么。
🔥 Harness 为什么会爆火?
Harness 这个词为什么会爆火?我的感觉是:模型能力在趋同,竞争的重心正在从"谁的模型强"转向"谁的 Harness 好"。
道理不复杂:模型是别人训练好的,谁都买得到、谁都调得动,光拼模型拉不开差距;真正拉开生产力差距的,是模型外面那套东西——工具全不全、上下文管理细不细、沙箱严不严、编排强不强。所以大家都把力气花在了 Harness 上。
在 GitHub Trending 上[5],热门榜几乎被 Harness 生态包场:
- ECC(约 25 万 Star):一个开源的 Harness 优化工具,宣称兼容 Claude Code / Codex / Cursor;
- ruflo(约 7 万 Star):定位是"Harness 的 Harness"(meta-harness),做多 Agent 集群编排;
- mattpocock/skills(约 25 万 Star):TS 圈知名布道师 Matt Pocock 维护的 Skills 合集;anthropics/skills(约 17 万 Star):Anthropic 官方的 Skills 仓库——Harness 的"标准挂载点"已经成了独立赛道;
- 微软开源的 Agent Lightning(约 1.7 万 Star):用强化学习训练 Agent 的框架,官方描述里用的词就是"Harnessed Agentic RL"[6]——连研究框架都默认把 Harness 当作 Agent 的标准组成部分。
中文社区同样:对 Claude Code 系统提示词和源码机制的万字级拆解已经出现多篇,"Agent = 模型 + Harness" 的提法也已经是高频词。
所以我的结论是:同一个模型,套上不同成色的 Harness,可以是玩具,也可以是生产力工具。 这也是你学习 Agent 开发时,应该把主要精力放在 Harness 上的原因。
🚧 三个最容易搞混的问题
1. Harness 就是 LangGraph、CrewAI 这些框架吗? 不是。这些框架是构建 Harness 的脚手架,帮你把循环、状态管理这些脏活封装好。但你上面手写的那几十行,同样是 Harness。框架省事,不是必需品。
2. Harness 就是 MCP 吗? 不是。MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 推出的工具接入标准——让任何工具都能用同一种方式插到任何 Agent 上,社区叫它"AI 时代的 USB-C"[7]。它标准化的是 Harness 里"工具层"的接口,是 Harness 的一个零件,不是 Harness 本身。系列五我会专门写它。
3. Harness 工程就是上下文工程吗? 不完全是。上下文工程管的是"模型看到什么",确实是 Harness 里最核心的一块;但沙箱、权限、子代理编排这些与上下文无关的部分,同样在 Harness 里。
📌 下期预告
下一篇拆执行循环:ReAct为什么至今有效?它和 Claude Code 里真正的循环之间,隔着哪几层工程进化?
觉得有用的话,点个赞再走,这是我更新的最大动力 🙏
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。





如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

更多推荐




所有评论(0)