Перейти к основному содержимому

Поддержка русского языка

Это часть серии статей, посвященной созданию многоязычного бота.

  1. Принцип работы
  2. Маршрутизация запросов
  3. Поддержка русского языка (вы находитесь здесь)
  4. Поддержка других языков
  5. Публикация в канал

В этом разделе мы создадим бота на русском языке — второй составляющей бота, который будет понимать несколько языков одновременно.

В 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: ""

Теперь бот опубликован и подключен к роутеру. На следующем шаге мы напишем полностью аналогичного бота на английском языке.