LLM Harness:真正决定AI编程效果的关键工程层
如果你最近一直在留意 AI 编程工具的进展,大概率会看到这样一个有些反直觉的结论:同一个下午,15 个不同的大语言模型在编程任务上的表现明显变好了,而模型本身一个都没换,只改了 harness。
这句话在 AI 编程社区里引发了不少讨论。很多人第一反应是怀疑:模型又没换,怎么可能变强?但如果你真正动手搭过基于 LLM 的编程工具,就会明白这并不玄幻。模型是你的发动机,harness 是变速箱、底盘、方向盘和仪表盘的组合。你换一台更好的发动机,肯定有效果;但如果你原来的底盘调校稀烂,换发动机带来的提升会被大量浪费。反过来,把底盘、转向、反馈系统做扎实,就算发动机不变,整台车的表现也能上一个台阶。
这篇文章我想把这个话题讲透:harness 到底是什么,它为什么能显著影响大模型的编程效果,它和 Prompt、RAG、Agent 的边界在哪里,以及如果你想自己动手改造一套 harness,应该从哪些模块开始。全文会提供一个最小可运行的 Python harness 示例,并给出可执行的对比验证方法,方便你在自己的项目里实践。
1. 先搞清楚一个核心问题:为什么换模型不等于换效果
过去两年,很多开发者形成了一个思维惯性:AI 编程效果不好,那就换更强的模型。从早期用 GPT-3.5 写工具脚本,到后来切换 GPT-4、Claude,再到今天国产模型密集发布,大家似乎默认“模型即上限”。
模型确实是上限。一个数学推理能力弱的小模型,无论你给它多好的工程框架,它都很难独立完成复杂算法题。但问题在于:大多数人离模型能力上限还有很大距离,真正的瓶颈在下限,也就是模型周围的这套工作流。
什么叫下限?我举个例子。假设你让一个 LLM 修复某个仓库里的一个 Bug,它是这样工作的:
- 它需要先知道项目结构、相关代码文件的内容;
- 它需要决定修改哪个文件、哪一行;
- 它需要调用工具去读取文件、写文件、执行测试;
- 测试失败后,它需要拿到失败日志,并根据反馈再次修改;
- 如果反复失败,它需要判断是自己理解错了需求,还是上下文信息不够,并决定向用户提问或继续尝试。
这一整套流程里,模型只是其中一环。真正决定任务能不能完成的,是“谁来组装上下文”“谁来控制工具执行”“谁来验证结果”“失败之后怎么办”。这几件事,就是 harness 的职责。
标题里那句话说得特别准确:“Only the harness changed”。这意味着在不升级模型的前提下,通过改进上述环节,15 个 LLM 的编程效果都得到了提升。这件事在工程上是完全成立的,因为绝大多数模型的输出质量,高度依赖于输入质量和反馈质量。你喂给模型的上下文是不是刚好覆盖了关键代码,它执行工具后能不能看到清晰报错,这些变量对最终结果的影响,常常比模型排行榜上几个百分点的分数差距更大。
所以在开始讨论 harness 之前,建议你先记住一句话:当你在 AI 编程中感觉“这个模型不行”的时候,先别急着换模型,先检查你的 harness 是不是拖后腿了。
2. LLM Harness 是什么:一个被低估的工程层
Harness 这个词直译是“挽具、线束”,在 AI 领域,它指的是包裹在模型外面、负责让模型能真正完成任务的那一层工程系统。它包含提示词组装、工具调用、上下文管理、结果验证、错误恢复、执行循环等模块。
为了说清楚它的边界,我用一张表来对比几个容易混淆的概念:
| 概念 | 解决什么问题 | 典型组成 | 与模型的关系 |
|---|---|---|---|
| Prompt | 让模型理解当前任务 | 指令文本、示例、输出格式说明 | 直接输入给模型 |
| RAG | 给模型补充外部知识 | 向量库、检索器、重排器 | 把检索结果拼进上下文 |
| Agent | 让模型自主决策和执行 | 记忆、规划、工具调用循环 | 围绕模型构建的智能体 |
| Harness | 让模型输出变成可用结果 | 上下文管理、工具执行、验证反馈、安全控制 | 包裹模型执行全流程的工程框架 |
从这里能看到一个关键点:Prompt、RAG、Agent 都可以被理解为 harness 的一部分,但 harness 的范围更大。它关心的是整个闭环的工程质量,而不仅仅是某个单点。
如果你的项目只是简单调用一次模型生成文本,不需要 harness。但一旦你要让模型完成“读代码、改代码、跑测试、改到通过”这样的多步任务,就必须有一层工程代码来管理这个循环。这层代码的质量,直接决定模型能不能把能力发挥出来。
这里有个容易踩的误区:很多人以为把工具调用功能加上,就算有了 harness。其实工具调用只是其中一个环节。一个完整的 harness 至少要回答这些问题:
- 模型需要哪些上下文?由谁决定?
- 模型可以调用哪些工具?调用权限如何控制?
- 模型输出是否合法?如何解析?
- 模型执行完工具后,反馈如何组装?
- 如何判断任务已经完成?
- 如果多次失败,终止条件是什么?
- 整个过程是否可观测、可复现?
这些问题每一个单拆出来都不难,但把它们组合成一个稳定系统,难度比大多数人想象得高。这也是为什么社区里越来越多的项目开始直接使用现成的 harness 框架,而不是从零写循环。
从搜索热词里也能看到,DeepSeek Harness、Codex Harness、阿里云百炼 Coding Plan、火山方舟 Coding Plan 这类工具正在快速进入开发者的视野。它们的共同点是:不再把模型当作一个聊天接口,而是把模型放进一个为编程任务定制的执行框架里,模型在里面完成读、写、改、验的完整闭环。
3. Harness 提升 Coding 能力的五个关键设计点
既然 harness 这么重要,它到底是通过哪些机制影响模型 coding 效果的?我在设计过几个基于 LLM 的代码处理流程之后,总结出五个最关键的维度。
3.1 上下文装配:让模型“看到”该看的东西
这是影响最大、也最容易被低估的一环。直接给模型丢一个完整仓库,让它在几十万行代码里自己找答案,效果通常很差。原因有两个:一是上下文窗口有限,大量无关代码会稀释注意力;二是模型需要把注意力放在关键文件上,而不是被无关文件干扰。
好的 harness 会先做上下文规划:根据任务描述,检索相关文件、提炼函数签名、整理调用关系,只把最小必要的信息拼进模型上下文。这背后可以是简单的关键词匹配,也可以是更复杂的代码语义检索。上下文质量上去了,模型一次性写对的概率会明显提升。
3.2 工具调用:把“说”变成“做”
模型的本质是文本生成器,它不能直接操作操作系统。要让它在真实项目里改代码,必须通过工具调用完成。常见工具包括:读取文件、写入文件、执行 Shell 命令、运行测试、搜索文件内容等。
工具层的工程质量很关键。工具的输入输出格式必须稳定;工具执行结果必须被完整捕获;调用权限必须明确。这里真正容易出错的地方是:模型输出的工具调用参数经常不符合格式,harness 需要做好容错和重试。你还