/rlebe[dev].dev
Dialog Analyzer · внутренний продукт розничной сети

ИИ слушает все звонки. Оценку ставит код — и её можно проверить

Система разбирает записи разговоров менеджеров с клиентами: распознаёт речь с разделением по спикерам, оценивает диалог по методике руководителя и выставляет 2/3/4/5 по заданному правилу. Каждое обоснование подтверждается дословной цитатой из разговора — а если цитата выдумана, это видно сразу.

ЗАПИСЬ #418 · 07:12 · ДИАРИЗАЦИЯ: DEEPGRAM
МенеджерЗдравствуйте! Меня зовут Алина, слушаю вас.
КлиентЗдравствуйте, я по ковру, который у вас на витрине.
МенеджерА как я могу к вам обращаться? Скажите, ковёр для гостиной или для спальни?
КлиентМарат. Для гостиной, комната большая.
МенеджерМарат, тогда лучше посмотреть вживую — размер на глаз не подобрать.
client_name Менеджер уточнил имя и дальше обращался по имени дословно
appointment Предложил приехать в шоурум неточно
get_contact «Записал номер телефона клиента» не найдено
100%
звонков разобрано
4 + 2
провайдера речи и LLM
77%
цитат дословно в тексте
2/3/4/5
ставит код, не модель
Зачем это понадобилось

Руководитель слушает пять звонков из пятисот — и делает выводы обо всех

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

5 / 500

столько записей успевают послушать

Остальные лежат в архиве телефонии как страховка на случай спора и никакой пользы не приносят.

две оценки одного звонка не совпадают

Даже у одного эксперта — а у двух тем более. Без письменной методики «хорошо» у каждого своё.

?

ИИ-оценка без доказательств бесполезна

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

Как считается оценка

Модель делает только то, что умеет надёжно

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

модель

Распознаёт речь и оценивает пункты

Четыре провайдера транскрибации на выбор, три из них с разделением по спикерам. Дальше LLM выставляет баллы по каждому пункту методики, пишет комментарий и обязана привести цитату.

код

Считает веса и проценты

Нормализация балла по шкале пункта, взвешенная доля. Знаменатель — сумма весов применимых пунктов: разговор не штрафуется за то, чего в нём не могло быть.

код

Выставляет 2, 3, 4 или 5 по правилу

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

человек

Не согласен — оставляет заметку

Оператор указывает верный балл и почему. Заметка встаёт прямо под инструкцию своего пункта в промпте, и следующая оценка учитывает расхождение. Отключается галочкой, откатывается мгновенно.

Методика — это данные, а не код

Руководитель пишет правило словами. Один раз

«Не назначил встречу в шоуруме — тройка». Модель переводит эту фразу в структуру, человек сверяет разбор глазами и сохраняет. Дальше в оценке звонков модели уже нет — исполняется сохранённая структура.

2← провален ≥1 из: needs, get_contact, communication_quality
3← провален ≥1 из: presentation, fitting, objections, appointment
3← провалено ≥2 любых пунктов
4← провален ≥1 любой пункт
5← по умолчанию
Двойная проверка

Разбору модели не верят на слово

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

Версионирование

Правка весов не переписывает историю

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

Доверие к оценке

Каждая цитата сверяется с транскриптом. Без участия модели

Сопоставить строку с текстом — задача сравнения строк, а не рассуждения. Детерминированная сверка дешевле, воспроизводима и, в отличие от модели, не может нагаллюцинировать себе подтверждение.

38%проверка целой строкой
77%разбор по фрагментам
Модель часто кладёт в одно поле несколько цитат через точку с запятой. Проверка «одной строкой» считала такую склейку выдумкой. Разбор по фрагментам показал реальную картину: первое число было артефактом проверки.
По худшему

Одна выдуманная цитата портит всё обоснование

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

Подсветка

От обоснования — к месту в разговоре

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

Задним числом

Работает и для старых записей

Результат считается на лету из транскрипта и не хранится в базе — значит, сверка применилась ко всему архиву, оценённому до её появления.

В отчёте

Видно и в карточке, и в Excel

Бейдж у каждой цитаты, сводка «подтверждено N из M» в карточке разговора и отдельная колонка в выгрузке. Метрика доверия к оценке, за которой можно следить как за показателем.

Чат-агент

«У кого из менеджеров худшие показатели и почему»

Здесь агент оправдан: заранее неизвестно, сколько записей и каких придётся прочитать. Реализация — LangGraph поверх ChatOpenAI, десять инструментов над теми же данными, что видит интерфейс.

Только чтение

Агент предлагает, решает человек

Все инструменты read-only. Правка методики и настроек остаётся за людьми — агент может лишь показать, что стоит поменять и почему.

Границы

Агенту запрещено считать оценку самому

Итог разговора — поле из карточки, и только оно. Именно на этом расхождении система однажды и поймалась: карточка показывала 4.18, а агент, прочитавший текст методики, называл 3.

Секреты

Ключи API агент не видит

Инструмент настроек отдаёт «задан / не задан» вместо значения: попав в историю диалога, ключ уезжал бы к провайдеру модели с каждым следующим сообщением.

Контекст

Длинный разговор не съедает окно

Транскрипт отдаётся фрагментами по 6000 символов со смещением, число шагов ограничено. Ошибки провайдера переводятся в человеческие формулировки, сырой ответ API в чат не попадает.

Контур и стек

Один контейнер на своём сервере. Данные никуда не расползаются

Ни базы рядом, ни очереди, ни воркеров: состояние в SQLite, фоновая обработка — asyncio-задачи в том же процессе. Всё, что требует моделей, вынесено к облачным провайдерам по HTTPS; аудио, транскрипты, оценки и ключи заказчика остаются на его машине.

Приложение
Python 3.12Flet / Material 3asyncioSQLite + aiosqliteDocker
Речь
DeepgramGladiaYandex SpeechKitGroq Whisperffmpeg
Оценка
OpenAIPerplexity Sonarjson_schemaLangGraph
Отчёты
openpyxlflet-chartsflet-audioPyInstaller (.exe)
Два режима, один код

Веб на сервере и .exe на столе

Тот же пакет собирается в десктопное приложение через flet pack. Различий ровно три: загрузка файла, плеер и выгрузка Excel — всё остальное общее.

Совместимость

Три поколения формата оценки читаются

Архив, накопленный до перехода на настраиваемые методики, не потерян: поле версии схемы позволяет различить форматы, которые внешне выглядят одинаково.

Устойчивость

Ошибка на любом шаге не роняет приложение

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

Пороги достоверности

Цифра не показывается, пока она не факт

Динамика — только от шести разговоров, «слабое место» — если пункт встречался хотя бы в трёх, мини-график — от четырёх точек. Изменение меньше ±0.15 подписывается как «без изменений», а не как рост.

Дальше

У вас записываются звонки. Их кто-нибудь слушает?

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

Пилот на вашем архивеБерём сотню реальных записей и показываем, что система в них видит.
Методика под вашу воронкуПункты, шкалы, веса и правило итоговой оценки — под ваш скрипт продаж.
Внедрение и передачаСвой сервер или десктоп, документация и обучение тех, кто будет с этим работать.
Обсудить проект →