最近,AI 圈有个很火的词叫 Harness(原意是马的“挽具”或“缰绳”)。
我之前曾写文章简单介绍过这个概念。
但今天看到 Sebastian Raschka 博士的一篇文章,它对 Harness 的解释堪称全面且透彻。
我之所以想和大家分享这篇文章的核心观点,是因为作者没有纸上谈兵。
他亲手编写了一个极简版的 Harness 框架 Coding Agent,并在实践中提炼出了 Harness 的 6 大核心组件。
文章图文并茂地解释了 Harness 究竟是什么,以及它为何如此重要。
LLM、Agent、Harness 啥关系?
在深入探究之前,我们得先理清几个容易混淆的概念。
千万别把大语言模型(LLM)和智能体(Agent)画等号。
我们可以用“造汽车”来打个通俗的比方:
大模型(LLM): 它是汽车的“发动机”。
早期的 GPT-3、GPT-4,核心能力是“文字接龙”。
推理模型(Reasoning Model): 它是一款“带涡轮增压的超级发动机”。
在开口说话前,它会在脑子里先打草稿、自我验证(即 Thinking 过程)。
Agent(智能体): 它是这辆车的“自动驾驶系统”。
Agent 是一个循环(Loop)。当你下达“帮我修个 Bug”的指令时,Agent 会自己做决策:第一步看哪段代码,第二步用什么工具,报错了怎么纠正,什么时候完成任务并交差。
Harness(框架): 这是围绕着发动机和司机打造的“汽车底盘、方向盘和仪表盘”。
没有它,Agent 就无法与真实世界交互。它负责帮模型读取本地文件、运行终端命令、管理各种工具。
大模型再聪明,如果被关在网页聊天框里,它也看不见你本地电脑里的项目结构。
LLM + Agent + Harness 这套系统的出现,彻底改变了游戏规则。
模型提供“引擎”算力,Agent 循环驱动问题被迭代解决,而 Harness 提供的运行时支持,则像“水电管道”一样构成了底层基础设施。
解剖 Harness 的六大核心组件
当我们谈论 Harness(框架)时,通常是指包裹在模型外围的那层软件系统。
这套系统就像个“大管家”,负责组装提示词、提供可用工具、追踪文件状态、应用代码修改、运行终端命令、管理权限、缓存提示词前缀、存储记忆等一系列脏活累活。
在如今的大模型时代,相比于在网页端干聊,正是这层框架决定了我们绝大部分的 AI 体验。
接下来,我们就以 Raschka 博士的“迷你编程智能体”为例,盘点 Coding Harness 的 6 大核心组件。
1. 实时上下文
如果你直接在聊天框里对 AI 喊一句:“帮我修一下测试代码的报错”。
这就好比拉来一个,对业务一无所知的程序员帮你看代码。
结果肯定是满头大汗:这是什么项目?用的什么框架?在哪报的错?
大模型也是如此。如果不知道你的代码仓库长什么样,它就只能“瞎蒙”。
但在 Harness 系统里,情况完全不同。
当你下达指令的瞬间,Harness 会在后台迅速扫描代码库收集“情报”:项目类型、文件目录排布、最新的代码提交记录等。
随后,它会自动生成一份简明的工作区摘要,连同你的指令一起打包递给大模型。
这样一来,AI 每次接到新指令时,就拥有了全局视野,不再是大脑一片空白。
2. 提示词缓存
赋予 AI 全局视野后,随之而来的是一个致命的体验问题:
如果每次对话,AI 都要把项目从头到尾重新读一遍,结果必然是又慢、又卡、还极其烧钱。
为了解决这个问题,Harness 引入了提示词的结构化设计与缓存复用。它会对信息进行“干湿分离”:
稳定前缀(Stable Prefix): 包含不常变动的信息,如 Agent 的人设、系统指令、可用工具列表、项目基础概况等。这部分会被系统缓存起来。
动态状态(Session State): 包含最新的聊天记录、AI 的短期记忆以及你刚刚下达的指令。
每次对话,大模型真正需要重新计算和处理的,只有那一点点“动态状态”,从而大幅提升了响应速度并降低了 API 成本。
3. 工具
用大模型写过代码的人都经历过这种痛点:
AI 甩出一段代码和几行终端命令,你得自己复制粘贴、自己运行;一旦报错,还得把鲜红的报错信息再复制回网页问它。
当跨入 Harness 领域时,最大的质变发生了:AI 长出了“手和脚”,能亲自在你电脑里搜文件、改代码、跑测试。
Harness 会提前给 AI 准备一个预设好的“工具箱”,例如:查看文件、读取文件、执行终端命令、修改代码。
你可能会担心:“让 AI 直接在我的电脑上运行命令?万一它操作失控,把数据库删了怎么办?”
别慌!Harness 不仅给了 AI 手脚,还给它戴上了“紧箍咒”。
当 AI 提交行动申请后,指令并不会立刻执行,Harness 会在后台进行严密的拦截检查:
“这是已知的合法工具吗?” “提供的参数格式正确吗?” “这个高危操作需要用户点击授权吗?” “它要访问的文件路径,是否超出了当前工作区 (Workspace) 的限制?”
这种看似限制 AI 自由的机制,反而换来了极高的系统安全性和可用性。
4. 上下文管理
在多轮编程对话中,Agent 会不断读取长文件、接收冗长的工具输出和报错日志。
AI 的“临时记事本”很容易被塞满,这在专业上称为 Context Bloat(上下文膨胀)。
如果不加节制,不管多大的窗口,分分钟都会被撑爆。
Harness 主要是通过两套动作给 AI 的记忆“做瘦身”:
动作一:暴力裁剪 (Truncation)
Harness 会像无情的剪刀手,将过长的日志或文档强制截断。它绝不允许单篇长篇大论霸占 AI 宝贵的脑容量。
动作二:去重与摘要 (Deduplication & Summarization)
如果在解决一个 Bug 的过程中,AI 反复查看了同一个核心代码文件好几次,Harness 会合并这些多余的读取记录。
它还会将完整的历史记录浓缩成更适合放入提示词的摘要。
真正的高手设计,往往就藏在这些控制上下文长度的枯燥细节里。
5. 会话记忆 (Session Memory)
既然历史记录被精简了,万一以后要查“旧账”怎么办?
这就引出了 Harness 核心的底层机制:存储维度的双轨记忆结构。
成熟的 Harness 系统会极其聪明地将记忆拆分成两本截然不同的“账本”:
完整对话记录 (Full Log):
你输入的指令、系统吐出的每一行长日志、AI 的每一句回复,都会被一字不落地记录在本地硬盘。
这本账本是为了“留底”,也是为了重建提示词 ,提供近期历史的准确快照。
工作记忆 (Working Memory):
这本账本极其精简,没有啰嗦的运行日志,只记录当前任务的关键情报。
它会随着工程的推进不断擦除和更新,侧重于保持任务的连贯性 ,防止 AI 在漫长的 debug 中“迷失自我”。
6. 子智能体 (Subagents)
顶级 Harness 还祭出了最后一件大杀器:子智能体(Subagents)。
简单来说,就是让主模型学会“当老板”。
当主 Agent 推进主线任务时,突然遇到一个棘手的边缘问题(比如某个冷门的测试跑不通)。
过去,它只能停下核心工作,去翻遍几十个文件找答案。
但在 Harness 框架下,主 Agent 会动态召唤出一个“子智能体”:
“你去把那个测试跑不通的原因查清楚,只向我汇报结果。” 主 Agent 继续思考核心逻辑,小弟在后台吭哧吭哧翻日志。
关键在于:Harness 必须对子智能体实施严格的权限控制(Bounded)。
如果小弟没有被限制权力,它可能会为了修一个边缘 Bug,一顿乱改毁了你的核心代码;或者它自己又去召唤一堆“孙子 Agent”,导致系统无限套娃。
因此,Harness 在召唤小弟时,会给它戴上极其严格的“镣铐”。
小弟继承了老大的一部分上下文,但权限被死死锁住,通常处于“只读”模式或受限沙箱中。
老大负责运筹帷幄把控主线,小弟负责跑腿死磕支线细节。
总结
到这里,我们一口气拆解了 Harness 的 6 大核心部件。
当然,在真正的系统源码中,这六个组件是互相穿插、紧密咬合的。
为什么我们要费这么大劲去搞懂这些底层逻辑?
因为一旦你在脑海中建立起这套高维度的“心智模型”。
你会深刻地明白:真正能让大模型从“聊天玩具”蜕变成“生产力工具”的,正是外面这层看不见、摸不着的 Harness 系统。
它补足了大模型的短板,赋予了 AI 视野、记忆、手脚以及团队协作的能力。

