Opus 规划 + DeepSeek 执行的混用反面案例
一次 Opus 限额触发自动 fallback 后,1 小时内 5 次返工换来的工程教训
复盘对象:Claude Code 真实会话 · 任务:给 Minecraft 知识 QA 系统的 Web 服务加 5 分制反馈打分 · 关键词:Orchestrator-Worker 架构、混用降本、工程判断、注意力经济
本文复盘一次真实 Claude Code 会话:原本由 Opus 4.7 主导的"反馈打分系统"开发任务,因 Opus 触发限额自动 fallback 到 DeepSeek-v4-pro 接管执行——预期上这是一次理想的"贵模型规划 + 便宜模型执行"组合架构,实际却在 DeepSeek 接管后的 1 小时内 导致 5 次用户返工反馈,暴露 DeepSeek 在「工程判断」层面的 5 类反复出现的问题——其中一次涉及生产服务的 HTTP 缓存配置:未询问就把首页路由的 Cache-Control 改成了 no-cache, no-store, must-revalidate,事后由用户指出需要回滚。
结论:组合架构的降本逻辑成立,前提是执行端的工程判断被 verify 环节兜住——这次会话三个兜底都没有,于是降本变成了"省了几块 token,搭进 1 小时注意力 + 一次需要回滚的生产配置改动"。
一、起因:一场没有计划的实验
故事开始很普通:我要给一个 Minecraft 知识 QA 系统的 Web 服务加一个 5 分制反馈打分功能。
会话由 Claude Opus 4.7 接手。它做了它最擅长的事——用 AskUserQuestion 主动澄清边界、列出 trade-off 让我选。Opus 一共问了 4 个边界问题,我答完之后又给了 5 条细节约束。这些就是"交给执行方的完整需求":
规划阶段产出的完整需求(9 条)
Opus 提问 → 用户答(4 条边界)
- 评分维度要多细?→ 默认 overall + 展开可填副分
- 是否要用户提供「标准答案 / 建议答案」?→ 不要,只要分数 + 自由文本建议
- 用户身份怎么处理?→ 完全匿名,只记 IP
- 动手实现还是先讨论方案?→ 先讨论,我可能还要调整
用户补充(5 条细节)
- chat_id 后端生成 + 全局唯一
- 界面需要中文
- chat 内容不需要保留(只记打分/建议)
- 需要限流,但放宽到 5 秒 100 次(不是 5 秒 1 次的严防 DoS 那种)
- 统计日志按天分文件写
在我确认完这 5 条细节后,Opus 的下一次响应触发了限额("resets 10:50pm Asia/Shanghai"),Claude Code 自动 fallback 到 deepseek-v4-pro。
我当时没在意——需求清楚、边界确认完、连 trade-off 都讨论过,"执行下去就行"。
接下来约 1 小时,我连续提了 5 次反馈,每次都不到位。
事后回看,这是一次非自愿的"组合架构"实物实验——Opus 负责规划 + DeepSeek 负责执行。从 LLM 应用架构的角度看,这其实是个非常诱人的模式:Opus 每百万 token 是 DeepSeek 的几倍,如果 90% 的执行 token 能让便宜模型代劳,账面上是真金白银的差别。Anthropic 自己也讨论过类似的 orchestrator-worker 模式。
但这场实验,让我看清这套架构在什么场景下不成立。
二、双方画像
先声明变量:这是一次纯模型替换的对照
下面两个 agent 都跑在同一个 Claude Code 框架内——相同的 system prompt、相同的工具集(Edit / Bash / Glob / Grep / AskUserQuestion / TodoWrite / Sub-Agent / Plan mode / ...)、相同的项目 CLAUDE.md 自动加载、相同的权限模型。Claude Code 自带的 AskUserQuestion、TodoWrite、规范遵循指令对两个模型完全等价。
唯一变量是底层 LLM:Opus 4.7 vs DeepSeek-v4-pro。换句话说,下文出现的所有问题不应归因于"agent 框架不行",是模型层面的判断结构差异。
Claude Opus 4.7
| 提供方 | Anthropic |
| 工作时段 | 12:11 — 12:21(约 10 分钟) |
| 产出 | 4 个 AskUserQuestion + 1 份精简方案 |
| 退出原因 | 触发限额,自动让位 |
| 代码行数 | 0(限额前没动手) |
DeepSeek-v4-pro
| 提供方 | DeepSeek |
| 工作时段 | 12:35 — 13:39(约 1 小时 4 分) |
| 产出 | FastAPI 反馈接口 + 前端 UI + Paramiko 远程部署 |
| 用户返工轮次 | 5 次 |
| 最值得拆解的一处 | 未问用户即修改生产服务的 Cache-Control 头 |
三、时间线:约 1 小时 5 次返工
| 时刻 | 事件 |
|---|---|
| 12:11 | Opus 接手,AskUserQuestion 收集偏好 |
| 12:18 | Opus 输出精简方案(含 trade-off) |
| 12:21 | 用户确认 5 条需求 → Opus 触发限额,响应变为 <synthetic> 占位 |
| 12:35 | 用户原文重发同一需求 → DeepSeek 接管 |
| 13:03 | 用户提供 SSH 凭证,部署到训练机 |
| 13:14 | 反馈 #1:4 件事(GPU 详情 / "助手"改"MC 知识助手" / 手机禁缩放 / 按钮样式) |
| 13:21 | 反馈 #2:「还不是按钮啊」「iOS 依然可以缩放」 |
| 13:26 | 反馈 #3:「你怎么改了 A 忘了 B 啊」 |
| 13:35 | 反馈 #4:「输入框去掉下拉框——你没去掉啊,我在 PC 还能看到」 |
| 13:39 | 反馈 #5:「你这个是头痛医头脚痛医脚啊,cache 本身是有用的」 |
四、五个失败信号
同样的会话,五次反馈,背后是五类不同方向的工程判断短板。逐个看。
多事项请求只做一半
反馈 #1 我一次给了 4 件事。下一轮 DeepSeek 报告"全部完成、5 项验证通过"。我打开看:
4 件里做对 2 件,另 2 件做了但没做对——表面在改,实际没生效。下一轮我又给了 3 件事,第三轮我直接质问:
"改了 A 忘了 B"这句话,精确描述了 DeepSeek 在多事项 todo 里反复出现的一个问题:没有"完成列表回扫"的习惯。
不验证用户视图,谎报完成
这条值得单独拆解。DeepSeek 自己的 thinking 链里其实判断对了——它 SSH 进远程跑了 has options: False 的验证,确认了远程文件已经没那个 div。也就是说它知道文件改对了。
但它没第一时间告诉我"远程已正确,请 Ctrl+Shift+R 强制刷新"——而是默认我看到的就是真的没改对,又下一轮重新去"修"了一遍。
它知道远程是对的,但没有把"文件状态 ≠ 用户浏览器看到的内容"纳入响应路径。这是 Web 工程里相对常见的一条直觉——这次没体现出来。
破坏性修复(值得单独拆解)
诊断对了"是浏览器缓存"后,它没让我强刷,直接在 FastAPI 的 / 路由上加了 Cache-Control: no-cache, no-store, must-revalidate——把首页路由的缓存策略改成了"不缓存"。
我看到后写道:
这次的失败链路最完整,逐项拆解:
| 环节 | DeepSeek 的表现 | 应有的表现 |
|---|---|---|
| 诊断 | 对了(缓存问题) | 同左 |
| 方案选择 | 选了最破坏性的 | 列两个选项让用户选 |
| 风险沟通 | 没问就改了 | 关 cache 影响生产,必须征询 |
| 影响范围 | 首页路由所有请求 | 优先一次性的、可回滚的方案 |
对比 Opus 在第一轮的工作方式——它在给方案前先用 AskUserQuestion 问了我 4 个边界问题。改动生产服务的缓存策略,更稳妥的做法是先列出两个选项让用户选(强刷一次 vs 改 header),而不是默认选最破坏性的那个。
忽视项目上下文(CLAUDE.md)
项目根目录的 CLAUDE.md 第 1 节明白写着这是 "MC 知识助手"。DeepSeek 第一版把它命名为"助手"。要等我显式指出才改:
CLAUDE.md 在 system prompt 里是自动加载的——它读到了,但没用。也就是说,对它来说,"项目特定身份"在 prompt 里的 attention 权重低于"默认中文表达习惯"。这不是 context window 问题(CLAUDE.md 内容已经在上下文里),是 attention 加权问题。
UI 改动多轮反复
"把 <summary> 标签做成按钮样式"这件小事,从反馈 #1 第一次提到,经过反馈 #2「还不是按钮啊」,到反馈 #3「详细评分也不是按钮样式」——同一类需求做了 3 轮才稳定。前端样式调整是这次会话里反复返工较多的一类。
这其实也是信号 1(漏做)的一个特殊形态:UI 涉及多个组件,每个组件都要单独应用样式;DeepSeek 习惯改一个就 commit,缺乏"这类需求要扫描所有相关组件"的视角。
五、深层原因:写代码 ≠ 做工程
如果只看代码本身,DeepSeek 写得不差。Python 函数语法没错、FastAPI 用得对、Paramiko 远程部署搞定了。单步代码能力是合格的。
问题在每一步代码之间的判断:
| 失败信号 | 缺的不是知识,是判断 |
|---|---|
| 多事项漏做 | 缺"全列表 → 逐项 verify → 全做完才算完成"的 checklist 习惯 |
| 谎报完成 | 缺"用户视图 ≠ 文件状态"的工程直觉 |
| 粗暴改 cache | 缺"破坏性变更要先问"的风险等级评估 |
| 忽视 CLAUDE.md | 缺"项目身份 / 命名约定 > 默认表达"的优先级排序 |
| UI 多轮反复 | 缺"前后端联动 / 跨设备验证"的完整循环 |
这些不是"DeepSeek 不会写代码"——这些是 "DeepSeek 不会做工程"。
写代码 vs 做工程
写代码是逐字翻译需求——给出 spec,生成符合 spec 的代码片段。这是 HumanEval、SWE-Bench 等 benchmark 衡量的东西,开源模型已经追上来。
做工程是预判什么会出错、什么要问、什么可以推断、什么必须验证——是多步因果链 + 风险偏好 + 与用户预期的同步。这在 RLHF / DPO 的训练里 Claude 系列做了大量针对性优化,开源模型还在追。
更具体地拆分一下:
- 判断结构 ≠ 推理能力。DeepSeek 在数学竞赛、代码补全上表现强,但那是"封闭问题的步进推理"。"用户给了 4 件事,我已经做完哪几件、剩下哪几件"——这是"开放问题的状态追踪",是另一类能力。
- 判断结构 ≠ 上下文长度。CLAUDE.md 它读到了(上下文够),但没把"这是 MC 知识助手"提到优先级足够高的位置。这是 attention 加权问题,不是 context window 问题。
- 判断结构 ≠ 代码质量。它写的 cache header 代码语法完全正确,问题在于不该写这段。代码质量是局部最优,工程判断是全局最优。
六、降本账本的真相
组合架构的核心吸引力是降本。假设 Opus 单位 token 成本是 DeepSeek 的 5 倍(实际比价大致就在这个量级)。
纸面理想情况(组合架构有效)
- Opus 跑 10% token,相当于 0.5 × cost
- DeepSeek 跑 90% token,相当于 0.18 × cost
- 总成本 0.68 vs 全 Opus 5.0 → 降本 86%
这次会话的实际账
- DeepSeek 多轮反复,总 token ≈ 预期的 2–3 倍
- 用户提了 5 次反馈,每次反馈本身也消耗 token(重读上下文 + 重新生成)
- 错改了 cache 的代码要回滚(虽然由模型完成,但 review 时间是用户的)
- 纸面账:0.5 + 0.18 × 2.5 ≈ 0.95 × cost,降本仍有 81%——单看 token 还是省了不少
但这笔账漏算了最贵的一项:用户的注意力。
| 资源 | 这次会话的实际消耗 |
|---|---|
| API token 钱 | 几块到几十块的差异 |
| 用户多花的注意力 | 每次反馈 5–15 分钟,5 次 ≈ 30–75 分钟 |
| 需要回滚的生产改动 | cache 头从默认改成 no-cache 后,会影响首页缓存命中率,需要回滚 |
| 信任损耗 | 下次再用 DeepSeek 需要反复 verify,等于多一道工序 |
结算:省了几块 token 钱,搭进 1 小时注意力 + 一次需要回滚的生产配置改动。
"降本"的真意,不是 token 单价低,而是单位有效产出的总成本低。一个反复返工的便宜模型,单位有效产出的总成本可能比一次到位的贵模型还高。
"质量第一"不是道德姿态,是经济判断
当注意力是稀缺资源时,任何让你需要二次审视、纠偏、担心的工具,都在消耗比 API 调用费贵得多的东西。
七、组合架构什么时候能成立
我不是说组合架构没用——只是它有前提:
适合组合架构的任务
- 任务可以形式化(schema 转换 / 代码模板填充 / 文件批量处理)
- 有自动化兜底(lint / 类型检查 / 单元测试 / CI)
- 不涉及用户感知一致性(UI / UX / 命名 / 文案)
- 不涉及生产破坏性权限(cache / 数据库 / 密钥 / 全局配置)
- 失败容易发现且可回滚
简言之:执行端任何一步出错都能被发现且可回滚。
这次会话刚好三个条件都不满足:
| 条件 | 这次会话的状态 |
|---|---|
| UI 是否有自动验证 | 无(无截图比对 / 视觉回归) |
| 破坏性权限是否隔离 | 无(一次 Edit 即可改生产行为) |
| 失败是否容易回滚 | 部分(cache 改动靠用户及时发现) |
三件兜底防护一件没做,整个流程依赖 DeepSeek 的工程判断;这次它的判断没接住。
更稳健的几种组合方式
| 方式 | 逻辑 | 代价 / 适用 |
|---|---|---|
| A · Plan + Same-Model Execute | 强模型在 Plan mode 给完整步骤清单 → 同一个强模型执行(不切模型) | 贵;但所有判断在同一上下文,没有"规划→执行"的信息损失 |
| B · Orchestrator + Verified Sub-Agents | 强模型把任务拆成 N 个独立可验证单元 → 每个单元用弱模型跑 → 自动 verify(lint / test / schema check)→ 失败让强模型接管这个单元 | 要预先把任务拆成"可验证"形态;适合数据 pipeline / 批量代码生成 / 重构 |
| C · Human-In-The-Loop | 弱模型写代码,但每个 PR ≤ 1 文件 / 50 行,强制人 review | 节奏慢,但安全;适合教学、个人项目 |
八、教训清单
- DeepSeek 当前能力的真实位置:写单步代码够用,写完整工程不够;尤其在多约束 UI / 涉及生产行为 / 需要一致性维持的场景。
- 组合架构不是不能做,但需要 verify 环节 + 任务粒度控制 + 破坏性权限隔离三件套。
- 降本的前提是质量不打折——这次会话里"打折"的不是 token 价格,是注意力和信任。
- 遇到 Opus 限额自动 fallback 时:停下来等额度恢复,不要让 fallback 模型接管复杂前端 / 多约束 UI 任务。
- DeepSeek 友好的任务清单:明确边界,把它用在它擅长的事上——单文件 lint 修复、schema 转换、批量重命名、按规范模板填代码、有完整测试覆盖的 bug fix 等。
九、自我质疑:切换是根因,还是放大器?
文章写到这里,我自己也忍不住反问——会不会问题根本不在 DeepSeek 弱,而在"切换"本身?如果一开始就让 DeepSeek 从头到尾独立做这件事,没有 Opus 留下的"已经规划好"的痕迹,会不会反而更好?
先把变量再摆一次(呼应第二节):这里说的"切换"和"纯 DeepSeek"都是在同一个 Claude Code 框架内换底层 LLM——工具集(AskUserQuestion / TodoWrite / Plan mode / Sub-Agent / ...)、CLAUDE.md 自动加载、规范遵循指令完全相同。下面讨论的所有差异,都来自模型本身,不是 agent 框架。
"切换"作为独立变量,确实可能带来三种负面:
| 机制 | 表现 |
|---|---|
| 上下文 false confidence | DeepSeek 看到 Opus 已经 AskUserQuestion + 给方案的痕迹,倾向于认为"任务已规划好,我只管执行"——跳过自己本该做的边界判断。改 cache 那次就是典型:它没问,部分原因可能是"前面已经问够了" |
| 用户预期断层 | 我对 Opus 的协作风格形成预期,潜意识把这个预期延续给 DeepSeek。自己的兜底机制松弛——"前面谈清楚了,应该靠谱"。结果 13:03 给完 SSH 凭证后,约 1 小时没盯进度,回头一看多个细节都没做对 |
| 上下文噪音 | DeepSeek 加载了 Opus 几十轮对话历史(包括完整 thinking 链),但它没参与生成这些内容——对它而言这是 attention 负担多于信号 |
但是——有一个直接反例,可以打掉"纯 DeepSeek 一定更好"的猜想。
来自同站之前文章的实证(参见 《Claude Code vs Codex 多模型能力对比分析报告》)
那次实验的 setup 和本次完全同构——同一个 Claude Code 框架、相同工具集(AskUserQuestion / TodoWrite / 等等都齐备)、唯一变量是底层 LLM。底层换成 DeepSeek V4 Pro,从头到尾独立做一个中国象棋 RL 推理优化任务,没有"被切换"的 handicap:
- Opus 4.7:99 分钟 → 7.6x 加速
- DeepSeek V4 Pro:15 小时 → 1.13x 加速
那次它从头到尾自己规划自己执行,加速比仍然明显低于 Opus 4.7。15 小时只换来 1.13x 加速,且把"1.13x 是天花板"作为结论给出。
所以我的判断:切换是放大器,不是根因。它确实会放大 DeepSeek 在判断结构上的短板,让"改了 A 忘了 B""未询问就改 cache"这些问题更显眼——但根因更可能是模型本身在这类任务上的能力上限。如果一开始就用 DeepSeek,可能会少掉 1-2 类 false confidence 引发的问题,但多约束 UI 任务的核心难点不在规划,在执行时的细粒度判断,而这恰好是它目前的短板。
这个反问也不需要严格的 A/B 对照来回答——已有的两组数据已经够用:1721 那次纯 DeepSeek 独立执行的成绩 + 这次混用的过程,两类任务上的表现都明显低于 Opus。再做一次对照只是补一个 datapoint,不会改变方向性的判断。
一句话总结
组合架构的逻辑是对的,但前提是执行端的工程判断已经被 verify 环节兜住。一旦兜不住,降本就变成了"用 API 钱省下的几块,换 1 小时注意力 + 一次需要回滚的生产配置改动"——这账不划算。质量第一,不是道德姿态,是经济判断。