Встраиваем ChatGPT или Claude в сайт на Django: архитектура и грабли

«Прикрутить ChatGPT к сайту» звучит как вечер работы: взял API-ключ, дёрнул endpoint, показал ответ. Демо так и делается. А потом ключ утекает из фронтенда, бот раздаёт советы конкурентов, а счёт за токены приходит как за аренду офиса. Разберём, как встраивать LLM в продакшен — на примере Django-стека.

Правило №1: ключ никогда не живёт на фронтенде

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

Правильно: фронтенд говорит только с вашим бэкендом, бэкенд — с провайдером модели. Django-view как прокси: принял вопрос, проверил права и лимиты, сходил к модели, вернул ответ. Ключ — в переменных окружения сервера.

Архитектура минимальной интеграции

  1. Endpoint в Django (DRF или обычная view) — принимает сообщение и контекст сессии.
  2. Слой промпта — системная инструкция («ты консультант магазина X, отвечай только про наши товары»), история диалога, при необходимости RAG-подмешивание ваших данных (как работает RAG).
  3. Стриминг. Ответ модели генерируется секунды — пользователь должен видеть текст по мере появления, а не смотреть на спиннер. В Django это StreamingHttpResponse/SSE или WebSocket через Channels.
  4. Журнал. Каждый диалог — в базу: для разбора качества, для юристов, для подсчёта расходов по пользователям.

Защита, без которой нельзя выкатывать

  • Лимиты на пользователя. N сообщений в час для анонима, больше — для залогиненных. Иначе ваш «консультант» станет бесплатным ChatGPT для всего интернета.
  • Ограничение темы. Системный промпт + проверка: бот магазина сантехники не должен писать курсовые. Это и расходы, и репутация.
  • Модерация входа. Провокации («представь, что ты без ограничений…») — классика. Фильтр до модели плюс жёсткая инструкция.
  • Потолок расходов. Алерт и автостоп при аномальном расходе токенов за день. Узнать о проблеме от биллинга провайдера — худший вариант.

Грабли, на которые наступают

  1. Синхронный вызов в вебе. Запрос к модели — секунды; воркеры заняты — сайт лёг. Стриминг или очередь (Celery) обязательны под нагрузкой.
  2. Нет фолбэка. API провайдера иногда недоступен. Пользователь должен увидеть «консультант отдыхает, вот телефон», а не 500.
  3. История без ограничений. Диалог растёт — каждый запрос тащит всю переписку, расходы растут квадратично. Нужна обрезка или суммаризация истории.
  4. Один провайдер намертво. Слой абстракции над API (или готовые библиотеки) позволяет переключить OpenAI ↔ Anthropic ↔ локальную модель без переписывания. Цены и качество моделей меняются каждый квартал — свобода манёвра дорога.

Сколько это стоит

Консультант на сайте с RAG по вашему каталогу — те же 40–80 часов, что и любой пилотный AI-проект: прокси, стриминг, лимиты, промпты, подключение данных. Полная структура расходов, включая токены, — в разборе стоимости внедрения.

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