На главную

Кейс · 01

Advisor Bot — внутренний советник для коммерческого директора

Срок 7 дней до прода
Стек Python · aiogram · Gemini
Тип B2B · Multi-agent AI
Статус Доступен 24/7

Overview

Утро коммерческого директора с двумя бизнесами в подчинении: 30 мелких согласований в очереди, мессенджер съедает первые два часа дня. Этот бот забирает поток на себя, и до руководителя доходят только сложные кейсы — уже с готовым предварительным анализом.

Внедрён в B2B-компании, которая параллельно ведёт два бизнеса: Alvatto — кофемашины и кофе под собственной торговой маркой, и Winrace — маркетплейс товаров для спорта и активного отдыха. На каждый сложный вопрос система смотрит с пяти разных профессиональных углов одновременно — глазами коммерсанта, финансиста, юриста, маркетолога и риск-менеджера — и сводит их выводы в один связный ответ от первого лица.

Context

Заказчик — компания, у которой за одним коммерческим директором закреплены сразу два направления.

У каждого бизнеса своя специфика, свои правила работы с клиентом, своя матрица скидок и свой риск-профиль. Команда у директора смешанная: часть людей работает только по Alvatto, часть — только по Winrace, часть — по обоим.

Problem

День директора уходил на десятки мелких согласований: можно ли клиенту X дать скидку 5%, отгрузить ли с отсрочкой две недели, как ответить на жалобу в отзыве, повторять ли июньскую акцию в сентябре. Половина таких вопросов — стандартные ситуации, на которые в компании уже сложился внятный ответ.

Но подчинённые не решались действовать без подтверждения сверху, а директор не успевал заниматься главным — стратегией, переговорами, новыми продуктами. Каждое утро очередь из мессенджера съедала первые два-три часа, а к вечеру догоняла снова.

«Подчинённые тащат ко мне тридцать мелких согласований в день. У половины есть очевидный ответ — но без меня никто не примет решение.»

Триггер момента

Параллельный запуск Winrace вторым бизнесом удвоил поток согласований у одного человека: к привычной нагрузке Alvatto добавилась незнакомая специфика маркетплейса. В новых обстоятельствах подчинённые стали выстраивать бесконечную очередь у двери директора. Рабочие дни были поглощены согласованиями от начала и до конца.

Constraints

На входе у нас было четыре жёстких ограничения, и они во многом определили форму решения.

  1. 01
    Бесплатный тариф Gemini. 250 запросов в сутки на старшую модель Flash и 1000 на младшую Flash-Lite. Любое решение, которое раздувает число вызовов, упирается в потолок.
  2. 02
    Одна система — два бизнеса. Alvatto и Winrace с разными правилами; универсальный «средний по больнице» ответ ни одной из сторон не годится.
  3. 03
    Не сжигать квоту на пустых вопросах. «Можно ли дать скидку?» без объёма, клиента и причины — бот не должен запускать пятёрку экспертов на догадках.
  4. 04
    Graceful degradation. На пиках Gemini периодически отдаёт 503 — это норма для бесплатного тарифа, но «бот лежит» — не норма.

Solution

Решение получилось многослойным, но логика у всех слоёв одна: тратить дорогие вызовы модели только там, где они реально нужны.

Мульти-модельная стратегия

Классификатор и финальный синтезатор обслуживает старшая Gemini Flash: там важнее качество. На пятёрку экспертных ролей работает младшая Flash-Lite: там важнее массовость и скорость, а суточный лимит у неё в четыре раза больше.

Классификатор с обязательным контекстом

Перед запуском пятёрки работает классификатор. Он определяет тип вопроса, бизнес и проверяет четыре обязательных пункта: объём сделки, конкретный клиент, география, причина запроса. Если какой-то отсутствует — бот сначала задаёт уточняющий вопрос и только потом тратит квоту на полный анализ.

Пятёрка экспертов параллельно

Пять параллельных вызовов модели через asyncio.gather. Коммерческий менеджер, финансовый аналитик, юрист, маркетолог и риск-менеджер получают свой системный промпт и только тот контекст, который относится к делу. Все возвращают строгий JSON — это даёт работать с ответами как с данными, а не как со свободным текстом.

Синтезатор и эскалация

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

Graceful degradation на трёх уровнях

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

Сравнение подходов

Один LLM vs мульти-агент

Наивный подход

Один LLM

  • Один промпт, один ответ
  • «Средний по больнице» — без специфики бизнеса
  • На пустом контексте сжигает квоту впустую
  • Падение API = бот молчит
Наш подход

Мульти-агент

  • +5 углов зрения параллельно — каждый со своим промптом
  • +Синтез в один связный ответ от первого лица
  • +Различает Alvatto и Winrace по бизнес-правилам
  • +Graceful degradation — частичный отказ ≠ молчание

Tradeoffs

Часть вещей мы намеренно не делали — потому что они на текущем объёме не окупались.

  • Не подключали векторную БД. Бизнес-контекст обоих направлений умещается в системные промпты.
  • Не делали отдельный веб-интерфейс. И сотрудники, и директор живут в Telegram — параллельная админка означала бы переключение контекста.
  • SQLite вместо PostgreSQL на старте. Для текущей нагрузки хватает; миграция заложена через SQLAlchemy без переписывания логики.

Results

Главные результаты — в инженерных свойствах системы.

  • Бесплатный тариф Gemini Flash-Lite берёт массовую часть нагрузки, Flash работает только в узких местах, где важно качество.
  • 7 LLM-агентов в одной системе пять экспертов + классификатор + синтезатор. Координируются через параллельные вызовы с таймаутами.
  • 3 уровня graceful degradation переживают частичные сбои без полной остановки — отказ экспертов / синтезатора / всей системы.
  • 3 режима в проде справочный fast-path, полный мультиагент, эскалация директору с тремя кнопками — без необходимости печатать ответ с нуля.

Пример оповещения директора об эскалации.

Согласования директора
приватный канал · только вы и бот
Advisor Bot
требует согласования
Сотрудник: Максим Беляков — менеджер по работе с клиентами, Alvatto

Вопрос:

Клиент просит вернуть деньги за кофемашину Alvatto Pro 1500 (12 990 ₽), купленную 4 месяца назад на сайте. Жалоба: «капучинатор плохо вспенивает молоко». Машина включается, кофе варит, поломки как таковой нет. Чек и гарантийный талон у клиента есть, прислал письменную претензию на e-mail. Что делаем?

Ответ бота:

По формальной части возврат не положен, но кейс на грани — клиент уже в письменной претензии, может пойти дальше.

Юрист: кофемашина — технически сложный товар (Постановление № 924). После 15 дней возврат денег возможен только при существенном недостатке. У нас — потребительские претензии к одной функции, не блокирующий дефект.
Риск-менеджер: если клиент пойдёт в Роспотребнадзор или суд — суд скорее на нашей стороне, но прецедент в открытом доступе и негативные отзывы по делу.
Коммерсант: рекомендация — предложить замену капучинатора по гарантии или скидку 30% на следующую покупку. Сохраняем клиента, гасим эскалацию.

Демо-макет. Имена, цифры и ситуации вымышлены и не отражают реальных сотрудников и кейсов заказчика.

«Очень доволен ботом. Сотрудник получает короткий ответ по делу, а ко мне приходит только то, что реально требует решения, и сразу с контекстом: объём, клиент, регион, оценка. Раньше я по два часа в день тратил на разговоры с командой "а сколько штук?", "а кто клиент?", сейчас уходит минут пятнадцать и никто не бегает в мой кабинет каждые 3 минуты.»

— коммерческий директор B2B-компании с двумя бизнесами в портфеле, Alvatto и Winrace

Tech stack

LLM и AI — какие модели работают и как координируются

Gemini 2.5 Flash (классификатор и синтезатор) и Gemini 2.5 Flash-Lite (пять экспертов) в связке. Структурированный JSON-вывод через Pydantic. Абстракция LLMProvider с реализациями GeminiProvider, ClaudeProvider, OllamaProvider — переключение в конфиге, без правки бизнес-кода.

Backend — что обслуживает aiogram, базу и параллельные вызовы

Python 3.11+, aiogram v3.27+ с FSM. SQLAlchemy 2.x async поверх aiosqlite, миграция на PostgreSQL заложена. asyncio.gather + asyncio.wait_for — параллельные вызовы пятёрки с таймаутами. tenacity для повторов на сетевых сбоях и 5xx. httpx в async-режиме.

DevOps и ops — как живёт в проде 24/7

Ubuntu 22.04 на VPS в Нидерландах. systemd-юнит для автозапуска и перезапуска при падении. Ротация логов. 24/7 в проде с момента деплоя.