发布于 2026年8月18日

名单不是路由器:构建自行选择工具的大脑
上周我写了关于 NeMoCo 的内容,这是一个自监督系统,它学习如何像大脑对世界进行分类那样对神经结构进行分类——从原始的、未标注的经验中学习,而没有被告知类别是什么。我一直在反复思考同一句话:标签是一种捷径,结构才是重要的。
本周我实现了那个想法的另一半,就在我实际工作的领域。我运行一个个人 AI 助手 —— Aura —— 它管理内存、路由任务,并努力在各会话中真正有用。它运行在一系列模型上:Claude 用于生产编码,少量云模型用于研究和设计,以及一个不消耗任何资源的本地模型。问题是 NeMoCo 所解决的同一个问题,只是反过来。NeMoCo 从原始数据中学习结构。我已经有了结构 —— 一份代理名单,每个代理都有自己的工作 —— 我需要系统能够 决定哪个模型应该处理哪个任务,实时地,在一个即将耗尽的预算下。
这个决策引擎就是我本周构建的。它由三部分组成:一个 分类器,读取任务并决定它是什么类型的工作;一个 路由器,根据实时配额将其映射到最佳模型链;以及一个 仪表盘,将整个系统呈现为一个活跃、跳动的大脑。这是技术说明——每个部分的作用、为什么它是这样的形状,以及迫使设计的失败案例。
问题:名单不是路由器
天真的设置是一个静态表格:这个代理运行这个模型,那个代理运行那个模型。它很简单,但却是错误的,原因有三。
首先,预算用完了。 Claude 按周配额运行 和 滚动会话配额,并且它们独立变化。某一天,周配额为 15% 而会话配额为 71% —— 由于旧路由器仅监控周配额,它报告 “Claude 可用,模式 NORMAL” 并将编码任务直接路由到墙上。CLI 在三小时内因 “您已达到会话限制” 拒绝所有调用,而仪表盘却一直显示一切正常。未能读取实际生效的限制的路由器不是路由器,而是猜测。
其次,质量不是单一数字。 编写良好代码的模型不一定在长上下文检索或 UI 生成方面表现良好。用单一的“质量”分数对所有模型进行评分是无用的——它无法告诉你哪个模型应该领导编码者而哪个领导研究者。每个代理都需要在其 自己的 轴上进行评分。
第三,评审者不应继承作者的盲点。 我故意将作者和评审者配对 —— 编码者编写,诊断者评审 —— 并且他们必须运行 不同 的模型族,否则评审者只是重复犯同样的错误。路由器的第一个版本总是让两个头落在同一个模型上,因为它在平局时选择延迟较低的一方。这完全违背了最初的设计。
因此静态表必须被移除。取而代之的是一个决策引擎,它读取实时状态并为每个任务计算出最佳模型链。
分类器:读取任务
第一部分是一个分类器,它读取任务并决定任务的类型。输入是一个句子 — — 自部署以来,支付端点在生产环境中一直返回 500 — — 输出是一个裁决:类型、层级和优先级。
第一个版本是纯正则表达式。它能工作,但它的脆弱性正是正则表达式总是具有的那种。"日志解析器"被误路由到运维(它其实是一个代码组件,而不是运维任务)。"结账正在对客户收取双倍费用"根本没有任何错误词汇,因此被分类为 unknown,并落到了主代理 — — 在生产环境事故中。"抛出 500s" 未匹配状态码模式,因为尾部的 's' 破坏了单词边界。这些都是我一次次修复的真实误路由,每次修复都对应一条新的正则规则。这说明你在使用错误的工具。
因此,分类器现在首先尝试使用一个廉价模型 — — `deepseek-v4-flash:cloud` 读取任务并返回 JSON 裁决。如果模型不可用,则回退到正则分类器。模型是主路径;正则是安全网。这与 NeMoCo 的教训相同:不要逐个案例手动标注,学习结构并让其迁移。
分类器还会从其调用方接收实时配额,因此它永远不会偏离路由器。调用方读取配额状态并传入;分类器不会直接读取配额文件。关键规则:production work is never downgraded onto a weak model, however tight the budget.即使 Claude 已经耗尽,生产事件也会被分类为 `prod` —— 它不会被悄悄重新路由到轻量代理并被报告为已完成。它会被阻塞,并触发交接协议。质量风险比配额风险更严重,设计永不会忘记哪个是哪个。
路由器:决策引擎
路由器是真正思考发生的地方。它接收分类器的裁决和实时提供方状态,并为每个任务层级计算模型链。
核心是基于轴的评分。 每个代理在其自身的技能轴上进行评分 — — 编码器基于代码生成,诊断器基于调试推理,研究员基于事实检索,创意者基于 UI 生成,运维基于工具调用,主控基于编排。模型的有效质量是其合成基准得分乘以其实际会话中的可观测可靠性。在基准测试表现良好但在生产环境中出错的模型会被降级。这就是“从真实性能学习”层:基准是合成能力,可靠性数据是实际经受住考验的内容。
评分公式是 Bander 的权重矩阵:`score = quality·Wq − cost·Wc − latency·Wl + claudeBonus`。成本是一个相对 0..1 层级,不是真实美元 — — 因为 ollama cloud 没有每次调用的价格,而 Claude 是订阅制,你无法诚实地将它们相互进行最小-最大缩放。此外,存在一个硬性质量下限:在其自身轴上得分低于此下限的候选者会在排名前被剔除,因此便宜但愚蠢的模型永远不可能仅凭价格获胜。
路由器还处理去相关问题 — — 通过将编码器和诊断器头部强制放置在不同的模型族中,使审查者不会继承编写者的盲点。并且它处理子代理经济学:一个子代理运行其父任务的一部分,一次委托可以扇出多达 20×,因此子代理链对成本的权重远高于任何固定层级。这就是在没有硬性排除的情况下让 Claude 被排除在子代理链之外的原因 — — 在 0.45 的成本权重下,它根本无法获胜。
仪表盘:机器人大脑
仪表盘是文本中最难捕捉的部分。它将整个系统呈现为一个有生命力的大脑。
有一个 3D 大脑视图 — — 这是一个 WebGL 渲染的神经结构,每个代理都是一个区域,你可以环绕、缩放并点击区域以深入查看其模型链、统计数据和覆盖选择器。此外,在网格视图中有一个“电子大脑中心件”:一个 SVG 电路板,代理作为工作流节点通过动画信号迹线相连,整体根据实时活动以更快或更慢的速度脉冲。
大脑不仅仅是装饰。它是可视化的遥测。仪表盘通过轮询之间会话文件的增长来得出每个代理的活动 — — 这是代理实际上在工作的最强信号 — — 并将其呈现为沿着电路迹线传播的信号脉冲。当系统空闲时,大脑会放缓到爬行。当系统繁忙时,迹线会加速。你可以看到大脑在思考。
还有一个层级选择器 — — 六个按钮(Tier 1–4、“Local”防护盾和“Baseline”重置),让你能够将整个舰队强制切换到指定的质量层级。此外,每个代理的模型覆盖会被持久化到文件中,这样当实时路由器的选择不是你想要的时,你可以将特定模型固定到特定代理上。仪表盘是大脑的控制界面。
塑造它的失败
这里的每个设计决策都是真实失败留下的疤痕,值得列出,因为它们正是本周的实际内容:
- 会话限制盲点。 路由器仅根据每周配额进行门控,忽略了实际上具有约束力的会话配额。修复办法:读取两者,并让 更严格 的那个生效。
- 基准信封错误。 rev1 基准将其文件写入 `{value:[...]}` 信封,而不是普通数组,导致每行缺少 `.model` 字段,路由器静默获得了一个空映射。基准数据从未到达路由器,也没有任何报错。修复办法:展开遗留形状,使旧文件仍能加载。
- 轴-评分标准倒置。 轴评分标准在调试推理上给 opus 打了 0.50 分——低于不应审查生产代码的模型。如果让它重新排序生产层级,评审者将变成作者。修复办法:生产层级不会被 不 通过评分标准重新排序。关键词评分标准缺乏足够的证据来推翻既定的设计决策。
- 上下文窗口死亡螺旋。 将一个 131k 上下文模型放在编排层首位导致窗口溢出,触发了压缩死亡螺旋。修复办法:每个编排候选者必须拥有一个窗口,其大小舒适地高于上下文预算加上预留。
- 可靠性无操作。 会话日志仅存储裸模型名称,而候选者携带提供商前缀,导致可靠性层静默地未匹配到任何内容。修复办法:匹配前去除前缀。
我得到的收获
The NeMoCo post ended with: 标签是一种捷径,结构才是关键,你可以从原始经验中学习结构。 本周是这种工程思维的体现。我没有为每个任务手写规则——我构建了一个读取任务的分类器和一个读取实时状态的路由器,让工作的结构来决定使用的工具。正则表达式分类器是“标签”方法,它在标签总是失效的地方彻底失效:在边界上,在你未曾预料的情况下。模型辅助分类器是“结构”方法:学习模式,迁移它,优雅地回退。
大脑仪表盘是让这一切感觉真实的部分。当你能看到代理实际工作时,信号脉冲在电路轨道上赛跑,并且看到整个系统在空闲时变得异常缓慢,你已经不再只是查看配置文件。你正在查看一个具有脉冲的系统。
路由器在精神上是开源的——它是我工作区的一组脚本,`classify-job.mjs`、`model-router-core.ps1`、`quota-dashboard.mjs`——它运行在 Claude、云端 Ollama 模型以及一个不消耗资源的本地模型的混合环境中。这不是一个封闭的企业系统。这是一个你自己可以构建的决策引擎,而塑造它的失败才是有用的部分。
这就是教训。名单是一个列表。路由器是一个决策。而大脑是在决策在预算耗尽时实时做出,由一个从自身错误中学习的系统所得到的东西。