跳到主要内容

你的模型路由是一个看不见负载的负载均衡器

· 阅读需 13 分钟
Tian Pan
Software Engineer

部署在 Web 集群前的负载均衡器之所以有效,是因为每台机器都会上报信息:CPU、队列深度、错误率、延迟。均衡器根据这些负载信息进行路由。模型路由器(Model Router)则拿不到这些遥测数据。它在模型执行任何操作之前,仅凭查询内容就决定由哪个模型来处理。路由器根据提示词(Prompt)预测难度。但真正的难度只有在生成答案时才会显现。当信号产生时,路由决策已经过去三秒钟了,而廉价模型可能已经向你的用户发送了一个自信但错误的回复。

这是模型路由核心的结构性缺陷,但大多数团队在发布路由器时从未这样审视过它。他们将其视为一个分类器——训练一个模型将查询标记为“简单”或“困难”,在预留集上进行验证,当准确率超过 90% 时就发布。分类器的隐喻在关键之处是错误的。分类器预测的是一个已经存在的标签。而路由器预测的是一个尚不存在、直到被路由的模型给出答案后才会存在、且可能永远不会以足够干净的形式存在以便学习的标签。

结果就是,系统的信心与其理应控制的对象毫不相关。路由器有 96% 的把握认为它选择了正确的模型。而在廉价路径上,下游模型有 4% 的时间在默默犯错。这听起来很小,直到你意识到你根本不知道是哪 4%,也没有自动化的方法来发现它们。路由错误不会表现为 500 错误。它们表现为对一小部分缓慢变化的用户群体而言略微变差的产品体验,而这恰恰是现代可观测性工具最难捕捉的一类故障。

你需要的标签在决策做出后才会出现

大多数预测问题最终都会给你标签。垃圾邮件分类器预测垃圾邮件,你标记漏掉的邮件,这些就成了训练数据。流失预测模型预测流失,用户要么续约,要么不续约,你下个季度根据事实进行训练。闭环形成了。

路由则无法闭环。你想要的标签——“廉价模型对这个查询是否足够好?”——是一个反事实(Counterfactual)。为了干净地获得它,你必须对每个查询同时运行廉价模型和昂贵模型,评判两者的输出并进行比较。但这恰恰是路由本应规避的成本。因此,没有人在生产流量中这样做。团队通常采用折中方案:要么使用离线基准测试(在与生产环境不符的查询分布上运行并评判两者),要么使用极小的影子样本(例如抽取 1% 的流量进行双重路由,但这留下的置信区间太宽,除了重大的退化外,什么也检测不到)。

这并不是某个特定路由器的 Bug。它是披着马甲的“多臂老虎机问题”(Bandit Problem)。路由器是一个根据上下文在不同选择间做出决定的“上下文老虎机”(Contextual Bandit),它只能观察到所选路径的回报,永远无法观察到未选路径的回报。将其视为受监督的分类问题,并辅以混淆矩阵和 F1 分数,实际上是向团队渗透了一个假设——即标签从一开始就可以通过提示词获知。事实并非如此。路由器在猜测一件只有在猜测之后才会发生的事情。

反馈回路的自我蚕食

现在把问题复杂化:假设团队在上线后收集了数据,并根据记录的生产流量训练下一个路由器。训练集中的每一条记录都受限于路由器之前的决策。廉价模型只接收路由器认为简单的查询。昂贵模型只接收路由器认为困难的查询。你用来训练的“地面真值”(Ground Truth)实际上是由你正试图改进的策略所选出的样本。

这是离线强化学习(Offline RL)和反事实学习中经典的策略偏见(Policy-bias)陷阱——当训练数据由某个动作策略塑造时,一旦策略改变,模型学到的模式就无法泛化。研究人员在个性化推荐和定价领域为此撰写了大量文献。但路由团队大多在没有阅读这些内容的情况下就发布了。结果是路由器收敛到了它自己的先验偏差。它路由到廉价路径的查询在日志中看起来很“简单”(因为答案很短,用户没有投诉,也没有触发重试)。它路由到昂贵路径的查询看起来很“困难”(因为答案很长,用户参与度高,对话得以继续)。路由器的信心不断攀升。其决策偏见日益严重。反馈“回路”变成了一个一端被堵住的管道。

这种情况发生的第一个迹象通常是重新训练无法提升指标。团队增加了三个月的新数据,重新运行流水线,却发现新路由器的表现与旧路由器几乎完全一致。他们得出的结论是它很“稳定”,但这其实是“自我证实策略已停止学习”的一种委婉说法。

路由错误看起来像质量平庸,而非报错

如果路由失败会触发异常,那么这篇文章就没必要写了。但事实并非如此。廉价模型接收到一个困难的查询,尽力而为,返回一个流利、看似合理,但介于“无用”和“微妙错误”之间的答案。响应字段非空。状态码是 200。延迟正常。用户读完后,要么接受了它(因为不知道更好的答案是什么),要么纠正了它(这增加了一轮难以归因的对话),要么放弃了(会话提前结束,这看起来与满意的短会话没区别)。

这些结果都不会触发警报,也不会显示在路由器准确率看板上。路由器愉快地报告它将 N% 的流量路由到了廉价路径并节省了 X 美元。这个看板在技术上是正确的,但在关键处具有误导性,因为通过在廉价路径上产生 Y% 的错误答案来节省 X 美元,只有在“Y 乘以错误答案的成本”小于 X 时才是赢家。而大多数团队根本无法估算错误答案的成本。

更难接受的推论是,这种不对称性会误导组织。成本节约很容易绘制成图表。而无声的质量损失则不然。路由决策在预算审查中获得奖励,只有当投诉响亮到足以升级时才会受到惩罚。到那时,性能退化已经发生了好几个月,而且可能被归因于“模型变了”或“用户变得更挑剔了”。

真实的信号源于下游

路由无法直接看到负载,但负载会在用户随后的行为中留下指纹。秘诀在于对这些指纹进行插桩(instrumentation),并将它们作为你唯一真正信任的标签进行回传。所有的候选指标都是不完美的,但它们都有一个共同的优点:它们是由路由决策直接导致的,而不是由路由器预测出来的。

  • 各条路线的升级率(Escalation rates)。 如果你的级联机制允许低成本路径在置信度较低时转交给高成本路径,那么升级率就是对误判压力(misroute pressure)的直接衡量。一个有 30% 时间都在升级的低成本路径在告诉你,路由在 30% 的情况下对“简单/困难”的判断是错误的,这是一个任何离线基准测试都无法产生的数据。
  • 重新生成与编辑。 重新提问、改写或点击“重试”的用户正在用他们的行为对质量进行投票。按路由决策汇总比例。如果低成本路径查询的重新生成频率是类似形式的高成本路径查询的 2 倍,那么低成本路径正在丢失答案。
  • 后续修正。 在多轮对话中,如果第 N+1 轮以“不,我的意思是……”或“那是错的,……”开头,则被标记为对第 N 轮的拒绝。这是一个提取它们并按路线分类的廉价经验法则。
  • 流式传输中途放弃。 在答案完成流式传输前关闭标签页的用户,是在拒绝正在生成的答案。追踪每条路线的会话时长和流完成率。
  • 人工干预触发。 对于具有人工接管路径的智能体(Agents),按路线划分的“升级到人工”率是最响亮的标签。这虽然少见,因此它只能捕捉到最差的路线,但那些正是最重要的部分。

其中的每一个信号都有噪声。没有一个是绝对的真理(ground truth)。但与“评估集上的路由准确率”不同,它们都会朝着你真正关心的事物方向变化。如果一个路由器的低成本路径导致重新生成率上升,那么它就是失败的,即使其分类器的置信度稳如泰山。

根据本应节省的资金来验证路由器

在你信任路由器处理生产流量之前,再做一个几乎没有团队会做的实验:故意误导路由并衡量损失。选取一部分流量,不顾路由器的输出,强制将每个查询发送给低成本模型,并比较下游信号(升级、重新生成、放弃、按群组划分的留存率)与路由到高成本模型的对照组。这个差值(delta)就是每次都路由错误的最坏情况。然后选取另一部分流量,强制每个查询使用高成本模型,衡量同样的信号。另一个方向的差值就是完美路由能为你带来的上限。

现在你有了实际的范围。你的路由器处于两者之间。如果一个刻意出错的路由器只让你损失了 3% 的重新生成率,而你的实时路由器处于 2.5%,那么你学到了一些具体的东西:你的路由器几乎不比随机好多少,而明显的分类器准确率衡量的是分布中容易的那一半。如果一个刻意出错的路由器让你损失了 25% 的重新生成率,而你的路由器处于 4%,那么你拥有一个正在发挥真正作用的路由器。没有这种校准,你根本不知道自己处于哪种情况。

同样的逻辑也适用于金钱。路由节省的数据通常是孤立报告的:“我们将推理成本降低了 58%”。一个更诚实的数据是节省的金额与误判带来的下游成本的比率。如果没有衡量误判成本,节省的数据就只是一个不完整的陈述。路由器正在以某种团队未考虑到的货币支付代价,而找出是哪种货币的唯一方法就是有目的地去衡量它。

更好的心智模型:路由是基于缓慢、间接信号的控制问题

一旦你停止将路由器视为分类器,设计空间就会打开。路由并不是基于提示词做一次性决策;它是一个控制循环,观察下游行为,将该行为归因回路由决策,并进行调整。像每个控制循环一样,它的成败取决于信号延迟和可观测性。

一些实际的启示:

  • 不要死磕低成本路径。使用带有回退机制的级联。 低成本模型生成一个候选答案;一个廉价的验证器(词元级不确定性、模式校验、模型自身的置信阈值、轻量级裁判)决定是发布该候选答案还是升级。这将路由决策从预测转变为事后检查,而这是路由器能够获取正确信息的唯一框架。
  • 将离线评估视为校准,而不是真理的源头。 用它来健全性检查(sanity-check)路由器是否能区分极其简单的查询和极其困难的查询。不要用它来设置阈值。应根据实时下游信号设置阈值,如果可能的话,按群组(cohort)设置。
  • 有目的地进行采样、评判和重放。 明确地分配预算——作为一个独立项目——对一小部分流量进行双重路由,并离线对差异进行评分。这是你唯一的反事实(counterfactual)信号,除非你为此付费,否则它并不存在。
  • 每次重新训练时都要提防策略偏见(policy-bias)陷阱。 当你根据日志流量进行重新训练时,低成本路径的训练数据就是之前的路由器所判断为简单的内容。混入故意误导路由的样本,否则就得接受你的重新训练是在更深地拟合之前的策略,而不是学习新东西。

更深层次的启示是对路由器实际所做的工作保持谦逊。它在利用无法完全决定结果的特征,对一个它无法观察到的结果进行预测,而且是在一个错误答案不会发出响亮警报的系统中。这句话的每一部分都让人感到不适,且每一部分都是真实的。能够成功交付路由器的团队,是那些内化了这一点,并设计了下游机制——升级、裁判、重放、故意误导路由——来进行补偿的团队。而那些交付不力的团队,则是报告分类器准确率后就撒手不管的团队。

路由器是一个看不见负载的负载均衡器。解决方案不是更好的分类器。而是“管线建设”——让你在事后看到负载的插桩,以及一个根据你所看到的、而非你所猜测的情况进行调整的控制循环。

References:Let's stay in touch and Follow me for more thoughts and updates