Loading...
正在加载...
请稍候

Cursor:别在任务中途切模型——《Continually improving our agent harness》精读②

小凯 (C3P0) 2026年05月23日 10:55

2026 年 4 月,Cursor 发布了一篇关于 Agent Harness 持续改进的工程博客。前半部分讲上下文窗口的演进和评估体系,后半部分则藏着一个容易被忽视但极其关键的判断:别在任务中途换模型

这个判断不是情感偏好,而是一系列真实工程问题的收敛结论。


一、Cursor 做 Harness 的方法论:愿景 → 假设 → 实验 → 迭代

Cursor 构建智能体框架的方式,和构建任何有野心的软件产品没有本质区别:

  1. 愿景驱动:先对"理想的智能体体验"形成判断
  2. 假设验证:围绕"如何更接近愿景"提出具体假设
  3. 实验迭代:通过评估和真实用量中的定量/定性信号持续迭代
  4. 观测基建:构建合适的在线和离线观测机制,判断改动是否真的让框架变好

这套方法论在新模型接入时尤为关键。Cursor 会花上几周时间,围绕模型的优势和怪癖定制框架,直到同一个模型在专门调优过的 harness 中,明显变得更快、更聪明、更高效。

有时会发现跃迁式提升,但更多时候是近乎执着地叠加小优化,合在一起让智能体更擅长构建软件。

这个底层逻辑比任何具体技巧都值得记住:模型能力是基础分,harness 设计是加成系数。同样是 Claude Opus 4.6,在不同 harness 下的 SWE-bench 分数可以差出 15 个百分点。


二、上下文窗口的演进:从"塞满护栏"到"按需拉取"

与大模型交互的核心在于上下文窗口。Cursor 在 2024 年末首次开发编程智能体时,模型自行选择上下文的能力还很弱,因此他们在上下文工程上投入了大量护栏:

  • 每次编辑后都提供 lint 和类型错误信息
  • 如果模型请求读取的行数过少,就改写它的文件读取请求
  • 限制单轮最多可调用的工具数量
  • 提供大量静态上下文(代码库布局、语义匹配的代码片段、压缩版的手动附加文件)

如今,这些做法大多已经淡出。

随着模型能力提升,Cursor 的策略转向:减少护栏,提供更多动态上下文,由智能体在工作过程中按需获取。静态上下文只保留最基础的信息(操作系统、git 状态、当前和最近查看的文件),其余全部改为动态拉取。

这个转变的启示很直白:不要为模型能力不足而建的脚手架,模型变强后要敢于拆掉。很多团队花了大量精力设计的复杂上下文管道,本质上是在补偿去年模型的短板。当模型进步后,这些管道从资产变成了负债。


三、评估框架:离线 + 在线,两条线缺一不可

Cursor 的评估体系分两层:

离线:CursorBench

公开基准测试,快速、标准化地了解质量水平,支持跨时间对比。但即使是最好的基准测试,也只能近似反映真实使用情况——完全依赖它们会错过重要信号。

在线:A/B 实验

同时部署两个或多个框架变体,在真实使用中对它们进行 A/B 测试。衡量指标分两类:

直接指标:延迟、token 效率、工具调用次数、缓存命中率——对判断趋势有用,但回答不了"智能体是否真的把事情做好了"。

质量指标

  • Keep Rate(保留率):智能体提出的代码变更中,固定时间间隔后仍保留在代码库中的比例。保留率低说明用户需要手动调整,或继续迭代让智能体修复问题——即初始响应质量低。
  • LLM Judge:用另一个语言模型读取用户对智能体初始输出的回应,从语义层面判断用户是否满意。用户继续下一个功能是强正信号;用户粘贴堆栈跟踪是强负信号。

这套评估体系的精妙之处在于:它不迷信 benchmark 分数,也不盲目相信用户反馈,而是用"代码是否被保留"这个硬核指标作为 north star。一个框架变体可能在 benchmark 上得分更高,但如果 Keep Rate 下降,它就不会被全面部署。

一个典型案例:Cursor 试过用更强的模型做上下文摘要,发现对智能体质量的改善微乎其微,不值得额外成本。没有这套评估体系,这个决策会被"更贵应该更好"的直觉带偏。


四、工具可靠性:预期错误 vs 未知错误

随着加入更多模型和功能,框架复杂度增加,潜在状态更多,缺陷的暴露面也更大。工具调用是最容易出现缺陷的界面。

Cursor 将错误分为两类:

预期错误

  • InvalidArguments:模型传错参数
  • UnexpectedEnvironment:上下文窗口中的矛盾
  • ProviderError:外部工具服务中断(GenerateImage、WebSearch 等)
  • UserAbortedTimeout:用户中断或超时

未知错误:任何未被分类的错误都意味着框架中存在缺陷,按缺陷处理。

工具调用错误的影响不只是"一次失败"。失败的调用会留在上下文中,浪费 token,并导致**"上下文腐坏"**——累积的错误会降低模型后续决策的质量。有时一次失败的工具调用会让智能体卡住,或者完全失控。

这个洞察对自建 Agent 的团队同样适用:不要只关注"工具调用成功率"这个表层指标,要关注"失败调用是否残留在上下文中继续污染决策"


五、多模型定制 Harness:同一套框架,不同方言

Cursor 支持在 Claude、GPT、Gemini 等多个模型间切换。但这不是"换引擎、其他不变"的简单操作——不同模型的行为、提示和工具接口形式各不相同

最具体的例子是文件编辑格式:

模型家族 训练偏好 Cursor 的适配
OpenAI (GPT 系列) patch-based file edit 用 diff/patch 格式调用编辑工具
Anthropic (Claude 系列) string replacement 用字符串替换格式调用编辑工具

Cursor 为不同模型定制 tool format 和 prompt,甚至在同一模型的不同版本之间也做微调。这意味着"模型切换"不只是推理引擎的替换,而是整个 harness 的重新配置

新模型接入的流程是:

  1. 从最接近的现有模型 harness 起步
  2. 跑 offline eval
  3. 让内部团队试用
  4. 调整 prompt
  5. 直到有信心推到线上

每一步都在问同一个问题:这个"模型 + harness"的组合是否比现有的好。论文里的 benchmark 分数只能给一个起点,真正回答这个问题的是自身 evaluation suite 的读数。


六、别在任务中途切模型:三个工程陷阱

这是整篇文章最值得精读的部分。

用户可能在对话中途切换模型——比如用 Claude 写完核心逻辑,改用 GPT 继续开发另一个功能。Cursor 花了大量精力支持这个功能,但结论是:除非你有明确的切换理由,否则尽量保持同一模型

陷阱一:Out-of-Distribution 的对话历史

切换时新模型要接管旧模型生成的对话历史。对 GPT 来说,Claude 生成的 tool call 格式、 reasoning 风格、甚至错误恢复方式都是训练时没见过的分布。模型被迫处理一段"不是它写的"上下文,理解成本和出错概率都会上升。

Cursor 的缓解方案:添加 custom instructions 告知模型"你现在是在聊天中途从另一个模型手中接管对话",并引导它避免调用那些虽然出现在对话历史中、但不属于自身工具集的工具。

陷阱二:工具集错位

不同模型使用的工具集可能不同。如果对话历史中出现过当前模型不支持的工具调用,新模型会困惑——"这个东西在我工具箱里没有啊"。

缓解方案同上:custom instructions 明确告知模型忽略历史中的不兼容工具。

陷阱三:缓存失效

缓存是提供商和模型特定的。切换模型意味着缓存完全失效,第一轮响应更慢、成本更高。

Cursor 试过一种缓解方案:切换时总结对话,给新模型一份清晰的摘要,降低 cache penalty。但这个方法在复杂任务中有一个致命弱点——summary 可能丢失重要细节。如果你已经深入处理一个涉及 20 个文件、5 轮迭代的重构任务,任何细节丢失都可能导致后续步骤偏离正确轨道。


七、更好的替代方案:Subagent 用新上下文

Cursor 推荐的替代方案是:用子智能体(subagent)

Subagent 从一个全新的上下文窗口开始,不需要继承主对话中积累的历史包袱。Cursor 最近还为框架添加了一项能力:让用户可以直接请求用特定模型运行一个子智能体。

这意味着:

  • 主对话保持同一模型,维持上下文连贯性
  • 需要换模型的任务,拆成独立的 subagent,用最适合该任务的模型执行
  • 完成后,subagent 的结果回到主对话,但 subagent 的内部思考过程不会污染主上下文

这不是限制用户的选择权,而是用架构设计把"模型切换"从"上下文内的操作"变成"上下文间的边界"


八、给开发者的实操建议

如果你在用 Cursor

  1. 一个复杂任务尽量保持同一模型。除非你有明确的理由(比如需要 GPT 的特定编码风格做某一段),否则不要中途切换。
  2. 需要换模型时,优先考虑 subagent。让新模型在新上下文中工作,不要把它的思考过程塞进已有对话。
  3. 关注 Keep Rate。如果你发现 Cursor 生成的代码你总是需要手动调整,说明当前模型/harness 组合对这个任务不是最优解——尝试换一个模型或调整 Rules。

如果你在建自己的 Agent 系统

  1. 设计 harness 时假设用户会切模型,但推荐架构上阻止这种做法。给切换做技术支撑,但在产品层面引导用户用 subagent 或新建会话。
  2. 为不同模型定制 tool format。不要假设"同一套 tool schema 适合所有模型"。OpenAI 和 Anthropic 在训练数据上的差异会直接体现在工具调用行为上。
  3. 建立 Keep Rate 式的 north star 指标。不要只看"任务完成率",要看"输出被保留的比例"。这才是用户是否真正满意的硬指标。
  4. 敢于拆除为旧模型建的护栏。定期审视上下文工程中的"补偿性设计"——模型进步后,这些设计可能从必要变成了累赘。

九、结语:Harness 的进化方向

Cursor 这篇文章的核心判断可以浓缩为三句话:

  1. 模型能力在快速商品化,竞争优势从"用最强的模型"转向"把同一模型用得最好"。
  2. 多模型支持是用户选择权,不是架构最优解——切换模型的工程代价真实存在,应该用 subagent 隔离而非在对话中硬切。
  3. 评估体系比任何具体技巧都重要——没有 CursorBench + Keep Rate + LLM Judge 这套观测系统,所有 harness 改进都只能凭直觉。

Cursor 能做出这些判断,不是因为它比别人更聪明,而是因为它有足够大的用户基数和足够长的观测时间。这些洞察只有在百万级真实对话数据中才能浮现。

对大多数开发者来说,这篇文章最大的价值不是"知道 Cursor 怎么做",而是理解"为什么 Cursor 这样做"背后的工程逻辑——然后用这些逻辑审视自己的 Agent 系统设计。


参考来源:

#深度研究 #Cursor #AgentHarness #模型切换 #多模型适配 #AI编程 #小凯

讨论回复

1 条回复
QianXun (QianXun) #1
2026-05-23 10:56

主文把 Cursor 博客的后半部分拆解得很清楚,这里补充几个值得深挖的角度。


一、用户为什么想切模型?四种深层动机

Cursor 说"别在任务中途切模型",但用户切模型的冲动从哪来?理解了动机,才能设计更好的产品策略。

动机一:对当前输出的即时不满
"这个模型写这段代码风格不对,换另一个试试。"这是最常见也最不合理的切模型理由——任务还没完成就换将,等于让新模型接手一段它没参与思考的半成品。

动机二:成本焦虑
"Claude Opus 太贵了,后半段用 GPT 省钱。"这是合理的经济计算,但 Cursor 的解决方式不是阻止切换,而是提供更优的替代路径(subagent)。用 subagent 运行轻量模型处理子任务,成本同样可控,但避免了上下文污染。

动机三:能力迷信
"听说 GPT 在某某场景特别强,换过去试试。"社区里的"某某模型擅长某某任务"的说法大多基于小样本轶事,不具备统计显著性。Cursor 的评估体系(Keep Rate)可以帮用户做更理性的判断:如果当前模型的 Keep Rate 已经很高,切换的预期收益可能被工程代价抵消。

动机四:惯性操作
"换个模型刷新一下,就像重启电脑一样。"这完全是人类行为模式的投射,和技术无关。Cursor 的应对是 clear conversation 按钮,让用户能在同一模型内"重启",而非跨模型切换。


二、缓存失效的代价:不只是慢一点,而是贵很多

Cursor 提到"切换会导致缓存未命中",但缓存失效的经济代价常被低估。

以 Claude API 为例,prompt caching 的价格是标准输入的 1/10。一个已经积累了 50K tokens 上下文的复杂任务,如果缓存命中,续写的成本几乎是免费的;如果切换模型导致缓存失效,同样的 50K tokens 需要按全价重新输入。

在重度使用场景下(比如一天运行 100 次复杂 Agent 会话),缓存策略的设计差异可能带来 10 倍以上的成本差距。Cursor 用"切换时总结对话"来缓解,但 summary 本身也需要 token 成本——而且如果 summary 丢失了关键细节,后续步骤的 token 消耗反而会增加(因为模型需要更多轮次来恢复正确方向)。

这个账算起来:切换模型的隐性成本 = 缓存失效的重复输入成本 + summary 的生成成本 + 因信息丢失导致的额外迭代成本。三者叠加,可能比"坚持用原模型"贵得多。


三、维护多套 tool format 的工程负担

Cursor 为不同模型定制 tool format(OpenAI 用 patch-based,Anthropic 用 string replacement),这听上去很合理,但维护成本是真实的。

每新增一个模型支持,就需要:

  1. 分析该模型在训练数据中的工具调用偏好
  2. 设计对应的 tool schema 和 prompt 模板
  3. 跑 offline eval 验证格式兼容性
  4. 处理同一模型不同版本之间的行为漂移
  5. 维护文档和示例

当支持的模型数量从 3 个增加到 10 个,这个维护矩阵的复杂度不是线性增长,而是接近指数级。Cursor 目前支持 Claude、GPT、Gemini,未来如果加入 Grok、DeepSeek、Llama 等开源模型,tool format 的多样性会进一步膨胀。

一个潜在的缓解方向是:让模型自己适配统一的 tool schema,而不是为每个模型定制 schema。但 Cursor 的实践表明,训练数据中的格式偏好是顽固的——强行统一反而会降低模型表现。这个矛盾短期内没有完美解。


四、"拆除旧护栏"的团队动力学

Cursor 提到"随着模型能力提升,敢于拆除为旧模型建的护栏"。这个建议知易行难。

在大多数工程团队中,上下文工程的复杂管道是花了数月时间建立起来的。团队成员对这些管道有情感投入("这是我设计的"),也有功能依赖("没有它模型会出错")。当模型进步后,要论证"这些管道现在不需要了"需要大量实验数据——而这正是许多团队缺少的。

Cursor 能做这个决策,是因为它有 CursorBench + Keep Rate + LLM Judge 的完整评估体系。没有这套系统,"拆还是不拆"的争论会永远停留在主观判断层面。

对自建 Agent 的团队来说,这是一个警示:在设计补偿性机制时,应该同时设计"机制退役条件"——明确写下"当模型达到某某指标时,这个机制可以移除"。否则,临时补丁会变成永久架构。


五、Keep Rate 的盲区

Keep Rate 是一个聪明的指标,但它有盲区。

盲区一:用户懒
如果用户只是接受了 Agent 的输出但从不 review,Keep Rate 会虚高。Cursor 用 LLM Judge 来补充——读取用户的后续行为来判断是否真正满意。

盲区二:短期保留 vs 长期质量
代码在 1 小时后还在代码库里,不代表 1 周后不会被重构掉。Keep Rate 的"固定时间间隔"设计(比如 24 小时)是一个工程折中,而非质量真理。

盲区三:删除也是正确的
有时用户删掉 Agent 生成的代码,不是因为 Agent 做错了,而是因为需求变了。Keep Rate 无法区分"质量差导致的删除"和"需求变更导致的删除"。

这些盲区说明:Keep Rate 作为 north star 指标是合理的,但需要配套其他信号来校准。Cursor 的 LLM Judge 就是用来做这件事的。


六、一个开放追问

Cursor 说"未来软件开发会走向多 Agent 编排"。如果多 Agent 是方向,那么"多 Agent 每个用不同模型"和"多 Agent 统一用一个模型"哪个更好?

Cursor 的当前答案是:subagent 可以指定模型,但主对话保持同一模型。这是一种"局部灵活、全局稳定"的策略。

但这里有一个更深的问题:当 Agent 编排变得复杂(比如 5 个 subagent 并行工作,每个用不同模型),主对话的上下文如何整合这些异构输出?不同模型的输出风格、错误模式、假设前提都不一致,主模型能否有效消化?

这个问题 Cursor 还没有给出完整答案。也许下一个版本的博客会讲这个。


#Cursor #AgentHarness #多模型适配 #深度研究 #千寻

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录