Бот — это приложение, которое автоматизирует (или выполняет по заданному сценарию) действие по запросу пользователя. Сегодня мессенджеры, сетевые сервисы и другое ПО не обходятся без ботов.
В этой статье я разберу пример создания чат-бота при помощи Azure Bot Service от Microsoft. Тема будет полезна всем, кто решил заняться разработкой ботов. Погнали!
Содержание:
Почему Azure Bot Service?
Анатомия бота в Azure Bot Services
Переходим к созданию бота
Правильно ли бот понимает вас?
Контроллеры и темплейты
Особенности Startup-а и наполнение вкладки ToDoDialog
Первый запуск и тестирование в Bot Framework Emulator
Как бот ориентируется во времени
Вместо заключения
Почему Azure Bot Service?
Преимущество разработки ботов на Azure Bot Services — высокая степень поддержки Microsoft своего продукта. Специалисты компании активно общаются с комьюнити и оперативно выявляют и исправляют баги в своих сервисах. Кроме того, Microsoft дает возможность создавать кастомные JSON-файлы для работы с API некоторых мессенджеров, что открывает большой спектр возможностей при создании ботов.
Вспомним и о других преимуществах:
- В Azure Bot Service есть возможность использовать open-source SDK-инструменты (Software Development Kit) для создания, тестирования и развертывания бота.
- Интеграция с Cognitive Services — сервисами, использующими в своей работе инструменты машинного обучения для решения типовых задач. Благодаря CS обеспечивается более качественный процесс взаимодействия бота с пользователем.
- Мультиплатформенность — возможность подключения бота ко множеству каналов без необходимости изменения первоначального кода.
- Большое количество открытых примеров, облегчающих процедуру разработки и быстрого старта (масса примеров готового кода на GitHub).
Инфраструктуру ботов на Azure можно расширять, добавляя в нее новый функционал. Например, вы можете добавить большее количество каналов и протестировать работу приложения на каждом из них.
Для хранения состояний диалогов и информации, которую вводит пользователь, можно использовать сервис Cosmos DB. А для обучения бота — добавить LUIS (Language Understanding). Сервис использует алгоритмы машинного обучения для лучшей коммуникации с пользователем. Но LUIS платный, и не каждый из ваших заказчиков захочет выделять на него дополнительное финансирование.
Анатомия бота в Azure Bot Services
Структуру функционирования бота, создаваемого на Azure, можно представить следующим образом:
Структура функционирования бота / Иллюстрация: Microsoft
Справа — перечень возможных каналов, к которым можно подключить бота. Этот список постоянно пополняется новыми платформами. Внизу — доступные Microsoft Cognitive Services, с которыми может работать платформа Azure. Эти сервисы позволяют коммуницировать с ботом через голосовые запросы, мимику, жесты и многое другое.
Для разработки бота на Azure используется Bot Builder SDK. Продукт — в открытом доступе, и его главный плюс — постоянная поддержка разработчиками. На их GitHub вы всегда сможете получить актуальную информацию о сервисе или задать интересующие вас вопросы его разработчикам.
Переходим к созданию бота
Прежде чем написать код, проанализируем нюансы, которые стоит учитывать перед созданием бота на Azure Bot Service:
- Обновления, ломающие функционал. Microsoft постоянно обновляет свои продукты. При этом новые обновления довольно часто «отламывают» ранее работающее куски кода. Поэтому всегда читайте патчноуты
от англ. «patch notes» — дословно переводится как «исправления» новых билдов Bot Builder SDK. Возможно, чужие гайды, по которым вы будете делать своего бота, окажутся неактуальными.
- Неочевидные решения. При использовании Bot Builder SDK вам всегда стоит быть открытым к экспериментам и быть готовым делать все не так, как вы привыкли.
- Универсальность. Одного и того же бота можно залить на разные каналы (Telegram, Skype, Slack и так далее), не меняя его исходный код. Но при разработке бота следует учитывать, что у каждой из этих платформ есть свои нюансы, которые потребуют от вас, как от разработчика, разных подходов при создании рабочей логики приложения.
Правильно ли бот понимает вас?
Коммуникация с ботом происходит через пользовательский интерфейс. Именно он позволяет общаться с ботом на понятном ему языке. Для этого в Azure используется система диалогов, которая подчиняется определенной иерархии:
Здесь мы видим три основных способа построения диалога с ботом:
Prompt
— способ взаимодействия бота с пользователем с помощью системы подсказок и ответов. Например, вы задаете боту информацию в виде числовой подсказки.Prompt
проверяет, был ли получен правильный ответ на подсказку от пользователя. В случае успеха диалог с ботом продолжится. Если от пользователя получен некорректный ответ, ему предложат ввести валидные данные.Waterfall
— сбор информации от пользователя с помощью серии последовательных задач/вопросов. Каждый шагwaterfall
-диалога реализуется как асинхронная функция. На каждом шаге бот запрашивает у пользователя входные данные, ожидает ответа, а затем передает результаты на следующий этап. Результат первой функции в качестве аргумента передается следующей и так далее, пока не будет пройден весь цикл вопросов.Component
— способ, в котором используется разбиение большого и объемного диалога на более мелкие и легко управляемые части. Component позволяет создать многоразовый диалог и использовать его в дальнейшем для различных независимых сценариев. Например, с его помощью можно создать диалог, который будет последовательно запрашивать у пользователя название улицы/номер дома/почтовый индекс.
В нижнем ряду — допустимые способы для создания пользовательского запроса боту:
- запрос текста (
Text
); - запрос числа (
Number
); - запрос даты/времени (
DateTime
); - запрос подтверждения (
Confirm
); - запрос выбора (
Choice
); - запрос вложения (
Attachment
).
По своей сути запросы — это поэтапные диалоги: на первом этапе бот запрашивает входные данные, а на втором — возвращает юзеру допустимые значение или запускает цикл запроса данных заново при поступлении некорректных значений.
Контроллеры и темплейты
Давайте рассмотрим кодовую начинку на примере созданного мною чат-бота Remind me later — его основной задачей было напоминание о действиях, которые мне нужно совершить в будущем.
Для создания бота я использовал Empty Template, предоставленный Visual Studio, который включает в себя BotController
.
BotController
принимает сообщения для бота и передает их бот-фреймворку. Бот также состоит из нескольких Deployment Templates
— шаблонов, которые используются для более легкого размещения приложения на платформе Azure.
NotifyController
используется для определения времени, когда нужно отправить пользователю сообщение. Более подробно о нем я расскажу ниже.
Особенности Startup и наполнение вкладки ToDoDialog
Перейдем во вкладку Startup.cs и посмотрим на ее наполнение. Здесь видим зарегистрированный обработчик ошибок — AdapterWithErrorHandler
. Он необходим для реакции приложения на ошибки в случае их появления в программе. Обратите внимание на регистрацию ConversationState
— его мы используем, чтобы бот понимал, с каким конкретно пользователем он общается, и на каком этапе этот диалог находится:
Рассмотрим содержимое вкладки ToDoDialog.cs. Я объявил waterfallSteps
— это набор шагов для waterfall
-диалога, о котором мы уже упоминали выше. В waterfallSteps
мы указываем, какие именно асинхронные функции будут использоваться для построения диалога пользователя с ботом на каждом из шагов:
Теперь посмотрим, какие типы вводимых Prompt
будет использовать наш бот. С наполнением здесь все довольно стандартно: бот задаст нам несколько вопросов о событии и затем предложит запланировать напоминание для него:
Теперь давайте запустим чат-бота и протестируем его работу при помощи интерфейса Bot Framework Emulator.
Bot Framework Emulator — это приложение, которое позволяет тестировать и отлаживать ботов как локально, так и удаленно. Используя эмулятор, вы можете общаться с ботом и проверять сообщения, которые он отправляет и получает. Эмулятор отображает сообщения точно так же, как они видны в пользовательском интерфейсе веб-чата.
Первый запуск и тестирование в Bot Framework Emulator
При запуске приложения появляется ссылка на URL-адрес, где бот будет ждать сообщение от пользователя:
Начнем!
Перед началом тестирования укажем эту ссылку в Bot Framework Emulator:
На первом шаге общения бот просит пользователя ввести название события, для которого необходимо напоминание. Для этого вызовем следующий код:
Теперь при обращении к боту он вернет нам следующий текст: Please enter event description. После объявления события, для которого необходимо сделать напоминание (например: Buy milk), вызовем код второго шага — в нем бот предложит выбрать один из трех вариантов времени напоминания:
Обратите внимание на использование stepContext
. Он сохраняет всю информацию о диалоге, записывая промежуточные значения.
Для реализации списка возможного времени напоминания я использовал ChoicePrompt
. Этот метод предложит пользователю на выбор три варианта ответа с возможным временем напоминания (через 2 минуты, через 5 минут или на следующий день в это же время). Вариантов ответа может быть и больше, но я остановился на трех.
Обозначим каждое новое время выбора через Choice
и получим:
В Bot Framework Emulator этот код будет визуализирован вот так:
Полученный результат можно распарсить при помощи
Parse
.
Для тех, кто забыл, напомню, что парсинг — это процесс автоматического сбора данных и их последующее структурирование.
Затем бот спросит у пользователя, уверен ли он в выбранном варианте времени напоминания, используя для подтверждения согласия ConfirmPrompt
:
Визуально этот метод будет выглядеть так:
Последним шагом мы достанем из
stepContext
заполненную ранее информацию и сформируем SavedNotificationModel
, в которую обязательно необходимо добавить conversationReference
. Без этого бот не сможет восстановить диалог с пользователем и не сможет понять, какой конкретно пользователь к нему обращался:
В качестве временного хранилища для этих событий я использовал метод
dictionary
, благодаря которому каждому конкретному диалогу бот присваивает свой уникальный instanceid
:
На этом диалог с ботом будет закончен. Можно вывести пользователю текст, который будет свидетельствовать об окончании диалога и создании соответствующего запроса на напоминание:
Thanks. Notification has been successfully saved.
Читайте также: «Говори по-человечески»: инструкция, как научить бота общаться
Как бот ориентируется во времени
Для ориентирования бота во времени я создал в NotifiedController метод NotifyTimeCheck()
. Этот метод позволяет систематически опрашивать наше приложение, и в случае скорого наступления времени события бот достанет это событие из dictionary
и отправит пользователю нотификейшн:
Для получения нотификации я вызову у
BotAdapter
метод ContinueConversationAsync()
и передам в него ConversationReference
. Первым параметром функции ContinueConversationAsync()
всегда необходимо передавать аppId
(Application ID) нашего бот-сервиса, иначе он не будет работать.
Помимо этого, самому боту нужно напомнить, что при наступлении определенного времени о событии необходимо сообщить конкретному пользователю. Для этого можно использовать Azure Function (BotTimerFunction
), которая будет срабатывать по временному триггеру (TimerTrigger
):
Каждую минуту функция будет отправлять запрос на этот
Endpoint
и запускать проверку предписанных событий. При попадании в нужные временные рамки бот выдаст пользователю уведомление о скором наступлении запланированного события.
Вместо заключения
Автоматизировать рутинные процессы, оперативно выдавать покупателям нужную информацию о продуктах, получать и обрабатывать обращения — все эти возможности грамотно настроенного чат-бота помогают превратить обычного пользователя в постоянного клиента. Поэтому в наше время создавать и обучать чат-бота — полезный навык, который сделает вас востребованным специалистом. Дерзайте!
Читайте также: Как создать Telegram-бота с помощью библиотеки python-telegram-bot
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: