Press "Enter" to skip to content
Попробовать

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

0

Расскажем, как финтех-проект группы 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

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

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

Leave a Reply

%d bloggers like this: