Рано или поздно продукт просит «добавить ИИ»: суммаризацию обращений, черновик ответа клиенту, разбор документа в поля формы. Для разработчика это обычная интеграция с внешним API, только ответ недетерминирован, платный и медленный. Здесь коротко практические правила. Как устроены модели, RAG и оценка качества, подробно в трек LLM.
Где живёт ключ
Ключ к LLM API только на сервере. Браузерное или мобильное приложение ходит в ваш бэкенд, а бэкенд в провайдера. Ключ в клиентском коде вытащат за минуты и потратят ваш бюджет. Ключ в коде репозитория тоже утечка: храните его в секретах окружения.
Бэкенд нужен не только ради ключа. Там проверяются права пользователя, лимиты, собирается промпт, пишутся метрики.
Вызов и надёжность
Внешний API может отвечать долго, вернуть 429 или 5xx, оборвать соединение. Минимальный набор:
- Таймаут на запрос, иначе воркеры повиснут.
- Повторы с экспоненциальной задержкой на 429 и 5xx, ограниченное число раз. Ошибки 400 повторять бессмысленно.
- Фолбэк: другая модель, другой провайдер или честное сообщение «функция временно недоступна», а не падение страницы.
- Лимит max_tokens на ответ: без него один запрос может стоить как сотня.
Выбор провайдера зависит от требований. Для данных российских пользователей часто берут отечественные модели (например, YandexGPT или GigaChat) или модель в своём контуре, остальные варианты оценивают по качеству, цене и условиям обработки данных.
Стриминг
Генерация длинного ответа занимает секунды. Чтобы пользователь не смотрел на спиннер, ответ отдают по частям: провайдер присылает токены потоком, бэкенд пересылает их клиенту, обычно через SSE (Server-Sent Events).
Что не забыть:
- Обрыв соединения посреди ответа. Клиент должен показать, что ответ неполный, а не выдать обрывок за результат.
- Отмена: пользователь закрыл вкладку, значит, запрос к провайдеру надо прервать, иначе вы платите за ненужные токены.
- Прокси и балансировщики, которые буферизуют ответ и ломают стриминг.
Structured output
Если ответ идёт в код, а не человеку, просите JSON по схеме. Многие API умеют ограничивать вывод JSON-схемой. Но даже тогда ответ надо валидировать на своей стороне (Zod, Pydantic, JSON Schema): модель может вернуть пустое поле, лишнее значение или правдоподобную выдумку. Невалидный ответ: повтор с сообщением об ошибке или фолбэк. JSON.parse без проверки схемы это ошибка, которая выстрелит в проде.
Стоимость
Платите за токены: входные (системный промпт, история, документы) и выходные (ответ). Выходные обычно дороже. Отсюда правила:
- Не таскать в каждый запрос лишнюю историю и огромные документы.
- Ограничивать длину ответа.
- Считать стоимость на запрос и на пользователя, ставить лимиты и бюджеты.
- Простые задачи отдавать меньшей модели.
Кеширование
Два разных кеша:
- Кеш промпта у провайдера. Если запросы начинаются с одинакового длинного префикса (системный промпт, инструкции, документ), часть провайдеров переиспользует его обработку дешевле и быстрее. Стабильную часть ставят в начало, изменчивую в конец.
- Свой кеш ответов. Для одинаковых запросов, например суммаризации одного и того же документа. Ключ кеша должен учитывать всё, что влияет на ответ: модель, версию промпта, входные данные и, если ответ зависит от прав, пользователя или его доступ. Иначе один пользователь увидит ответ, собранный по данным другого.
Логи и данные
Логировать нужно: модель, токены, задержку, стоимость, ошибки, версию промпта. Полные тексты промптов и ответов часто содержат персональные данные. Их либо не пишут, либо маскируют, либо хранят отдельно с ограниченным доступом и сроком хранения. Для 152-ФЗ важно и то, куда уходят данные: передача персональных данных стороннему провайдеру требует правового основания.
Человек в контуре
Чем дороже ошибка, тем ближе к результату должен стоять человек. Черновик письма клиенту правит и отправляет сотрудник. Извлечённые из документа поля пользователь подтверждает перед сохранением. Автоматически без проверки можно делать только то, что легко откатить и что не вредит при ошибке. На собеседовании этот пункт часто отличает зрелый ответ от наивного.
Короткий чек-лист
- Ключ на сервере, права и лимиты на пользователя.
- Таймаут, повторы с backoff, фолбэк, max_tokens.
- Стриминг с обработкой обрыва и отмены.
- Схема ответа и валидация.
- Учёт токенов и стоимости, кеш с правильным ключом.
- Логи без персональных данных.