Claude Opus 4.8,按项目标题的描述,价格贵了57.1倍,五项对比全输。第一次看到这个结果,大多数人第一反应大概率是:模型名称写错了吧?评测任务是不是偏向了某个模型?甚至觉得这是一次包装过的营销操作。但真正值得注意的是,这个标题里反复出现的关键词不是“模型”,而是“Harness”。也就是说,这场对比想说的并不是某个模型不行,而是“裸模型输给了带Harness的完整执行链路”。
在我看来,这是一个信号:在真实工程环境里,模型与模型之间的能力差距,正在被模型之外的工程层拉平甚至反超。很多人还在用“参数规模/基准分”来选模型,但真正决定线上表现的东西,已经慢慢变成了你为模型搭建的那套调用、验证、重试、上下文管理、工具编排的流程。用一句话概括我的判断:模型是发动机,Harness是整车。发动机排量有差距,但整车调校和驾驶策略,有时候比排量更决定最终成绩。
这篇文章我会先拆这次对比可能的输法,再讲清楚Harness到底在解决什么问题,然后给出一套可以迁移到自己项目里的最小Harness结构和公平评测检查清单,最后说清楚这种思路的适用边界。
1. 先别急着下结论,这次对比到底输在哪
1.1 为什么会出现“贵57.1倍却全输”这种反直觉结果
如果只看标题,这里有一个很刺眼的数字:57.1倍。但项目标题本身没有给出具体价格结构,所以我们只能把它当作一个对比设计里的前提信息,而不是一个可复用的定价结论。真正值得拆解的,不是这个倍数是否准确,而是“全输”到底意味着什么。
全输不等于某个模型在所有真实任务上都差。它更可能意味着:在一个特定的评测集、一套特定的提示词模板、一组特定的工具调用接口、一个特定的执行轮数上限、一套特定的结果判定规则下,Claude Opus 4.8 没有跑过那个被Harness包裹的对手。
这和你平时在榜单上看到的基准分对比完全不是一回事。传统基准分对比做的是“静态能力测试”,把输入喂给模型,直接看输出。Harness对比做的是“动态任务完成测试”,模型只是整个系统里的一环,系统会帮它规划、调工具、纠错、重试、校验结果。
所以“贵57.1倍却全输”这个结果,真正说明的问题不是模型能力不存在差距,而是:在复杂任务里,模型能力只是结果的一部分,执行框架的调度能力、重试能力、上下文管理能力,正在成为更大的变量。
一个很朴素的道理:一个厉害的工程师,如果只给他一张白纸、一台不带网络和编译器的电脑,他很难完成一个软件交付。但如果给一个普通工程师一台配好环境、有CI、有测试、有文档、有工具链的电脑,他可能交付得更快。模型也是这样。裸模型是被动等待输入,Harness则是主动带着模型走完一条已经被验证过的路径。
1.2 评测链路里,哪些环节会悄悄决定胜负
要理解这种对比,先要把“模型能力对比”拆成“评测链路对比”。如果两边用的Harness不同,那你测出来的就不只是模型差距,还包含了整套流程差距。
以下是常见评测链路里会干预结果的关键环节:
- 提示词模板:给模型的任务描述是不是同构的。一段经过精心设计的系统提示词,可能让弱模型表现提升百分之十几;同样,一段糟糕的提示词也可能让强模型发挥失常。
- 测试集选择:任务难度、领域分布、格式要求是否一致。同一个任务,代码生成版的难度和自然语言答题版的难度完全不同。
- 温度与采样参数:候选结果数量、温度、top_p、max_tokens等设置,会影响模型的探索程度。
- 工具集权限:一方可以用文件读写、代码执行、浏览器检索,另一方只能纯文本回答,这就是不公平对比。
- 重试策略:一方失败后允许自动重试3次,另一方只要输出不符合格式就算失败。
- 结果校验规则:使用普通字符串匹配,还是用另一个模型来判断结果质量,判定标准差异很大。
有经验的工程师看到这些变量,会明白一个道理:所谓“全输”,可能只是“在某一套流程配置下全输”。换一套Harness,结果很可能反转。这并不意味着Harness是作弊,而是说明评估一项复杂任务时,模型和流程本来就是耦合的,很难彻底分开。
1.3 看到这种对比时,先别急着换模型
很多人看到“Claude Opus 4.8全输”,第一反应是:那我是不是不该用这个模型?我的建议是:千万别仅凭这样一个标题就调整选型。
这里有一个更合理的处理顺序:
- 先确认对比任务和你自己的任务是否同构。
- 再确认两边是否使用了等价的工具集和重试策略。
- 然后确认判定指标是什么,是格式正确率、人工评分还是LLM评分。
- 最后才是看模型本身的能力差异。
如果上面这些变量都不可见,那这个对比对你的参考价值就非常有限。它更大的价值在于提醒你:Harness正在成为新的竞争维度。
2. Harness到底是什么,为什么它能拉平模型差距
2.1 Harness不是提示词工程,也不是一个壳
“Harness”这个词在不同语境里有不同含义。在模型评测领域,它通常指一套“模型执行与评估框架”,用来统一跑测试、收集结果、计算指标。在智能体应用和复杂任务执行场景里,它更接近于“模型外围的完整执行环境”。
我比较喜欢的定义是:Harness是一套把模型变成可靠执行器的工程链路。它至少包含以下五个模块:
- 任务解析层:把用户目标拆解成模型可以处理的步骤。
- 上下文管理层:决定哪些信息进入模型、哪些信息保留、哪些信息被摘要压缩。
- 工具调用层:给模型暴露文件读写、代码执行、搜索、API请求等外部能力。
- 验证与重试层:判断模型输出是否合法、是否完成任务,不合法就触发重试或回退。
- 输出标准化层:把模型的非结构化输出转换成分数、JSON、报告等可被下游消费的格式。
这就是为什么它不只是“一个壳”。一个壳只是把输入传进去、把输出拉出来。Harness是主动介入模型工作过程,并通过外部工具验证它每一步的判断。
在近期社区讨论里,deepseek harness、codex harness这些词频繁出现。这说明很多人已经不再只关心模型名,而是关心“怎么把模型牢靠地接进自己的工作流”。这其实是一种工程意识的转变:从“选一个强模型”到“搭一条可靠流程”。
2.2 三条机制,解释Harness为什么能补偿模型差距
机制一:复用成功路径。
Harness可以通过多轮尝试,把正确的方法固化下来。比如一个任务需要先读取文件、再定位函数、再生成补丁,Harness会在失败后把工具返回信息追加到上下文里,引导模型重新尝试。这个过程相当于给模型外挂了一个“试错记忆”,模型能力弱一点,但流程补齐了试错次数和路径修正。
机制二:补偿单次采样偏差。
模型是有随机性的。同一个问题,同一个模型,跑一次和跑十次,效果可能差很多。Harness可以通过多次采样、投票、自我反思、校验重试,把“单次最好结果”变成“多次稳定的好结果”。这样即使原始模型本身的上限低一点,只要采样足够多、验证足够严格,最终交付的结果也可以很稳。
机制三:显式管理上下文窗口。
复杂任务的失败,很多时候不是模型推理能力不够,而是上下文被撑爆、关键信息被淹没。Harness可以通过摘要、分段、只注入相关工具结果等策略,保证模型始终在一个可控的上下文里工作。这个能力对弱模型和强模型都有效,但对弱模型的提升更明显,因为弱模型对信息噪音更敏感。
所以,并不是Harness“让模型变聪明了”,而是它让模型少犯错误、减少无效输出、更快回到正确路径上。
2.3 一个关键提醒:Harness不能凭空创造能力
必须说清楚一点:Harness的补偿能力是有边界的。如果一个模型的代码能力本身就比较弱,Harness不可能让它写出它没有学会的算法;如果一个模型的知识覆盖里没有某类专业领域,Harness也不能让信息从无到有。
Harness能做到的,是把模型已有能力的可用率提高,把执行流程中的浪费找回来,把错误率降下来。它更像“评测优化”和“工程交付优化”,而不是“模型能力的无中生有”。
这也是为什么“贵57.1倍全输”这个标题很有迷惑性。它容易让人误以为便宜模型通过Harness就可以全面替代贵模型。比较准确的表达是:在特定任务、特定Harness、特定评估指标下,便宜模型加一套好流程,可以做到比贵模型裸跑更好。一旦任务超出Harness能补偿的范围,模型本身的上限就会重新浮出水面。
3. 把Harness思维搬进自己的工作流:一个最小可用结构
3.1 先定义你的任务边界,不要一上来就搭框架
很多人听到Harness有用,马上想搭一套复杂的Agent框架。我的建议是:不要。一开始就应该从你最痛的具体任务出发,确定三个问题:
- 你要解决的是“单次生成结果”,还是“多步完成一个任务”?
- 模型的中间步骤是否需要外部工具验证?
- 输出结果是否要求固定的格式、准确率和可追溯性?
如果你只是做文本摘要、翻译、内容润色,那Harness的必要性并不高,一个稳定提示词模板就够了。如果你要做代码修改、数据分析、长文档整理、批量信息抽取这类多步任务,那Harness就非常值得投入。
初学时可以按“最小可用流程”来设计:把任务拆成三步,每步用模型执行一次,再用代码校验一下输出,失败就重试。先不要引入复杂的状态机和多Agent协作。
3.2 最小Harness示例:一个可供参考的流程结构
这里给一个流程示意图,不绑定具体框架。你可以用Python脚本、n8n工作流、LangChain、自研调度器,甚至简单的Shell脚本实现,重点在于结构。
for each task in eval_set: state = init_context(task) for round in range(max_iterations): action = model.call( context=state, tools=tool_whitelist ) if action.is_final_answer(): if validate(action.result, task): record(round, action.result, "success") break else: state = apply_action(action) # 把工具返回结果追加进上下文 state = manage_context(state) # 摘要、裁剪、分段,控制上下文长度 else: record(round, None, "failed")这个流程说明了Harness的核心循环:模型不直接输出最终答案,而是被引导着走“调用模型 -> 解析动作 -> 执行工具 -> 更新上下文 -> 再次调用模型”的循环。验证层负责判断结果是否合格,不合格时继续循环,直到达到最大轮数。
对应的配置项,可以参考下面这个JSON结构:
{ "task": { "name": "repo_code_fix", "max_iterations": 3 }, "model": { "primary": "some-strong-model", "fallback": "some-cheap-model" }, "context": { "max_context_chars": 16000, "strategy": "truncate_or_summarize" }, "tool": { "whitelist": ["file_reader", "file_writer", "shell"], "allow_interactive": false }, "retry": { "max_retries": 3, "backoff_seconds": 2 }, "eval": { "protocol": "unit_test_or_llm_judge", "show_attempts": true } }这只是结构示例,不是某个框架的官方配置。实际使用时,要结合你选用的模型服务、开发语言、部署环境去调整字段名和范围。关键是先把这个流程跑通,而不是一开始就追求完整。
3.3 关键参数与调优顺序
在Harness里,参数不是越多越好。有几个参数会直接影响成败:
- max_iterations:最大迭代轮数。设太小,模型没有足够机会修正错误;设太大,耗时和成本都会上升。一般从2到3开始,观察成功率变化,再逐步增加。
- tool_whitelist:允许模型调用的工具白名单。原则是“最小权限”。给模型越多的工具,它越容易走偏。先只给解决当前任务最必要的工具。
- context_strategy:上下文管理策略。常见有三种:全部保留、按长度截断、对旧内容做摘要。复杂任务里,摘要策略更稳健,但会增加额外调用成本。
- retry策略:重试应该区分“解析失败重试”和“任务完成度不够重试”。前者是输出格式问题,后者是内容质量问题。两类重试的判断逻辑不同,不要混在一起。
- eval.protocol:结果校验规则。能用精确校验就用精确校验,比如代码跑单测、数据查记录数;不能精确校验再用LLM打分。
调优顺序我一般推荐这样走:
- 先用默认参数跑通一条样例。
- 看失败发生在哪一层:解析失败、工具调用失败、结果校验失败。
- 先修“格式和协议”,再修“上下文策略”,最后修“模型参数”。
- 当单条任务稳定后,再扩大任务集和批量数。
不要一上来就调整温度、top_p这种模型采样参数。很多时候失败原因不是模型采样偏差,而是提示词没有给够约束,或者工具返回结果没有正确塞回上下文。
3.4 从单任务扩展到批量化、接口化
单任务跑通以后,再考虑批量化和接口化。
批量化要注意三点:并发数、限流、失败隔离。不要一次性把几十个任务塞进同一个Runner,否则一个任务卡住会拖慢全部。更稳的做法是给每个任务独立的临时目录、独立的日志文件、独立的超时时间。
接口化要注意输出契约。Harness最终要服务下游,所以要固定输出格式。我建议把每次执行的结果落成一个标准JSON:
{ "task_id": "task_001", "status": "success", "attempts": 2, "output": "最终结果", "error_log": [ "round_1: tool_call_timeout", "round_2: output_format_invalid" ], "cost_estimate": { "input_tokens": 12000, "output_tokens": 2400 } }这样的结构化输出,方便后续做质量分析、成本核算和问题排查。当你积累几十条或上百条这样的执行记录后,你就能清楚看到自己的Harness到底在哪一环消耗最大、哪一环最容易失败。
4. 不要被对比带偏:一次公平评测需要冻结的变量
4.1 公平对比的检查清单
如果你看完“贵57.1倍全输”这样的标题,也想自己设计一次模型对比,那一定要先列一个检查清单。避免把Harness差异误当成模型能力差异。
| 变量 | 要冻结的内容 | 常见坑 |
|---|---|---|
| 测试集 | 相同的任务列表、相同的输入源 | 一边选了简单用例,一边选了高难用例 |
| 提示词模板 | 同样的系统提示词结构、同样的示例 | 一边给了完整Few-shot,一边只给一句指令 |
| 上下文管理 | 同样的截断/摘要策略、同样的最大上下文 | 一边能把整库代码塞进去,一边上下文溢出 |
| 工具集 | 同样的工具白名单和权限 | 一边能执行代码,另一边只能纯文本输出 |
| 重试策略 | 相同重试次数、相同失败判断条件 | 一边自动重试3次,另一边一次失败即判负 |
| 采样参数 | 相同temperature/top_p/max_tokens | 一边温度0.7多次采样,另一边温度0.0单次输出 |
| 结果判定 | 相同校验规则、相同评分标准 | 一边用LLM judge,另一边用字符串精确匹配 |
| 日志与可复现性 | 记录完整执行轨迹、随机种子 | 只有最终分数,没有中间过程 |
这张表既适合评测别人的对比结果,也适合设计自己的评测方案。没有冻结的变量越多,结果解释力越弱。
4.2 一个“先跑通、再对比、最后优化”的对比流程
做模型对比,不要直接拿两个模型全量跑。更稳妥的做法是三步走。
第一步,跑通基线和流程。先用模型A在Harness X上跑通5到10条样例,确认流程没有断裂:模型能解析、工具能执行、结果能校验。这一步的目的是排除“流程本身不可用”导致的失败。
第二步,固定变量做小样本对比。在同样的测试集、同样的harness配置、同样的工具集下,分别跑模型A和模型B,各跑20到50条。观察成功率、平均轮数、失败模式。这时的差异才比较接近模型能力差异。
第三步,再做交叉实验。把模型A放进Harness Y,把模型B放进Harness X,看结果如何变化。交叉实验能帮你确认,到底模型差异贡献大,还是Harness差异贡献大。
实际尝试中,你会发现一个常见结果:Harness差异会掩盖模型差异。也就是说,如果你用两套差别较大的Harness,弱模型配好流程,完全可能赢过强模型配差流程。
4.3 排查链路:当便宜模型没有赢,先查哪几层
如果你已经给便宜模型配了Harness,但在对比中仍然输给贵模型,可以按下面的顺序排查:
- 先看评测协议是否对等:两边是不是真的用了同一套任务描述、同一套工具白名单、同一套判定逻辑。
- 再看工具执行结果是否有效回填:模型调用工具后,输出有没有真的放进下一轮上下文。很多Harness在这一步会丢信息,导致模型反复走错。
- 再看重试逻辑是否击中真实问题:如果模型第一次输出JSON解析失败,第二次还在继续生成JSON,说明重试没有修正问题,只是机械重试。
- 再看上下文是否被噪音淹没:检查每一轮进入模型的文本,是否包含了大量无关工具输出。如果上下文被日志塞满,再强的模型也会被带偏。
- 最后才检查模型本身的参数:温度、top_p、max_tokens等。这些参数很少是首要原因。
这条排查链路可以复用到很多场景。核心逻辑是:先看外部流程,再看模型参数。很多“模型不够聪明”的结论,最后都被证明是“流程没把聪明好好放出来”。
5. Harness思维不是银弹,它有明确的适用边界
5.1 适合使用Harness思维的人
从实际价值来看,以下三类人最应该关注Harness:
第一类:做复杂任务自动化的人。比如AI编程助手、数据分析流水线、批处理文档工具。这类场景天然需要多步执行、工具调用、结果校验,Harness几乎绕不开。
第二类:需要稳定SDK接口的人。如果模型输出格式经常变化,下游接口就会崩溃。Harness里的输出标准化和结果校验层,能大幅提高稳定性。
第三类:预算有限,但还需要保质量的人。用便宜模型加Harness,在部分任务上可以做到接近贵模型的效果。不过需要花时间做评测和调优,不是零成本替代。
5.2 不适合的场景
Harness不是万能药。以下几类场景,不值得过度投入:
- 单次短文本生成,比如写标题、写摘要、翻译一句话。加Harness反而增加复杂度和延迟,直接用好一点模型加提示词模板就够。
- 纯知识问答,不需要工具调用,也不涉及多步执行。Harness能带来的增量很小。
- 对“模型本身创造性”有高要求的场景,比如开脑洞、写长文。Harness的约束和重试机制反而可能让输出变得保守。
- 评测模型“原生能力”的时候。如果你要判断两个模型谁知识面更广、谁推理更细腻,就不应该引入复杂的Harness去干预过程。
所以在复制“便宜模型+Harness打赢贵模型”这个思路之前,先问自己一句:我的任务真的需要多步执行和外部工具吗?如果不需要,这个思路就不成立。
5.3 所有Harness都绕不开的底线
Harness能提高可用率,但不能突破模型的能力上限。
更准确地说:
- 模型A的知识上限是90分,Harness可以把它稳定输出到85分以上。
- 模型B的知识上限是70分,Harness最多把它稳定输出到65分左右。
它很难让70分模型稳定超过90分模型,除非任务本身对模型能力要求不高、瓶颈主要在执行流程、工具调用和格式校验上。那种情况下,70分模型加好Harness确实可能拿到更好的最终结果,因为90分模型的裸跑可能只有60分可用率。
这也是为什么“贵57.1倍全输”这个案例并不代表一般规律。它更像是一个边界案例,提醒我们不要再把模型当作孤岛来评估。真实系统里,最终成绩是模型和流程的合成结果。
6. 比“谁赢”更值得关注的问题:从选模型转向设计工作流
6.1 模型能力仍然重要,但它的权重在变化
过去几年,大家的注意力几乎全在模型能力上:谁的参数多、谁的基准分高、谁更聪明。这在模型能力快速提升的阶段是合理的,因为模型本身是最大变量。
但进入应用落地阶段后,情况变了。模型能力提升的速度开始放缓,而应用场景对稳定性、成本、可维护性的要求越来越高。这时候,Harness这类工程层的东西开始变得更重要。
有一个粗略但有用的判断方式:在一次完整任务里,模型贡献的是一次次“局部推理判断”,而Harness贡献的是“把无数次局部判断串成一条可靠路径”。当任务复杂度上升,局部判断的价值会下降,路径设计的价值会上升。这解释了为什么复杂业务场景里,便宜模型加好流程经常能有超出预期的表现。
6.2 Harness思维的长期价值:可复用、可观测、可维护
与其说Harness是某个工具,不如说它是一种工程视角。它的长期价值体现在三件事上:
第一,可复用。一个调好的Harness不会只服务一次任务。你可以换模型、换测试集、换业务场景,但执行链路和错误处理逻辑可以反复使用。
第二,可观测。Harness天然需要日志、Trace、成本记录和结果记录。这些数据能帮你持续发现问题、优化参数。裸模型调用往往缺少这类观测能力。
第三,可维护。当你的流程升级时,Harness能让你比较平滑地迁移。比如从模型A换到模型B,你只需要改动模型接入层,不需要把任务拆解、工具调用、结果校验全部重写。
这可能是“Harness思维”最值得长期投入的理由:它让复杂的应用交付从“依赖某个模型灵不灵”变成“依赖一套可以被审计、被优化的工程链路”。
6.3 下次看到模型对比,先问两句
如果你只从这篇文章里带走一个行动建议,我希望是:下次再看到“某个模型赢了另一个模型”的对比,不要立刻换模型,先问两句:
第一句:两边使用的Harness是一样的吗?如果不一样,那对比的是“模型+流程”的组合,不是模型本身。
第二句:这个对比的任务类型,和我自己的业务场景一致吗?如果对方测的是代码生成,而你是做长文档总结,参考价值就很有限。
然后再决定要不要升级模型、要不要调整Harness、要不要更换工具链。
回到开头的案例:Claude Opus 4.8贵57.1倍却五项全输,它真正应该带来的启示,不是“贵模型不值得买”,而是“我们在评估模型时的参照物已经变了”。过去你只需要问“哪个模型更强”,现在你需要多问一句“哪套流程能让我的模型稳定交付结果”。
在很长一段时间里,模型差距会继续存在,Harness也无法填平所有模型代差。但对多数真实业务来说,先把Harness做好,再谈模型升级,性价比往往更高。先跑通一条最小链路,再逐步补工具、补校验、补日志,最后才谈批量和成本优化。这条路没有那么性感,但它务实、可控,也更容易在项目里真正落地。