Sales Calls Analytics Dashboard
Ситуация
ИИ-обзвон — это воронка: приветствие → оффер → встреча → квалификация. Прод-выгрузка хранит звонки, но не говорит, на каком шаге бот теряет клиента. Задача — превратить сырую выгрузку в ответ за минуту: где обрыв, по каким причинам, когда звонить и что чинить — скрипт, тайминг или качество самого бота.
Задача
От меня требовалось снять разбор звонков с ручного просмотра: сравнить шаги воронки между собой и показать, на каком из них теряется больше всего клиентов.
Действия
Что показывает дашборд
| Блок | Что отвечает |
|---|---|
| KPI + воронка | общая картина и где главный обрыв |
| Разбор шага 1 | главная утечка по типам: молчание / сброс / отказ |
| Куда направить усилия | переходы по взвешенной потере контактов |
| Реакции клиентов | что чинить в скрипте по вовлечённому хвосту |
| Когда звонить | вовлечённость по часам и дням недели |
| Качество бота | готовые дефекты: баг отрасли, зацикливание, dead air |
| Разбор диалогов | фильтр среза + транскрипты обрывов |
Методология разметки
Скрипт бота шаблонный, поэтому шаг, до которого дошёл разговор, определяется детерминированно по маркерам в репликах бота:
- 1 — приветствие + согласие;
- 2 — оффер;
- 3 — встреча;
- 4 — квалификация.
Причина обрыва на шаге 1 и тип реакции клиента — эвристики по тексту. LLM в пайплайне не используется (всё воспроизводимо), но если рядом положить llm_labels.csv с колонками phone, dt_raw, <метки>, они подмешаются автоматически — разметку реакций можно усилить через LLM.
Данные
Датасет data/calls_demo.csv — полностью синтетический: генерируется скриптом make_demo_data.py, детерминирован по фиксированному SEED и не содержит ни одного реального телефона, имени или записи разговора. Цифры воспроизводят форму типичной прод-выгрузки (воронка, дефекты, распределение по часам), чтобы дашборд рассказывал реалистичную историю на безопасных данных.
Запуск
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/streamlit run app.py
Результат
Дашборд даёт ответ за минуту: на каком шаге бот теряет клиента и что чинить. Разметка детерминированная и воспроизводимая, без LLM в критическом пути, поэтому числа можно перепроверить. Из воронки выходит точка роста — взвешенная потеря контактов и первый A/B-сценарий.
Ограничения
Датасет синтетический, а разметка шага — по маркерам шаблонного скрипта: на живом боте с более свободными репликами эвристики придётся пересматривать. Ценность карточки — в методе разбора выгрузки на безопасных данных, а не в конкретных значениях воронки.