Поддержка русского языка
Это часть серии статей, посвященной созданию многоязычного бота.
- Принцип работы
- Маршрутизация запросов
- Поддержка русского языка (вы находитесь здесь)
- Поддержка других языков
- Публикация в канал
В этом разделе мы создадим бота на русском языке — второй составляющей бота, который будет понимать несколько языков одновременно.
В JAICP вновь создайте новый проект, в качестве языка NLU для данного проекта выберите русский. Перейдите в раздел NLU.
Наполнение интентов
Бот для данного пошагового сценария будет запрашивать имя клиента и номер комнаты для бронирования.
Создайте через интерфейс NLU два интента:
/hello
— интент для обработки приветствия. Добавьте для него такие тренировочные фразы, как добрый день, здравствуйте, привет./book
— интент, обрабатывающий запросы о бронировании комнаты по номеру. Включите для данного интента слот-филлинг, после чего настройте по образцу того, как показано ниже.
Сценарий
Дескриптор сценария
Перейдите на вкладку Редактор для написания кода сценария.
В конфигурации каждого одноязычного бота необходимо задать ISO-код языка, который он поддерживает. Добавьте этот параметр в раздел injector
файла chatbot.yaml
, чтобы он стал доступен из сценария.
injector:
currentLanguage: ru
Функции
Создайте в папке src
файл routerClient.js
. Функции из этого файла будут отвечать за взаимодействие с ботом-роутером.
function isSameLanguage(ctx) {
return $caila.detectLanguage([ctx.request.query])[0] === ctx.injector.currentLanguage;
}
function returnToRouter(ctx, data, targetState) {
data = data || {};
targetState = targetState || "/Redirect";
ctx.response.replies = ctx.response.replies || [];
ctx.response.replies.push({
type: "context-return",
state: targetState,
data: data
});
}
-
Функция
isSameLanguage
вызывает метод$caila.detectLanguage
для определения языка и проверяет, совпадает ли результат вызова с языком, заданным по умолчанию вinjector
. -
Функция
returnToRouter
возвращает контекст на бота-роутера при помощиcontext-return
. По умолчанию делается переход в стейт/Redirect
.
Код сценария
В файле main.sc
разместите код сценария бота на русском языке.
require: name/name.sc
module = sys.zb-common
require: slotfilling/slotFilling.sc
module = sys.zb-common
require: routerClient.js
theme: /
state: Start
q!: $regex</start>
go!: /Hello
state: Hello
intent!: /hello
a: Здравствуйте! Как вас зовут?
state: Name
q: * $Name *
a: Очень приятно, {{$parseTree._Name.name}}!
script:
$session.booking = $session.booking || {};
$session.booking.name = $parseTree._Name.name;
go!: /Book
state: Book
a: Уточните номер комнаты, которую вы хотели бы забронировать.
state: Yes
intent: /book
a: Комната номер {{$parseTree._Room}} забронирована.
script:
$session.booking = $session.booking || {};
$session.booking.room = $parseTree._Room;
state: NoMatch || noContext = true
event!: noMatch
if: isSameLanguage($context)
a: Извините, я вас не понял.
else:
script: returnToRouter($context, $session.booking);
- В начале подключаются все необходимые зависимости. В данном случае это справочник имен и модуль слот-филлинга из
zb-common
, а также созданный ранее файлrouterClient.js
. - Стейты
/Start
и/Hello
отвечают соответственно за технический запуск бота и за обработку приветствия. - Во вложенном стейте
Name
происходит обработка имени, распознанного при помощи паттерна$Name
, и сохранение информации об имени в сессионные данные. - Стейт
/Book
и вложенный стейтYes
предназначены для уточнения номера комнаты при помощи слот-филлинга. Названный номер также записывается в$session
.
Обратим особое внимание на реализацию стейта /NoMatch
для обработки нераспознанных запросов. Сначала производится проверка, совпадает ли язык запроса с языком бота. При их несовпадении контекст возвращается боту-роутеру с передачей всех данных, которые были ранее записаны в $session.booking
.
/Redirect
. К нему привязан обработчик processRequest
, который повторно определяет язык запроса и в зависимости от результата либо переключает контекст на другого одноязычного бота, либо сообщает, что поддержка данного языка не предусмотрена.Подключение к роутеру
После сохранения всех изменений перейдите на вкладку Каналы и опубликуйте сценарий в любом канале, например в чат-виджете.
Из свойств канала скопируйте идентификатор бота (botId
), перейдите в проект бота-роутера и вставьте идентификатор в раздел injector
дескриптора сценария, например:
injector:
bots:
ru: "250555190-booking_ru-250555190-zNt-16011310957"
en: ""
Теперь бот опубликован и подключен к роутеру. На следующем шаге мы напишем полностью аналогичного бота на английском языке.