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

Поведение бота

Наш диалоговый бот должен загадывать число случайным образом. Далее пользователь выдвигает свое предположение. Если его предположение неверно, то бот должен сказать, больше или меньше число, загаданное ботом, и предложить пользователю попытаться еще раз. И так до тех пор, пока пользователь не отгадает загаданное ботом число. После этого можно предложить сыграть еще раз.

Примеры диалога с этим ботом:





Создание сценария

Зайдите на app.aimylogic.com. Создайте новый аккаунт или войдите в свой аккаунт.

Нажмите "Создать бота или обзвон" чтобы создать новый сценарий:



Дайте сценарию название, выберите русский язык и нажмите Продолжить.



Разработаем сценарий

Бот работает согласно сценарию, который вы разработаете. Вы можете контролировать конкретное поведение бота, внося изменения в сценарий.

Приветствие

Наш бот при старте должен рассказать пользователю правила игры и предложить сыграть. Чтобы добавить сообщение с приветствием

Стартовый экран - это экран, который находится слева и наверху. Бот всегда будет начинать общение с этого экрана.

Чтобы добавить приветствие, нажмите Текст.



Это создаст блок Текст. Напишем в нём:

Привет!



Нажмите Сохранить, чтобы добавить этот блок.



У нас появился стартовый экран с блоком Текст, в котором сообщение "Привет!".



Как добавлять название для экрана?

Для удобства добавим этому экрану метку - название сценария.

Для этого кликните на знак # в верхней строке экрана



Введите название экрана:

приветствие



И выберите цвет



Экрану добавлено название:



Переходим к следующему экрану

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

Нажмите + БЛОК и выберите блок Переход







Подробнее о блоке Переход читайте здесь.

Предложение поиграть

Добавим предложение поиграть в "Угадай число".

Нам нужно, чтобы бот после приветствия перенаправлял на предложение поиграть, для этого мы и используем блок Переход. Чтобы создать связь, кликните на сам блок Переход:



Появится окно выбора блока. Выберите Текст


Напишем в нём:

Сыграем в "Угадай число"?


Назовём этот экран:

играть



Принимаем ответ пользователя

Добавьте на экран "играть" блок Интенты. Этот блок принимает ввод пользователя. Блок Интенты должен быть на всех экранах, где вы ожидаете, что пользователь что-то напишет.

Подробнее о блоке Интенты читайте здесь.

В Aimylogic уже есть готовые интенты, созданные для вашего удобства. Они содержат популярные фразы, сортированные по намерениям пользователя.

Подробнее о Готовых интентах читайте здесь.

Нажмите Выбрать готовый интент



Выделите готовые интенты - Согласие, Отказ и Прощание:



Нажмите Выбрать



Затем нажмите Сохранить:





Добавим экран "играть" кнопку "Давай!".

Подробнее о кнопках читайте здесь.

Нажмите + КНОПКА, введите текст:

Давай!

И нажмите Enter, либо кликните на свободном месте экрана.



Загадаем число

Чтобы сгенерировать случайное число, нам понадобится сторонний сервис, который умеет выдавать случайное число по запросу. Таким сервисом может выступить сайт random.org, который умеет генерировать истинно случайные числа и события. У этого сайта есть API, с помощью которого наш бот может получить случайное число. Мы можем использовать этот API с помощью блока HTTP-запрос.

Нажмите на интент Согласие.

Таким образом мы создадим связь от интента Согласие и определим, что будет делать бот, когда пользователь скажет "да", "хорошо", "давай", "ладно" и т.д.



Выберите блок HTTP-запрос.

Оформим вопрос следующим образом:

Метод GET

В поле URL скопируйте и вставьте:

https://www.random.org/integers/?num=1&min=1&max=100&col=1&base=10&format=plain&rnd=new



В этом URL мы указали, что будем выдавать случайное число от 1 до 100.

Если открыть этот адрес в браузере, то вы увидите, что он просто возвращает некоторое целое число от единицы до сотни. Если перезагрузить страницу, то появится новое случайное число, Как раз то, что нам нужно.



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

Переменные - это как коробки, в которые мы что-то кладём, какую-то информацию. Для порядка удобно подписать коробки, поэтому каждая переменная имеет своё имя.

В Aimylogic мы пишем переменные используя $, а затем имя переменной. Регистр имеет значение - переменные $number и $NUMBER - это разные переменные.

Подробнее о переменных читайте здесь.

На вкладке RESPONSE нажмите +. Скопируйте и вставьте в поля:

Имя переменной:

num



В поле Значение скопируйте и вставьте:

parseInt($httpResponse)

Что здесь происходит?

После HTTP запроса Aimylogic сохраняет ответ сервиса random.org в системную переменную $httpResponse. Но сервис random.org возвращает текст, а нам нужно целое число, чтобы мы могли сравнивать с ним число пользователя (строка и число - разные типы данных в Javascript). Поэтому нам нужно сначала преобразовать текстовый ответ сервиса в целое число. Для этого в Javascript есть функция parseInt, которой мы и воспользуемся.

Передадим в функцию parseInt весь ответ от сервиса - так мы преобразуем строку в число. Затем мы записываем это значение в переменную, которую указали в поле ?? и сохраним его в переменную $num.

Поля BODY и HEADERS заполнять не нужно.

Нажмите Сохранить



Назовём этот экран:

запрос





А теперь угадывай!

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

Кликните на вариант Завершен успешно блока HTTP-запрос и создайте блок Текст. В нём напишите:

Я загадал число от 1 до 100. Угадай, какое!

Назовём этот экран:

загадал

И добавим на экран "загадал" блок Переход:

Вот что у нас получается:



Примем ввод пользователя

От блока Переход создайте новый блок Интенты.

Нажмите Создать интент. Скопируйте и вставьте:

* $NUMBER *




$NUMBER - системная переменная, которая принимает числа. При этом числа можно называть как цифрами - 1, 3, 99, так и словами - один, три, девяносто девять.

Звёздочки означают, что перед и после $NUMBER могут быть любые слова. Таким образом, бот сможет понять, если пользователь скажет что-то вроде "Наверное, пять". Бот достанет оттуда "пять".

Подробнее о звёздочках и других способах принимать ввод в интентах читайте в статье о синтаксисе шаблонов.

Затем нажмите ВЫБРАТЬ ГОТОВЫЙ ИНТЕНТ и выберите готовые интенты - Согласие, Отказ, Приветствие, Прощание.



Таким образом, мы предусматриваем различную реакцию пользователя, и далее скажем боту, что делать в ответ на такие реплики.

Нажмите Выбрать и Сохранить

Назовём этот экран:

прием ввода

Вот что у нас получилось:



Мы вывели блок Интенты на отдельный экран, чтобы было удобно перенаправлять сюда в дальнейшем.

Проверяем диапазон числа

Нам нужно убедиться, что пользователь ввёл число, которое не больше 100 и не меньше 1.

Нажмите на интент * $NUMBER * и создайте блок Условия.

Блок Условия используется, когда нужно добавить нелинейности в диалог. Вы можете написать строку Javascript выражения в строку условия. В зависимости от выполнения того или иного условия бот переходит на разные экраны. Если условие в блоке Условия выполняется (если оно "true"), то бот переводит согласно связи от этого выражения. Если не выполняется ни одно выражения (они все "false"), то бот проверяет выражения ниже. Если ни одно из выражений не верно, то бот переходит по else. Условия выполняются сверху вниз. Это значит, что если верхнее условие выполнено, бот уходит по связи от него и игнорирует условия внизу.

В блоке Условия можно указать несколько js выражений- несколько веток диалога. В нашем случае у нас будет три ветки: когда указанное пользователем число больше 100, когда оно меньше 1. Ну, и третий - когда число не меньше 1 и не больше 100, то есть, else, которое добавляется автоматически.

Подробнее о блоке Условия читайте здесь.

Скопируйте и вставьте в блок Условия:

$NUMBER > 100



Нажмите + Условие и добавьте ещё одну строку:

$NUMBER < 1



Нажмите Сохранить.

Назовём этот экран:

диапазон

Вот что у нас получилось:



Переместим экраны для компактного отображения. Чтобы переместить экран, наведите указатель на левый верхний угол экрана и потяните:





Если число не попадает в диапазон

Если пользователь назвал число больше 100 или меньше 1, нам нужно выдать сообщение о том, что нужно ввести число, попадающее в диапазон.

Поэтому от условия $NUMBER > 100 создадим блок Текст, в котором напишем:

Назови число от 1 до 100!



Назовём этот экран:

назови число

Свяжите условие $NUMBER < 1 (если число меньше одного) с экраном "назови число". Чтобы связать существующий экран с другим экраном, нажмите на круг и протяните стрелочку к целевому экрану:







На экран "назови число" добавьте блок Переход и свяжите его с экраном "прием ввода":



Вот что у нас получилось:



Таким образом, когда пользователь назовёт число "двести" или "ноль", бот скажем "Назови число от 1 до 100!". Затем, так как бот перевел пользователя на экран с интентами, бот сможет снова принять реплику пользователя.

Протестируем

Мы можем проверить, что всё работает так, как мы задумали. Конечно, полностью еще сценарий не готов, но можем проверить, что работает то, что мы разработали.

Нажмите Тестировать. Откроется тестовый виджет.



Сейчас у нас разработана только ветка, которая сообщает, что число не попадает в диапазон. Поэтому будем называть числа больше 100 и меньше 1.

Поговорим с ботом следующим образом:



Если тестирование работает не так, как на скриншоте, проверьте предыдущие шаги.


Что если я внёс изменения в сценарий, а в тестировании всё по-старому?

Если вы хотите внести изменения в сценарий (что-нибудь добавить, удалить или исправить, изменить связи и т.д.) и проверить, как работает новая версия сценария, вам нужно обязательно перезапустить тестирование, то есть, нажать ОСТАНОВИТЬ ТЕСТ и затем снова нажать Тестировать.




Как начать один и тот же диалог со старта?

Чтобы начать сессию с начала, нажмите на этот значок:



Тогда бот начнёт диалог со старта.

Если число попадает в диапазон

Если число меньше 100 и больше 1, то выражения в нашем блоке Условия не будут выполняться и бот пойдёт по else.

От else создадим новый блок Условия, в котором напишем:

$num < $NUMBER

$num > $NUMBER



Назовём этот экран:

сравнение с загаданным числом

В этом блоке условий мы сравниваем число, которое загадал бот (мы записали его в переменную $num с помощью блока HTTP-запрос) с числом, которое загадал пользователь (это число записано в $NUMBER).



Вот что у нас получилось:



Если число меньше

Кликните на строчку $num < $NUMBER и создайте блок Текст:

Мое число меньше! Попробуй еще раз.

Назовём этот экран:

меньше



Добавим на экран "меньше" блок Переход и свяжем его с экраном "прием ввода".



Если число больше

От условия $num > $NUMBER создайте блок Текст:

Мое число больше! Попробуй еще раз.

Назовём этот экран:

больше



Добавим на экран "больше" блок Переход и свяжем его с экраном "прием ввода".



Если введенное пользователем число равно загаданному ботом числу

Если пользователь угадал, то число будет не больше и не меньше, значит, бот пойдёт по else.

Нажмите на else экрана "сравнение с загаданным числом" и создайте блок Текст:

Правильно! Я загадал $num!

Назовём этот блок:

угадал



Сыграем ещё?

Добавим на экран "угадал" блок Переход. От этого блока Переход создадим новый блок Текст:

Сыграем ещё раз?

Назовём этот экран:

сыграем еще?



Добавим на экран "сыграем еще" готовые интенты Согласие, Отказ, Прощание.

Свяжем интент Согласие с экраном "запрос".



Если пользователь больше не хочет играть

От интента Отказ экрана "сыграем еще? создадим блок Текст:

Ну ладно, пока!

Назовём этот экран:

прощание



Свяжем интент Прощание с экрана "сыграем еще?" с экраном "прощание":


Свяжем интент Отказ экрана "прием ввода" с экраном "прощание":


Свяжем интент Прощание экрана "прием ввода" с экраном "прощание":


Свяжем интент "Отказ" экрана "играть" с экраном "прощание":


Свяжем интент "Прощание" экрана "играть" с экраном "прощание":


Если непонятно

Мы не можем предсказать все варианты того, что может написать пользователь. Для этого на блоке Интенты есть вариант Любая другая фраза. Любая другая фраза отрабатывает, когда пользователь написал что-то, что не попадает ни в один интент и не соответствует ни одной кнопке.

От варианта Любая другая фраза экрана "сыграем ещё" создадим новый блок Текст:

Что-то я тебя не понял...

Назовём этот экран:

сыграем? непонятно


Добавим на экран "сыграем? непонятно" блок Переход и свяжем его с экраном "сыграем ещё".



От варианта Любая другая фраза экрана "играть" создадим другой новый блок Текст:

Сейчас было непонятно...

Назовём этот экран:

начать? непонятно


Добавьте на экран "начать? непонятно" блок Переход и свяжите его с экраном "играть".



Теперь доработаем вариант Любая другая фраза на экране "прием ввода". Здесь мы запрашиваем число, и Любая другая фраза может отработать, если пользователь не назвал число, сказал что-то, что не содержит числа.

От Любая другая фраза экрана "прием ввода" создадим блок Текст:

Не вижу в твоём ответе числа...

Назовём этот экран:

нет числа

Добавим на экран "нет числа" блок Переход и свяжем его с экраном "назови число".


Свяжем интент Согласие экрана "прием ввода" с экраном "назови число".


Добавьте на экран "прощание" блок Интенты, создайте интент, скопируйте и вставьте в него:

* *игр* *



Этот экран будет принимать такие реплики пользователя, как "давай играть", "играть ещё", "поиграем", "давай поиграем", "давай поиграем ещё раз", "играть ещё раз" и т.д.

Свяжите интент * *игр* * с экраном "запрос".



Свяжем вариант Любая другая фраза экрана "прощание" с экраном "играть".



Добавьте на экран "прощание" кнопку:

играть



Свяжите интент Приветствие с экрана "прием ввода" с экраном "приветствие".

Доработаем интенты

Чтобы сделать реакции бота более "живыми" можем добавить дополнительные интенты.

Например, на экран "играть" в интент Согласие можем добавить такой интент:

* *игр* *



Тогда, если пользователь напишет "ну, давай поиграем", бот также распознает как согласие.

В интент Отказ на экране "играть" можно добавить интент:

* не * *игр* *


Этот интент может принимать такие реплики, как "не хочу играть", "не буду играть" и т.д.

В процессе тестирования бота вы можете найти "слепые места" бота и добавить нужные интенты в сценарий.

Готово!

Сценарий готов.

Итого:

В этом уроке мы научились

оперировать базовыми блоками Aimylogic для создания говорящих ботов;
использовать синтаксис шаблонов;
распознавать намерение пользователя с помощью блока Интенты и назначать реакции бота;
делать запросы к сторонним сервисам и обрабатывать ответы;
создавать нелинейные сценарии, где бот может принимать решения по ходу диалога с пользователем;
делать циклы в сценарии, чтобы бот ходил не только вперед по диалогу, но и назад;
работать с блоком Условия и оперировать переменными;
ну и наконец, просто создали прикольную игру, которую и ребенку не стыдно показать. :-)

Что дальше?

Можете опубликовать его в канал. Например, в вк, в фейсбук, в Алису или в Телеграм. Также, можете разместить бота на вашем сайте или подключить другой канал.

Публикация в каналах может требовать доработки, но советы описаны в соответствующих статьях, посвященных каналам.
Была ли эта статья полезна?
отменить
Спасибо!