Раз, Два, Три! Чат-бот из Google Таблицы на примере PvP-игры для Алисы

Чат Бот на русском языке

Изначально я родился со знанием лишь английского языка, но со временем я стал понимать и русский язык, ведь В России столько много людей, которые хотят пообщаться со мной.

Три! Синхронизация

Отправка/получение данных от веб-приложения занимает время, а Алисе не терпится дать ответ пользователю, поэтому в дело вмешиваются вопросы синхронизации. Естественно, для больших проектов в качестве бекенда навыка Алисы Google Таблицы не подходят: время ответа увеличивается при большом количестве параллельных запросов. Тем не менее существуют рекомендации по оптимизации чат-бота, которые позволяют сделать небольшой проект жизнеспособным в условиях диалоговой системы реального времени. Таймаут синхронного протокола Алисы — 1,5 секунды на ответ. Если сервер не успевает выдать ответ за это время, пользователь видит грустное сообщение в духе “Извините, <имя диалога> не отвечает”. Никаких подсказок, что делать дальше, система не предлагает. Чтобы избежать такой ситуации, можно и нужно ускорять сервис, а также отслеживать и обрабатывать таймауты. Наиболее длительные операции при работе скрипта игры — чтение и запись данных таблицы. Поэтому, во-первых, количество эти операций нужно минимизировать, а во-вторых, желательно их распараллелить. Зачитать данные таблицы достаточно один раз. После исполнения логики скрипт готов выдать пользователю ответ сразу, до окончания записи результатов. На получение ответа следует отвести ограниченное время — например, 1100 мс:

$request_params = array(   'userId' => $user_id,    'utterance' => $utterance,   'channel' => 'alice' );   $get_params = http_build_query($request_params);  $ctx = stream_context_create(array('http'=>     array(         'timeout' => 1.1     ) ));  $answer = file_get_contents('https://script.google.com/macros/s//exec?'. $get_params, false, $ctx); 

Если ответ GET-запросом получен вовремя, мы можем отдать его пользователю и инициировать сохранение результатов POST-запросом в фоновом режиме. В противном случае мы отдаём пользователю текст-заглушку с кнопками для продолжения, а результаты исполнения скрипта игнорируем, чтобы пользователь мог повторить свой запрос в текущем контексте.

if($answer === FALSE) { $text = ' Помедленнее, я не успеваю.'; $tts = 'Помедленнее, я не успеваю.'; } else {      $answer = json_decode($answer);             $text = $answer->text;     $tts = $answer->tts;      //сохранение в таблице     $data2store = $answer->data;             $postdata = json_encode(array(           'data' => $data2store       ));    $opts = array('http' =>       array(           'method'  => 'POST',           'header'  => 'Content-Type: application/json',           'content' => $postdata,           'timeout' => 0.1       )   );            $context  = stream_context_create($opts);   file_get_contents("https://script.google.com/macros/s//exec", false, $context); } 

a1ezodgm9tqdt2gudd7vfes9bn0.png В многопользовательской игре для Алисы должны быть решены задачи синхронизации как между серверами игры и Яндекса, так и между игроками. Если игрок хочет играть против другого пользователя, игра сама подбирает соперника — из тех, кто хотел играть в последнее время. Пользователи должны подтвердить готовность играть друг с другом, чтобы игра началась. На текущий момент навык не может инициировать отправку сообщения пользователю Алисы. Поэтому в скрипте игры предусмотрена проверка готовности соперника и отведённой под раунд игры минуты. Если соперник задерживает игру, пользователю предлагается подождать его: “Подождём соперника ещё чуть-чуть?” Соглашаясь подождать, пользователь запускает очередную проверку. Если минута игры заканчивается, игра завершается.

Можно ли поговорить с Siri-ботом онлайн?

Чтобы полноценно работать, Siri нужен доступ в сеть. ladyx.ch. По сути вы общаетесь с чат-ботом в онлайн режиме, но отдельной программы или сайта для подобного нет. Сири работает только на девайсах бренда Apple и в родной ОС. Предлагаемые на сайтах варианты — боты, имитирующие программу, никак к Сири не относятся, разве что оформление интерфейса скопировано с точностью. Боты, заменяющие Сири, не соответствуют по выполняемым командам, уступают в словарном запасе и создают минимальное приближение к программе. Оболочка интерфейса графически скопирована, но это — единственное сходство. Устанавливая ПО такого типа, пользователь рискует получить в комплекте вредоносный вирус, замаскированный под кейген-крак. Ограничьтесь Сири на айфоне и не устанавливайте имитации, как бы не хвалили.

depositphotos_179017866_l-2015-300x225.jpg

Раз! Диалог

Игра начинается с правил. Я придумал такие: каждый из двух игроков сперва размещает за тремя дверями сокровище и ловушку, а затем открывает любую из дверей соперника. Открываете сокровище — получаете монеты соперника, открываете ловушку — отдаёте монеты ему. Количество монет, от 1 до 3, определяет сам игрок. За оставшейся дверью находится ящик Пандоры, открыв который можно найти/потерять случайное количество монет. Играть можно как с Алисой, так и против других пользователей. Интерфейс Алисы решён в виде диалога, и всё игровое взаимодействие должно быть реализовано через обмен сообщениями. Обработка каждого сообщения сервером игры представляется следующими шагами:

  1. восстановление контекста пользователя;
  2. интерпретация запроса в восстановленном контексте;
  3. формирование ответного сообщения;
  4. сохранение изменившегося контекста пользователя.

Восстановление и сохранение контекста пользователя

Контекст пользователя включает его состояние в игре, в том числе предыдущие результаты, шаг внутри сценария и текущего соперника, а также имя пользователя и прочую информацию, необходимую для игровой логики. В каждом запросе, согласно протоколу, Алиса передаёт идентификатор пользователя. Этого достаточно для сохранения и последующего восстановления его контекста. В качестве хранилища данных возьмём Google Таблицы. К объективным преимуществам этого решения относятся бесплатное использование, наглядность и простота эксплуатации. Встроенный редактор скриптов позволяет описывать логику игры на Apps Script (базирующемся на JavaScript), обращаясь к API таблиц, и публиковать её в виде web-приложения. Создав таблицу с нужными заголовками, можно перейти к редактору скриптов:jdrhbosnzge_mq5ms5h0oqnsnqo.png Логику игры можно описать в проекте на Apps Script, организовав её в виде набора gs-файлов, и перейти к публикации:nkw0kn0ghmmskohgbtk_nefgc3o.png При публикации нужно указать доступность приложения анонимным пользователям: На выходе вы получите URL опубликованного веб-приложения. Функции doGet() и doPost() в скрипте будут обрабатывать запросы соответствующих типов, чтобы получать и сохранять контексты пользователей. Ниже схема работы с API таблиц для оперирования данными:

    //получение листа     var sheet = SpreadsheetApp.openById("").getSheetByName("<название вкладки>");    //получение диапазона     var range = sheet.getRange(<нужные ячейки>);    //извлечение данных диапазона     var values = range.getValues();    //сохранение данных в диапазон     range.setValues(<нужные данные>); 

Интерпретация запроса в восстановленном контексте

В общем случае корректная интерпретация текстовых запросов требует использования интеллектуальных NLU-алгоритмов. И хотя такие алгоритмы доступны в несложных инструментах вроде описанного мной Aimylogic, в этом случае от обработки естественного языка я решил отказаться в пользу простоты. В предложенной игре взаимодействие игрока с Алисой ограничивается десятком возможных состояний и может быть сведено к небольшому набору намерений. Для простоты я всегда предлагаю игроку три возможных действия: отправить “Раз”, “Два” или “Три”. На любой другой запрос Алиса просит уточнить действие. Сценарий в этом случае сводится к следующему коду на Apps Script:

//для каждого состояния в игре switch(user.state){     case "start":       //прописываем реакцию на каждое из возможных действий       switch(utterance){         case “1️⃣ Раз”:         case “2️⃣ Два”:         case “3️⃣ Три”:           //формируем ответ на ожидаемые действия         default:           //формируем ответ на неожиданное действие       }       break;    //здесь все другие состояния     default:      //формируем ответ на случай непредвиденного состояния } 

Для пользователя решённое таким образом взаимодействие представляется как выбор одного из трёх вариантов, смысл которых явно определён в каждом ответе Алисы. Сами варианты представлены кнопками “Раз”, “Два”, “Три”, которые существенно ускоряют игровой процесс.

Формирование ответного сообщения

Ответ Алисы состоит из нескольких частей, каждую из которых нужно сформировать, в том числе:

  • текст для отображения на экране;
  • текст для синтеза речи;
  • набор кнопок-подсказок.

Недавно я сформулировал концепцию ЛЁГКОГО диалога, описывающую принципы проектирования разговорного интерфейса в том числе для Алисы. Формат ответа Алисы позволяет реализовать эти принципы. Так разделение отображаемого и проговариваемого текста позволяет сделать ответы более краткими и естественными. Можно не заставлять Алису синтезировать длинный текст, с которым пользователь уже знаком, а также использовать emoji в тексте сообщения и названии кнопок. Кнопки-подсказки реализуют принцип инициативы: Алиса всегда обозначает и предлагает возможные действия для продолжения диалога. В сценарии предложенной игры список кнопок не зависит от контекста и добавляется к каждому сообщению. Итак, у нас есть Google Таблица с данными пользователей, которые сохраняются и получаются через URL веб-приложения. Приложение написано на Apps Script, оно интерпретирует действие пользователя в соответствии с его контекстом и формирует данные для ответного сообщения. Осталось подключиться к Алисе…

Как общаться с Siri

Удержите нажатием кнопку «Home» и режим бота включится. Теперь отдавайте команды или говорите об интересующих вещах. Если этой кнопки нет, нажмите боковую на корпусе или произнесите «привет, Сири». Если на девайсе установлена минимум iOS 8.3 beta 2 — разговаривайте с чат-ботом на русском. Если ОС старше — заучите английские команды для будильника, мессенджера и телефонной книги.

depositphotos_11988845_l-2015-300x199.jpg

Если Сири не включена по умолчанию или при первом запуске устройства, то включить ее можно так:

  • перейдите в меню setup;
  • выберите setting;
  • откройте Siri;
  • переставьте слайдеры на включение;
  • при необходимости разрешите функцию «Hi, Siri» и установите русский язык.

Потребуется перезагрузка девайса.

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий