Создание говорящего будильника-викторины, часть 1: введение в Dialogflow

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

Это заставило меня задуматься о том, что, возможно, мне нужно сделать свой собственный говорящий будильник своими руками. не поддерживает «отложить» и б. это гораздо более настойчиво будит меня. Поэтому я решил сделать будильник-викторину, который не позволит мне вернуться в постель, пока я не отвечу на кучу вопросов-викторин.

Чтобы создать это совершенно не бесполезное и раздражающее устройство, я использовал Dialogflow — платформу Google для создания умных чат-ботов — и AIY Voice Kit, набор на базе Raspberry-Pi для создания голосовых устройств.

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

Итак, БУЗЗ БУЗЗ БУЗЗ. ПРИШЛО ВРЕМЯ НАЧАТЬ СОЗДАВАТЬ БУДИЛЬНИК DIALOGFLOW.

Понимание диалогового потока

Dialogflow — это основанная на машинном обучении платформа Google для создания чат-ботов. Вы можете подумать, зачем вам нужен целый фреймворк, не говоря уже о машинном обучении, для создания чат-бота? У ELIZA его не было, и посмотрите, какой она оказалась сообразительной:

Конечно, если вы когда-нибудь звонили на горячую линию службы поддержки и чувствовали ужас, когда вместо человека отвечал бот, вы знаете, насколько разочаровывающими могут быть плохо спроектированные «диалоговые интерфейсы».

Dialogflow (DF) был создан с учетом определенного типа разговора. Пользователь подключается к боту или «агенту» Dialogflow, потому что он пытается выполнить что-то конкретное: забронировать рейс или номер в отеле, узнать часы работы ресторана, проверить статус своего заказа на ужин. Пользователь звонит в вашу службу поддержки или отправляет сообщение вашему боту в Facebook, чтобы выполнить что-то конкретное, и выяснение того, что это за вещь — так называемое «сопоставление намерений» — является одной из основных функций Dialogflow. DF принимает текст или речь пользователя в качестве входных данных, выясняет, чего хочет пользователь, и направляет эти запросы в соответствующий ответ ИЛИ блок кода, необходимый для его выполнения.

Создание диалогового интерфейса будильника

В Google Home вы можете установить будильник, сказав: «Эй, Google, поставь будильник на 8 утра». Вы также можете спрашивать Home такие вещи, как «Окей, Google, когда мой будильник?» и «Окей, Google, отложить!»

Сегодня мы воспроизведем этот «диалоговый интерфейс» в Dialogflow. Мы добавим поддержку установки, перечисления и удаления будильников.

Начало работы

Сначала перейдите на домашнюю страницу Dialogflow и создайте учетную запись. Шаг первый в любом проекте DF — создать нового агента, который более или менее соответствует одному чат-боту. Вы можете сделать это, щелкнув значок шестеренки в левой части пользовательского интерфейса и выбрав Создать нового агента в раскрывающемся списке.

Назовите своего агента (мой называется «SimpleAlarm») и выберите «Создать новый проект Google» в раскрывающемся списке. Это создаст для вас новый проект Google Cloud Platform, который предоставит на серверной части ресурсы, необходимые для запуска вашего агента Dialogflow. Подробнее об этом позже.

Как только ваш агент будет создан, вы сможете начать с ним чат на боковой панели, где написано «Попробуйте сейчас»:

Ууху 🎊! Ваш агент говорит.

Намерения в Dialogflow

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

Логически мы хотим поддерживать три различных типа действий:

  • Установка будильника
  • Список этого будильника
  • Удаление будильника

(Для простоты мы построим это так, чтобы пользователь мог установить только один будильник для каждого типа.)

Каждое из этих действий будет соответствовать Intent в Dialogflow. В пользовательском интерфейсе вы заметите, что ваш агент уже имеет два предустановленных намерения: «Запасное намерение по умолчанию» и «Приветственное намерение по умолчанию».

Давайте исследуем «Приветственное намерение по умолчанию». Это намерение отвечает за реагирование на пользователей, которые так или иначе говорят «Привет». Если вы нажмете на это намерение и прокрутите вниз, вы увидите раздел с надписью «Обучающие фразы»:

Эти фразы представляют собой набор вариаций «привет». Используя эти обучающие фразы (вы можете добавить больше, добавив текст в поле «Добавить пользовательское выражение»), Dialogflow не только сопоставляет эти запросы с «Приветственным намерением», но также использует машинное обучение для распознавания других фразы, похожие на «привет», которые также должны обрабатываться «приветственным намерением». Вот почему, когда я спросил своего агента: «Что происходит, чувак?» раньше он мог ответить «Привет! Могу я чем-нибудь помочь?"

Если вы прокрутите дальше приветственное намерение, вы также увидите раздел «Ответы»:

Здесь вы можете предоставить Dialogflow различные способы ответа пользователю, когда он говорит что-то похожее на «Привет».¹

Создание установки будильника

Агенты Dialogflow инициализируются с двумя встроенными намерениями: приветственным намерением и резервным намерением. Резервное намерение — это ловушка, которая отвечает на все, что она не распознает, что-то вроде: «Я этого не понял. Вы можете сказать это снова?").

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

Создайте новое намерение, нажав «Создать намерение» в верхней правой части пользовательского интерфейса:

Затем назовите свое намерение, например, «setAlarm». Прокрутите вниз и нажмите «Добавить обучающие фразы». В поле с надписью «Добавить выражение пользователя» введите фразу «Установить будильник на 9 утра» и нажмите клавишу ввода:

Вы заметите, что когда ваша новая тренировочная фраза появится ниже, часть «9 утра» будет выделена желтым цветом. Если вы нажмете на эту выделенную желтым цветом часть, вы должны увидеть всплывающее окно, которое, вероятно, говорит @sys.time:time.

Только что произошло то, что Dialogflow распознал объект, в данном случае объект времени. Тегирование сущностей делает две важные вещи. Во-первых, это позволяет Dialogflow распознавать, что запрос пользователя «Установить будильник на 9:00» и пользователь, запрашивающий «Установить будильник на 10:00», по сути, являются одним и тем же запросом, хотя фактическое значение объекта (9:00 против 10:00) различается.

Во-вторых, он извлекает параметры — например, 9 утра — и сохраняет их в переменных, которые мы можем позже использовать в коде. Если вы прокрутите вниз, вы должны увидеть под заголовком «Действие и параметры» новый параметр с именем table. Мы сможем использовать эту переменную позже, когда будем устанавливать будильник.

Добавление обучающих фраз

Далее нам нужно определить некоторые обучающие фразы, которые учат Dialogflow тому, какой тип пользовательских запросов должен соответствовать намерению addAlarm.

Теперь давайте добавим несколько ответов. Прокрутите вниз до области ответов и нажмите «Добавить ответ». Здесь вы можете добавить различные варианты ответов:

Видите ключевое слово $time, которое я использовал в ответах? Это заполняет ответ значением соответствующего параметра с тем же именем. Другими словами, если пользователь говорит: «Поставь будильник на 7 утра», Dialogflow ответит такой фразой: «Понятно, я поставлю тебе будильник на 7 утра».

Обучение вашего агента

Нажмите «Сохранить», и Dialogflow начнет обучение вашего агента, используя предоставленные вами обучающие данные. Это может занять минуту. Когда обучение будет завершено, опробуйте новое намерение в тестовой консоли:

На боковой панели вы можете видеть, что фраза «Разбуди меня в 23:00» соответствует намерению setAlarm 🎊. Это сработало! Обратите также внимание, что в разделе «ПАРАМЕТР» он также автоматически распознал 23:00 как параметр time и сопоставил с 23:00. Довольно аккуратно, если вы спросите меня.

Добавление запроса на обязательный параметр

Пока что наше намерение отлично работает, если пользователь просит нашего бота установить будильник и указывает время. Но что пользователь только что сказал: «Поставь будильник»? В этот момент мы хотим, чтобы наш Агент ответил примерно так: «Хорошо, я поставлю тебе будильник, но на какое время?» К счастью, в Dialogflow есть встроенный механизм для обработки этого случая, который называется «Обязательные параметры».

Перейдите в раздел «Действия и параметры» вашего намерения. Здесь вы должны увидеть time в качестве одного из ваших параметров. Рядом с time установите флажок «Обязательно». Это указывает Dialogflow, что если пользователь не указал время, он должен запросить его у пользователя. Затем вы можете «попросить» пользователя указать время. Нажмите «Определить подсказки…» рядом с параметром «время»:

Здесь вы можете сообщить Dialogflow, как попросить пользователей указать время:

Благодаря этой приятной функции мы можем вернуться в раздел «Обучающие фразы» и добавить еще несколько фраз, в которых не указано время, например:

«Поставь будильник».

"Разбуди меня."

— Можешь поставить мне будильник?

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

Нажмите «Сохранить», подождите, пока ваш агент обучится, и протестируйте его в консоли:

Добавление предупреждений в список и удаление предупреждений

Теперь давайте создадим еще два намерения, точно так же, как мы сделали намерение setAlarm, но для вывода списка существующих сигналов тревоги (назовем его «listAlarm») и для удаления сигнала тревоги (назовем его «deleteAlarm»).

Я не буду приводить здесь весь код, так как он почти идентичен описанному выше намерению setAlarm, но…

Для вашего намерения listAlarm добавьте обучающие фразы, такие как:

  • «Когда мой будильник?»
  • — У меня установлена ​​сигнализация?
  • «Когда мое напоминание?»

и любые другие, о которых вы думаете. Когда это намерение совпало, мы будем использовать код (!), чтобы проверить, на какое время установлен будильник, и динамически реагировать на пользователя. Но это для следующего поста. А пока просто установите ответ для этого намерения примерно так: «Я еще не поддерживаю эту функцию!»

Для deleteAlarm добавьте обучающие фразы, например:

  • «Удалить мой будильник».
  • «Сними сигнализацию».
  • «Отменить напоминание».

Установите ответы на что-то вроде: «Хорошо, я отменил ваш будильник».

Поздравляем, часть Dialogflow вашего будильника — диалоговый пользовательский интерфейс — готова! Если вам это не помогло (или вы хотите сэкономить время), вы также можете импортировать моего заархивированного агента прямо в Dialogflow.

Вы можете думать об этом как о внешнем интерфейсе приложения. Конечно, серверная часть, код, который на самом деле отслеживает наши будильники и устанавливает их, еще не создан. Но не волнуйтесь, мы вернемся к этому в следующем посте. А пока наслаждайтесь блаженным непрерывным сном — пока можете. ⏰

Отсутствует важная информация в этом сообщении? Оставьте комментарий ниже, и я постараюсь заполнить его.

  1. Вы также можете динамически генерировать ответ Dialogflow в коде с помощью Fulfillments. Но об этом в следующем посте!