Привет! На связи Маша Иванова — старший аналитик в команде монетизации и Азамат Эмирбеков — старший BI-разработчик. Мы помогаем коллегам в командах Авито Недвижимости и Авто — собираем аналитические данные.
Заметили, что менеджеры тратят много времени на создание презентаций для встреч с клиентами. Мы решили, что можем ускорить процесс с помощью автоматизации, и разработали бота, который быстро находит данные, а затем формирует готовые слайды. Расскажем, какие презентации создавали коллеги, почему это занимало много времени и как мы, не применяя ИИ, справились с этой проблемой при помощи бота.
Статья будет полезна аналитикам и менеджерам, которым нужно автоматизировать работу.
В этой статье:
• Почему менеджеры подолгу собирали презентации
• Бонус: подсказки, как запустить бота у себя
Почему менеджеры подолгу собирали презентации
Команды Недвижимости и Авто показывают продавцам возможности Авито и рассказывают об услугах. Это помогает продавцам определиться, нужно ли им подключить какой-то сервис, чтобы получать больше откликов от покупателей.
Чтобы доказать эффективность услуги, надо подтвердить её цифрами — показать, как продукт уже повлиял на результаты других продавцов. Эти цифры нужно найти и добавить в презентацию. Именно поиск занимал бо́льшую часть времени.
Ещё мы заметили, что менеджеры делают скриншоты с данными, вместо того, чтобы вбивать цифры в новые таблицы. Это неудивительно, поскольку переносить данные вручную долго. Решили разобраться и с этой проблемой тоже.
В итоге выделили три конкретные причины, почему всё пора модернизировать.
1. Долго искать цифры. Менеджеры собирают информацию в Redash. Это платформа, в которой хранится бизнес-аналитика, нужная для презентаций. Источник полный, но сбор всей информации может занять длительное время.

2. Нет единообразного стиля для презентаций. Проблема связана с тем, что корпоративный шаблон не подходил для этого вида презентаций. Каждый документ менеджеры разрабатывают с нуля: продумывают расположение блоков, текста и иллюстраций. Создают слайды на свой вкус, поэтому структуры у всех различаются.

3. Клиентам сложно воспринимать информацию. Менеджеры добавляют в презентации скриншоты из дашбордов и гугл-доков. Это максимально быстрый способ собрать документ. Поскольку встреч много и для каждой нужна по презентация, метод значительно экономил время. Проблема была в том, что такие картинки не очень хорошо читались, выглядели разнородно и не слишком аккуратно.

Чтобы сразу решить все проблемы, мы решили разработать новый продукт, который будет создавать презентации автоматически.
Как работает новое решение
Бота собрали на платформе Paas для нашего внутреннего мессенджера. Мы не использовали нейросети или другие ИИ, хватило обычного кода. Всё работает так: менеджер пишет в чат команду, а бот собирает данные, делает необходимые расчёты, строит графики и выдаёт готовый документ.

Менеджерам не надо искать информацию вручную, думать над структурой слайдов, их количеством и расположением элементов на страницах. Презентации формируются быстро, содержат актуальные данные и выглядят единообразно.

Бот работает асинхронно, это значит, что создавать презентации могут одновременно несколько менеджеров. Процесс происходит в четыре шага после настройки:
0 этап. Настройка бота. Параметры зависят от того мессенджера, в котором будет работать решение. В нашем случае это Mattermost.
1 этап. Парсинг входящих параметров (parser.py). Бот обрабатывает текстовое сообщение от менеджера. Команду можно напечатать на естественном языке или в формате JSON. В запросе может быть регион, периоды и другие данные. Правила обработки настраивает аналитик с помощью регулярных выражений. Это происходит в тот момент, когда он добавляет бота в свою команду.
JSON (JavaScript Object Notation) — это текстовый формат для хранения и передачи структурированных данных в понятном для человека и компьютера виде.
Пример данных о человеке в формате JSON:
{ "firstName": "Иван", "lastName": "Петров", "age": 30, "isEmployed": true, "address": { "city": "Москва", "street": "Ленина", "house": 15 }, "hobbies": ["чтение", "путешествия", "программирование"] }
2 этап. Логика обработки сообщений от пользователей (plugin.py). Скрипт проверяет, в какой команде работает менеджер и отправляет запрос на формирование подходящей презентации. Здесь также реализована диалоговая логика бота — возможность общаться с ним в мессенджере.
3 этап. Формирование слайдов (slides). Это происходит на основе библиотеки python-pptx: бот проводит необходимые расчёты, строит графики, таблицы и размещает всё на слайдах. Вся аналитическая логика настраивается индивидуально для конкретной команды менеджеров. В результате на следующем этапе модуль function_slide.py возвращает готовый объект слайда.
4 этап — Формирование презентации (presentation.py). Это делает скрипт: собирает массив из слайдов, которые мы получили на предыдущем этапе, и отдаёт пользователю через plugin.py.
Все презентации, скрипты и иллюстрации хранятся в отдельных папках для каждой команды. Это позволяет разделять наборы правил для разных команд и уменьшает количество ошибок.

Что изменилось в работе
Стали создавать презентации быстрее. В команде Недвижимости удалось ускорить процесс примерно в четыре раза. Раньше менеджеры могли тратить более 20 минут на создание одной презентации, теперь процесс занимает около пяти минут. В это время сотрудник успевает написать запрос, а бот обрабатывает информацию и выгружает в чат готовый документ.
В команде Авто цифры схожие. Для части менеджеров время на создание презентации сократилось с 30 до 5–7 минут. Однако пока существуют и более сложные презентации, где нужно дополнительно собирать информацию, чтобы подготовить слайды.
Сделали доступ к генератору презентаций через чат. Чтобы собрать документ, нужно отправить в бот текстовое сообщение. Ряд параметров приходится вводить в формате JSON из-за специфики некоторых данных и расчётов. Не все менеджеры знакомы с JSON, поэтому в будущем планируем модернизировать решение, чтобы бот понимал естественный язык на 100%.
Бонус: подсказки, как запустить бота у себя
Чтобы внедрить минимально работающее решение, понадобятся две библиотеки:
для работы с ботом. Например, мы используем mmpy-bot 2.2.1;
для работы с презентациями. У нас стандартное решение на пайтоне.
Для начала необходимо создать точку входа для работы с ботом, которая определяет настройки бота. Это делается так:
#!/usr/bin/env python from mmpy_bot import Bot, Settings from my_plugin import MyPlugin bot = Bot( settings=Settings( MATTERMOST_URL = "http://chat.example.com", MATTERMOST_PORT = 443, BOT_TOKEN = "a69155mvlsobcnqpfdceqihaa", BOT_TEAM = "test", SSL_VERIFY = True, ), # Either specify your settings here or as environment variables. plugins=[PresentationPlugin()], # Плагин презентации ) bot.run()
Далее необходимо создать файл my_plugin.py — это скрипт, в котором указана логика для работы бота и взаимодействия с пользователем. Вот какие правила нужно прописать в скрипте:
условия для принятия запросов от пользователей;
логику ответов бота;
правила для выдачи презентации;
логику параллельной обработки.
Вот как может выглядеть скрипт:
class PresentationPlugin(Plugin): #.......... # Здесь код контроля состояния пользователя и функции подсказок для него #.......... ######## # Листенер, который ловит НАЗВАНИЕ КОМАНДЫ на любом этапе и перезапускает сценарий. @listen_to(r"^(?:your_team_1|your_team_2|your_team_3)$", re.IGNORECASE, direct_only=True) async def receive_team_name(self, message: Message): self._start_flow_with_team(message, message.text) # Универсальный листенер на любой текст # После указания команды - принимаем данные для презентации и парсим их в словарь и отправляем запрос на создание презентации @listen_to(r"^.+$", re.IGNORECASE, direct_only=True) async def receive_name(self, message: Message): user_id = message.user_id state = self.get_current_state(user_id) text = (message.text or "").strip() # Если мы ещё на шаге 0 (самый старт) и пришло не название команды — даём инфо (правило 1) if state['current_step'] == 0: if is_team_name(text): return else: self.prompt_team_choice(message) return # На шаге 1 ждём параметры. Подсказываем следующий шаг, если формат не тот. if state['current_step'] == 1: # Если пользователь прислал НАЗВАНИЕ КОМАНДЫ здесь — перезапускаем (правило 2) if is_team_name(text): return team_name = state['team_name'] try: data, presentation_name = parse_message(text, team_name) state['data'] = data self.driver.reply_to(message, "Начинаю генерацию презентации...") prs = DefaultPresentationGenerator(data=data, team_name=team_name) tasks = await asyncio.gather(asyncio.to_thread(prs.create_presentation)) file_name = f"{presentation_name}.pptx" presentation = tasks[0] presentation.save(file_name) except ValueError: # Неверный формат параметров — подскажем и покажем шаблон (правило 3) self.prompt_next_step(message, state) return except Exception as e: logger.error(e) self.driver.reply_to(message, ERROR_TEXT) return else: self.driver.reply_to( message, "Презентация готова! Отправляю файл", file_paths=[file_name], ) # После успешной генерации очищаем состояние self.reset_user_state(user_id) return
Далее необходимо заполнить функцию парсинга запроса пользователей parse_message. Что именно нужно прописать — зависит от ваших потребностей.
Последним действием настраиваем шаблон вашей презентации Default Presentation Generator.
Вся статья кратко
👉 Раньше у менеджеров уходило несколько часов в неделю на то, чтобы создать презентации для встреч с клиентами. Теперь они могут сделать это значительно быстрее.
👉 Мы собрали бота, который в несколько этапов формирует презентации. Сначала он собирает входящие параметры пользователя, а затем запрашивает данные и создаёт документ.
👉 Наш бот собирает информацию с помощью DWH-экспорта, но вы можете использовать другой метод, который подойдёт для вашей базы данных.

Больше недушной аналитики, кейсов, историй и внутрянки Авито ищите в Телеграм-канале «Коммуналка аналитиков». Присоединяйтесь 🤗
