Это будут три разных сущности, которые нам необходимо идентифицировать и извлечь из запроса клиента.
Если клиент говорит: «Можно мне пиццу?», нам нужно настроить агента запросить дополнительную информацию, необходимую для отправки заказа в бэкэнд-систему, ответственную за размещение заказов.
Как мы можем собрать эти недостающие фрагменты информации?
Для этого мы можем использовать раздел действия и параметры намерения.
Здесь вы можете установить необходимые значения параметров, соответствующие сущностям в запросе.
Если пользователи опустят один или несколько параметров в своем ответе, ваш агент попросит их указать значения для каждого пропущенного параметра.
Поэтому в разделе действия и параметры отметим параметр pizza_topping и нажмем Define prompts.
И здесь мы введем вопросы, которые чат-бот задаст, если не обнаружит в намерении пользователя сущность pizza_topping.
И здесь вы также можете заметить, что отмечена опция «Список» для начинки, чтобы агент распознавал несколько начинок в запросе.
И мы создадим сущность размер size.
Далее вернемся в намерение и разметим его обучающие фразы этой сущностью.
Далее перейдем в раздел действия и параметры.
И здесь отметим параметр size и нажмем Define prompts.
И здесь введем уточняющий вопрос.
Таким образом, здесь мы добавим: «Хотите кусок или целый пирог?»
Это позволит агенту запросить информацию, если она не была захвачена.
Теперь, переключимся на выполнение.
И здесь мы видим встроенный редактор, который мы активируем.
И вы увидите, что здесь уже есть шаблон с некоторым кодом, написанным на nodeJS.
Этот код представляет собой веб-приложение nodeJS webhook, которое будет развернуто в Google сервисе Firebase.
Webhook – это механизм получения уведомлений об определённых событиях.
В нашем случае – это механизм уведомления об обнаружении определенного намерения чат-ботом.
И webhook в нашем примере будет развернут с помощью облачной функциональности Cloud Functions for Firebase, которая позволяет автоматически запускать код в ответ на события, вызванные HTTP-запросами.
Ваш код хранится в облаке Google и работает в управляемой среде.
После того, как вы напишите и развернете код, серверы Google сразу же начнут управлять этой облачной функцией.
И для нашего чат-бота бесплатного плана Spark Firebase будет достаточно.
И здесь во встроенном редакторе, у нас также есть файл package.json, и нам нужно изменить его.
Нам нужно добавить зависимость от Google базы данных Datastore, которую мы будем использовать для хранения заказа пиццы.
Поэтому мы добавим @google-cloud/datastore.
После этого нажмем кнопку Deploy развернуть.
В результате в наш проект будет добавлен облачный сервис Cloud Functions for Firebase, где будет развернут наш webhook.
Чтобы проверить развернут ли наш webhook, откроем страницу нашего Google проекта Dialogflow и нажмем Cloud Functions.
И здесь мы увидим нашу развернутую облачную функцию.
Теперь более подробно рассмотрим код webhook.
Здесь, у нас есть объявление о некоторых необходимых пакетах, которые нам нужно импортировать, и нам также необходимо импортировать пакет хранилища данных Datastore.
Поэтому здесь мы импортируем пакет Datastore.
И в строке 12 мы создадим новый экземпляр хранилища данных, привязав его к идентификатору нашего Google проекта.
Идентификатор проекта можно посмотреть в консоли проектов по адресу, указанному на слайде.
И здесь у нас есть основная функция dialogflowFirebaseFulfillment, где у нас есть функция для приветствия агента, и у нас есть функция для агента, который ничего не понимает.
Но у нас нет функции для заказа пиццы, и это то, что мы собираемся сюда добавить.
И далее, как только вы создали функцию, вам нужно сопоставить намерение с выполнением этой функции, с помощью добавления записи в карту намерений Map.
И если мы включим, например, Fulfillment в намерении приветствия, тогда если мы наберем в Try it – hello, чат-бот ответит не фразой намерения, а функцией приветствия агента, которая определена в вебхук.
Теперь, давайте создадим функцию для заказа пиццы.
Здесь у нас есть функция order pizza, которая определяет переменные для извлечения параметров из пользовательского запроса.
Она создает ключ для хранения в базе данных, а затем создает новую сущность.
Эта сущность будет содержать значения переменных.
Возврат этой функции – это действие сохранения содержимого созданной нами сущности в Datastore.
И в конце, мы должны добавить запись в карту намерений.
После этого развернем заново наш вебхук.
И теперь нужно включить Fulfillment для намерения order.pizza.upsell.drink-no, чтобы после того, как клиент отказался от напитка, мы сохранили наш заказ в базе данных.