核心要点
单模型代理的时代正在落幕。随着 LLM 版图的极速扩张——GPT-4o、Claude Haiku/Sonnet/Opus、Gemini Flash/Pro、Llama 变体、Mistral 以及数十种专用模型占据了不同的成本-性能生态位——在恰当的时机将查询路由到合适的模型,已成为一类顶级的工程难题。
动态模型路由可以在将推理成本压缩 40–85% 的同时,保持相当于最强模型 90–95% 的质量水准。这节省下来的差价足以支撑 AI 产品运营预算的相当一部分。然而,当下绝大多数已部署的 Agent 仍然死板地硬编码单个模型。
本文综述了 2026 年初 LLM 路由领域的最前沿技术:理论基础、路由策略分类学、真实世界的基础设施(OpenRouter, Martian, LiteLLM, Not Diamond, Amazon Bedrock)、最新的学术研究成果(RouteLLM, MasRouter, Router-R1, BaRP)、面向 Agent 开发者的架构模式,以及正在兴起的自学习路由器前沿。
问题所在:没有单一模型能通吃所有权衡
成本-能力谱系
现代 LLM 在每 Token 成本上跨越了几个数量级:
| 模型层级 | 示例模型 | 输入成本 ($/M tokens) | 优势 |
|---|---|---|---|
| Nano/Flash | GPT-4o Mini, Gemini Flash-Lite, Claude Haiku | $0.07–$0.30 | 速度,成本,简单任务 |
| 中端 | GPT-4o, Gemini Flash, Claude Sonnet | $0.50–$3.00 | 通用能力,函数调用 |
| 前沿 | GPT-5, Claude Opus, Gemini Ultra | $3.00–$15.00 | 复杂推理,长上下文 |
| 推理 | o3, DeepSeek R1, Claude w/ extended thinking | $6.00–$60.00 | 数学,代码,多步逻辑 |
若将 90% 的请求路由到 Nano 层,10% 路由到前沿层,在质量几乎无损的前提下(因为生产环境中的绝大多数查询并非真的那么难),大约能节省 86% 的成本。
专用模型的爆发进一步加剧了这一现象:医疗问答模型、代码微调模型、Embedding 模型、视觉模型、推理模型等。没有哪个通才模型能同时在所有这些维度上保持顶尖。
Agent 特有的压力
在 Agent 循环内部,路由问题显得尤为紧迫。单一的 Agent 轮次可能包含:
- 快速意图分类(低成本)
- 工具选择决策(中等成本)
- 多跳推理链(高成本)
- 最终响应合成(中等成本)
全部四步都用 Claude Opus 虽然正确但极其浪费。全部四步都用 Haiku 虽快但在第三步却显得脆弱不堪。最佳策略是对每一步进行独立路由。
路由策略分类学
静态路由
最简单的形式:在应用逻辑中按任务类型硬编码模型。
ROUTING_TABLE = { "intent_classification": "claude-haiku-3", "tool_selection": "gpt-4o-mini", "complex_reasoning": "claude-opus-4", "response_synthesis": "claude-sonnet-4", } def route(task_type: str) -> str: return ROUTING_TABLE[task_type] 优点: 可预测,零开销,易审计。 缺点: 脆弱——无法适应任务类型内部的查询级差异。一个标记为 "complex_reasoning" 的查询可能很琐碎(用 Haiku 即可),也可能真的很难(需要 Opus)。
静态路由适用于任务类别具有统一复杂性的良好类型化管道,例如 OCR 后处理或从固定模式中提取结构化数据。
基于分类器的路由
一个小型、快速的模型评估传入的查询并预测哪个层级足以应付。这是生产系统中最广泛部署的方法。
Query → [轻量级分类器] → 复杂度评分 → 模型选择 分类器可以是:
- 在偏好数据上训练的 BERT 类模型(RouteLLM 的做法)
- 被提示评估难度 1–5 的小型生成模型
- 基于查询长度 + 关键词信号的规则启发式
- 针对带有难度标签示例的嵌入相似性查找
RouteLLM(LMSYS,发表于 ICLR 2025)是典型的开源实现。它利用 Chatbot Arena 的人类偏好数据训练了四个路由器变体,并实现了:
- 85% 的成本降低:在 MT Bench 上于 GPT-4 和 Mixtral 8x7B 之间路由,保持了 95% 的 GPT-4 质量
- 45% 的节省:在 MMLU 上
- 35% 的节省:在 GSM8K 上
- 路由器无需重新训练即可迁移到未见过的模型对(Claude 3 Opus / Llama 3 8B)
其中 BERT 分类器变体尤为实用:运行时间不到 10ms,且无需 LLM 推理即可做出路由决策。代码可在 GitHub 获取。
级联 / 顺序回退
与预先预测使用哪个模型不同,级联策略先尝试廉价模型,仅当输出质量低于阈值时才进行升级。
Query → Haiku → [置信度检查] → 若高置信度: 返回响应 → 若低置信度: Sonnet → [置信度检查] → 若高置信度: 返回响应 → 若低置信度: Opus → 返回响应 ETH Zurich 2024 年的论文《LLM 路由与级联的统一方法》证明了级联的理论最优条件,并引入了级联路由——一个结合了这两种方法的统一框架。关键洞察:级联需要支付延迟税(顺序调用),但消除了对准确的预判复杂度分类器的需求。路由则是零延迟开销,但需要一个良好的预测器。最佳选择取决于你的延迟预算和分类器精度。
置信度估计是难点。常用技术包括:
- 模型对自己输出的自报置信度
- 跨多个样本的一致性检查
- 评估响应的二级判别模型
- 特定答案 Token 上的困惑度或对数概率阈值
语义路由
语义路由利用基于嵌入的相似度将传入的查询映射到预定义的路由类别,每个类别关联一个模型或专家。
Query → [嵌入模型] → 向量 → cosine_similarity(vector, route_prototypes) → top-k 匹配 → 分发到专家模型 Aurelio Labs 的 semantic-router 库是参考的开源实现。路由原型被定义为一小组代表性话语,在启动时嵌入,然后与实时查询匹配。
2025 年 9 月发布的 vLLM Semantic Router 在推理服务方面更进一步。它使用基于 ModernBERT 的分类器 来决定查询是需要思维链推理还是可以直接回答——有效地在推理模型路径和快速路径之间进行路由。结果显著:
- 总体准确率提升约 10%,在专业领域超过 20%
- 延迟降低约 50%
- 消耗的 Token 减少约 50%
2026 年 1 月发布的 v0.1 "Iris" 版本增加了 Go/Rust 双语言实现,并集成了 Envoy 以支持云原生部署,以及基于 LoRA 的多任务分类,在分类任务间共享基础模型计算。
何时使用语义路由: 具有清晰界限的意图类别的应用(客户支持分流、路由到不同文档集的 RAG、多域助手)。不太适用于连续的复杂度梯度。
成本感知 / 预算受限路由
与将成本作为约束来优化质量不同,预算受限路由将成本视为硬性预算,并在预算内最大化质量。
PILOT 论文(2025)将其构建为一个情境赌博机问题——从离线偏好数据中学习查询和 LLM 的共享嵌入空间,然后通过在线赌博机反馈进行微调。这使得操作者可以在推理时调整成本/质量权衡,而无需重新训练路由器。
对于企业部署,可以直接对每个用户或每个项目的 Token 预算进行编码:
def route_with_budget(query: str, remaining_budget_usd: float) -> str: estimated_tokens = estimate_tokens(query) if remaining_budget_usd < 0.001: return "gpt-4o-mini" # 预算耗尽 elif complexity_score(query) > 0.8 and remaining_budget_usd > 0.05: return "claude-opus-4" elif complexity_score(query) > 0.5: return "claude-sonnet-4" else: return "claude-haiku-3" 现实世界的实现方案
OpenRouter 自动路由
OpenRouter 提供了一个统一的 API 端点 (openrouter/auto),根据提示分析自动在数十种模型中进行选择。其选择由 Not Diamond 的元模型驱动。除了所选模型的标准费率外,不收取额外费用。
OpenRouter 还提供:
- 提供商回退:如果提供商宕机或被限速,自动故障转移到备用提供商
- 模型回退:每个请求的回退模型声明列表
- 免费模型路由器:在预算允许时路由到免费层模型
import openai client = openai.OpenAI( base_url="https://openrouter.ai/api/v1", api_key="sk-or-...", ) response = client.chat.completions.create( model="openrouter/auto", # 自动选择最佳模型 messages=[{"role": "user", "content": query}], ) # 检查选择了哪个模型: selected_model = response.model Martian 模型路由器
Martian 是首个商业 LLM 路由器,获得 NEA 和 General Catalyst 的 900 万美元支持,Accenture 为战略投资者。它将每个提示路由到具有最佳正常运行时间、技能集和性价比的模型。
核心宣称:成本降低高达 98%,被 300 多家公司使用。Martian 的核心能力是预估模型性能而无需运行它——利用模型压缩和蒸馏技术在推理前预测输出质量。该插入式 API 与 OpenAI 兼容。
Not Diamond
Not Diamond 训练了一个元模型,用于预测哪个下游 LLM 在给定查询上表现最佳。它超越了路由,进入了提示适配领域——自动重写提示以更好地适应所选模型,在企业数据集上实现了 5–60% 的准确率提升。
性能结果:平均准确率提升 39%,某些模型在 SRE 基准测试上翻倍。IBM Ventures 是投资者;SAP 在 Sapphire 2025 上将 Not Diamond 集成到了其生成式 AI 中心。
Not Diamond 为 OpenRouter 的 Auto Router 提供支持。
Amazon Bedrock 智能提示路由
Amazon Bedrock IPR(2025 年 4 月 GA)提供了一个无服务器端点,可在模型系列内部进行路由:
- Anthropic:在 Claude 3.5 Sonnet 和 Claude 3 Haiku 之间
- Meta:在 Llama 3.1 70B 和 8B 之间
轻量级 SLM 预测每个候选模型的可能性能,并路由到预计能满足质量要求的最廉价模型。宣称相比始终使用较大模型可节省 60% 的成本。路由不收取额外的 API 费用。
import boto3 bedrock = boto3.client("bedrock-runtime", region_name="us-east-1") response = bedrock.converse( modelId="arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-router-v1", messages=[{"role": "user", "content": [{"text": query}]}], ) LiteLLM 代理
LiteLLM 是部署最广泛的开源 LLM 代理,路由功能内置其中。其路由能力包括:
回退类型:
fallbacks:通用错误回退列表context_window_fallbacks:超出上下文限制时触发content_policy_fallbacks:在违反内容政策时触发
负载均衡策略: 轮询、最不繁忙、基于延迟、基于成本
配置驱动的路由:
model_list: - model_name: "fast-model" litellm_params: model: "claude-haiku-3" - model_name: "smart-model" litellm_params: model: "claude-opus-4" router_settings: routing_strategy: "cost-based-routing" fallbacks: - "fast-model": ["smart-model"] context_window_fallbacks: - "fast-model": ["smart-model"] LiteLLM 的自动路由功能对查询复杂度进行分类,并自动从配置的模型池中进行选择,实际上充当了代理内的分类器路由器。
架构模式
模式 1:路由器作为中间件/代理
客户端应用 | ▼ [路由器代理] ←── 路由配置,模型注册表,预算状态 | ┌────┼────┐ ▼ ▼ ▼ Haiku Sonnet Opus 所有 LLM 调用都被代理层拦截。代理做出路由决策,处理回退,记录决策日志,并执行成本控制。应用与模型无关——它发送到一个端点,其余的由代理处理。
这是 OpenRouter、LiteLLM、Martian 和 Amazon Bedrock IPR 使用的模式。它实现了集中治理:无需代码部署即可更改路由策略、跨应用预算管理、审计日志。
模式 2:Agent 内部路由逻辑
Agent 自行推理为每一步调用哪个模型。这适用于 Agent 具有复杂的、上下文相关的路由需求,且无法用简单的分类器表达的情况。
class RoutingAgent: async def plan_and_route(self, task: str) -> str: # 使用廉价模型分类任务类型 task_type = await self.classify(task, model="haiku") if task_type == "math_proof": return await self.invoke(task, model="o3") elif task_type == "code_gen