L0 · 地基:什么是 Harness,为什么需要它
本层目标:在写任何代码、记任何术语之前,先建立一个能撑起整门课的心智模型—— 模型是大脑,harness 是身体、神经系统和记忆。 学完这一层,你看任何 agent 产品, 都能立刻问出那个最关键的问题:"它在替这个模型补哪个先天缺陷?"
0. 先讲一个画面
想象你雇了一位记忆力惊人、读过几乎所有书的天才顾问。你把他单独关在一间没有窗户、没有门、没有电话、没有纸笔的白房间里。你从门缝塞一张纸条进去问问题,他在纸条背面写答案再塞回来。然后——他立刻失忆,忘记刚才发生的一切。
这位顾问,就是"裸模型"(raw LLM,raw=未加任何外壳的、LLM=Large Language Model 大语言模型,也就是 ChatGPT、Claude 这类模型最原始、没套任何工具的样子)。他很聪明,但:
- 他不知道现在几点、外面发生了什么;
- 他不能查资料、不能动手做任何事,只能"说";
- 他记不住你们上一张纸条聊了什么;
- 他一次只能读下这么多字,纸条太长他就看不全;
- 他偶尔会一本正经地编一个听起来很对、其实不存在的答案。
而 Harness(外壳/脚手架),就是你给这间白房间装上的门、电话、纸笔、记事本和秘书。 它没有让顾问变聪明——顾问还是那个顾问——但它让这个聪明的大脑第一次能真正干活。
这门课,从头到尾就在干一件事:一件一件地,给这间白房间装设备。 每装一件,你都会清楚地看到"原来模型缺的是这个"。
1. 模型缺了什么:裸模型的五个先天缺陷
把"裸模型"想成一个纯函数(pure function,数学意义上的函数:同样的输入永远给同样的输出,自己不留任何痕迹、不记得被调用过):你给它一段文字(输入),它返回一段文字(输出)。就这么简单——也就这么有限。它的全部能力边界,由五个先天缺陷划定。整门课的 L1–L8,本质上就是逐个修补这五个缺陷。 先记住它们,后面每一层你都能对号入座。
| # | 缺陷 | 具体表现 | 后面哪层来补 |
|---|---|---|---|
| 1 | 无状态(健忘) | 每次调用都是全新的它,不记得上一句 | L1 把历史塞进输入 / L4 上下文 / L5 记忆 |
| 2 | 不能行动(只会说) | 不能上网、不能读文件、不能运行代码,只能输出文字 | L2 工具调用 |
| 3 | 不能持续(一锤子买卖) | 说完一句就停,不会"做完一步再看情况做下一步" | L3 Agent Loop |
| 4 | 容量有限(装不下) | 一次能读进的字数有上限(上下文窗口),多了就溢出 | L4 上下文工程 |
| 5 | 会幻觉 / 不可靠 | 会自信地编造;步骤一多就跑偏、犯错累积 | L7 可靠性与验证 |
关键认知:这五个缺陷不是 bug,是模型这种东西的本质。 再强的模型也改不掉"它本身只是一个文字进、文字出的无状态函数"。 所有让 AI"看起来会做事"的魔法,都不在模型里,而在模型外面那层 harness 里。 这句话是整门课的题眼。
把缺陷讲透:逐个看
① 无状态。 这是最反直觉的一点。你在 ChatGPT 里跟它聊了十轮,感觉它"记得"前面——那是假象。真相是:每一轮,程序都把前面所有对话重新打包,连同你的新问题,整段重新喂给模型。模型本身什么都没记住,是外面的程序每次都把"病历本"重新递给它看。这个"每次重新递病历本"的动作,就是最原始的 harness 行为(L1 会拆开看)。
② 不能行动。 模型输出的永远只是文字。它写出 rm file.txt 这串字符,文件不会被删——除非外面有个程序读到这串字符,替它真的去执行。模型能"想做事",但"做"这个动作永远发生在 harness 里,不在模型里(L2 的核心)。
③ 不能持续。 一次调用 = 一次"思考"。模型说完就停。真实任务("帮我修好这个 bug")需要:看代码→改一处→跑测试→看报错→再改……这种"做一步、看结果、决定下一步"的循环,模型自己不会做,得 harness 用一个 while 循环把它一轮轮喂回去(L3 的核心)。
④ 容量有限。 模型一次能"读进眼里"的字数有硬上限,叫上下文窗口(context window,可以理解成模型的"视野宽度"或"工作台大小",一次只能摊开这么多内容)。这里的字数其实是按 token(模型眼里的最小文字单位,约等于半个汉字或 0.75 个英文单词)来算的,L1 会细讲。超了,要么报错,要么悄悄丢掉一部分。于是出现一个贯穿全课的核心矛盾:给它的信息越多,它越懂你想干嘛;但塞得越满,越贵、越慢、还越容易"读着读着忘了中间"。 怎么在有限窗口里塞最该塞的东西,是一门手艺(L4)。
⑤ 会幻觉、不可靠。 模型是"概率最像答案的下一个词"机器,不是"事实核查"机器。它不知道自己不知道,会非常自信地编。单次还好,一旦让它自主连做几十步,每步的小错会累积放大,越跑越偏。所以"自主"不是免费的,得用工程手段(验证、复查)给它套缰绳(L7)。
2. 这层怎么补:Harness 的定义
Harness(在 LLM 语境下)= 包裹在模型外面的那整套"脚手架"软件,它把一个"只会输出文字的无状态函数",变成一个"能记忆、能行动、能持续、能自主完成任务"的 agent。
注意三个要点:
- Harness 不改模型。 它在模型外面。同一个模型,配一套烂 harness 是玩具,配一套好 harness 就是 Claude Code。这就是为什么"harness engineering"是一门独立学科——模型是别人训练的,能力天花板很大程度上由你的 harness 决定。
- Harness 是普通软件。 它是循环、是 if/else、是读写文件、是调 API。里面没有魔法,全是确定性的工程。这对你是好消息:它可被理解、可被设计、可被调试。
- "Agent"(智能体)= 模型 + Harness。 当别人说"我做了个 agent",他真正做的工作,绝大部分是 harness。模型是买来的(调 API——Application Programming Interface 应用程序接口,简单说就是"通过网络付费调用别人家模型服务"的入口,你不用自己训练模型),agent 的灵魂在外壳。
一张图:大脑 vs 身体
┌─────────────────────────────────────────────┐
│ AGENT │
│ │
│ ┌───────────┐ ┌──────────────────┐ │
│ │ 模型 │ ◀───▶ │ HARNESS │ │
│ │ (大脑) │ 文字 │ (身体/神经/记忆) │ │
│ │ │ 来回 │ │ │
│ │ 聪明但: │ │ • 循环(持续) │ │
│ │ 健忘 │ │ • 工具(行动) │ │
│ │ 不能动 │ │ • 上下文(装载) │ │
│ │ 装不下 │ │ • 记忆(跨会话) │ │
│ │ 会编 │ │ • 验证(靠谱) │ │
│ └───────────┘ └────────┬─────────┘ │
│ │ │
└──────────────────────────────────┼───────────┘
▼
真实世界(文件、终端、网络、你)
大脑很贵很聪明,但被锁在颅骨里,唯一的 I/O 是"文字进、文字出"。Harness 是它的眼、耳、手、海马体和前额叶——把它接到真实世界上,并在它要犯傻时拉住它。
3. 底层原理:为什么"加外壳"这条路走得通
你可能会问:与其费劲做外壳,为什么不直接把这些能力训练进模型?这是理解整门课为什么存在的关键。
- 职责分离。 模型负责它唯一擅长的事:根据上文,生成最合理的下一段文字。把"记忆管理、工具执行、流程控制"也压给模型,等于让大脑兼职当手脚——又贵又不可靠。让确定性的事交给确定性的代码(harness),让模糊判断的事交给模型,这是整个领域最核心的工程哲学。
- 可迭代、可替换。 Harness 是你的代码,你今天改循环、明天加工具、后天换个更强的模型——外壳不动,大脑随便换。如果能力焊死在模型里,你什么都改不了。
- 可控、可审计。 工具要不要批准、上下文里放什么、错了怎么回退——这些都得是你能看见、能改、能审计的确定性逻辑。安全和信任,只能建在 harness 这层,不能寄望于模型"自觉"。
一句话原理:模型提供"判断力",harness 提供"确定性"。一个好 agent,是把这两者在正确的边界上拼起来。 这门课教的,就是这些边界画在哪、怎么拼。
4. Claude Code 锚点:你每天用的就是一个 harness
抽象的东西,挂个你摸得到的实物就具体了。你正在用的 Claude Code,本身就是一个教科书级的 harness。 把上面五个缺陷对照它:
| 模型缺陷 | Claude Code 这个 harness 怎么补的(后面对应层会细讲) |
|---|---|
| 健忘 | 每轮把对话历史重新打包喂回;长了自动压缩;还有 CLAUDE.md、memory 文件做长期记忆 |
| 不能行动 | 给模型挂了 Bash、Read、Edit、WebSearch 等工具,模型"申请"、Claude Code 替它执行 |
| 不能持续 | 一个 agent loop:模型调工具→Claude Code 执行→把结果喂回→模型再决定,直到任务完成 |
| 装不下 | 上下文工程:自动压缩、按需读文件(而非全塞进去)、把长信息放文件里当外部记忆 |
| 会跑偏 | 危险操作要你批准;Superpowers 还加了"先写计划再执行""完成前先验证""代码复查"等缰绳 |
下次你用 Claude Code,试着用"harness 视角"看它:你按下回车后,那个转圈圈里发生的一切——读文件、跑命令、把结果接回去再想——没有一步是模型自己干的,全是外面这层 harness 在编排。你学的这门课,就是这层编排的设计原理。
5. 小练习 / 思考题
用这几道题检验你是否真的"换上了 harness 视角"。(答案在文末折叠)
- 判断对错:你和 ChatGPT 连聊十轮,说明模型把前九轮"记住"了。
- 你让 Claude Code "把这个文件里的
foo改成bar"。请把这件事拆成"哪些是模型干的、哪些是 harness 干的"。 - 有人说:"新模型上下文窗口到 100 万 token 了,以后 L4 上下文工程是不是就没用了?" 用本层的"核心矛盾"反驳他。
- 为什么说"做一个 agent,绝大部分工作量在 harness,而不在模型"?
- 自检:现在请你不看表格,默写裸模型的五个先天缺陷,并各配一句话说明后面哪层来补。能默出来,这一层就过了。
- 错。 模型没记住任何东西。是外面的程序每轮把前九轮历史重新打包、整段重喂给它——"记忆"在 harness,不在模型。
- 模型干的:读到指令后,决定"要调用 Edit 工具,参数是把 foo 换成 bar"——它只是输出了这个意图(文字)。Harness 干的:真的去打开文件、执行替换、保存、再把"改好了"的结果文字喂回给模型。模型自始至终没碰过文件。
- 窗口变大只是把"装不下"的红线往后挪,但核心矛盾不变:塞得越满越贵、越慢、还越容易"读着读着忘了中间"(中间遗忘 / context rot)。所以"该往窗口里放什么、不放什么"永远是手艺,窗口再大也省不掉。
- 因为模型是买来的(调 API 就有),所有让它"会做事"的能力——行动、持续、记忆、靠谱——都得在模型外面用代码搭出来。Agent 的差异化几乎全在 harness。
- (对照第 1 节表格自检:无状态/不能行动/不能持续/容量有限/会幻觉。)
一句话带走
模型是大脑,harness 是身体、记忆和缰绳。这门课接下来要做的,就是一件一件地,给这个被锁在白房间里的天才装上设备——而你会发现,所谓"AI 会做事"的全部魔法,都不在大脑里,在外面这层你能亲手设计的脚手架里。
下一层 L1,我们打开第一件设备:拆解"一次模型调用"到底长什么样——system / user / assistant、messages、token、上下文窗口。这是所有 harness 的最底层协议。