Как робот «Совести» общается с клиентами

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Расскажем, как финтех-проект группы QIWI — карта беспроцентной рассрочки «Совесть» — перевел часть разговоров контакт-центра на робота, который не только отвечает на вопросы, но и сам задает их при исходящих обзвонах. Статья про применение на практике HTTP-запросов, синтеза речи и распознавания голоса.



Шаг 1: Интеллектуальный IVR


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

// Модуль, который потребуется для распознавания речи абонента
require(Modules.ASR);
​
let call;
​
// Данные, которые будем собирать во время звонка
let data = {};
​
const PHRASES = {
 hello: "http://some_url_to_mp3_sound_for_start_question"
};
​
// Соответствие категории и dtmf, который будет отправлять Qiwi
const dtmf = {
 operator: { name: "Оператор", digit: "0" },
 balance: { name: "Баланс", digit: "1" },
 pin_code: { name: "Пин-код", digit: "3" }
};

Как это устроено? Обращаясь по номеру горячей линии, клиент попадает в голосовое меню и озвучивает тему своего вопроса — система распознает сказанное и направляет звонок на дальнейшую обработку. Клиенту нужно просто озвучить в свободной форме свою проблему, дополнительного нажатия каких-либо клавиш на телефоне не требуется.

// Получаем входящий звонок от «Совести», запускаем обработчик события входящего звонка
VoxEngine.addEventListener(AppEvents.CallAlerting, e => {
 // Сохраняем объект звонка в глобальную переменную
 call = e.call;
​
 // Получаем номер телефона звонящего для будущей обработки
 data.phone = e.callerid;
​
 // При переадресации звонка по SIP есть возможность передать на платформу строковую информацию в заголовках.
 // В случае с «Совестью» платформа получает идентификатор звонка в заголовке X-CID
 // Сохраняем для будущей обработки
 data.xcid = e.headers["X-CID"];
​
 // Отвечаем на звонок
 call.answer();
​
 // Вешаем обработчик на событие соединения с клиентом
 call.addEventListener(CallEvents.Connected, HandleConnected);
​
 // Обрабатываем событие старта аудиозаписи
 call.addEventListener(CallEvents.RecordStarted, record => {
   // Сохраняем URL записи для дальнейшей обработки
   data.record_url = record.url;
 });
 // Обрабатываем событие отключения абонента
 call.addEventListener(CallEvents.Disconnected, HandleDisconnected);
});
​
async function HandleConnected(e) {
 // Запускаем запись разговора
 call.record(true);
​
 // Задаем вопрос абоненту
 await startPlayback(call, PHRASES.hello);
​
 // Начинаем слушать его ответ
 startASR();
}

Если потребителя интересуют общие инструкции — например, активация карты, способы ее пополнения, смена ПИН-кода и так далее, он слышит записанный аудиоролик с пошаговым объяснением.

// Функция, которая позволяет воспроизвести mp3-сообщение абоненту
function startPlayback(call, url, loop = false) {
 return new Promise(resolve => {
   call.startPlayback(url, loop);
   call.addEventListener(CallEvents.PlaybackFinished, function callback() {
     resolve(call.removeEventListener(CallEvents.PlaybackFinished, callback));
   });
 });
}

Таким образом, первая функция колл-центра, которую легко автоматизировать — это воспроизведение стандартных хауту и ответы на распространенные вопросы.

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

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

Показать код
// Функция запускает модуль ASR и получает в виде строки информацию, которую произнёс абонент
function startASR() {
 const asr = VoxEngine.createASR({ lang: ASRLanguage.RUSSIAN_RU });
​
 // Получаем ответ от абонента
 asr.addEventListener(ASREvents.Result, asrevent => {
   asr.stop();
​
   speech_processing(asrevent.text);
 });
}
​
// Функция обрабатывает фразу абонента
function speech_processing(text) {
 /* Поиск ключевых слов/словосочетаний, чтобы сопоставить тематику разговора абонента */
​
 /* Каждое условие if - это выбор той или иной тематики разговора.
    Поиск ключевых слов лучше выводить в отдельную функцию,
    которая возвращает булево значение.
    Для демонстрационных целей используется метод строки
    includes и оператор &&
 */
 if (
   text.includes("хочу") &&
   text.includes("узнать") &&
   text.includes("баланс")
 ) {
   // Записываем название распознанной категории для дальнейшей обработки
   data.category = dtmf.balance.name;
​
   // Отправляем тоновый сигнал на сторону «Совести»
   sendDigits(dtmf.balance.digit);
 } else if (
   text.includes("хочу") &&
   text.includes("узнать") &&
   text.includes("пин")
 ) {
   data.category = dtmf.pin_code.name;
​
   sendDigits(dtmf.pin_code.digit);
 } else {
   // Если не распознали категорию, ставим по умолчанию - Оператор
​
   data.category = dtmf.operator.name;
​
   sendDigits(dtmf.operator.digit);
 }
}
​
// На платформу звонок попадает из IVR «Совести»,
// и «Совесть» планирует этот звонок получить обратно, когда платформа узнает, какая категория вопроса интересует абонента.
// Способ общения с IVR на стороне «Совести» реализован с помощью sendDigits,
​
/* К каждой категории "привязан" тоновый сигнал, и «Совесть» знает об их соответствиях, то есть, получая dtmf - 1, IVR «Совести» информирует абонента о балансе, а получая dtmf - 3, обрабатывает запрос от абонента “узнать свой пин-код” */
​
function sendDigits(digit) {
 // отправляем сигнал
 call.sendDigits(digit);
​
 // Завершаем звонок абонента через 1.5 секунды, чтобы гарантировать успешную доставку DTMF. 
 setTimeout(call.hangup, 1500);
}
​
// Обработчик события момента, когда звонок с абонентом завершен.
async function HandleDisconnected(e) {
 // У объекта события Disconnected мы можем узнать продолжительность разговора и сохранить для дальнейшей обработки.
 data.duration = e.duration;
​
 // По завершении звонка у нас есть объект с данными, полученными по ходу выполнения сценария. Мы можем отправить его в CRM.
 await sendToCrm(data);
​
 // Обязательно завершаем сессию. Хоть у нас уже и завершён входящий звонок и больше нет активных плечей, сессия будет активна еще в течение 60 секунд. Так как нам это не нужно, принудительно завершаем её.
 VoxEngine.terminate();
}
​
async function sendToCrm(data) {
 // Для демонстрационных целей - мы просто логируем наш объект с данными.
​
 Logger.write(JSON.stringify(data));
​
 // В другом случае - именно в этой функции мы можем осуществить http - запрос с помощью функции Net.httpRequestAsync
}


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


Шаг 2: Голосовые уведомления


Как снизить затраты на обслуживание входящей линии мы разобрались, переходим к исходящим. Одна из типичных причин, по которой оператор звонит владельцу карты — напоминание о внесении ежемесячного платежа: это необходимо делать по телефону, так как сообщение или push-уведомление могут быть пропущены. В то же время, совсем не обязательно тратить на этот процесс время операторов. С помощью сервиса Smartcalls «Совесть» дозванивается клиенту — всего робот делает три попытки — и проговаривает посредством синтеза речи, когда и какую сумму необходимо положить на счет.


Сценарий уведомления

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



Шаг 3: Сбор обратной связи


Последний момент — это автоматизированный сбор информации для исследований. До использования Smartcalls проекту удавалось обзванивать выборку в 3 000 – 5 000 человек в месяц. Сейчас робот совершает 40 000 исходящих звонков ежемесячно, при этом всех сотрудников, ранее занятых обзвонами, перевели на другой функционал. С помощью сервиса происходит контроль качества обслуживания, замеры оценки эффективности клиентского сервиса (CES), лояльности и удовлетворенности клиентов (NPS и CSI).


Сценарий NPS

Как это устроено? Бот просит клиента оценить по десятибалльной шкале один из параметров работы проекта, и дальнейший сценарий зависит от выставленной оценки. Если это «восемь» и выше, робот благодарит собеседника и завершает разговор. Если же «семь» и ниже — просит оставить развернутый комментарий, указав причины неудовлетворенности. Речь транскрибируется и выгружается в письменном виде для дальнейшего анализа.


Сегодня технологии позволяют создать бота по-настоящему дружественным. Его способность понимать речь человека постоянно улучшается в результате непрерывного обучения новым фразам и часто используемым словам. В языковую модель добавляются не только названия промоакций или опций карты, но и множество вариантов формулировок одних и тех же запросов.
Источник: https://habr.com/ru/company/Voximplant/blog/467021/


Интересные статьи

Интересные статьи

Фантастические и полуфантастические конструкции, элементы, похожие на Lego и AirPods, простое управление через смартфон и немножко AR. Довольно любопытный микс от известной нам компании. Подр...
Но если для интернет-магазина, разработанного 3–4 года назад «современные» ошибки вполне простительны потому что перед разработчиками «в те далекие времена» не стояло таких задач, то в магазинах, сдел...
Приветствую вас (лично вас, а не всех кто это читает)! Сегодня мы: Создадим приложение (навык) Алисы с использованием нового (октябрь 2019) сервиса Yandex Cloud Functions. Настроим н...
Конспект отличной, на мой взгляд, книги. Рекомендую всем, кто занимается UX-исследованиями, хочет развивать свой продукт или создать что-то новое. Книга учит, как правильно задавать во...
Тема статьи навеяна результатами наблюдений за методикой создания шаблонов различными разработчиками, чьи проекты попадали мне на поддержку. Порой разобраться в, казалось бы, такой простой сущности ка...