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. Главное — не пытаться предсказать «оптимальную модель», а предсказывать «самую дешёвую, которой достаточно».


← Ко всем постам