Угадай число
В этом уроке мы изучим основные компоненты Aimylogic, которые понадобятся для создания любого бота. В итоге у нас получится бот, который загадывает случайное число и предлагает пользователю угадать его в процессе диалога.
Поведение бота
Наш диалоговый бот должен загадывать число случайным образом. Далее пользователь выдвигает свое предположение. Если его предположение неверно, то бот должен сказать, больше или меньше число, загаданное ботом, и предложить пользователю попытаться еще раз. И так до тех пор, пока пользователь не отгадает загаданное ботом число. После этого можно предложить сыграть еще раз.
Примеры диалога с этим ботом:
Создание сценария
Зайдите на https://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.
- Поговорим с ботом следующим образом:
Если тестирование работает не так, как на скриншоте, проверьте предыдущие шаги.
Что если я внес изменения в сценарий, а в тестировании все по-старому?
| Если вы хотите внести изменения в сценарий (что-нибудь добавить, удалить или исправить, изменить связи и т. д.) и проверить, как работает новая версия сценария, вам нужно обязательно перезапустить тестирование, то есть, нажать ОСТАНОВИТЬ ТЕСТ и затем снова нажать **Тестировать.
Как начать один и тот же диалог со старта?
Чтобы начать сессию с начала, нажмите на этот значок:
Тогда бот начнет диалог со старта.---12. Если число попадает в диапазон
Если число меньше 100 и больше 1, то выражения в нашем блоке Условия не будут выполняться и бот пойдет по else.
- От else создадим новый блок Условия, в котором напишем:
$num < $NUMBER
$num > $NUMBER
- Назовем этот экран:
сравнение с загаданным числом
В этом блоке условий мы сравниваем число, которое загадал бот (мы записали его в переменную $num
с помощью блока HTTP-запрос) с числом, которое загадал пользователь (это число записано в $NUMBER
).
Вот что у нас получилось:
- Если число меньше
- Кликните на строчку
$num < $NUMBER
и создайте блок Текст:
Мое число меньше! Попробуй еще раз.
- Назовем этот экран:
меньше
- Добавим на экран «меньше» блок Переход и свяжем его с экраном «прием ввода».
- Если число больше
- От условия
$num > $NUMBER
создайте блок Текст:
Мое число больше! Попробуй еще раз.
- Назовем этот экран:
больше
- Добавим на экран «больше» блок Переход и свяжем его с экраном «прием ввода».
- Если введенное пользователем число равно загаданному ботом числу
Если пользователь угадал, то число будет не больше и не меньше, значит, бот пойдет по else.
- Нажмите на else экрана «сравнение с загаданным числом» и создайте блок Текст:
Правильно! Я загадал $num!
- Назовем этот блок:
угадал
- Сыграем еще?
- Добавим на экран «угадал» блок Переход. От этого блока Переход создадим новый блок Текст:
Сыграем еще раз?
- Назовем этот экран:
сыграем еще?
- Добавим на экран «сыграем еще» готовые интенты Согласие, Отказ, Прощание.
Свяжем интент Согласие с экраном «запрос».
- Если пользователь больше не хочет играть
- От интента Отказ экрана «сыграем еще? * создадим блок Текст:
Ну ладно, пока!
- Назовем этот экран:
прощание
- Свяжем интент Прощание с экрана «сыграем еще?» с экраном «прощание»:
- Свяжем интент Отказ экрана «прием ввода» с экраном «прощание»:
- Свяжем интент Прощание экрана «прием ввода» с экраном «прощание»:
- Свяжем интент «Отказ» экрана «играть» с экраном «прощание»:
- Свяжем интент «Прощание» экрана «играть» с экраном «прощание»:
- Если непонятно
Мы не можем предсказать все варианты того, что может написать пользователь. Для этого на блоке Интенты есть вариант Любая другая фраза. Любая другая фраза отрабатывает, когда пользователь написал что-то, что не попадает ни в один интент и не соответствует ни одной кнопке.
- От варианта Любая другая фраза экрана «сыграем еще» создадим новый блок Текст:
Что-то я тебя не понял…
- Назовем этот экран:
сыграем? непонятно
- Добавим на экран «сыграем? непонятно» блок Переход и свяжем его с экраном «сыграем еще».
- От варианта Любая другая фраза экрана «играть» создадим другой новый блок Текст*:
Сейчас было непонятно…
- Назовем этот экран:
начать? непонятно
- Добавьте на экран «начать? непонятно» блок Переход и свяжите его с экраном «играть».
Теперь доработаем вариант Любая другая фраза на экране «прием ввода». Здесь мы запрашиваем число, и Любая другая фраза может отработать, если пользователь не назвал число, сказал что-то, что не содержит числа.
- От Любая другая фраза экрана «прием ввода» создадим блок Текст:
Не вижу в твоем ответе числа…
- Назовем этот экран:
нет числа
- Добавим на экран «нет числа» блок Переход и свяжем его с экраном «назови число».
- Свяжем интент Согласие экрана «прием ввода» с экраном «назови число».
- Добавьте на экран «прощание» блок Интенты, создайте интент, скопируйте и вставьте в него:
* *игр* *
Этот экран будет принимать такие реплики пользователя, как «давай играть», «играть еще», «поиграем», «давай поиграем», «давай поиграем еще раз», «играть еще раз» и т. д.
- Свяжите интент
* *игр* *
с экраном «запрос».
- Свяжем вариант Любая другая фраза экрана «прощание» с экраном «играть».
- Добавьте на экран «прощание» кнопку:
играть
-
Свяжите интент Приветствие с экрана «прием ввода» с экраном «приветствие».
-
Доработаем интенты
Чтобы сделать реакции бота более «живыми» можем добавить дополнительные интенты.
- Например, на экран «играть» в интент Согласие можем добавить такой интент:
* *игр* *
Тогда, если пользователь напишет «ну, давай поиграем», бот также распознает как согласие.
- В интент Отказ на экране «играть» можно добавить интент:
* не * *игр* *
Этот интент может принимать такие реплики, как «не хочу играть», «не буду играть» и т. д.
В процессе тестирования бота вы можете найти «слепые места» бота и добавить нужные интенты в сценарий.
Готово!
Сценарий готов.
Итого:
В этом уроке мы научились
- оперировать базовыми блоками Aimylogic для создания говорящих ботов
- использовать синтаксис шаблонов
- распознавать намерение пользователя с помощью блока Интенты и назначать реакции бота;
- делать запросы к сторонним сервисам и обрабатывать ответы
- создавать нелинейные сценарии, где бот может принимать решения по ходу диалога с пользователем; * делать циклы в сценарии, чтобы бот ходил не только вперед по диалогу, но и назад
- работать с блоком Условия и оперировать переменными
- ну и наконец, просто создали прикольную игру, которую и ребенку не стыдно показать.
Что дальше?
Можете опубликовать бота в канал, например
- во ВКонтакте
- в Алису
- или в Telegram
- Также, можете разместить бота на вашем сайте или подключить другой канал.
Публикация в каналах может требовать доработки, но советы описаны в соответствующих статьях, посвященных каналам. :)