Расширение сценария
Это часть серии статей, посвященной созданию исходящего обзвона с использованием NLU.
- Настройка подключения
- Разработка бота
- Запуск обзвона
- Аналитика по диалогам
- Расширение сценария (вы находитесь здесь)
- Тестирование
На данном шаге рассмотрим, как дополнить сценарий нашего обзвона следующими возможностями:
Перезвон
Нередки случаи, когда клиентам неудобно разговаривать в то время, когда им позвонил бот, и требуется осуществить вызов повторно.
Настройка интента
Сперва поддержим соответствующий класс запросов в NLU.
- Перейдите в NLU > Сущности > Системные и включите сущность
@duckling.timeдля распознавания даты и времени. - Перейдите в NLU > Интенты и добавьте новый интент
/Перезвонитесо следующими настройками:

В Тренировочные фразы включите примеры как с упоминанием даты и времени, так и без него. Вместо указания конкретного времени используйте название системной сущности @duckling.time.
Далее активируйте для данного интента слот-филлинг с одним обязательным слотом dateTime, соответствующим сущности @duckling.time, и добавьте несколько уточняющих вопросов, например:
- Когда вам перезвонить?
- Когда можно будет позвонить?
- Когда я могу вам позвонить?
Обязательность слота гарантирует, что обработчик интента не сработает до тех пор, пока клиент не назовет желаемое время перезвона.
Конфигурация слот-филлинга
Перейдем в редактор сценариев. Сперва откройте конфигурационный файл chatbot.yaml и дополните его полем injector, в котором укажите настройки прерывания слот-филлинга:
injector:
slotfilling:
maxSlotRetries: 3
stopOnAnyIntent: false
stopOnAnyIntentThreshold: 0.2
В данном случае параметр maxSlotRetries: 3 означает, что бот дважды переспросит время перезвона, если не распознает его в ответах. Если клиент назовет некорректное время в третий раз, слот-филлинг прервется, а запрос попадет в стейт /Симптомы/Ответ по активатору event!: noMatch.
Возможность прерывания по интенту для данного сценария не играет роли, поскольку других стейтов с глобальными интентами в сценарии нет. Поэтому параметры stopOnAnyIntent и stopOnAnyIntentThreshold установлены в соответствии с поведением по умолчанию.
Дополнение сценария
Осталось подключить в main.sc модуль слот-филлинга и добавить в корневую тему theme новый стейт:
require: slotfilling/slotFilling.sc
module = sys.zb-common
theme: /
state: Перезвоните
intent!: /Перезвоните
a: Хорошо, перезвоню вам позже!
script:
$dialer.setCallResult("Просьба перезвонить");
$dialer.redial({startDateTime: new Date($parseTree._dateTime.timestamp)});
go!: /Прощание
Метод $dialer.redial запланирует новый звонок с учетом нужного времени и включит его в обзвон.
Перебивание
Не всегда целесообразно ждать, когда бот закончит говорить, чтобы дать клиенту возможность ответить. Чтобы клиент мог перебивать бота, настройте в сценарии прерывание речевого потока.
Между подключением модуля слот-филлинга и объявлением корневой темы добавьте блок init, в котором установите обработчик postProcess:
init:
bind("postProcess", function(ctx) {
ctx.response.bargeIn = {
bargeIn: "forced",
bargeInTrigger: "interim",
noInterruptTime: 1000
};
}, "/");
В данном случае:
bargeIn: "forced"означает, что в случае прерывания бот не договаривает реплику до конца и прерывается сразу;bargeInTrigger: "interim"— режим прерывания с промежуточными результатами распознавания;- установка времени
noInterruptTimeв 1 000 миллисекунд значит, что в течение 1 секунды после начала ответа перебить бота нельзя. Это полезно для защиты от случайных шумов.
Обработчик postProcess в данном случае привязан к корневой теме, то есть ко всем стейтам сценария. Для более тонкой настройки перебивания воспользуйтесь методом $dialer.bargeInResponse.
Воспроизведение аудио
В качестве ответа бота можно использовать предзаписанные аудиофайлы — например, чтобы вместо синтезированной речи использовать записи диктора. Для вывода используется тег audio.
Допустим, что записана реплика Кажется, проблемы со связью, а аудиофайл размещен по адресу https://example.com/comms-issue.wav. Тогда в стейте /NoInput замените строку
a: Кажется, проблемы со связью.
на
audio: https://example.com/comms-issue.wav
Перейдем к тестированию разработанного сценария.