Малый бизнес регулярно теряет клиентов в нерабочее время: человек пишет в чат сайта в 23:00, не получает ответа и уходит к конкуренту. Стандартные решения — либо скриптовые боты с жёсткими сценариями, либо интеграция с зарубежными LLM вроде GPT-4, что обходится в десятки тысяч рублей в месяц и предполагает хранение данных за рубежом. Разработчик из России собрал альтернативу на открытой модели с локальным инференсом и российским мессенджером в качестве интерфейса для операторов.
В основе системы — модель Qwen3 30B A3B Instruct в квантизации Q4_K_M GGUF, запущенная через vLLM на сервере Dell T440 с GPU NVIDIA Tesla V100 32 ГБ, двумя процессорами Intel Xeon Gold 6244 и 128 ГБ оперативной памяти. Скорость генерации — до 98 токенов в секунду, контекстное окно — 32 тысячи токенов. Модель поднята через OpenAI-совместимый API, что позволяет подключать её к любому коду, уже работающему с OpenAI SDK. Инференс и хранение диалогов выполняются на сервере в России.
| Компонент | Технология | Назначение |
|---|---|---|
| Виджет на сайте | JavaScript + WebSocket | Чат для клиента без внешних зависимостей |
| Relay-сервер | FastAPI + WebSocket | Маршрутизация сообщений между vLLM и MAX |
| ИИ-модель | Qwen3 30B Q4_K_M GGUF / vLLM | Генерация ответов и суммаризация диалога |
| Интерфейс оператора | MAX-бот + webhook | Приём уведомлений и ответы оператора из мессенджера |
Архитектура состоит из трёх компонентов. Виджет на сайте — JavaScript-чат без iframe и внешних зависимостей, подключается через WebSocket. Relay-сервер на FastAPI хранит сессии пользователей и маршрутизирует сообщения: в обычном режиме — в vLLM, при эскалации — в MAX. Третий компонент — MAX-бот, через который оператор ведёт переписку прямо из мессенджера. Выбор MAX вместо Telegram объясняется тем, что данные хранятся в российской юрисдикции, а API мессенджера поддерживает webhook и ответы от имени бота.
При эскалации оператор получает в MAX не историю переписки, а краткое резюме, сформированное моделью.
Главная техническая сложность оказалась не в подключении модели, а в сохранении непрерывности диалога при переключении каналов. Relay-сервер хранит маппинг session_id ↔ MAX chat_id, благодаря чему клиент видит один чат независимо от того, кто отвечает — модель или человек. Порог эскалации настраивается: он определяется количеством сообщений в диалоге, чтобы оператор подключался не слишком рано и не слишком поздно.
Ключевое отличие от стандартного «перевода на оператора» — автоматическое резюме. Когда клиент запрашивает живого человека, relay вызывает vLLM для суммаризации истории, и оператор получает в MAX не весь лог переписки, а готовый контекст: о чём спрашивал клиент, что уточнял, каким было последнее сообщение. Оператору не нужно перечитывать историю и переспрашивать клиента.
Система изначально рассчитана на несколько клиентов одновременно. Каждый бизнес получает отдельный MAX-бот с собственным токеном, уникальный webhook-endpoint и виджет, а также системный промпт до 10 000 символов — описание бизнеса, прайс, тон общения, режим работы. Модель также получает текущее московское время и может сообщить клиенту, доступен ли оператор прямо сейчас. Контекст диалога ограничен последними шестью сообщениями — по оценке разработчика, этого достаточно для большинства сценариев поддержки. Добавить нового клиента в систему можно одним API-запросом, в ответ на который возвращается готовый тег для вставки на сайт.
