Один LLM
- —Один промпт, один ответ
- —«Средний по больнице» — без специфики бизнеса
- —На пустом контексте сжигает квоту впустую
- —Падение API = бот молчит
Кейс · 01
Overview
Утро коммерческого директора с двумя бизнесами в подчинении: 30 мелких согласований в очереди, мессенджер съедает первые два часа дня. Этот бот забирает поток на себя, и до руководителя доходят только сложные кейсы — уже с готовым предварительным анализом.
Внедрён в B2B-компании, которая параллельно ведёт два бизнеса: Alvatto — кофемашины и кофе под собственной торговой маркой, и Winrace — маркетплейс товаров для спорта и активного отдыха. На каждый сложный вопрос система смотрит с пяти разных профессиональных углов одновременно — глазами коммерсанта, финансиста, юриста, маркетолога и риск-менеджера — и сводит их выводы в один связный ответ от первого лица.
Context
Заказчик — компания, у которой за одним коммерческим директором закреплены сразу два направления.
У каждого бизнеса своя специфика, свои правила работы с клиентом, своя матрица скидок и свой риск-профиль. Команда у директора смешанная: часть людей работает только по Alvatto, часть — только по Winrace, часть — по обоим.
Problem
День директора уходил на десятки мелких согласований: можно ли клиенту X дать скидку 5%, отгрузить ли с отсрочкой две недели, как ответить на жалобу в отзыве, повторять ли июньскую акцию в сентябре. Половина таких вопросов — стандартные ситуации, на которые в компании уже сложился внятный ответ.
Но подчинённые не решались действовать без подтверждения сверху, а директор не успевал заниматься главным — стратегией, переговорами, новыми продуктами. Каждое утро очередь из мессенджера съедала первые два-три часа, а к вечеру догоняла снова.
«Подчинённые тащат ко мне тридцать мелких согласований в день. У половины есть очевидный ответ — но без меня никто не примет решение.»
Триггер момента
Параллельный запуск Winrace вторым бизнесом удвоил поток согласований у одного человека: к привычной нагрузке Alvatto добавилась незнакомая специфика маркетплейса. В новых обстоятельствах подчинённые стали выстраивать бесконечную очередь у двери директора. Рабочие дни были поглощены согласованиями от начала и до конца.
Constraints
На входе у нас было четыре жёстких ограничения, и они во многом определили форму решения.
Solution
Решение получилось многослойным, но логика у всех слоёв одна: тратить дорогие вызовы модели только там, где они реально нужны.
Классификатор и финальный синтезатор обслуживает старшая Gemini Flash: там важнее качество. На пятёрку экспертных ролей работает младшая Flash-Lite: там важнее массовость и скорость, а суточный лимит у неё в четыре раза больше.
Перед запуском пятёрки работает классификатор. Он определяет тип вопроса, бизнес и проверяет четыре обязательных пункта: объём сделки, конкретный клиент, география, причина запроса. Если какой-то отсутствует — бот сначала задаёт уточняющий вопрос и только потом тратит квоту на полный анализ.
Пять параллельных вызовов модели через asyncio.gather. Коммерческий менеджер, финансовый аналитик, юрист, маркетолог и риск-менеджер получают свой системный промпт и только тот контекст, который относится к делу. Все возвращают строгий JSON — это даёт работать с ответами как с данными, а не как со свободным текстом.
Синтезатор читает все пять JSON-ответов и формулирует одно решение от первого лица — без «эксперты сходятся во мнении». Если нужен директор, синтезатор сам помечает ответ флагом эскалации, и тот уходит в приватный канал директору с тремя кнопками: одобрить, не одобрить, написать свой ответ.
Если часть экспертов не уложилась в таймаут — синтезатор работает с теми, кто успел. Если упал сам синтезатор — система отдаёт ответ самого уверенного из доступных экспертов. Если упало всё — пользователь получает понятную ошибку, а не молчание.
Сравнение подходов
Tradeoffs
Часть вещей мы намеренно не делали — потому что они на текущем объёме не окупались.
Results
Главные результаты — в инженерных свойствах системы.
Пример оповещения директора об эскалации.
Демо-макет. Имена, цифры и ситуации вымышлены и не отражают реальных сотрудников и кейсов заказчика.
«Очень доволен ботом. Сотрудник получает короткий ответ по делу, а ко мне приходит только то, что реально требует решения, и сразу с контекстом: объём, клиент, регион, оценка. Раньше я по два часа в день тратил на разговоры с командой "а сколько штук?", "а кто клиент?", сейчас уходит минут пятнадцать и никто не бегает в мой кабинет каждые 3 минуты.»
Tech stack
Gemini 2.5 Flash (классификатор и синтезатор) и Gemini 2.5 Flash-Lite (пять экспертов) в связке. Структурированный JSON-вывод через Pydantic. Абстракция LLMProvider с реализациями GeminiProvider, ClaudeProvider, OllamaProvider — переключение в конфиге, без правки бизнес-кода.
Python 3.11+, aiogram v3.27+ с FSM. SQLAlchemy 2.x async поверх aiosqlite, миграция на PostgreSQL заложена. asyncio.gather + asyncio.wait_for — параллельные вызовы пятёрки с таймаутами. tenacity для повторов на сетевых сбоях и 5xx. httpx в async-режиме.
Ubuntu 22.04 на VPS в Нидерландах. systemd-юнит для автозапуска и перезапуска при падении. Ротация логов. 24/7 в проде с момента деплоя.