知识点思维导图
25 个知识节点
Harness Engineering(01) - Harness 是什么
读完后,你应能完成以下任务:
- 绘制“Harness Engineering(01) - Harness 是什么 / 先认识主角:LLM 到底会什么,不会什么”的关键对象与数据流,解释“我们要造的东西是包在 LLM 外面的,所以得先搞清楚 LLM(大语言模型)本身是个什么货色。”,并用源码位置、日志或 Trace 标注证据。
- 为“Harness Engineering(01) - Harness 是什么 / Harness 登场:给大脑装上身体”设计正常与异常输入,验证“Harness 这个词,原意是"挽具、马具"——就是套在马身上、让马的力气能拉动车的那套装备。”,输出首个偏差位置与回归测试结果。
- 实现“Harness Engineering(01) - Harness 是什么 / 一图看懂差别:裸 LLM vs 带 Harness”的最小代码或配置,检验“模型可以反复"出手"很多次——读个文件、看到内容、再决定下一步、再读下一个……直到任务真正完成。”,输出命令、结果与 Diff,并说明不适用边界。
你有没有想过:ChatGPT 网页版只会跟你聊天,而 Claude Code 能直接改你的代码、跑命令、读文件——可它俩背后用的其实是同一类大模型。 差别不在模型,在那层"外壳"。这层外壳,就叫 Harness。
一、先认识主角:LLM 到底会什么,不会什么
我们要造的东西是包在 LLM 外面的,所以得先搞清楚 LLM(大语言模型)本身是个什么货色。
LLM 的本质,朴素到让人意外:
给它一段文字,它预测接下来最可能出现的文字。
就这么简单。 它是个超级强大的"文字接龙"引擎。 所以它有几个天生的"残疾":
- 它不会主动做任何事——你不调用它,它就是一堆躺在硬盘里的参数。
- 它没有记忆——这次对话和上次对话之间,它是彻底"失忆"的。
- 它够不着真实世界——不能读你的文件、不能联网、不能跑代码、看不见你的屏幕。
举个扎心的例子。你问裸 LLM:
"帮我看看 config.json 里写了啥?"
它能怎么办? 它根本没有"读文件"这个能力。 结果只有两种:要么老实说"请把文件内容贴给我", 要么更糟——它直接编一个看起来很像样的 config.json 给你。
这就是裸模型的天花板:它有"脑子",但没有"手"和"眼睛"。
二、Harness 登场:给大脑装上身体
Harness 这个词,原意是"挽具、马具"——就是套在马身上、让马的力气能拉动车的那套装备。 马(模型)力气再大,没有挽具也只是在原地撒欢。
放到 AI 里,Harness 就是包在 LLM 外面的那套程序,它负责:
| LLM 缺什么 | Harness 补什么 |
|---|---|
| 不会主动做事 | 提供一个循环,不停地"问模型下一步干嘛"并执行 |
| 够不着真实世界 | 提供工具(Tools):读文件、跑命令、联网…… |
| 没有记忆 | 提供上下文管理和持久化记忆 |
| 不知道自己该干嘛 | 提供系统提示词,给它身份、规则、目标 |
| 可能乱来 | 提供权限与安全控制 |
一句话记住这个心智模型:
模型是大脑 🧠,Harness 是身体 🦾。 大脑负责思考"该干什么",身体负责真正"伸手去干",再把结果(眼睛看到的)反馈给大脑。
你平时用的 Claude Code、Cursor、各种"AI Agent", 本质上都是不同的 harness 套着相似的大脑。 所以同样的模型,套个好 harness 就能改代码,套个差 harness 就只能尬聊。
三、一图看懂差别:裸 LLM vs 带 Harness
裸 LLM 调用——一问一答,一锤子买卖:
你 ──问题──▶ [LLM] ──回答──▶ 你
(结束)
带 Harness 的 Agent——一个会自己转圈圈的循环:
你 ──任务──▶ ┌─────────── Harness ───────────┐
│ │
│ ┌──▶ [LLM 思考"下一步干嘛"] │
│ │ │ │
│ │ ▼ │
│ │ 要调用工具吗? │
│ │ │ │ │
│ │ 是│ 否│ │
│ │ ▼ ▼ │
│ │ [执行工具] [给出最终答案]──┼──▶ 你
│ │ │ │
│ └───────┘ │
│ (把工具结果喂回给 LLM,再转一圈) │
└────────────────────────────────┘
看出关键区别了吗? 带 harness 的版本里, 模型可以反复"出手"很多次——读个文件、看到内容、再决定下一步、再读下一个……直到任务真正完成。 这个"转圈圈"的机制,就是下一章要讲的 Agent Loop(核心循环)。
四、用代码感受一下(概念示意)
光说不练假把式。 下面是两段伪代码,先建立直觉,第 03 章我们会写出真能跑的版本。
裸 LLM:
带 Harness:
注意第 3 步:**真正去读文件的是 harness,不是模型。 ** 模型只是"动嘴"说要读,"动手"的永远是外面这层壳。 这个分工是理解一切 Agent 的钥匙。
五、常见误区
❌ 误区 1:模型越强,Agent 能力越强。 不全对。 模型强决定了"想得对不对",但"能不能动手"完全取决于 harness 给了哪些工具。 给最强的模型配一个没有任何工具的 harness,它照样什么都干不了。
❌ 误区 2:Agent 是有"意识"的、能自己醒来干活。
没有。
Agent 之所以"动",是因为 harness 的那个 while 循环在驱动它。
循环停了,它立刻变回一堆静止的参数。
**是 harness 给了它"心跳"。
**
❌ 误区 3:模型自己会记住我说过的话。 不会。 模型每次调用都是"失忆"的。 你之所以感觉它记得, 是因为 harness 每次都把历史对话重新塞给它看(这就是"上下文", 第 06 章细讲)。
❌ 误区 4:Harness 是某种高深的 AI 技术。 恰恰相反。 Harness 的核心其实是很朴素的工程代码——一个循环、一些工具函数、一些字符串拼接。 难的不是写出来,而是把它做得好用、安全、可靠。 这正是本小册后面要讲的。
六、最佳实践 / 心智模型
✅ **始终分清"谁在思考"和"谁在动手"。 ** 思考 = 模型; 动手 = harness。 遇到任何 Agent 行为搞不懂时,问自己这两个问题,基本就理清了。
✅ **把 harness 当成"给模型的工作环境"。 ** 你给它什么工具、什么规则、什么信息,它就只能在这个范围里干活。 Agent 强不强,一半看模型,一半看你这个环境设计得好不好。
✅ **从"最小能跑"开始,而不是一上来追求完美。 ** 后面第 03 章你会看到,50 行代码就能跑通一个真 Agent。 先让它转起来,再逐步加功能。
七、动手实践:裸 LLM vs 带 Harness 的 Agent
问题:"帮我看看当前目录下 config.json 里写了什么?"
bare_llm.py:裸 LLM 调用。模型够不着文件,只能让你自己贴内容、或干脆瞎编。with_harness.py:带一个read_file工具和一个最小循环。模型会"动嘴"说要读文件,由 harness "动手"真去读,再把内容喂回去得出答案。
7.1 怎么跑
本 demo 默认用离线 Mock 模型(mock_llm.py),
无需 API Key、无需联网,
直接跑就能看效果:
python bare_llm.py
python with_harness.py
你会看到 with_harness.py 多打印了"🔧 模型请求调用工具 → harness 执行 → 把结果喂回"的过程,
最后给出基于真实文件内容的回答;
而 bare_llm.py 只能两手一摊。
7.2 想换成真实模型?
把脚本里 from mock_llm import chat 换成真实的 Anthropic SDK 调用即可(需要 pip install anthropic 并设置 ANTHROPIC_API_KEY)。
Mock 的接口刻意做得和真实调用很像,方便你对照。
7.3 看点
对照着读两个文件的 while 循环部分——裸 LLM 没有循环,
harness 版本有循环。
这正是第 02 章"Agent Loop"的引子。
八、总结
- 先认识主角:LLM 到底会什么,不会什么:我们要造的东西是包在 LLM 外面的,所以得先搞清楚 LLM(大语言模型)本身是个什么货色。
- Harness 登场:给大脑装上身体:Harness 这个词,原意是"挽具、马具"——就是套在马身上、让马的力气能拉动车的那套装备。
- 一图看懂差别:裸 LLM vs 带 Harness:带 harness 的版本里,模型可以反复"出手"很多次——读个文件、看到内容、再决定下一步、再读下一个……直到任务真正完成。
- 用代码感受一下(概念示意):注意第 3 步:真正去读文件的是 harness,不是模型。
- 常见误区:模型强决定了"想得对不对",但"能不能动手"完全取决于 harness 给了哪些工具。
- 最佳实践 / 心智模型:✅ 从"最小能跑"开始,而不是一上来追求完美。
学完自测
选择所有正确答案;提交后逐项核对判断依据。