Fallback-цепочки и деньги: как не платить лишнего

Обложка

Самый недооценённый навык в лабе с LLM — не «завести ещё одну модельку», а научиться не платить за то, что может работать бесплатно. Потому что облачные API устроены коварно: счёт растёт не тогда, когда ты делаешь что-то сложное, а когда тебе лень разбираться, куда ушёл очередной запрос.

Я это понял на третий месяц, когда открыл статистику и увидел, что половина расхода улетела на рутину, которую спокойно тянет локальная моделька: перескажи, перепиши, подставь в шаблон, прикинь заголовок.

Боль: платишь не за интеллект, а за привычку

Главная иллюзия новичка: «дорогая модель = хорошая модель, пусть на ней всё и крутится». На деле дорогая модель — инструмент с узким профилем. Она нужна, когда задача реально тяжёлая: разбор чужого конфига, код с нетривиальной логикой, перекрёстный аудит.

Для всего остального платить за топ-модель — это как возить картошку на «порше». Доедет, да. Но зачем.

Цепочка вместо одной модели

Правильная архитектура тут — не «одна модель на всё», а fallback-цепочка: список моделей по убыванию «цены и ума». Запрос летит на первую, если она упала или перегрузилась — на вторую, и так до локального «погреба», который почти никогда не отказывает, потому что это твоё собственное железо.

Логика простая:

В моей связке это выглядит так: дешёвый флэш → тяжёлый про → локальный qwen3:30b. Флэш крутится по умолчанию, про подхватывает сложные сессии и черновики статей, а локальная модель — последний рубеж, который не зависит ни от чьего дата-центра.

Важно: порядок — это не про «кто умнее», а про «кто дешевле при достаточном качестве». Поставишь про первым — заплатишь за весь объём рутины, которую флэш сделал бы так же.

Бесплатно ≠ безлимитно

Отдельная тема — «бесплатные» модели на агрегаторах вроде OpenRouter. Там есть целый зоопарк моделей с ценой ноль: glm, gemma, nemotron и прочие. Соблазн велик: качай бесплатно и радуйся. Но у бесплатного есть три нюанса, которые вылезают боком: лимиты, 429 и гео.

Первый — лимиты. Без пополнения баланса это жалкие 50 запросов в день (и 20 в минуту). На субагентов это уходит за час. Активируется нормальный режим только после разового пополнения — в моём случае хватило $10, и лимит подскочил до 1000 запросов в день. Важно: лимит общий на все бесплатные модели, это не «по тысяче на каждую».

Второй — 429. Бесплатные модели живут в общей очереди и регулярно отдают «Provider returned error» — очередь перегружена. Это не сбой, это норма. Лечится ретраем с паузой или переключением на другую бесплатную модель. Проверено на практике: в один момент отвечают два nemotron'а, а glm и gemma — молчат с 429. Через час картина может поменяться.

Третий — бесплатные не значит «наши». Некоторые из них находятся там же, откуда нас методично отшивают.

Мёртвые зоны: 403 из-за гео

Вот грабли, на которые я наступил, чтобы вы не наступали. Часть популярных облачных API из нашей страны просто не работает — отдаёт 403 на любом запросе. Не «медленно», не «с ошибками», а глухо: 403, до свидания.

Сюда попадает и сам OpenAI, и половина моделей на OpenRouter, которые крутятся на их бэкенде. Проверить легко: если модель «по документации» должна работать, а в логах стабильный 403 — она мертва именно для нас, и не надо три часа чинить то, что чинится только VPN'ом.

Главный вывод: не включать такие модели в fallback-цепочку. Иначе получится красивая схема, в которой каждый второй шаг — это гарантированный отказ, и вместо экономии ты получаешь задержку и кучу красных строк в логах. Я однажды поймал себя на том, что «запасная» модель в цепочке была мёртвой с самого начала — просто её не проверили отдельно.

Что куда: рутина на free, особое — на платные

Теперь главное — разделение труда:

Смысл в том, чтобы платные модели редко включались, но метко. Тогда счёт в конце месяца — это копейки, а не «сколько?!».

Считаем по токенам, а не «по запросу»

Самая частая ошибка в оценке стоимости — считать «за запрос». Запрос запросу рознь: один — 200 токенов, другой — 20 тысяч, потому что ты кинул в контекст три файла по десять килобайт.

Цена у моделей считается за миллион токенов, отдельно на вход и на выход. Например, у Claude: Haiku — $1/M вход и $5/M выход, Sonnet — $2/$10, Opus — $5/$25. Разница в разы: длинный контекст (вход) стоит копейки, а длинная генерация (выход) — уже ощутимо.

Практический вывод: если задача требует тяжёлой модели — следи за тем, сколько она генерит на выходе, а не сколько ты ей скормил. Три килобайта контекста на входе почти бесплатны; три килобайта ответа от Opus — это уже заметная строка в счёте.

И ещё: токены — это не слова. Русский текст даёт примерно 1.5–2 токена на слово, код — ещё плотнее. Поэтому «прикинуть на глаз» по словам почти всегда врёт в меньшую сторону.

Мониторинг: порог тревоги и cron

Деньги любят счёт. Чтобы «не платить лишнего» стало фактом, а не мантрой, у меня висит cron-задача проверки баланса: ходит в API, смотрит остаток и расход, и если баланс проседает ниже порога — шлёт сообщение.

Порог подбирается под темп: от срабатывания до нуля должно оставаться время спокойно среагировать, а не «ой, всё встало». Для меня это пара дней автономной работы агента — с запасом.

Заодно та же задача смотрит не только баланс, но и куда уходит трафик: какая модель сколько выжгла за сутки. Именно этот график однажды показал мне, что флэш крутит 90% запросов (как и задумано), а вот на про падает слишком много рутины — и я поправил маршрутизацию. Без цифр я бы этого не заметил: «ну вроде норм».

Итог

Fallback-цепочка — это не про то, чтобы сэкономить «в теории». Это про то, чтобы честно разделить: что бесплатно, что дёшево, что стоит дорого — и почему. Три уровня — флэш, про, локальный qwen — закрывают почти всё, а платные топ-модели остаются для тех самых «особых случаев», где их цена оправдана.

Домашняя лаба тем и хороша, что ты видишь каждый запрос. Грех этим не пользоваться: посчитай цену за токен, настрой порог тревоги, выкинь мёртвые 403-модели из цепочки — и счёт в конце месяца перестанет тебя удивлять. В неприятную сторону.

#llm #selfhosting