编程智能体真正拉开差距的,可不只是模型

3 阅读9分钟

前两天我在看一篇关于编程智能体的分享,里面有一句话我印象很深:现在真正拉开差距的,往往不是模型本身,而是包裹在模型外面的那一层运行框架。

这话听起来有点反直觉。因为过去一年里,我们讨论最多的,始终还是“哪个模型更强”“哪个模型更会写代码”“哪个模型更适合做 Agent”。但如果你真的把 Claude Code、Codex CLI、OpenClaw 这类系统放在一起看,就会发现一个越来越明显的事实:同样是大模型,放进不同的运行框架里,最后给人的感觉可能完全不是一个量级。

说白了,模型更像发动机,真正决定你开起来顺不顺手的,往往是整车系统。

先把几个概念分清

很多人第一次接触编程智能体时,最容易把几个词混在一起:LLM、推理模型、智能体、Harness。

这几个东西看上去都和“模型能力”有关,但它们其实不是一回事。

LLM 是最底层的基础模型,本质上还是在做下一个词的预测。推理模型是在这个基础上做过增强的版本,会更愿意花算力做中间推理、自我验证和搜索。智能体则是把模型放进一个循环里,让它能根据环境反馈不断决定下一步做什么。至于 Harness,则是包裹在模型外面的那层软件脚手架,负责把这些动作真正组织起来。

如果把它们简单类比一下,LLM 像发动机,推理模型像改装过的发动机,而 Harness 才是整套车架、方向盘、变速箱和刹车系统。

这也是为什么你在普通聊天框里直接用模型,和在 Claude Code 这种编程智能体里用同一个模型,体感会差很多。差异并不只是“谁更聪明”,而是系统有没有把模型真正带进一个适合做开发工作的环境里。

编程智能体到底在做什么

编程智能体不是一个“会聊天的代码助手”那么简单,它本质上是在做一件更具体的事:把一个软件工程任务拆成可以迭代执行的步骤,然后在代码仓库、工具、记忆和反馈之间不断循环。

这意味着它必须先知道自己在哪个项目里,知道当前分支是什么,知道仓库里有哪些约定,知道该去读哪个文档,知道有哪些测试命令,甚至知道哪些文件根本不该碰。

如果没有这些信息,模型就只是一个很会说话的文本生成器。它可以给你建议,但很难真的把事情做完。

而一旦有了 Harness,情况就变了。模型不再只是输出一段回答,而是可以:

  • 读取工作区上下文
  • 调用工具去查文件、搜符号、跑命令
  • 在工具结果基础上继续判断
  • 把长对话压缩成可持续推进的状态
  • 必要时把一部分任务交给子智能体

这才是编程智能体和普通聊天模型的真正分界线。

六个核心组件,决定了它好不好用

那篇分享把编程智能体拆成了六个核心组件。我觉得这个拆法特别好,因为它不是在堆概念,而是在告诉你:一个好用的智能体,底层一定要同时解决六类问题。

1. 实时代码仓库上下文

模型不能在真空里做开发。

当你对它说“把这个测试修一下”或者“实现这个功能”时,它需要知道自己是不是在一个 Git 仓库里,当前目录是什么,项目里有没有 README、AGENTS.md 之类的说明,相关代码可能藏在哪里。

这一步看起来很基础,但其实是整个系统的地基。因为一旦上下文不对,后面的推理再强也没用。

很多人以为编程能力的关键是模型会不会写代码,但真实工作里,更多时间其实花在“先搞清楚应该看哪里”这件事上。能把仓库上下文先摸清楚,已经赢掉一半了。

2. 提示词形态与缓存复用

如果每轮对话都把一大坨稳定信息重新拼一遍、重新喂给模型,那系统很快就会又慢又贵。

所以一个成熟的 Harness,通常会把不变的部分固定成提示词前缀,比如系统指令、工具说明、仓库摘要,把经常变化的部分放在后面,比如最新指令、近期对话、短期记忆。这样不仅更省算力,也更利于提示词缓存。

这件事很容易被忽略,但它会直接影响体验。你看到的是“模型好像反应很顺”,背后其实可能是系统把最重的那部分工作做了缓存和复用。

3. 工具的接入与调用

真正让智能体从“会说”变成“会干活”的,是工具调用。

普通模型只能建议你“去跑一下测试”或者“检查一下配置”,但编程智能体可以直接调用读取文件、全局搜索、运行 Shell 命令、写入文件这些动作。更重要的是,这些动作不是随便乱来的,而是经过 Harness 安检的。

它要先判断工具是不是白名单内的,参数合不合法,路径有没有越界,高危操作要不要人工批准。只有这些都通过了,动作才会真的执行。

这一步决定的是安全性和可控性。没有工具调用,智能体只是聊天机器人;有了工具调用但没有约束,它又会变成危险的自动化脚本。

4. 给上下文瘦身

多轮对话最容易出的问题,不是信息不够,而是信息太多。

编程智能体会不断读取文件、接收日志、保留工具输出,如果这些内容全部原封不动地塞回上下文,Token 很快就会爆掉。于是,一个成熟的系统必须会裁剪、压缩、去重,把真正重要的内容留下来。

这件事听上去很枯燥,但它非常关键。因为智能体能不能持续干活,不只是看它第一轮答得好不好,而是看它能不能在十几轮、二十几轮之后,还保持稳定的判断。

5. 结构化的会话记忆

上下文瘦身解决的是“这轮该塞多少历史进来”,会话记忆解决的则是“长期要留下什么”。

好的智能体不会把所有历史都一股脑堆给模型,而是会把状态拆成两层:完整记录和工作记忆。完整记录负责把所有事件都留住,工作记忆则负责保留当前最关键的任务状态,比如现在在修什么、已经试过什么、下一步最该看什么。

这类设计的价值在于,它让智能体不是在每一轮都重新失忆,而是能带着前面的进展继续往下走。

6. 任务委派与受限子智能体

当智能体有了工具和记忆,下一步自然就是把部分工作分出去。

有些问题适合主智能体继续推进,有些问题则更适合交给一个边界更明确的子智能体去处理,比如查资料、定位文件、排查测试失败的原因。这样做的好处很明显:主线不被打断,岔路问题也能并行推进。

但子智能体不是越多越好。它必须有足够上下文去干活,同时又不能无限繁殖、抢着改同一个文件,或者一路嵌套下去失控。所以这里真正考验设计的,不是“能不能派出去”,而是“派出去以后怎么收回来”。

为什么说 Harness 往往比模型更拉开差距

读到这里,你大概就能理解为什么我会说,编程智能体真正拉开差距的,不只是模型。

因为在当前这个阶段,原始模型之间的差距,很多时候已经没有大家想象得那么大了。至少在基础能力上,顶级模型之间的差异,正在被外围系统逐渐放大或者抹平。

同一个模型,如果没有上下文管理、没有工具链、没有缓存、没有记忆、没有安全边界,它就只是一个很强的语言模型。可一旦把它放进一个完整的 Harness 里,它就变成了真正能在代码仓库里工作的智能体。

换句话说,模型解决的是“会不会想”,Harness 解决的是“能不能做成”。

这也是为什么有些系统看起来特别顺手。不是因为它背后的模型一定碾压别人,而是因为它把开发这件事里最麻烦的脏活累活,都提前处理好了。

你可以把这个理解成:模型负责思考,Harness 负责把思考变成行动。

这对我们自己做 Agent 有什么启发

如果你自己也在做智能体,最该先问的可能不是“我该选哪个模型”,而是“我的运行框架有没有把真实工作流补齐”。

具体一点说,你至少要问自己四个问题:

  • 它知道自己在什么仓库里吗?
  • 它能安全地调用工具并执行动作吗?
  • 它能在长对话里保持上下文不爆炸吗?
  • 它能把临时状态和长期记忆分开管理吗?

如果这些问题还没解决,模型再强,体验也很难真正好。

反过来,如果这些底层能力做扎实了,哪怕模型本身不是最贵、最炫的那个,系统也可能表现得相当能打。因为在智能体这个场景里,用户感受到的不是“模型跑分”,而是“它到底能不能把活干完”。

写在最后

编程智能体这件事,真正让人开始重视的,不是它会不会多说几句,而是它有没有能力在真实开发环境里持续推进任务。

模型当然重要,但如果你只盯着模型,很容易忽略掉更关键的那一层:让模型能够稳定工作、可控工作、持续工作的 Harness。

如果你最近也在做 Agent,不妨先别急着换模型。先看看你的运行框架,离一个真正能干活的开发环境,还有多远。