LLM-router: как автоматически выбирать модель по задаче

7 июня 2026 г. · 13 мин чтения · Максим Космов

LLM-router: как автоматически выбирать модель по задаче
Содержание

TL;DR

Система, которая сама решает, какой моделью отвечать на конкретный вопрос. Не пользователь руками каждый раз выбирает «это в Claude, это в Gemini, а это локально в Mistral», а маленький классификатор смотрит на текст запроса за 10 миллисекунд и роутит. Простой вопрос про погоду уходит в Gemini Flash. Запрос «разбери эту портянку кода и найди утечку памяти» уходит в Claude Opus. Запрос с персональными данными клиента остаётся на локальной машине и обрабатывается Mistral 7B локально.

Результат меряется три недели на реальном потоке. Экономия $0.05-0.10 на каждом запросе по сравнению с тем, когда всё гонится в одну топовую модель. На тысяче запросов это $50-100 чистой экономии. По скорости отклик стал на 30% быстрее, потому что простые задачи не ждут очереди в дорогой модели, а отвечают мгновенно через дешёвый Flash.

В тексте: зачем вообще нужен роутер если можно просто выбирать модель руками, как устроена архитектура, как работает классификатор, какие модели расписаны по слотам, что делать когда классификатор ошибся, какие готовые решения есть на рынке (OpenRouter, LiteLLM), как поднять свой роутер на FastAPI за вечер, и сколько реально получается экономии в цифрах.

Зачем вообще нужен LLM-router

Долго работать по схеме «одна модель на всё» привычно. Платишь $50-80 в месяц за Claude Opus и кидаешь в него вообще любые запросы. От «сколько будет 17 умножить на 23» до «перепиши вот эту функцию на 400 строк с учётом потокобезопасности». И там, и там Opus отвечает отлично, но за вопрос про умножение платишь такую же цену как за разбор кода.

Это и есть главная проблема одной модели на всё. Дорогие закрытые модели берут $0.01-0.03 за запрос независимо от его сложности. Простые запросы, а их в любом реальном потоке 60-70%, переплачиваются в десятки раз. Бесплатный Gemini Flash на простом вопросе отвечает за 200 миллисекунд и стоит почти ноль. Opus отвечает за 4 секунды и стоит $0.02.

Вторая проблема, скорость. Сложные модели медленнее. Когда задаёшь короткий вопрос и ждёшь 4 секунды вместо 0.2, это раздражает. Когда роутер сам видит «это простой вопрос» и отправляет в быструю модель, ответ приходит мгновенно.

Третья проблема, приватность. Есть задачи, где не хочется отправлять данные в облако. Внутренние записки, переписка с клиентами, наброски с реальными именами и суммами. Для таких запросов нужна локальная модель. Но если каждый раз думать «ага, это чувствительное, надо в локальную», начинаешь забывать и отправлять конфиденциальное в Claude. Роутер автоматически распознаёт чувствительные паттерны и держит их на локальной машине.

Четвёртая проблема, масштабирование. Когда поток вырастает с 50 запросов в день до 800, физически перестаёшь успевать выбирать модель руками. Роутер делает это сам со скоростью, которой человек не повторит.

Архитектура: как это работает

Поток выглядит так. Запрос приходит в gateway (FastAPI на порту 8080). Gateway вызывает функцию classify(prompt). Классификатор за 8-12 миллисекунд возвращает один из трёх лейблов: simple, complex, sensitive. Дальше gateway смотрит в конфиг и видит куда роутить.

simple уходит в Gemini Flash через Google API. Это вопросы вида «что такое REST API», «переведи фразу на английский», «суммируй текст в 3 предложения». Стоимость почти нулевая, скорость 200-400 мс.

complex уходит в Claude Opus 4.7 через Anthropic API. Это код, длинный анализ, креатив, многошаговое рассуждение. Стоимость $0.01-0.03, скорость 2-5 секунд.

sensitive остаётся на локальной машине и обрабатывается Mistral 7B Instruct через Ollama. Это запросы с пометками типа «вот письмо от клиента Иванова», или с ключевыми словами «персональные данные», «внутренний», «не отправляй наружу». Стоимость $0 (только электричество), скорость 1-2 секунды на RTX 3090.

После выполнения модель возвращает ответ обратно в gateway. Gateway логирует метаданные: какой класс присвоен, в какую модель ушло, сколько токенов, сколько стоило, сколько заняло времени. Логи смотришь раз в неделю и подкручиваешь классификатор если видишь систематические ошибки.

Весь pipeline занимает 250 мс на простом запросе и до 5 секунд на сложном. На простых запросах экономия на скорости получается за счёт того, что классификатор очень быстрый (10 мс) и Gemini Flash тоже очень быстрый.

Классификатор: как он принимает решение

Это самая интересная часть. Тут не одна нейросеть на 7 миллиардов параметров, потому что такое решение само по себе будет тормозить весь pipeline. Двухуровневый классификатор работает лучше.

Первый уровень, правила на регулярках и ключевых словах. Если в запросе есть слова «код», «функция», «класс», «алгоритм», «архитектура», «refactor», «debug», это с высокой вероятностью complex. Если в запросе меньше 20 слов и нет вышеуказанных маркеров, скорее всего simple. Если в запросе есть «клиент», «персональн», «внутренн», «не отправляй», «приват», имена и email-паттерны, это sensitive.

Правила покрывают примерно 75% запросов и работают за 1 миллисекунду.

Второй уровень, маленькая модель-классификатор. Если правила не дали уверенного ответа, запрос идёт через distilBERT, дообученный на 3000 размеченных примерах. Модель выдаёт один из трёх лейблов с вероятностью. На локальной машине это занимает 8-10 миллисекунд через ONNX runtime на CPU.

Точность связки получилась 92%. То есть из 100 запросов классификатор правильно определяет класс в 92 случаях. В оставшихся 8 либо отправляет простой вопрос в Claude (переплата небольшая), либо отправляет сложный вопрос в Gemini Flash (получается слабый ответ и приходится переспрашивать).

Примеры реальной классификации:

«Что такое webhook», simple, Gemini, 230 мс, $0.00008.

«Перепиши этот SQL-запрос так чтобы он работал быстрее на таблице в миллион строк, вот схема и план выполнения», complex, Claude, 3.4 секунды, $0.018.

«Вот письмо от клиента Петрова, помоги составить вежливый отказ», sensitive, локальный Mistral, 1.6 секунды, $0.

«Сделай саммари этой статьи в 3 пунктах», simple, Gemini, 380 мс, $0.0002.

«Найди утечку памяти в этом коде на Go, файл на 800 строк прикреплён», complex, Claude, 4.7 секунды, $0.024.

Список моделей: что прописано в роутере

В Gemini Flash отправляются простые вопросы. Лимит бесплатного использования у Google щедрый, 1500 запросов в день. В него почти невозможно упереться. Платный тариф стоит $0.075 за миллион входных токенов, что в сравнении с Claude примерно в 30 раз дешевле. Скорость 200-400 мс. Качество достаточное для всего что не требует глубокого рассуждения.

В Claude Opus 4.7 отправляются сложные задачи. Это код, архитектура, длинный анализ, креативные тексты в продакшен, многошаговое логическое рассуждение. Цена $0.015 за тысячу входных токенов и $0.075 за тысячу выходных. Скорость 2-5 секунд. Качество эталонное.

В локальный Mistral 7B Instruct через Ollama уходит чувствительное. Эта модель крутится на RTX 3090 и не выходит в интернет. Скорость 1-2 секунды на запрос. Цена $0 при условии что видеокарта уже куплена. Качество для типовых задач (переписка, суммаризация, перевод) приличное, но для серьёзного кода или анализа недостаточное.

Дополнительно в роутере прописаны fallback-цепочки. Если Gemini вернул ошибку, переотправить в Mistral локально. Если Claude вернул rate limit, переотправить в GPT-5 через OpenAI API. Если локальный Mistral не отвечает (например, идёт перезагрузка), переотправить в Gemini, но с пометкой «осторожно, данные могут быть чувствительными».

Fallback: что делать когда классификатор ошибся

Это самая больная точка. Классификатор работает с 92% точностью, но 8% ошибок на потоке в 1000 запросов в день, это 80 неправильных решений ежедневно. Без fallback это превращается в плохой UX.

Схема такая. После того как модель ответила, gateway смотрит на ответ. Если ответ короче 30 символов и содержит фразы типа «не уверен», «уточните вопрос», «недостаточно контекста», это сигнал что Gemini не справился. Gateway автоматически переотправляет запрос в Claude и возвращает уже второй ответ. Пользователь видит небольшую задержку, но получает нормальный ответ.

Второй fallback, на стороне пользователя. Есть кнопка «переотправить в сильную модель». Если ответ от Gemini кажется слабым, нажимаешь кнопку и Claude переотвечает на тот же вопрос. Используется редко, но полезно.

Третий fallback, пассивное обучение. Каждое срабатывание fallback логируется как «классификатор ошибся, должно было быть complex». Раз в неделю берёшь эти примеры и докидываешь в датасет для дообучения классификатора. За месяц такой работы точность выросла с 88% до 92%.

Реализация: три варианта

Первый вариант, OpenRouter. Готовый коммерческий сервис, который сам выбирает модель по запросу. Платишь $20-50 в месяц, получаешь готовое решение без головной боли. Минус, переплачиваешь за то, что можно сделать самому за вечер.

Второй вариант, LiteLLM. Это open-source библиотека на Python, которая даёт единый интерфейс к 100+ моделям. Сама не маршрутизирует, но даёт удобную обёртку для своего роутера. С неё удобно начинать.

Третий вариант (основной), FastAPI плюс Python плюс свой классификатор. Файл router.py на 200 строк, конфиг в YAML, классификатор на distilBERT. Полный контроль, нулевая зависимость от чужих сервисов, можно затюнить под любой кейс. Развёртывается за один вечер.

Цифры экономии

Раньше всё гонялось в Claude Opus. Средняя стоимость запроса $0.018. На потоке 800 запросов в день это $14.40 в день, или $432 в месяц.

Сейчас 65% запросов уходит в Gemini Flash по $0.0002 (это $0.10 в день), 20% уходит в Claude по $0.018 (это $2.88 в день), 15% уходит в локальный Mistral по $0 (это $0). Итого $2.98 в день, или $89 в месяц.

Экономия $343 в месяц чистыми. Это $4116 в год. На железо потрачено $0 дополнительно, RTX 3090 уже стояла. На разработку роутера ушло 8 часов рабочего времени.

По скорости средний ответ стал быстрее на 30%. Простые запросы вместо 4 секунд отвечают за 300 мс. Сложные как отвечали 3-5 секунд, так и отвечают.

FAQ

Сколько времени реально занимает поднять свой роутер? Один вечер на MVP с правилами без ML-классификатора, и ещё два вечера на distilBERT, разметку датасета и дообучение. Итого 3 вечера для рабочей системы.

Что если классификатор сильно ошибается на конкретных данных? Размечай свой датасет. Тысячи примеров достаточно для запуска. Дальше докидывай ошибочные классификации и переучивай раз в неделю.

Можно без ML, только на правилах? Можно. Точность будет 75-80%, что уже неплохо для старта. Первый прототип роутера обычно делается на одних регулярках и нормально работает.

Что с приватностью если отправляешь в Gemini? Google заявляет что не использует API-запросы для обучения. Но если данные действительно чувствительные, лучше прописать жёсткое правило «эти ключевые слова, всегда локально».

Какая модель лучше для классификатора, distilBERT или что-то новее? DistilBERT хватает с запасом. Эта задача простая, новые большие модели тут оверкилл и будут тормозить pipeline.

📌 Dzen (~900 слов)

Роутер сам выбирает модель. Руками больше не надо

Привычная схема, одна модель на всё, Claude Opus. Любой вопрос, от «сколько будет 17 на 23» до «разбери эту портянку кода на 800 строк», уходит туда. Платишь $50-80 в месяц и не паришься. Удобно, но неоптимально. За простой вопрос отдаёшь столько же, сколько за сложный.

Три месяца назад была собрана система LLM-router. Это маленькая инфраструктура, которая смотрит на запрос и сама решает, какую модель использовать. Простой вопрос, в дешёвую и быструю модель. Сложный, в дорогую и умную. Чувствительный, в локальную, чтобы данные не выходили из дома.

Результат измерен на потоке в 800 запросов в день. Экономия $343 в месяц чистыми. Скорость ответов стала на 30% выше. Дальше про устройство и про то, почему такое тоже можно собрать за вечер.

Идея простая

Внутри роутера живёт классификатор. Это маленькая модель, которая за 10 миллисекунд читает запрос и присваивает ему один из трёх лейблов: простой, сложный или чувствительный.

Простой, это вопросы вида «что такое REST API», «переведи на английский», «суммируй текст». Они уходят в Gemini Flash. Эта модель быстрая (200 мс) и почти бесплатная ($0.0002 за запрос).

Сложный, это код, длинный анализ, креативные задачи, многошаговое рассуждение. Они уходят в Claude Opus. Эта модель медленная (3-5 секунд) и дорогая ($0.018 за запрос), но качество эталонное.

Чувствительный, это запросы с персональными данными, внутренней перепиской, именами клиентов. Они остаются на локальной машине и обрабатываются Mistral 7B через Ollama. Скорость 1-2 секунды, цена $0, и главное, данные не выходят в интернет.

Как работает классификатор

Двухуровневая система. Первый уровень, правила. Если в запросе есть слова «код», «функция», «алгоритм», «refactor», это complex. Если запрос короткий и без таких слов, simple. Если есть «клиент», «персональн», имена и email, sensitive.

Правила покрывают 75% запросов и работают за 1 миллисекунду.

Второй уровень, distilBERT, дообученный на 3000 размеченных примерах. Если правила не дали уверенного ответа, запрос идёт через эту модель. Она выдаёт лейбл за 10 мс на CPU через ONNX runtime.

Точность связки 92%. Из 100 запросов классификатор правильно определяет класс в 92 случаях. Это достаточно для продакшена, особенно с fallback-механизмом.

Примеры классификации

«Что такое webhook», simple, ушло в Gemini, 230 мс, стоимость $0.00008.

«Перепиши SQL-запрос, чтобы он работал быстрее на миллионе строк», complex, ушло в Claude, 3.4 секунды, $0.018.

«Письмо от клиента Петрова, помоги составить вежливый отказ», sensitive, локальный Mistral, 1.6 секунды, $0.

«Найди утечку памяти в этом Go-коде, файл на 800 строк», complex, Claude, 4.7 секунды, $0.024.

Видно что роутер реально различает классы и каждый запрос попадает туда, где он будет обработан быстрее и дешевле всего.

Fallback: что если классификатор ошибся

8% ошибок на потоке в 800 запросов в день, это 64 неправильных решения. Без fallback это превратилось бы в плохой UX.

Схема такая. После ответа модели gateway смотрит на текст. Если ответ короче 30 символов и содержит «не уверен», «уточните», «недостаточно контекста», gateway автоматически переотправляет запрос в Claude. Пользователь видит небольшую задержку, но получает нормальный ответ.

Плюс есть кнопка «переотправить в сильную модель» вручную. Если видишь слабый ответ, жмёшь кнопку и Claude переотвечает.

Каждое срабатывание fallback логируется и попадает в датасет для дообучения классификатора. За месяц такой работы точность выросла с 88% до 92%.

Как собрать у себя

Три варианта. Первый, OpenRouter. Готовое коммерческое решение. Платишь $20-50 в месяц, получаешь работающий роутер. Минус, переплачиваешь за то, что можно сделать самому.

Второй, LiteLLM. Open-source библиотека на Python с единым интерфейсом к 100+ моделям. Не маршрутизирует, но даёт удобную обёртку. С неё удобно стартовать.

Третий, свой роутер на FastAPI плюс Python. 200 строк кода, конфиг в YAML, классификатор на distilBERT. Полный контроль. Собирается за один вечер на MVP и ещё два вечера на ML-классификатор.

Цифры экономии

Раньше: всё в Claude Opus, 800 запросов в день по $0.018, итого $432 в месяц.

Сейчас: 65% в Gemini ($0.10 в день), 20% в Claude ($2.88), 15% локально ($0). Итого $89 в месяц.

Экономия $343 в месяц, $4116 в год. На разработку ушло 8 часов рабочего времени, на железо $0 дополнительно (RTX 3090 уже стояла).

По скорости средний ответ стал на 30% быстрее. Простые запросы вместо 4 секунд отдают за 300 мс. Сложные как были 3-5 секунд, так и остались, но их теперь меньше четверти от всего потока.

Подводные камни

Классификатор ошибается. Готовься к 8-15% ошибок в зависимости от качества разметки. Без fallback на сильную модель пользователи будут жаловаться.

Простые задачи иногда оказываются сложными. Вопрос «как починить вот это» может выглядеть как simple, но без контекста кода это будет полная каша. Решается дополнительным правилом «если в запросе есть код-блок, это всегда complex».

Локальная модель отжирает память. Mistral 7B берёт 14 ГБ видеопамяти. Если видеокарта на 8 ГБ, придётся брать квантованную версию с потерей качества или отказаться от локальной обработки.

API могут падать. Прописывай fallback-цепочки между разными провайдерами. Стандартная схема: Gemini в GPT-5, Claude в GPT-5, локальный Mistral в Gemini.

Финал

LLM-router, это инфраструктура, которая окупается за две недели. Восемь часов работы дают экономию $343 в месяц и плюс 30% к скорости отклика. Если через LLM API гонится больше 100 запросов в день, без роутера переплата идёт в 2-4 раза.

📲 TG (600-900 символов)

LLM-router сам выбирает модель под запрос. Простой вопрос в Gemini Flash за 200 мс и $0.0002. Сложная задача в Claude Opus за 3 секунды и $0.018. Чувствительные данные с именами клиентов остаются на локальной машине через Mistral 7B на Ollama, в интернет не уходят. Классификатор двухуровневый: правила на регулярках покрывают 75% запросов за 1 мс, дальше distilBERT на 3000 примерах добивает точность до 92%. На потоке 800 запросов в день экономия выходит $343 в месяц чистыми, $4116 в год. Скорость ответа в среднем на 30% выше. Сборка MVP, один вечер, FastAPI плюс 200 строк Python и YAML-конфиг. Fallback на сильную модель ловит 8% ошибок классификатора и докидывает их в датасет для дообучения.

Читайте дальше