图解 AI Agent:Agent = 模型 + Harness

图解 AI Agent:Agent = 模型 + Harness

你好,这是《AI Agent 原理》系列的第 1 篇。这个系列我想做的事情很简单:把 Agent 的底层原理一次讲一个,讲透,所有概念都用当下的热门技术举例。今天先回答一个最基础的问题------大模型和 Agent,到底差在哪?

🐴 先从一个你大概率遇到过的场景说起

你对一个 chatbot 说:

"帮我把项目里那个登录报错的 bug 修了。"

它会非常认真地给你回一篇《修复方案》:分析原因、列出步骤、附上示例代码。写得头头是道------然后就没有然后了。bug 还在,它不会真的去打开你的文件。

问题出在哪?它只有脑子,没有手脚。

模型再聪明,它默认能做的只有一件事:接一段文字,吐一段文字。它不能读你的文件、不能执行命令、不能看到自己上一步干的结果。要让它真的干活,得在模型外面套一整套东西。这几年,行业给这套东西起了个名字:Harness

🧩 Harness 是什么:一个比喻讲清楚

Harness 这个词,直译是"马匹的挽具"------套在马身上的那套皮带和挽索。这个词选得很准,因为这个比喻你能一直用下去:

一匹再壮的马,直接放出去是干不了活的;套上挽具,它的力气才能变成拉车、耕地。大模型也一样:

ini 复制代码
Agent = 模型 + Harness
  • 模型(Model) :LLM 本体,负责"思考和决策",比如 DeepSeek-V4、GLM-5、Claude。它是"大脑"。
  • Harness:模型之外的一切------系统提示词、工具、执行循环、记忆、沙箱......它是让大脑能持续干活的"身体"。

顺便交代一下这个词的来历,免得你后面看到相关文章犯嘀咕:它最早由 HashiCorp 创始人 Mitchell Hashimoto 在做编码 Agent 时带火[1],后来 Martin Fowler 专门写了专题文章,Thoughtworks 也做了同名播客[2]------如今已经是行业标准术语了。出处见文末,正文我们只关心它指什么。

🧠 一张图看懂差别

裸模型是这样的------一次性输出,说完就结束:

复制代码
 你的提问 ──────▶  ┌───────────┐  ──────▶  一段文字
                  │    LLM    │
                  └───────────┘

套上 Harness 之后:

arduino 复制代码
┌────────────────────────────────────────────────┐
│                  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 产品,心跳都是同一个循环:

scss 复制代码
        ┌────────────────────────────────────────┐
        │                                        │
        ▼                                        │
   ┌─────────┐      ┌─────────┐      ┌─────────┐ │
   │  思考    │ ───▶ │  行动    │ ───▶ │  观察    │─┘
   │ (Reason) │      │  (Act)  │      │(Observe)│
   └─────────┘      └─────────┘      └─────────┘
        │
        └──▶ 目标完成了?──是──▶ 输出结果,退出循环
  • 思考:模型根据当前信息决定"下一步干什么";
  • 行动:Harness 执行模型选的工具(比如真的去跑一条命令);
  • 观察:把执行结果塞回上下文,让模型看到效果,进入下一轮。

这个循环一点也不神秘,用 TypeScript 写个最小内核也就几十行(类型标注从简,聚焦原理;任何兼容 OpenAI 接口的服务都能跑):

php 复制代码
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 里真正的循环之间,隔着哪几层工程进化?

觉得有用的话,点个赞再走,这是我更新的最大动力 🙏


参考链接

  1. Martin Fowler ---《Harness engineering for coding agent users》(术语梳理、guides / sensors 分类、上下文工程观点):martinfowler.com/articles/ha...
  2. Thoughtworks Podcast ---《What is harness engineering?》:www.thoughtworks.com/en-us/insig...
  3. 《Agent Skills,一篇就够了》(Claude Code 四类 Memory 的拆解):zhuanlan.zhihu.com/p/204860530...
  4. DeepSeek API 更新日志(V4-Pro 双模式与思考强度分档):api-docs.deepseek.com/zh-cn/updat...
  5. GitHub Trending(ECC / ruflo / mattpocock/skills / anthropics/skills 热度数据):github.com/trending
  6. Microsoft Research --- Agent Lightning("Harnessed Agentic RL" 表述出处):github.com/microsoft/a...
  7. Model Context Protocol 官网:modelcontextprotocol.io
相关推荐
dunge20261 小时前
ChatGPT Plus / Pro 与 Codex 深度实战:2026年9月5日 从模型能力对比到代码生成工作流全解析
人工智能·chatgpt
阿拉斯攀登1 小时前
SpringCloudAlibaba微服务消息调用:跨服务业务异步解耦
人工智能
joinwell521 小时前
只发 GET,为什么还是写进去了?从公共 Wiki 到 Agent 工具门禁的效果边界
人工智能·http
zhuhai_xigedian1 小时前
源网荷储一体化柜的经济效益优化功能实现机制
大数据·运维·人工智能·重构·能源
jay神1 小时前
深度学习的损失函数怎么选?
人工智能·深度学习·计算机视觉·毕业设计·损失函数
zhaoali07091 小时前
深度学习系列实验-计算机视觉基础
人工智能·深度学习·计算机视觉
RisunJan1 小时前
AI 名词速查手册
人工智能
堕落年代1 小时前
uni-app x 蒸汽模式:实时流式语音识别(ASR)三大疑难杂症全记录
人工智能·uni-app·语音识别
Casbin开源社区1 小时前
一个面板管住 29 个 AI 编程 Agent:Casbin Gateway 的配置统一、协议互转、用量统计与权限管控
人工智能·golang·开源·gateway·casbin