Cascade Routing 实战调优
编写日期:2026-04-18 | 阅读时间:约 20 分钟
本文档是在生产环境中调优 Inference Gateway 的 Cascade Routing 的实战指南。架构概念和基本实现请先参考网关路由策略。
目标读者
本文档面向平台运维人员和 MLOps 工程师。假设已部署基于 LLM Classifier 或 LiteLLM 的 Cascade Routing,并希望基于实际生产流量优化准确性和成本。
1. 调优目标与 SLO 定义
Cascade Routing 调优必须同时实现成本节约和质量维持。如果没有明确的 SLO,过度优化可能导致用户体验下降。
SLO 示例(GLM-5 + Qwen3-4B 环境)
| 指标 | 目标值 | 测量方法 | 备注 |
|---|---|---|---|
| TTFT P95 | < 3秒 | Langfuse trace time_to_first_token | Qwen3-4B 基准,GLM-5 为 < 10秒 |
| Cost per 1k Requests | < $5.00 | 每日总成本 / 请求数 × 1000 | 当前 $8.20,目标节约 38% |
| Misroute Rate | ≤ 5% | (FN + FP) / 总请求 | FN:需要 strong 但使用了 weak;FP:使用了 strong 但 weak 足够 |
| SLM 使用率 | 60-70% | weak 路由 / 总请求 | 太低则成本节约不足,太高则质量下降 |
| 用户满意度 | ≥ 4.0/5.0 | Langfuse 反馈分数平均 | thumb-down < 10% |
测量周期
- 实时监控:TTFT P95、Cost per Request(Grafana 仪表板)
- 每日审查:Misroute Rate、SLM 使用率(Langfuse 分析)
- 每周调优:关键词添加/删除、阈值调整(基于离线标注)
成功指标计算示例
# 基于 Langfuse trace 数据计算
def calculate_metrics(traces: list):
total = len(traces)
weak_count = sum(1 for t in traces if t.tags.get("tier") == "weak")
misroute_count = sum(1 for t in traces if t.tags.get("misroute"))
total_cost = sum(t.calculated_total_cost or 0 for t in traces)
return {
"slm_usage_rate": weak_count / total * 100,
"misroute_rate": misroute_count / total * 100,
"cost_per_1k": (total_cost / total) * 1000,
}
SLO 权衡
SLM 使用率过高会降低质量,过低则成本节约效果不明显。通过每周 A/B 测试找到最佳平衡点。
2. 分类阈值基准(v7 baseline)
经过生产验证的分类标准
在 GLM-5 744B(H200 × 8,$12/hr)和 Qwen3-4B(L4 × 1,$0.3/hr)环境中经过 2 周生产测试得出的基准。
STRONG_KEYWORDS(17个)
STRONG_KEYWORDS = [
# 中文(7个)
"重构", "架构", "设计", "分析", "优化", "调试", "迁移",
# 英文(10个)
"refactor", "architect", "design", "analyze", "optimize", "debug",
"migration", "complex", "performance", "security"
]
关键词选择依据:
- 重构/refactor:需要理解整体代码结构 — Qwen3-4B 在 1,000 行以上代码库中会丢失上下文
- 架构/architect:多文件依赖分析 — SLM 的浅层推理不足
- 分析/analyze:根因追踪 — GLM-5 的链式思考必不可少
- 优化/optimize:算法复杂度计算 — 数学推理能力差异
- 调试/debug:堆栈跟踪回溯 — 需要长上下文
- 迁移/migration:API 变更映射 — 需要深入理解框架
- complex:用户明确提及复杂度
- performance:性能分析、瓶颈识别 — 系统级理解
- security:CVE 分析、漏洞检测 — 安全领域知识
TOKEN_THRESHOLD(500字)
TOKEN_THRESHOLD = 500 # 中文约 250-300 tokens
依据:
- 500字以下:简单查询(代码片段说明、单个函数编写)— Qwen3-4B 足够
- 500字以上:多轮对话累积、包含长代码块 — 需要 GLM-5
- 中英混合时,英文 token 密度高,建议添加
len(content.encode('utf-8')) > 600条件
TURN_THRESHOLD(5轮)
TURN_THRESHOLD = 5
依据:
- 5轮以下:独立查询 — context window 负担小
- 5轮以上:累积上下文复杂化,引用先前对话增多 — 利用 GLM-5 的长上下文处理能力