Анализируем звонки из SipUni с помощью ChatGPT и Rev.Ai


В данной статье рассмотрим пример реализации кейса, в котором происходит аналитика по транскрипции записи разговора

Анализируем звонки с помощью ChatGPT и Rev.Ai

В этом кейсе мы настроим автоматический анализ телефонных разговоров с помощью сервисов Rev.Ai (транскрипция аудио) и ChatGPT (анализ текста).

Записи разговоров будут приходить из amoCRM

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

Что будем делать

Общая схема работы:

  • amoCRM создает запись разговора и отправляет webhook в MoreKit
  • MoreKit принимает ссылку на аудиофайл и отправляет его в Rev.Ai
  • Rev.Ai возвращает текстовую расшифровку разговора
  • Эта расшифровка передается в ChatGPT для анализа
  • Готовый анализ записывается в amoCRM в примечание к сделке

Подготовка к работе

Перед началом убедитесь, что:

  • MoreKit подключен к вашему amoCRM
  • У вас есть API-ключ от Rev.Ai (можно получить на сайте https://www.rev.ai/)
  • У вас есть доступ к OpenAI API

Подключение сервисов

Первым делом — подключим сервисы в MoreKit.

Подключение amoCRM

В MoreKit в разделе Сервисы — ищем в списке сервисов amoCRM, нажимаем на кнопку Добавить, произойдет перенаправление на страницу переадресации amoCRM, где необходимо выбрать нужную CRM, которую надо подключить в MoreKit

Добавляем amoCRM в MoreKIT
Выдаем доступ к аккаунта amoCRM

Подключение Rev.AI

В данной статье описан процесс создания токена доступа API в сервисе Rev.AI

Чтобы начать работу с API, вам нужно зарегистрировать учётную запись на главной странице Rev.ai. После этого войдите в свою учётную запись и перейдите в раздел «access token» на боковой панели. Вы попадёте на страницу, которая выглядит примерно так. Скопируйте сгенерированный API ключ и вставьте его в меню подключения сервиса rev.ai в MoreKit

Подключение OpenAi

Следующим шагом — подключим OpenAi. В списке сервисов ищем OpenAi
Так-же потребуется сгенерировать токен доступа к API в личном кабинете OpenAI

После создания ключа доступа к API — по аналогии ищем OpenAi в списке сервисов MoreKit и подключаем сервис

Настраиваем процесс в MoreKit

Создайте процесс в MoreKit с типом amocrm Webhook. Скопируйте ссылку из первоначального блока, перейдите в настройки web hooks в маркете amoCRM. Событие должно срабатывать при создании примечания в сущности контакта, так как штатная интеграция sipUni создает примечания с записями разговоров в контакте

Данный кейс можно использовать не только с sipUni, но и с другими сервисами, которые предоставляют публичную ссылку на запись разговора

Когда примечания с записью разговоров создастся — в MoreKit придет событие со входящими данными, в которых будет состав созданного примечания, из которого достанем ссылку на запись разговора. Здесь важно обратить внимание на тип созданного примечания

Каждый сервис в amoCRM имеет свой уникальный ID типа примечания, по этому чтобы не ловить все примечания, поймайте нужные примечания и создайте проверку в первоначальном блоке, чтобы процесс запускался только на нужные примечания.

Далее — выстроим логическую схему. Данная схема будет:

  • Искать контакт, к которому прикрепилось примечание
  • Искать сделки из контакта в нужных воронках
  • Доставать ссылку на запись разговоров из примечания
  • Отправлять запись на транскрипцию в Rev.AI
  • Записывать в техническое поле сделки ID задания на расшифровку, чтобы проверять статус готовности транскрипции
  • Формировать диалог для передачи в OpenAi
  • Отправлять запрос в OpenAi с транскрипцией записи разговора для анализа звонка
  • Передавать анализ звонка обратно в контакт

Описание блоков схемы

Ищем контакт по ID сущности из примечания

#6 Найти контакты — ищем контакт в crm системе, к которому прикрепилась запись разговора

Ищем сделку из контакта с фильтрами по статусам и воронкам

#1 Найти сделки — ищем активную сделку из контакта по двум воронкам

Декодируем ответ из примечания

#7 JSON декодировать — данный сервисный блок нужен для того, чтобы разложить строку с данными примечания из sipuni в формат «Ключ»: «Значение».

Данный сервисный блок нужен для удобства работы с данными, так как sipUni в записях звонков передает JSON внутри строки

Вот пример, как будет представлена строка с данными примечания в этом блоке

Проверяем, есть ли в примечании ссылка на запись разговора

#9 Проверка — проверяем, что ссылка в примечании не пустая

Создаем примечание

Если ссылка пустая — создаем примечание в сделке с текстом Не дозвонились

Создаем задание на транскрипцию

#8 Создать задание — Функциональный блок Rev.Ai, отправляем ссылку на запись в Rev.Ai для получения транскрипции

Записываем в сделку id rev.ai

#46 Обновить сделку — записываем в технической поле сделки ID созданного задания в Rev.Ai, чтобы получать статус выполнения транскрипции дальше в процессе

Откладываем событие на 10 сек

#10 Отложить событие — после перехода на этот блок — схема задержится на 10 секунд. Короткие аудиозаписи в Rev.Ai обрабатываются достаточно быстро

Получаем результаты задания

#17 Получить задание — получаем статус транскрипции. Если транскрипция была выполнена, среди данных в блоке получения будет:

{
"status":"transcribed"
}
Проверяем статус задания

#16 Проверка — проверяем, завершена ли транскрипция записи. Если запись не завершена — уводим на блок #18 Отложить событие. В схеме будет «Змейка» из таких проверок, чтобы дождаться завершения транскрипции

Пример лесенки ожиданий

Данные блоки в схеме получают статус и проверяют статус готовности. Максимально разрешенное время в секундах в блоке Отложить событие — 90 секунд

Получаем результат транскрипции

#11 Получить транскрипцию — если транскрипция выполнена, получаем данные транскрипции

Перебираем монолог с помощью цикла {% for %}

#12 Создать переменную — формируем из полученной транскрипции диалог между спикерами для передачи его в OpenAi. Здесь перебираем монологи с помощью цикла {% for %}

Подробнее о циклах можно прочитать в нашей документации

Формируем дату для постановки задачи

#24 Дата и время — формируем текущую дату для передачи в OpenAi в формате TimeStamp, она будет использовать в системном промпте (инструкции для ИИ)

Формируем запрос в чат GPT

#21 — отправляем запрос в OpenAi на генерацию ответа от ИИ

  • Модель — в данном кейсе использовалась модель gpt-4.1-mini
  • Инструкции от разработчика — объясняем ИИ, что нужно сделать. Данное поле одно из самых важных для получения нужного ответа. Следите за пунктуацией при написании инструкций, так как когда посылается запрос на генерацию — он чувствительно относится к пунктуации в русском языке, это нужно учитывать, т.к. изначально OpenAi настроен под промты на английском языке. Данный промпт требует от ИИ отдавать ответ в формате JSON. В данном ответе будет формироваться две переменные, «analytics» — будет содержать в себе анализ звонка, «pushdate» — будет содержать в себе дату перезвона, если клиент попросил перезвонить. На данную дату будем ставить задачу для перезвона
  • Сообщение от пользователя — сюда передаем сформированный текст из переменной по монологам транскрипции

На что стоит обратить внимание:

В блоке отправки запроса к OpenAi присутствуют настройки для более точной работы с ИИ.

Описание настроек в блоке GPT

Если вы заметили неточность в ответах — используйте настройки. К примеру — можно попробовать поиграться с параметром Рандомность ответа в блоке — он управляет креативностью модели.
Для более точных задач, где не нужно придумывать креативные идеи лучше ставить значение меньше одного.
Например, если поставить «Рандомность ответа» на значение 0,8 — при ответе ии будет меньше «придумывать», больше опираясь на инструкции, которые ему даны.
Краткое описание настроек:

  • Повторение токенов в ответах (-2.0 до 2.0) — параметр frequency_penalty. Уменьшает (или увеличивает) повтор слов
  • Отклонение от темы (-2.0 до 2.0) — > 0: поощряет упоминание новых тем, < 0: остаётся ближе к текущей теме.
  • Ссылка на изображение — если модель мультимодальная, можно передавать изображения.
  • Рандомность ответа (0 до 2.0) — 0: максимально детерминированный (одинаковые ответы).
    1: умеренная случайность.
    2: креативный и непредсказуемый.
  • Уровень рассуждений — средний, низкий, или высокий. При выставлении Высокий — потребует больше токенов для ответа, но точность ответа будет выше
  • Приоритетность (scale tier) — Это может относиться к приоритету обработки запроса, если есть несколько тарифов.
  • Максимальное количество используемых токенов — максимальное кол-во токенов для ответа. Чем выше число — тем более обширный ответ получится
  • ID пользователя — Это служебное поле, передаваемое в имя пользователя при отправке запроса.
    Помогает OpenAI идентифицировать пользователя (например, для анализа злоупотреблений).
  • Искать данные в интернете — возможность искать данные в интернете, если поддерживается выбранной моделью. Данный параметр может негативно сказаться на времени ожидания готовности генерации от ИИ (ответа). Если инструкция задано достаточно точно — лучше не использовать
Декодируем текст ответа от GPT

#25 JSON декодировать — раскладываем JSON строку с ответом от ИИ в формат «Ключ»: «Значение»

Создаем примечание с ответом от GPT

#15 Создать примечание — создаем примечание, в текст которого кладем полученный анализ текста

Проверяем, есть ли в ответе "Не дозвонился"

#30 Проверка — проверка на наличие анализа. Если не дозвонился — поставим задачу

Создаем задачу в amoCRM

#47 Создать задачу — ставим задачу, если не дозвонились

Проверяем, есть ли дата перезвона в ответе от GPT

#27 Проверка — проверяем, есть ли в ответе pushdate (дата для перезвона). Как было ранее задано в инструкции от разработчика к ИИ — если в диалоге клиент попросил перезвонить, то в ответе должна сгенерироваться дата перезвона в формате timestamp

Создаем задачу

#29 Создать задачу — если дата перезвона была сгенерирована — ставим задачу со сроком выполнения до этой даты

Проверка в amoCRM и получение результата

Теперь остается совершить звонок или дождаться звонка, провести диалог и дождаться генерации анализа звонка от ИИ

Как видим — анализ встречи успешно записан в примечание сделки.

Пример с постановкой задачи, если в диалоге договорились о перезвоне

В событиях также видим можно отследить, как прошел процесс

Итог

Теперь при появлении новой записи разговора в amoCRM, система автоматически отправит аудио в Rev.Ai, расшифрует текст, проанализирует его с помощью OpenAi и добавит результат в примечание карточки сделки.

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