同一个模型,为什么结果差10倍?差的不是模型

Trae 是一款非常优秀的作品,本文图片就由 Trae 生成

引言

我在很早之前有个错觉:用的是同一个模型,结果应该差不多

在上一篇文章 使用 trae 中遇到的一些问题 ,分享了我从 Claude Code 迁移到 Trae 时遇到的问题

为此,我做了一组严格的对照实验:

  • 相同的模型:分别测试了 GLM5 和 Kimi 2.5
  • 相同的起点:新窗口,干净的上下文
  • 唯一变量:Claude Code vs Trae

结果呢?同样的模型、同样的提示词,Trae 的表现明显不如 Claude Code。更具体地说:

  • 在 Claude Code 中能正确调用 Skill 并按流程执行本地脚本
  • 在 Trae 中模型直接忽略了脚本调用步骤,自己猜测实现
  • 有时候模型反问完就直接结束工作了,任务没完成
  • 有时候又能正常执行

当时的发现是:在执行过程中上下文不断增加,然后导致一部分信息被忽略了

那么,同样的模型,同样的提示词,为什么换个工具结果就差这么多?

先说结论,差的不是模型,是 Harness


一、为什么你的结果不稳定?

1.1 上下文焦虑:模型"害怕"了

症状:Agent 做到一半突然说"我已经完成了",但你一看,明显还有很多没做。

根因 :Anthropic 发现了一个他们称之为"上下文焦虑"(Context Anxiety) 的现象------当模型感知到上下文窗口快满时,会提前结束工作,就像学生看到考试快结束了就匆忙交卷。

arduino 复制代码
你的 Agent 的内心独白:

"上下文已经用了 80%... 我是不是该收尾了?"
"算了,这个功能不做了,先交差吧。"
"用户应该不会注意到我跳过了这一步..."

没有 Harness 的后果:模型自己决定何时停止,而这个决定是基于"上下文还剩多少",不是"任务是否完成"。

1.2 无限循环:模型"上头"了

症状:Agent 反复调用同一个工具,或者一直在"搜索 → 看结果 → 再搜索"中打转,永远停不下来。

根因:LLM 没有内在的"停止信号"。人类会想"我已经搜了 5 次了,够了",但 LLM 没有这个概念------它只会机械地继续循环。

scss 复制代码
你的 Agent 的行为模式:

第 1 轮:web_search("React 性能优化")
第 2 轮:web_search("React 性能优化 最佳实践")
第 3 轮:web_search("React performance optimization 2025")
第 4 轮:web_search("React 渲染优化 虚拟列表")
第 5 轮:web_search("React memo useMemo useCallback 区别")
...
第 20 轮:还在搜...

没有 Harness 的后果:没有预算限制,Agent 可以无限循环,直到 API 额度耗尽或你手动 Ctrl+C。

1.3 自我评估偏差:模型"自恋"了

症状:Agent 做完工作后说"我已经完美地完成了任务",但你一看,代码有 bug、功能没实现、逻辑有漏洞。

根因 :Anthropic 的实验发现,LLM 评价自己的工作时,总是过度正面。这不是谦虚的问题------模型真的"认为"自己做得很好。

vbnet 复制代码
你的 Agent 的自我评价:

Agent: "我已经完成了用户认证模块的实现。"
Agent: "代码质量很高,遵循了最佳实践。"
Agent: "所有功能都已正确实现。"

你打开代码一看:
- 密码明文存储
- 没有 CSRF 防护
- JWT 没有过期时间
- 登录接口没有限流

没有 Harness 的后果:没有外部验证者,Agent 的"完成"只是它自己认为的完成,不是真正的完成。

1.4 上下文爆炸:模型"失忆"了

症状:对话进行到一半,Agent 开始忘记之前说过的话、做过的决定,甚至重复之前已经完成的步骤。

根因:上下文窗口是有限的。当对话历史超过窗口容量时,早期的信息会被截断或压缩。如果压缩策略不好,关键信息就会丢失。

arduino 复制代码
你的 Agent 的记忆退化:

第 1 轮:用户说"用 TypeScript 写,不要用 JavaScript"
第 5 轮:Agent 记得用 TypeScript
第 15 轮:上下文压缩发生
第 16 轮:Agent 开始写 JavaScript 代码
第 20 轮:用户说"我之前说了用 TypeScript!",Agent 说"抱歉,我忘了"

没有 Harness 的后果:没有压缩策略,上下文要么爆掉(API 报错),要么粗暴截断(丢失关键信息)。

1.5 单点故障:模型"挂了"

症状:API 调用失败、网络超时、Provider 限流,Agent 直接崩溃,之前的工作全部丢失。

根因:没有错误恢复机制。一次 API 失败 = 整个对话作废。

csharp 复制代码
你的 Agent 的崩溃日志:

[INFO] 调用 OpenAI API...
[ERROR] Rate limit exceeded. Please retry after 60s.
[INFO] 对话终止。所有进度丢失。

没有 Harness 的后果:没有 fallback、没有重试、没有状态持久化,任何一次失败都是致命的。


二、为什么别人比你稳定?

2.1 别人有 Harness,你没有

"别人"不是直接调 API。他们在 API 和模型之间加了一层------Harness

复制代码
你的方式:
  用户 → API 调用 → 模型 → API 返回 → 用户
  (裸调用,模型做什么就是什么)

别人的方式:
  用户 → Harness → API 调用 → 模型 → API 返回 → Harness → 用户
  (Harness 在中间做翻译、保护、纠偏)

Harness 不改变模型的输出,但改变模型输出的命运------好的 Harness 会让模型的输出走上正确的轨道,坏的 Harness(或没有 Harness)会让模型的输出自由落体。

2.2 别人的 Harness 做了什么?

以 Hermes Agent 为例,它的 Harness 做了这些你的代码没做的事:

你遇到的问题 Hermes 的 Harness 怎么解决
上下文焦虑 迭代预算 + Grace Call:预算耗尽时给模型一次"优雅收尾"的机会,而不是硬中断
无限循环 IterationBudget:硬性上限(默认 90),execute_code 不计数(避免惩罚正常的多步骤执行)
自我评估偏差 子代理隔离 + 摘要返回:主 Agent 看不到子代理的中间过程,只看最终结果,迫使子代理自我审查
上下文爆炸 自动压缩 + 会话分裂:迭代式摘要保留关键信息,压缩后创建新 session 保持干净上下文
单点故障 5 级错误恢复:重试 → Fallback → 压缩 → 部分恢复 → 降级

2.3 关键差异:不是功能,是假设

你可能想:"这些功能我也能加,加个重试、加个预算限制不就行了?"

不行。 关键差异不在于单个功能,而在于这些功能背后的假设体系

好的 Harness 不是功能堆砌,而是假设体系------每个功能都基于一个"模型不能做什么"的假设,这些假设互相支撑,形成闭环。

sql 复制代码
假设体系(Hermes 的例子):

假设:模型会无限循环
  → 解决:迭代预算
    → 新假设:预算耗尽时模型可能还有话没说完
      → 解决:Grace Call(多给一次机会)
        → 新假设:Grace Call 后模型可能产生空响应
          → 解决:空响应重试 + 部分流恢复
            → 新假设:重试也可能失败
              → 解决:Fallback 到上轮内容

这是一个完整的假设链,不是孤立的功能点。

如果你只加了"迭代预算"而没有"Grace Call",Agent 会在预算耗尽时被硬中断,可能连一句总结都没来得及说。如果你只加了"重试"而没有"部分流恢复",流式中断时已传输的内容就白费了。

这就是为什么"加个重试"不等于"有了 Harness"。


三、Harness 怎么解决这些问题?

3.1 解决上下文焦虑:预算制 + 优雅退出

没有 Harness

arduino 复制代码
模型:上下文快满了... 我该收尾了... 算了,就这样吧。
结果:任务完成度 60%,但模型说"已完成"。

有 Harness(Hermes 的做法)

erlang 复制代码
Harness:你还有 45 次迭代预算,继续工作。
模型:好的,继续实现下一个功能。
...
Harness:预算还剩 1 次,这是你的 Grace Call,请总结当前进度。
模型:我已完成 8/10 个功能,剩余 2 个是...
结果:任务完成度 80%,且有明确的进度报告。

关键设计

  • 迭代预算:不依赖模型自己判断何时停止
  • Grace Call:预算耗尽时不硬中断,给一次"优雅收尾"的机会
  • execute_code 不计数:程序化的工具调用不应该消耗预算,避免惩罚正常的复杂任务

3.2 解决无限循环:预算 + 退还机制

没有 Harness

erlang 复制代码
模型:让我再搜一次...
模型:让我再搜一次...
模型:让我再搜一次...
(无限循环,直到 API 额度耗尽)

有 Harness(Hermes 的做法)

scss 复制代码
Harness:你还有 45 次迭代预算。
模型:web_search("React 性能优化")
Harness:消耗 1 次预算,剩余 44。
模型:web_search("React memo 用法")
Harness:消耗 1 次预算,剩余 43。
...
模型:execute_code("npm run test")
Harness:execute_code 不计数,预算仍为 30。
...
Harness:预算耗尽。Grace Call。
模型:基于搜索结果,我总结如下...

关键设计

  • 硬性上限:不管模型想不想停,预算到了必须停
  • 智能计数:程序化调用(execute_code)不消耗预算,只有"思考型"调用才计数
  • 退还机制:如果一轮只调用了 execute_code,自动退还预算

3.3 解决自我评估偏差:Generator-Verifier 分离

没有 Harness

arduino 复制代码
模型:我写完了认证模块。
模型:让我检查一下... 看起来很好!
(模型自己检查自己,永远是"很好")

有 Harness(Anthropic 推荐的三 Agent 架构)

markdown 复制代码
Generator Agent:我写完了认证模块。
Evaluator Agent:让我检查...
  - 密码明文存储?FAIL
  - 没有 CSRF 防护?FAIL
  - JWT 没有过期时间?FAIL
Generator Agent:收到反馈,修复这三个问题...
Evaluator Agent:再次检查...
  - 密码已加密?PASS
  - CSRF 防护已添加?PASS
  - JWT 过期时间已设置?PASS

Hermes 的实现方式 :通过 delegate_task,可以创建一个"审查"子代理,它的 goal 是"审查代码质量",toolsets 只包含 ["file", "terminal"](只读 + 测试),不包含写权限。这实现了 Generator-Verifier 的分离。

关键设计

  • 角色分离:生成者和评估者是不同的 Agent 实例
  • 工具隔离:评估者只有只读工具,不能修改代码
  • 迭代循环:评估不通过 → 反馈给生成者 → 修改 → 再评估

3.4 解决上下文爆炸:压缩 + 分裂 + 搜索

没有 Harness

erlang 复制代码
对话越来越长...
API 返回:context_length_exceeded
对话崩溃,所有进度丢失。

有 Harness(Hermes 的做法)

erlang 复制代码
Harness:上下文已用 85%,发出警告。
Harness:上下文已用 92%,触发压缩。
  - 保留:系统提示 + 最初 3 轮 + 最近 N 轮
  - 压缩:中间轮次 → 迭代式摘要
  - 创建新 session(parent_session_id 链接旧 session)
模型:继续在干净的上下文中工作。
...
用户:之前我们讨论过什么?
Harness:通过 FTS5 搜索旧 session,找到相关内容。
模型:根据搜索结果,我们之前讨论了...

关键设计

  • 预检压缩:不等 API 报错,主动检测并压缩
  • 保护头尾:系统提示和最近对话优先保留
  • 迭代式摘要:多次压缩时更新之前的摘要,而不是重新生成
  • 会话分裂:压缩后创建新 session,保持干净上下文
  • FTS5 搜索:旧 session 不删除,可以全文搜索

3.5 解决单点故障:5 级错误恢复

没有 Harness

复制代码
API 调用失败 → 对话终止 → 进度丢失 → 从头开始

有 Harness(Hermes 的做法)

复制代码
Level 1:重试
  API 429/500 → 带退避重试(最多 3 次)

Level 2:Fallback
  主 Provider 失败 → 切换到 Fallback Provider
  OpenRouter → 直连 OpenAI → 本地模型

Level 3:压缩
  API 返回 context_length_exceeded → 主动压缩 → 重试

Level 4:部分恢复
  流式中断 → 使用已流式传输的内容作为最终回复
  空响应 + 上轮有内容 → 使用上轮内容

Level 5:降级
  所有恢复策略失败 → 返回当前最佳结果 + 错误信息

关键设计

  • 层级递进:从最简单的重试开始,逐步升级到更激进的恢复策略
  • 状态持久化:每轮工具执行后保存到 SQLite,崩溃后可恢复
  • 部分结果优于无结果:宁可返回不完美的结果,也不要让用户白等

四、同一个模型,结果差 10 倍的真正原因

4.1 不是模型的问题,是 Harness 的问题

Anthropic 做了一个实验:

配置 耗时 成本 结果质量
Solo Agent(无 Harness) 20 分钟 $9 能跑但有 bug,UI 粗糙
3-Agent Harness(Planner + Generator + Evaluator) 6 小时 $200 功能完整,UI 精致,bug 极少

同一个模型(Claude Opus 4.5),结果质量差了 10 倍以上。

差的不是模型,是 Harness。

4.2 Harness 的 5 个维度决定了结果稳定性

维度 没有 Harness 有 Harness 差异倍数
停止控制 模型自己决定何时停(焦虑或无限循环) 预算制 + 优雅退出 2-3x
质量保证 模型自己评价自己(过度正面) 外部验证者(Generator-Verifier) 3-5x
上下文管理 爆掉或截断(信息丢失) 压缩 + 分裂 + 搜索(信息保真) 2-3x
错误恢复 一次失败 = 全部丢失 5 级恢复(重试 → Fallback → 压缩 → 部分恢复 → 降级) 5-10x
成本控制 不控制(可能无限消耗) 智能路由 + 缓存 + 预算 2-5x

5 个维度叠加,结果差异可达 10-100 倍。

4.3 最容易被忽视的差异:信息保真

大多数人关注"模型能不能做",但忽视了"信息在传递过程中损失了多少"。

erlang 复制代码
信息保真度对比:

没有 Harness:
  用户意图 → 模型理解(损失 10%)→ 上下文截断(损失 30%)→ 模型遗忘(损失 20%)
  最终保真度:~50%

有 Harness:
  用户意图 → 模型理解(损失 10%)→ 压缩摘要(损失 10%)→ FTS5 搜索补偿(挽回 15%)
  最终保真度:~85%

50% vs 85% 的信息保真度,就是"勉强能用"和"稳定可靠"的区别。


五、 回到上一篇文章:这些问题如何解释

现在让我们用 Harness 的视角来重新审视使用 trae 中遇到的一些问题文章中描述的问题:

问题一:模型忽略了 Skill 中的工作流,直接猜测实现

这是典型的上下文管理问题。

文中截图我们可以看到"模型还顺便了解了下项目结构",这意味着上下文被项目探索信息填充了,Skill 的工作流指令被稀释了。

一个好的 Harness 会确保关键指令始终在上下文中保持可见,比如通过结构化的交接文件或 Sprint 合同。

问题二:模型反问完就结束工作了

这就是"上下文焦虑"的典型表现。 模型觉得上下文快满了,就提前收工。解决方案是上下文重置或更好的上下文管理策略。

问题三:同样的提示词,不同工具的结果不同

这正是 Harness 差异的体现。Claude Code 和 Trae 虽然都是编码 Agent,但它们的工具设计 、上下文管理、任务分解策略都不同。同一个模型,装进不同的 Harness,就像同一台发动 机装进不同的车,表现天差地别。

问题四:"明明聊的好好的,怎么交付差这么多"

这是因为缺乏外部评估机制。没有独立的评估器,模型会自己说服自己"已经做得很好了"。生 成器-评估器架构的价值就在于打破这种"自我感觉良好"的循环

六、结论

如果你觉得自己的 Agent 输出不稳定,不要急着换模型。先问自己几个问题:

  • 你的提示词是否把任务拆得足够细?还是一口气把"做个完整的 XX 系统"扔给了它?同一个任务,"先创建用户表页"和"做一个包含用户管理的全栈应用",结果会完全不同。

  • 你是否在关键节点做了检查?还是让 Agent 自己说"我完成了"就信了?尝试在关键步骤后加一步"跑一下看看"或"检查是否符合预期",而不是直接接受。

  • 你的工作流是否被正确执行?如果你定义了 Skill 或 MCP 工具,Agent 是否真的按流程走了?还是自己"猜"了一个实现?关注 Agent 的工具调用日志,而不只是看最终输 出。

  • 你的会话是否太长了?当你觉得 Agent "前半段还行,后半段开始乱来",很可能是上下文已经太长了。尝试新开一个会话,把前一轮的成果作为输入传递进去,而不是在 同一个窗口里无限继续。

  • 你是否在用适合这个模型的方式使用它?不同的 Agent 产品有不同的 Harness 设计。同一个模型,在 Claude Code 和 Trae 中的表现可能天差地别。了解你所用工具的Harness 设计理念,才能发挥模型的真正实力

正如 Anthropic 团队所说:

设计工具是一门艺术,不是科学。它取决于你使用的模型、Agent 的目标、以及它运行的环境。最好的建议?经常实验,阅读输出,尝试新事物。最重要的是,试着像 Agent一样思考。

同一个模型,结果差 10 倍。差的不是模型,是如何使用它。

张小龙说,人是环境的反应器。套在模型上也很像那么回事,模型是环境的反应器。

即,模型是 Prompt 的反应器,而 Harness,正是构建这个 Prompt 环境的建筑师


本文基于 Anthropic 四篇工程博客的核心洞察,结合 Hermes Agent 源码分析写成。 参考文章: 1. Harness Design for Long-Running Apps 2. Managed Agents: Decoupling the Brain from the Hands 3. Seeing Like an Agent 4. Multi-Agent Coordination Patterns

相关推荐
mldong7 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排8 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
linqiw8 小时前
Embabel 上手:Java Agent 是怎么干活的
agent
passerby60618 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角9 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!9 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰10 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
大模型真好玩10 小时前
DeepSeek Harness 入门很简单(三)——DeepSeek Harness接入工具、MCP、Skill
人工智能·agent·deepseek
mayaairi11 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js