代码语言

知识点思维导图

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 给了哪些工具。
  • 最佳实践 / 心智模型:✅ 从"最小能跑"开始,而不是一上来追求完美。

学完自测

选择所有正确答案;提交后逐项核对判断依据。

1在“Harness 是什么”中,需要同时满足“先认识主角:LLM 到底会什么,不会什么”与“Harness 登场:给大脑装上身体”。给定正文约束“我们要造的东西是包在 LLM 外面的,所以得先搞清楚 LLM(大语言模型)本身是个什么货色。”,哪些判断保持了原有处理机制?多选
2“Harness 是什么”出现偏差:“在“Harness 是什么 / 一图看懂差别:裸 LLM vs 带 Harness”中,即使不满足“模型可以反复"出手"很多次——读个文件、看到内容、再决定下一步、再读下一个……直到任务真正完成”,结果与副作用仍会保持不变。”已成为实际行为。围绕“一图看懂差别:裸 LLM vs 带 Harness”与“用代码感受一下(概念示意)”,哪些判断能定位被改变的职责或边界?多选
3评审“Harness 是什么”方案时,验收条件包含“模型强决定了"想得对不对",但"能不能动手"完全取决于 harness 给了哪些工具。”。关于“常见误区”与“最佳实践 / 心智模型”的哪些决策符合正文机制?多选