Причины отказов в CRM: анализ с ИИ по цитатам

Причины отказов в CRM: анализ с ИИ по цитатам. Готовый промпт и учебный пример. Проверка по исходным данным, ограничения и следующий шаг для своей задачи.

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

Подготовьте безопасный срез проигранных сделок

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

Поле причины отказа и связанная с ним причина доступны через API сделок: в описании сущности есть loss_reason_id, а вложенная сущность _embedded[loss_reason] отдаёт id и название причины, если запрос идёт с нужным параметром Сделки. Это техническая возможность получить связку «сделка — причина из поля CRM», а не доказательство, что записанная причина верна.

Важная граница: проигранные сделки не описывают всех лидов и не доказывают причинно-следственную связь. Если исправить причину в CRM, это ещё не доказывает влияние на выручку. Срез отвечает на узкий вопрос — совпадает ли запись менеджера со словами клиента.

Определите кодбук до классификации

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

  • price — клиент явно называет цену препятствием.
  • timing — клиент явно откладывает решение из-за времени.
  • competitor — клиент явно говорит, что выбрал другого поставщика.
  • unknown — причина не высказана.

Отдельно определите, как каждая метка соотносится с записью в CRM:

  • match — цитата подтверждает записанную причину.
  • mismatch — цитата указывает на другую категорию.
  • unconfirmed — цитата не позволяет подтвердить запись.
  • missing_input — цитаты нет.

Правило, которое стоит прописать явно: эмоция не равна причине. Раздражение клиента само по себе не даёт метку price или timing. Пустое поле тоже не доказательство: это отсутствие входных данных, а не вывод о причине.

Учебный пример

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

Входные строки

ID Причина в CRM Цитата клиента
L1 price «Для нашего бюджета это дорого.»
L2 price «Бюджет есть, вернёмся к проекту в январе.»
L3 competitor «Пока не готовы ответить.»
L4 price — (поле пустое)
L5 competitor «Мы подписали договор с другим поставщиком.»
L6 timing «Ничего не работает, я раздражён.»

Эталонная разметка

ID Метка Evidence (дословно из цитаты) Отношение к CRM
L1 price «Для нашего бюджета это дорого.» match
L2 timing «вернёмся к проекту в январе» mismatch
L3 unknown null unconfirmed
L4 unknown null missing_input
L5 competitor «подписали договор с другим поставщиком» match
L6 unknown null unconfirmed_emotion_not_reason

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

  • price — 1
  • timing — 1
  • competitor — 1
  • unknown — 3
  • Итого строк — 6; 1+1+1+3=6.
  • Полнота подтверждённых строк — 3 из 6, то есть 50%.

Действие по результату учебного примера — исправить или проверить поля на основании цитат. Менять CRM и писать клиентам автоматически по такому анализу не нужно.

Дайте промпт и разберите исключения

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

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

Правила категорий:
price — клиент явно называет цену препятствием.
timing — клиент явно откладывает решение из-за времени.
competitor — клиент явно выбрал другого поставщика.
unknown — причина не высказана.

Правила отношения к CRM:
match — цитата подтверждает записанную причину.
mismatch — цитата указывает на другую категорию.
unconfirmed — цитата не позволяет подтвердить запись.
missing_input — цитаты нет.

Жёсткие условия:
1. Метка присваивается только по кодбуку.
2. Evidence — дословная подстрока из цитаты или null.
3. Эмоция не является причиной.
4. Пустое поле — это missing_input, а не вывод о причине.
5. Каждая строка получает ровно одну метку.
6. Не меняй CRM и не пиши клиентам.

Входные строки:
L1, crm_reason: price, quote: «Для нашего бюджета это дорого.»
L2, crm_reason: price, quote: «Бюджет есть, вернёмся к проекту в январе.»
L3, crm_reason: competitor, quote: «Пока не готовы ответить.»
L4, crm_reason: price, quote: null
L5, crm_reason: competitor, quote: «Мы подписали договор с другим поставщиком.»
L6, crm_reason: timing, quote: «Ничего не работает, я раздражён.»

Верни JSON по схеме:
{
  "rows": [
    {"id": "string", "label": "price|timing|competitor|unknown", "evidence": "string|null", "crm_relation": "match|mismatch|unconfirmed|missing_input|unconfirmed_emotion_not_reason"}
  ],
  "counts": {"price": 0, "timing": 0, "competitor": 0, "unknown": 0},
  "confirmed_share_percent": 0,
  "exceptions": ["string"],
  "unknowns": ["string"]
}

Проверки, которые нужно выполнить перед ответом:
— все шесть ID покрыты ровно один раз;
— сумма counts равна числу строк;
— confirmed_share_percent = число строк с crm_relation match или mismatch, делённое на число строк и умноженное на 100;
— каждая непустая evidence дословно входит в исходную quote;
— строки без цитаты и строки с эмоцией не получают метку причины.
Если проверка не проходит, не выдумывай ответ — укажи в exceptions точный вход и требуемое уточнение.

Разбор исключений. L2 формально записан как price, но клиент говорит про январь и наличие бюджета — метка timing, отношение mismatch. L3 и L4 — разные случаи: в L3 клиент ответил уклончиво, в L4 цитаты нет вовсе. L6 содержит эмоцию, но не причину, поэтому остаётся unknown. Только L1 и L5 подтверждают запись.

Технические проверки — покрытие ID, сумму counts, формулу доли и вхождение evidence в цитату — может выполнять агент или код по правилам. Человек нужен там, где решение смысловое: уточнить неизвестное бизнес-условие, разобрать исключение, решить, что делать с расхождением. Ручная вычитка каждой строки для этого не требуется.

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

Валерий Курземнек

Автор метода «Машиночитаемый маркетинг»

Что ещё почитать