Прототип на LLM делается за вечер. Сервис, который выдерживает нагрузку, укладывается в бюджет и не падает вместе с провайдером, это обычная инженерия плюс несколько специфичных приёмов.
Стоимость
Провайдеры берут деньги за токены, отдельно за входные и выходные; выходные обычно дороже в несколько раз. Кешированные входные токены (повторяющийся префикс промпта) часто стоят заметно дешевле.
стоимость запроса = вход / 1e6 × цена_входа + выход / 1e6 × цена_выхода
Пример расчёта на собесе: 50 тысяч запросов в день, 3000 входных и 400 выходных токенов. Умножьте и получите бюджет; затем найдите, что его раздувает. Обычно это контекст: длинная история, 20 чанков RAG, огромный системный промпт.
Как снижать:
- Меньше контекста: отбор чанков, обрезка и суммаризация истории, компактные результаты инструментов.
- Prompt caching: стабильная часть промпта (системный промпт, инструкции, справочник) в начале, изменяемая в конце. Тогда провайдер переиспользует префикс.
- Маршрутизация моделей: простые запросы на маленькую дешёвую модель, сложные на большую. Классификатор сложности или каскад: сначала дешёвая, при низкой уверенности дорогая.
- Кеш ответов: точный (по хешу нормализованного запроса) и семантический (по близости эмбеддингов). Семантический кеш опасен: похожие вопросы могут требовать разных ответов, а общий кеш может отдать чужие данные. Порог сходства подбирают на данных.
- Батч-API для офлайн-задач: провайдеры дают скидку за асинхронную обработку.
- Ограничение выхода:
max_tokens, просьба отвечать кратко, структурированный вывод.
Задержка
Общая задержка ≈ очередь + TTFT + TPOT × число выходных токенов. Что делать:
- Стриминг: показывать текст по мере генерации. Общая задержка не меняется, но воспринимаемая падает в разы.
- Короткий вход ускоряет TTFT, короткий выход сокращает генерацию.
- Меньшая модель быстрее.
- Параллелить независимые шаги: поиск в нескольких индексах, вызовы инструментов.
- Не делать лишних последовательных вызовов модели в цепочке.
Мерить нужно перцентили (p50, p95, p99), а не среднее: у LLM длинный хвост.
Надёжность
Внешний провайдер падает, отвечает 429 (лимит) и 5xx, иногда медленно. Обвязка:
- Таймауты на соединение и на весь ответ; при стриминге ещё и на паузу между токенами.
- Ретраи только для временных ошибок (429, 5xx, сетевые), с экспоненциальной задержкой и джиттером, с учётом заголовка
Retry-After. Ошибки 400 (плохой запрос) повторять бессмысленно. - Фолбэк: при недоступности основной модели переключиться на резервную (другой регион, другой провайдер, своя модель). Промпт и парсинг должны быть совместимы с резервной моделью, это проверяют заранее.
- Circuit breaker: при серии ошибок временно не слать запросы в сломанного провайдера.
- Лимиты и очереди на своей стороне: квоты на пользователя, приоритеты, деградация вместо падения (короткий ответ, отключение второстепенных функций).
- Идемпотентность действий, которые запускает модель.
Часто всё это собирают в LLM-шлюз (gateway): единая точка вызова моделей для всех сервисов компании с маршрутизацией, ключами, квотами, кешем, логированием и учётом стоимости по командам.
Наблюдаемость
Обычных метрик сервиса мало. Для LLM пишут:
- Трейсы: каждый вызов модели и инструмента, промпт (с маскированием ПДн), ответ, версии промпта и модели, токены, стоимость, задержка.
- Метрики: токены и деньги по фичам и командам, TTFT, p95, доля ошибок и фолбэков, доля невалидного JSON, доля отказов модели.
- Качество в проде: оценки пользователей, выборочная автоматическая оценка судьёй, дрейф тематик запросов.
- Алерты: рост стоимости, рост ошибок, падение качества.
Частые ошибки
- Нет таймаутов: зависший запрос к провайдеру держит поток или соединение.
- Ретраи на всё подряд, включая 400, и без джиттера: «громовое стадо» после сбоя.
- Фолбэк на модель, с которой никто не проверял промпт.
- Считать только среднюю задержку и среднюю стоимость.
- Логи с полными промптами и персональными данными без маскирования.
Что спросят на собесе
- Посчитать стоимость фичи в месяц и предложить, как её снизить.
- Как уменьшить задержку и что даёт стриминг.
- Ретраи, фолбэки, circuit breaker: когда что.
- Семантический кеш: плюсы и риски.
- Что логировать и мониторить у LLM-сервиса.