English
一份个人实验报告 · 2026 年 11 月

Kurt's Bitter Lesson

与 AI 模型协作的两种美好设想,一天的架构与补丁,以及一个小模型答不上来的问题:你在跟谁说话?

Kurt × Claude(Opus / Haiku)× DeepSeek(Flash / Pro)· 数据截至 2026-11-12

摘要。我想从 AI 辅助工程里得到两样东西。一是省流模式:Claude 额度快用完时,活儿转到便宜模型上继续干,Claude 几乎不花钱。二是稳定工程模式:强模型(Claude Opus)只把力气花在判断上——写规格、做终审——体力活交给便宜模型(DeepSeek)。我们为这两种模式设计了一套分层架构,每一块都测了,结果到处是问题。每个问题都配一个新机制,每个机制又配一个补丁。一天之内,派发规则换了六版;大约 36 个机制来了又走,同时存活的最多时有 22 个。最后压垮它的事情很简单:守在门口的小模型(Claude Haiku)分不清我是在跟它说话,还是想让它把话转给 Opus——这不能用规则解决,因为“做判断”正是它被禁止做的事。我们把架构拆了。剩下的只有几行规则、一个脚本和三个机制。

核心想法:不要想太多架构。它很有可能对强模型是妨碍;流程设计在纸上再合理,也很有可能是未经验证的空想。

1两种美好的设想

我在 Claude Code 桌面版里做工程。Opus 很好用,但额度有限。DeepSeek 提供 Anthropic 兼容的 API,所以同一条 Claude Code 命令行可以直接跑在 DeepSeek 上,几乎不占我的 Claude 额度。Haiku 又快又便宜。于是就有了两种模式。

设想一

省流模式

  • 额度吃紧时自动触发(5 小时窗口 ≥80%,或一周 ≥70%)。
  • Haiku 坐镇主对话:只跟我说话、提问、转达。
  • DeepSeek Pro 当总管:拆任务、写规格。
  • DeepSeek Flash 负责执行,另一个 Flash 负责初审。
  • 完全不调用 Opus。
“额度快用完的时候,活儿照跑,Claude 几乎不花钱。”
设想二

稳定工程模式

  • 额度正常时的默认模式。
  • Opus 只被短暂调用,只做判断:写规格、做终审。
  • Opus 甚至不读代码库——Flash 先给它写一份摘要。
  • 所有执行和初审都由 DeepSeek Flash 完成。
  • 由脚本闸门判定工作是否“完成”。
“Opus 只把额度花在判断上。”预计省下 80–90% 的 Claude 额度(相比什么都用 Opus 做)。(从未实测。)

两种设想共用一个当时觉得理所当然的前提:只要盒子画对了、箭头连对了,我们就能把每类工作都路由给负担得起它的最便宜的模型。这份报告剩下的部分,讲的就是这个前提后来怎么样了。

2架构

这套设计(“V2”)借鉴了两个相当靠谱的来源:DeepSeek Harness 的 super-agent 模式(前面一个轻量路由器,后面是强力的 worker,异步事件,外加一个看门狗),以及 Anthropic 的 orchestrator–worker 模式(由强模型监督大任务)。点一下某一层,看看每种模式在那一层放了什么——以及后来它们都怎么样了。

层省流稳定
图 1。V2 的各层,以及围在它们四周的七个派发/通信组件。这里的一切,都还没在任何真实任务上跑过,就已在纸上推理完毕。

层之上还压着模式开关本身:用一个只报整数百分比的工具读额度,选一档,允许带过期日期的手动覆盖,并在每份计划的第一行打印当前档位——由 hook 强制执行,第一行格式不对的计划会被直接拒绝。

3实测

这套设计值得夸一句的是,我们真的测了。一天里做了七个实验(T0–T6)。下面所有数字都来自当天的日志、账本和数据表。

3.1 各个零件都能用(T0–T3)

测试问题结果
T0DeepSeek 的 agent 能自己拉起子代理吗?通过
T1hook 能拦住主对话、不许它自己改文件吗(“结构化路由器”)?通过
T2账本和完成闸门能用吗?通过
T3hook 能把子代理打回去,直到它干完吗?通过
表 1。四个机制单独拿出来都能用。这正是陷阱:每一块都可行,让人误以为整体已经验证过了。

3.2 稳定工程模式,端到端(T4)

一道真实的题(任务队列的收尾逻辑),两条路线。A:DeepSeek Pro 写规格。B:Opus 根据 Flash 的摘要写规格。两条路线相同的部分:Flash 执行,Flash 初审,Opus 终审。另外单独写了五个隐藏验收测试。

图 2。T4 的每一步(悬停看详情)。两条路线都被 Opus 的终审打了回来,而隐藏测试在每个版本上都是 5/5 全过。流水线的层层关卡给出了全绿的测试;唯一一个自由阅读的强审查者找出了 bug。路线 A 耗时 1,118 秒,DeepSeek 花费 $2.89;路线 B 耗时 689 秒,花费 $1.43。Claude 额度表只显示整数百分比,两次 Opus 调用期间都没有动,所以承诺的 80–90% 节省根本没法测量。

3.3 执行这种活,Flash 足够了(T5)

FlashPro脚手架误报
图 3。3 个小任务 × 2 个模型 × 2 次运行:12/12 通过。Flash 平均 19 秒,Pro 平均 55 秒。唯一那次失败是闸门自己的配置问题,不是模型的问题。一个少见的干净结果——而且它支持的是砍掉一层(Pro),不是加一层。

3.4 该由谁来动脑子?(T6)

规划和“拷问”(就需求对我做访谈)都在主对话里进行——而在省流模式下主对话是 Haiku,于是设计判断力恰好在最需要它的地方变弱了。修法是再加一层:Haiku 负责转达,由 Opus 子代理或 DeepSeek 来提问。

图 4。DeepSeek 把“最多问 4 个问题”读成了“每次必问 4 个”,问到第 6 轮还没停。负责转达的 Haiku 把一个问题的标题写错了。而这个测试里要设计的对象本身又是更多架构:一个用来校验每份计划顶部额度行的 hook,配一张 13 项的测试清单。两版设计最后都没有被打分。

4补丁摞补丁

每个测试都暴露一个问题。每个问题都用同一种方式回应:加一个新机制。一步步看补丁日志。

图 5。问题(左)→ 补丁(右)。注意看:补丁常常是关于模型行为的一条新规则,而下一个问题又常常是上一个补丁造成的。

机制是怎么堆起来的

选一个版本。划掉的是已删除的,描边的是该版本新增的,红色圆点表示这个机制从未在真实任务上测过,或从未上线。

图 6。派发规则各个版本里存活的机制,根据归档的规则文件和设计笔记整理。数量是近似值——什么算一个“机制”本身就有判断空间——但整体形状不是。

5你在跟谁说话?

到 v0.5,主对话已经被压缩成纯粹的转达。它的全部工作就是:把我的话交给新开的 Opus 总管,把总管的回答带回来,自己从不动脑。任何工程或项目类请求——哪怕只是一个问题——都必须转发。没有“小事”例外(早先的一个例外让 Haiku 可以悄悄自己干活)。

它失败的原因听起来微不足道,事后看却是致命的。你来当一次转达者试试。下面每条消息都可能是我会发的;其中两条是我真实发给 Haiku 会话的话。

图 7。没有正确的那一栏。每条消息都可以有两种读法。

规则说“不要判断”,可“这条该不该转发”本身就是判断——而规则把这件事交给了系统里最弱的模型。hook 可以阻止模型去做某件事(T1 已经证明了);但它拦不住模型该转发而不转发,也拦不住它在压缩时丢掉意思。转达也没有省下什么:每个新总管都要重读一遍上下文;而当主对话本来就是 Opus 时,再开一个 Opus 总管纯属重复。用了一阵之后,我的评价很直白:Haiku 干不了这个活。但换一个更强的转达者,也只是把缺陷藏起来:架构已经把守门人变成了意图路由器,而意图是整段对话里最难判断的东西。

6把它拆掉

v1.0 又试了一次,做减法:按主对话当前跑的模型分档;Haiku 只需要把消息分进三个筐(改代码 / 问项目 / 闲聊);脚本负责写任务卡、跑闸门,最多三轮就停。它有 30 个单元测试,全绿。

图 8。v1.0 的第一单真实任务——加一个 sub 函数。写卡的模型抄来了一条需要 tests/__init__.py 的测试命令;同一张卡又禁止添加 __init__.py。第 1 轮:验收失败。第 2 轮:文件加上了,验收通过,闸门却判它越界。第 3 轮:卡住,被手动终止。两项检查互相矛盾,再能干的执行者也没法同时满足。

架构到此为止。v2.0 删掉了闸门、验收命令、返工轮次、写卡步骤、账本、模板、测试和转达层。同一个任务,7 轮、11 秒做完。

省流:承诺省流:现在
主对话Haiku 转给一个 DeepSeek Pro 总管Haiku 聊天;遇到工程请求,把我的原话一字不改地塞进一条命令,再原样转达回复
检查闸门 + Flash 初审 + Pro 终审没有了——我自己看结果
稳定:承诺稳定:现在
Opus短暂调用,写规格和终审;从不读代码直接干活;能交给 DeepSeek 的就交;自己读 diff
执行Flash,跑在带闸门和沙箱的流水线里Flash,带着完整工具集,一个 80 轮的上限
节省80–90%(估计)未知(额度表看不出来)
表 2。两种设想都活了下来——作为意图,而不是架构。整套规则现在一屏就能放下,外加一个约 90 行的脚本。
图 9。各版本规则目录的大小(来自归档副本)。v0.4.1 的归档只保留了主规则文件,所以它的真实体积更大。当前版本是峰值的 14%。

最后一点讽刺。活下来的那个脚本,启动 DeepSeek 时仍带着 --bare 这个“隔离”标志,它会悄悄把 agent 削到只剩三个工具,并剥夺它拉起子代理的能力。T0 早就发现了这一点,还写进了两份笔记。没有人回去重读那两份笔记;这个限制被当成 DeepSeek 的固有事实记了下来。直到我问了一句为什么,它才被修掉。就连这次简化,也继承了一小片挡在模型路上的旧架构。

7教训

不要想太多架构。它很有可能对强模型是妨碍;流程设计在纸上再合理,也很有可能是未经验证的空想。

Rich Sutton 的 The Bitter Lesson 指出:长远来看,利用算力的通用方法,会赢过人手编码进去的人类知识。这一次,是同一个小尺度、一天、一个人的翻版。

论点一

架构会妨碍强模型

  • Opus 写规格时拿到的是 Flash 的摘要,而不是代码:设计把最弱模型的视角喂给了最强的模型。
  • 两项检查(闸门和验收命令)互相矛盾;没有哪个执行者能同时通过。
  • 转达层把 Haiku 变成了意图路由器——偏偏是它做不了的那件事。
  • 一个“隔离”标志悄悄拿走了 agent 自己组织工作的能力。
  • 真正抓到 bug 的,是结构的反面:一个强模型自由地读 diff。
论点二

流程设计往往是没人验证过的臆测

  • 80% / 70% 这两个阈值是拍脑袋定的,从未验证。
  • 80–90% 的节省是个估计,额度表永远确认不了。
  • 闸门真正的拦截率,在它被删掉之前从未测过。
  • 路由器 hook、看门狗、loop 模式、档位覆盖和计划头 hook,都设计了,但从未上线。
  • 30 个单元测试只证明了机器能转,没证明它有用;第一单真实任务就失败了。

那该怎么做

  1. 从最简单的做起:把任务和完整工具集交给一个足够强的模型。
  2. 把少数硬性限制放进脚本(一个轮数上限),而不是写成要求模型记住的规则。
  3. 先跑一单真实任务,再考虑加东西。只有当某次真实失败本来会被某个机制挡住时,才加这个机制——并且测量它。
  4. 保留一次由强模型做的独立审查。其余的都先别加,等数据开口。
  5. 别让弱模型去判断用户到底是什么意思。

局限