spec / applied-ai
ru en
открыт к предложениям
Senior / Lead Applied AI · удалённо · UTC+3

LLM systems
for revenue
и аналитика

Дмитрий Пром · AI Engineer & Data Analyst (LLM-based analytics)

$ разговор → транскрипт → оценка → структурированные данные → решение

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

удалённо UTC+3 5 лет в разработке, 2 в AI рассматриваю зарубеж RU / EN

пример трассировки · синтетические данные путь одного разговора
00.118sttтранскрипт, разделение говорящих
00.402filterотбор по длительности и содержанию
00.688retrieveрегламент и карточка клиента в контекст
00.977checksкритерии чек-листа, схема ответа
01.240summaryполя и детекторы саммари
01.361evalсверка с golden set, гейты релиза
01.640deliverCRM, BI и отчёт заказчику
sttбизнес-правила оркестрация llm evalsrag голосовые агенты crm / bi

Это схема, а не мониторинг: шаги показывают порядок обработки. Значения на странице не приходят из живой системы.

§01 / масштаб

Production-системы на реальных коммерческих процессах

каждая цифра приходит со знаменателем

90

production-пайплайнов обрабатывают поток без участия человека

знаменатель — сценарии, переведённые в автоматическую обработку

100%

подходящих диалогов оценивается вместо ≤20% ручной выборки

знаменатель — диалоги, прошедшие фильтр длительности и содержания

98%

совпадение решений AI и экспертов

знаменатель — 500 сделок замороженного golden set

−88%

стоимость ключевого LLM-сценария на 1 000 сделок

при неизменных схеме ответа, бенчмарке и гейтах качества

464

критерия чек-листов

246

полей и детекторов саммари

55 / 32

активных чек-листов и конфигураций саммари

≥ 1 млн ₽

экономии на контакт-центре в месяц · детали по запросу

§02 / слой измерений

Как считаются ключевые метрики

выборка · знаменатель · правило сравнения

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

метрика знаменатель правило сравнения значение
01 Покрытие оценкой Диалоги, прошедшие фильтр длительности и содержания Сколько из них оценивается автоматически — против ручной выборки прежнего процесса 100% / ≤20%
02 Совпадение решений 500 сделок замороженного набора, размеченных экспертами Решение модели против экспертного вердикта по каждой сделке. Пропуски критических нарушений и классы ошибок проверяются отдельным порогом, который блокирует релиз: среднее значение их прячет 98%
03 Экономика моделей Стоимость сценария на 1 000 сделок До и после переезда при неизменных схеме ответа, бенчмарке и гейтах качества; цены зафиксированы снимком на дату −88%
04 Эффект Voice AI Подходящие типовые консультации — для доли; прежний процесс — для лидов Доля, прошедшая без оператора, и рост квалифицированных лидов в первый месяц 45–50% · ×1,2
05 Экономия контакт-центра Стоимость обслуживания того же потока консультаций До и после автоматизации, рублей в месяц ≥ 1 млн ₽

§03 / основной проект · крупная edtech-платформа (РФ)

AI-контроль качества всех коммуникаций с клиентом

от ручной выборки к сплошной оценке

Раньше отдел контроля качества слушал выборку разговоров руками. Сейчас поток коммуникаций транскрибируется, фильтруется, оценивается по чек-листам и превращается в структурированные данные для руководителей, CRM и BI — по всем сотрудникам, которые общаются с клиентом.

Я собрал этот контур целиком: логику платформы, системные промты, выбор моделей, пайплайны, правила оценки, выгрузку и калибровку на живом потоке.

01

CRM и телефония

звонки, переписка, сделки, метаданные

02

Транскрибация

разделение говорящих и нормализация текста

03

Движок пайплайнов

фильтры, теги, действия при сбое

04

LLM-слой

оценка по чек-листу, саммари, смысловая аналитика

05

PostgreSQL / BI / CRM

данные там, где уже работает команда

замкнутая петля

Система, которая проверяет саму себя

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

→ как такие наборы собираются, размечаются и замораживаются

что это дало

Оценка перестала быть выборочной

Руководитель видит не мнение по десяти звонкам, а весь поток: где нарушают регламент, где теряют сделку, какие возражения не отрабатывают. На этих же данных строится аналитика следующего раздела — это одна система, а не две.

§04 / аналитика

Аналитика, по которой принимают решения

продажи · маркетинг · продукт и тарифы · конкуренты

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

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

тысячи

сделок в одном исследовании

до полугода

горизонт сравнения периодов

десятки признаков

на сделку в глубоком разборе

все каналы

звонки и переписка всех сотрудников, кто общается с клиентом

кейс · продажи и трафик

запрос бизнеса«Понять причины снижения конверсии в мае и изменение структуры продаж тарифов»

Конверсия упала не там, где искали

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

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

→ решения по закупке трафика, скрипту и презентации тарифов.

кейс · продукт и цена

запрос бизнеса«Причины отказов и есть ли у клиентов запрос на программы дополнительного образования»

«Дорого» — это не всегда про цену

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

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

→ платёжные сценарии, работа с отказами по рассрочке и отдельная оценка спроса на программы с документом об образовании.

кейс · процессы и упущенная выручка

запрос бизнеса«Понять реальные причины обращений действующих клиентов и найти точки роста в клиентском пути»

Часть работы отдела продаж — не продажи

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

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

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

обязательная часть любого отчёта

  • Контроль выборки: сколько записей вошло, сколько потеряно и почему — до всех процентов.
  • Знаменатель у каждой доли, и при сравнении периодов он один и тот же.
  • Наблюдение и объяснение разведены: гипотеза называется гипотезой и сопровождается способом проверки.
  • Каждая категория подтверждается цитатой клиента, а отдельный лист позволяет заказчику проверить разметку руками.
  • Раздел ограничений: чего эти данные не показывают и какой вывод из них делать нельзя.

почему это быстро

Одна цепочка от разговора до решения

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

→ эта же методика на синтетических данных, с кодом и тестами

§05 / инженерные решения

Что я выбрал и от чего отказался

решение · альтернатива · условие пересмотра

stt

Готовый сервис распознавания вместо своего Whisper

Взял готовый сервис распознавания речи: качество на спонтанной телефонной речи и разделение говорящих из коробки, предсказуемая цена за минуту и никакой эксплуатации — ни своего железа, ни дежурств.
Отказался от своего Whisper на GPU: дешевле на объёме, но это железо, очередь, дежурство и просадка качества на шумных линиях, которую пришлось бы чинить самому.

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

→ рантайм, в котором эта задержка считается по этапам

retrieval

pgvector вместо отдельной векторной базы

Взял pgvector в том же PostgreSQL: поиск живёт рядом с бизнес-фильтрами — клиент, продукт, период. Это один запрос вместо двух хранилищ и синхронизации между ними.
Отказался от выделенной векторной БД: быстрее на миллионах векторов и богаче по фильтрации, но это ещё один сервис, бэкапы и точка отказа ради выигрыша, которого на текущем объёме не видно.

Порог перехода известен заранее: когда время поиска станет заметным на фоне времени модели или индекс перестанет помещаться в память.

→ сравнение стратегий поиска на разных объёмах

evaluation

Оценка моделью против замороженной разметки

Взял LLM-судью и экспертный golden set: критерии меняются вместе с регламентом, а судья ещё и объясняет решение — это можно показать руководителю и оспорить.
Отказался обучать классификатор под каждый критерий: стабильнее и дешевле в инференсе, но каждая правка регламента требует новой разметки, а правок десятки за квартал.

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

→ как набор замораживается и как ловится его подмена

переезд на дешёвую модель

Что ломается первым и как это ловится

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

Поэтому релиз блокируется по двум вещам: валидность схемы и полнота на критических нарушениях. Лечится сжатием контекста, переносом части правил из промта в код, примерами на ошибочных классах и отдельным проходом по критическим категориям.

Результат — тот же валидированный вывод при −88% стоимости сценария. Там, где цена ошибки высокая, человек остаётся в петле: это осознанное ограничение, а не недоделка.

→ метрики и гейты, по которым это проверялось

§06 / собственный продукт · независимый saas · leadchat.online

Lead Chat: AI-платформа продаж с оплатой за результат

50 ₽ за созданный лид — не за сообщения

Собственный продукт, а не демо: агент ведёт диалог по бизнес-цели, квалифицирует клиента, отрабатывает возражения, отвечает по базе знаний и совершает действия — записывает, собирает контакт, отдаёт лид в CRM.

База знаний

Сайты и офисные файлы нормализуются в чанки и эмбеддинги, индексируются в pgvector с ключевым поиском как запасным вариантом.

Ядро агента

Бизнес-цель, этапы диалога, квалификация, возражения, опора на источники и ограничения поведения. История не уезжает в контекст целиком: свежие реплики — дословно, ранние — сжатым состоянием диалога и собранными полями, иначе стоимость и задержка растут с каждой репликой.

Действия и интеграции

Вызов функций для сбора лида, онлайн-записи и бизнес-действий; amoCRM, Bitrix24, Telegram, email.

Платформа и биллинг

Веб-виджет, фоновые задачи, биллинг по результату и аналитика конверсии.

почему архитектура именно такая

Оплата за результат задаёт всё остальное: пока «лид» не определён технически, брать за него деньги нельзя. Лид засчитывается не за состоявшийся диалог, а когда агент собрал обязательные поля и они прошли валидацию. Отсюда и цель у диалога, и этапы, и проверка полноты данных перед закрытием.

кто что делает

Я отвечаю за продуктовую концепцию, AI-логику и ключевую архитектуру. С технической стороны со мной работает партнёр-разработчик: отдельные компоненты и тестирование кода. Продуктовые метрики закрыты — разбираю их отдельно.

Next.jsNode.jstRPCPrismaPostgreSQL / pgvectorRAGtool callingbackground jobspayments

§07 / production-системы

Голосовой агент, корпоративный RAG, оценка и экономика моделей

промт — один компонент из десяти

voice ai

45–50%

подходящих типовых консультаций проходит без оператора

Перевёл регламент контакт-центра в живой диалог: ветвление по скрипту, уточнения, перебивания, ответы из базы знаний. Подключён к телефонии Сипуни, держит 10 линий одновременно, работает круглосуточно и не зависит от того, какой менеджер взял трубку.

Задержка — главный ограничитель канала: 3 секунды до первой реплики и до 10 секунд между репликами. Она складывается из распознавания речи, запроса к модели с контекстом скрипта и базы знаний и синтеза ответа. Сокращается она не выбором модели, а тем, как рано начинается распознавание и сколько контекста уходит в запрос.

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

Отсюда ×1,2 квалифицированных лидов в первый месяц и экономия от 1 млн ₽ в месяц: больше дозвонов, круглосуточная работа, полный охват скрипта и стабильное знание продукта.

→ рантайм такого диалога: этапы, перебивания, бюджет задержки

корпоративный rag

100+

ежедневных внутренних пользователей

Два ассистента на Dify отвечают сотрудникам по внутренним документам — это и есть RAG: модель отвечает не из памяти, а по найденным фрагментам. Один по продажам, второй по корпоративной базе в Confluence, 37 документов, поиск чисто векторный.

Отвечал за нарезку документов, сборку контекста, опору на источники и качество ответа. Сотрудник получает ответ со ссылкой на документ меньше чем за 10 секунд вместо примерно пяти минут ручного поиска.

→ сравнение стратегий поиска и проверка обоснованности ответа

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

оценка llm

4

специализированных golden set

Отдельные наборы и метрики под балльную оценку, саммари, смысловую аналитику и нарушения. Экспертная калибровка, регрессии и разбор ошибок после каждой смены модели. 98% совпадения решений — на замороженном наборе из 500 сделок.

→ методика и код в публичном репозитории

экономика моделей

−88%

стоимости ключевого LLM-сценария

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

Стоимость считаю на 1 000 сделок и фиксирую снимок цен на дату — иначе сравнение «до и после» ничего не значит.

§08 / метод и стек

Один человек отвечает за весь путь: от регламента до решения

01

Формализую

перевожу регламент и пограничные случаи в проверяемое поведение

02

Собираю

промты, схемы ответа, поиск, оркестрацию, хранение и API

03

Измеряю

golden sets, экспертная калибровка, регрессии, типология ошибок

04

Внедряю

CRM, BI и рабочие процессы, где уже находится команда

05

Объясняю

отчёт с ограничениями и решение, которое из него следует

в production под моей ответственностью

PythonTypeScriptFastAPINode.jsPostgreSQLpgvectorDockerOpenAI APIAnthropic APIGigaChatYandexGPTDifyRAGAI AgentsStructured OutputsTool CallingLLM-as-a-JudgeVoice AICRM / BISQLGit

работал вне этого контура

LangChainLangGraphQdrantvLLMHugging FaceFine-tuning / LoRARAGASA/B TestingGuardrailsPrompt InjectionNLP

Разделяю сознательно: слева то, что работает на реальном трафике и за что я отвечаю, справа — то, с чем работал вне этого контура.

§09 / позиционирование

Промт-инжиниринг — один слой. Я отвечаю за систему целиком.

Работаю на стыке AI-инженерии, аналитики и продукта. Беру задачу в формулировке «сделайте так, чтобы это перестали делать руками» и довожу до системы, которая работает на реальном трафике, — и до отчёта, по которому принимают решение.

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

инженерные артефакты

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

→ шесть репозиториев и что в каждом

§10 / публичный код

Шесть репозиториев, которые можно открыть и запустить

свыше 10 000 строк python · без зависимостей · без ключа к модели

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

оценка llm

llm-evaluation-harness

Четыре класса задач, типизированная таксономия ошибок, bootstrap-интервалы и релизные гейты. Критический recall гейтится отдельно от средней точности — именно те пропуски, которые среднее прячет.

→ открыть репозиторий · около 2 300 строк

тесты и CI на Python 3.11 и 3.12

эталонные наборы

golden-set-builder

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

→ открыть репозиторий · около 1 500 строк

тесты и CI на Python 3.11 и 3.12

промты как контракты

prompt-contracts

У каждого промта схема ответа, правила отказа, бюджет размера и golden set, который гейтит его изменения. Команда diff отвечает на единственный вопрос ревьюера: нужно ли перезапускать оценку перед мержем.

→ открыть репозиторий · около 850 строк

тесты и CI на Python 3.11 и 3.12

голосовой рантайм

voice-agent-runtime

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

→ открыть репозиторий · около 1 100 строк

тесты и CI на Python 3.11 и 3.12

retrieval и обоснованность

rag-grounding-lab

Сколько стоит нарезка и где проигрывает каждая стратегия поиска — три поломки воспроизведены, а не спрятаны. Ответ проверяется по предложениям: выдуманное число ловится отдельно от неподтверждённой формулировки, а честный отказ засчитывается как обоснованный.

→ открыть репозиторий · около 1 200 строк

тесты и CI на Python 3.11 и 3.12

аналитика на выходах модели

conversation-intelligence-lab

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

→ открыть репозиторий · около 300 строк

тесты и CI на Python 3.11 и 3.12

$ ragl compare --top-k 1 --chunking title-prefixed

chunking        retrieval     hit   nDCG  paraphrase  exact-term

title-prefixed  vector        75%  0.750         70%         83%
title-prefixed  keyword       81%  0.812         70%        100%
title-prefixed  hybrid        81%  0.812         70%        100%

Реальный вывод из rag-grounding-lab, по первой позиции выдачи. hit — как часто нужный документ вообще нашёлся, nDCG — насколько высоко он оказался. Смотреть надо на последнюю колонку: векторный поиск путает почти одинаковые коды, потому что «РГ-14.2» и «РГ-14.3» состоят почти из одних и тех же буквосочетаний, — а поиск по точному слову их различает. Отсюда правило вместо мнения: ключевой поиск окупается там, где в запросах есть артикулы, коды и номера версий. Там, где спрашивают обычными словами, как в базе на 37 документов, векторного достаточно.

как я нахожу свои ошибки

Ошибка находится проверкой, а не глазами

три случая из этих репозиториев

статистика

Альфа Криппендорфа возвращала не 1.0 при полном согласии

В матрице совпадений стояло сравнение тождества строк вместо позиций разметчиков, из-за чего отбрасывались все пары, где оба поставили одинаковую метку. Число получалось правдоподобным и неверным.

Осталось в репозитории: тест «для двух разметчиков на номинальной шкале α и κ обязаны совпадать». Сейчас 0.7630 против 0.7631.

ci

CI не запускал ни одного job'а

Shell-heredoc внутри блока run поставил своё тело в нулевую колонку, а это обрывает блочный скаляр YAML. GitHub не смог прочитать файл: пайплайн выглядел красным, хотя код ни разу не выполнялся.

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

ci

Шаг падал на той самой проверке, которую выполнял

GitHub запускает bash с флагом -e, поэтому команда, от которой ожидается ненулевой код возврата, завершала шаг до того, как этот код успевали проверить. В логе стояло «exit code 3» — ровно то число, которое шаг и проверял.

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

ai engineer & data analyst · llm-системы · аналитика для решений

Ищете человека, который доводит AI до production и до решения?

Открыт к Senior / Lead Applied AI ролям с end-to-end ответственностью: от бизнес-регламента до работающей системы, измеримого эффекта и отчёта, по которому действуют. Удалённо, UTC+3, рассматриваю зарубежные команды.