Model router в продакшне: как мы маршрутизируем запросы между 5 моделями
2026-02-18 · Алексей Волков
Model router в продакшне
Когда у вас в проде одна модель — всё просто. Когда их пять и каждая на что-то хороша, а на что-то переплата — нужен роутер. Рассказываем, как собирали свой.
Зачем вообще роутер
Исходная ситуация: один endpoint, все запросы идут в GPT-4. 40% трафика — простые задачи, с которыми справляется модель в 10 раз дешевле. Ещё 5% — reasoning-heavy, где даже GPT-4 ошибается, а Opus нет. В среднем мы либо переплачивали, либо теряли качество.
Архитектура
Request
│
▼
[Feature extractor] → длина, язык, наличие кода, тип задачи, doc score
│
▼
[Classifier] → logistic regression на 14 фичах, обученная на 8k размеченных запросах
│
▼
[Policy] → sticky routing (одна сессия — одна модель), fallback rules
│
▼
Model: Haiku | Sonnet | Opus | GPT-4 | local-llama
Classifier отдаёт вероятности по 5 классам, policy берёт argmax + применяет правила (например: «если latency_budget < 500ms — не Opus»).
Фичи
| Фича | Откуда берётся |
|---|---|
| length_tokens | tiktoken по input |
| lang | fasttext detect |
| has_code | regex на code fences и keywords |
| task_type | rule-based classifier (extraction, QA, gen, reasoning) |
| context_docs_n | от вызывающего слоя |
| user_tier | из auth token |
| requires_reasoning | флаг от caller |
Обучение
Разметка — 8000 запросов из реального трафика. Лейбл — «какая самая дешёвая модель дала приемлемый output» (определяется LLM-as-judge + sampling ревью).
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(multi_class="multinomial", C=0.8, max_iter=500)
clf.fit(X_train, y_train)
# accuracy на holdout: 0.87
# savings при calibrated routing: 31% vs baseline "always GPT-4"
Fallback и sticky routing
Если выбранная модель вернула ошибку (rate limit, 5xx) — автоматический fallback на следующий по score. Если в рамках одной session_id уже был выбор — следующие запросы идут в ту же модель (стабильность поведения важнее микро-экономии).
Что работало хуже, чем ожидалось
- Neural classifier — пробовали маленький DistilBERT на тех же фичах, +0.5% accuracy при 40x росте latency. Отказались.
- Cascade (сначала дешёвая, если не уверена — дорогая) — хорошо звучит, плохо работает в latency-sensitive сценариях. Оставили для batch-режима.
Результаты
| Метрика | До | После |
|---|---|---|
| Средняя стоимость запроса | $0.028 | $0.019 |
| p95 latency | 1.4s | 0.9s |
| User-perceived quality (holdout eval) | 4.31 | 4.29 |
| Инцидентов из-за rate limits | 12/мес | 2/мес |
Вывод
Роутер — не магия, а нормальный классификатор с хорошими фичами и адекватным fallback. Главное — не пытаться предсказать «оптимальную модель», а предсказывать «самую дешёвую, которой достаточно».
← Ко всем постам