ИИ слушает все звонки. Оценку ставит код — и её можно проверить
Система разбирает записи разговоров менеджеров с клиентами: распознаёт речь с разделением по спикерам, оценивает диалог по методике руководителя и выставляет 2/3/4/5 по заданному правилу. Каждое обоснование подтверждается дословной цитатой из разговора — а если цитата выдумана, это видно сразу.
Руководитель слушает пять звонков из пятисот — и делает выводы обо всех
Прослушать весь поток невозможно физически, поэтому выборку берут наугад, а разговор оценивают по памяти. Менеджер узнаёт о проблеме через месяц на разборе, а не в тот день, когда потерял клиента.
столько записей успевают послушать
Остальные лежат в архиве телефонии как страховка на случай спора и никакой пользы не приносят.
две оценки одного звонка не совпадают
Даже у одного эксперта — а у двух тем более. Без письменной методики «хорошо» у каждого своё.
ИИ-оценка без доказательств бесполезна
Модель убедительно объяснит любой балл и при этом сошлётся на фразу, которой в разговоре не было. Такой отчёт нельзя показать менеджеру.
Модель делает только то, что умеет надёжно
Главное архитектурное решение проекта: LLM оценивает пункты методики, а итоговую оценку звонка считает код. Иначе один и тот же разговор давал бы разный результат при повторных прогонах — а от этих оценок зависят решения о живых людях.
Распознаёт речь и оценивает пункты
Четыре провайдера транскрибации на выбор, три из них с разделением по спикерам. Дальше LLM выставляет баллы по каждому пункту методики, пишет комментарий и обязана привести цитату.
Считает веса и проценты
Нормализация балла по шкале пункта, взвешенная доля. Знаменатель — сумма весов применимых пунктов: разговор не штрафуется за то, чего в нём не могло быть.
Выставляет 2, 3, 4 или 5 по правилу
Правило исполняется структурой, а не текстом. Строки проверяются по возрастанию оценки, поэтому одна не может незаметно перекрыть другую — этот класс ошибок в правиле просто не возникает.
Не согласен — оставляет заметку
Оператор указывает верный балл и почему. Заметка встаёт прямо под инструкцию своего пункта в промпте, и следующая оценка учитывает расхождение. Отключается галочкой, откатывается мгновенно.
Руководитель пишет правило словами. Один раз
«Не назначил встречу в шоуруме — тройка». Модель переводит эту фразу в структуру, человек сверяет разбор глазами и сохраняет. Дальше в оценке звонков модели уже нет — исполняется сохранённая структура.
Разбору модели не верят на слово
Модель ищет в тексте требования, которым не соответствует ни один пункт, и решения, принятые за автора — всегда с цитатой. Код ищет ссылки на несуществующие пункты, недостижимые и перекрытые строки, оценки вне диапазона. На живом разборе модель предложила бесполезную строку-перехватчик — поймал её код.
Правка весов не переписывает историю
Сохранение методики создаёт новую версию, прежняя остаётся вместе с оценёнными по ней записями. Статистика считается в разрезе одной версии: усреднять оценки по разным шкалам — значит складывать разное.
Каждая цитата сверяется с транскриптом. Без участия модели
Сопоставить строку с текстом — задача сравнения строк, а не рассуждения. Детерминированная сверка дешевле, воспроизводима и, в отличие от модели, не может нагаллюцинировать себе подтверждение.
Одна выдуманная цитата портит всё обоснование
Составная цитата проверяется по фрагментам, а итог берётся по худшему из них. Фрагменты короче трёх слов отбрасываются — совпадение по паре служебных слов нашлось бы в любом разговоре.
От обоснования — к месту в разговоре
Сверка запоминает границы фрагмента в символах, поэтому от оценки пункта можно перейти к реплике и обратно. Слабые совпадения не якорятся вовсе: показать пальцем на случайный кусок хуже, чем честно сказать «не найдено».
Работает и для старых записей
Результат считается на лету из транскрипта и не хранится в базе — значит, сверка применилась ко всему архиву, оценённому до её появления.
Видно и в карточке, и в Excel
Бейдж у каждой цитаты, сводка «подтверждено N из M» в карточке разговора и отдельная колонка в выгрузке. Метрика доверия к оценке, за которой можно следить как за показателем.
«У кого из менеджеров худшие показатели и почему»
Здесь агент оправдан: заранее неизвестно, сколько записей и каких придётся прочитать. Реализация — LangGraph поверх ChatOpenAI, десять инструментов над теми же данными, что видит интерфейс.
Агент предлагает, решает человек
Все инструменты read-only. Правка методики и настроек остаётся за людьми — агент может лишь показать, что стоит поменять и почему.
Агенту запрещено считать оценку самому
Итог разговора — поле из карточки, и только оно. Именно на этом расхождении система однажды и поймалась: карточка показывала 4.18, а агент, прочитавший текст методики, называл 3.
Ключи API агент не видит
Инструмент настроек отдаёт «задан / не задан» вместо значения: попав в историю диалога, ключ уезжал бы к провайдеру модели с каждым следующим сообщением.
Длинный разговор не съедает окно
Транскрипт отдаётся фрагментами по 6000 символов со смещением, число шагов ограничено. Ошибки провайдера переводятся в человеческие формулировки, сырой ответ API в чат не попадает.
Один контейнер на своём сервере. Данные никуда не расползаются
Ни базы рядом, ни очереди, ни воркеров: состояние в SQLite, фоновая обработка — asyncio-задачи в том же процессе. Всё, что требует моделей, вынесено к облачным провайдерам по HTTPS; аудио, транскрипты, оценки и ключи заказчика остаются на его машине.
Веб на сервере и .exe на столе
Тот же пакет собирается в десктопное приложение через flet pack. Различий ровно три: загрузка файла, плеер и выгрузка Excel — всё остальное общее.
Три поколения формата оценки читаются
Архив, накопленный до перехода на настраиваемые методики, не потерян: поле версии схемы позволяет различить форматы, которые внешне выглядят одинаково.
Ошибка на любом шаге не роняет приложение
Запись переходит в статус «ошибка» с сохранённым текстом причины, остальные продолжают обрабатываться. Нет ключа — понятное сообщение с просьбой указать его в настройках, а не трассировка стека.
Цифра не показывается, пока она не факт
Динамика — только от шести разговоров, «слабое место» — если пункт встречался хотя бы в трёх, мини-график — от четырёх точек. Изменение меньше ±0.15 подписывается как «без изменений», а не как рост.
У вас записываются звонки. Их кто-нибудь слушает?
Продажи, поддержка, приём заявок — везде, где разговор решает деньги, архив телефонии можно превратить в измеримое качество работы команды. Методика ваша, критерии ваши, данные остаются на вашем сервере.
Похожие задачи в других отраслях
Витрина в Telegram
Магазин подключается тремя токенами и получает витрину прямо в мессенджере.
смотреть кейс → B2B · e-commerceКаталог измерительной техники
Фасетный поиск с умным сужением, коммерческие предложения с печатью в PDF.
смотреть кейс → Финансы · виджетУправленческая отчётность для МойСклад
ОПиУ, движение денег и управленческий баланс из живых данных учётной системы.
смотреть кейс →