Бот — это приложение, которое автоматизирует (или выполняет по заданному сценарию) действие по запросу пользователя. Сегодня мессенджеры, сетевые сервисы и другое ПО не обходятся без ботов.
В этой статье я разберу пример создания чат-бота при помощи Azure Bot Service от Microsoft. Тема будет полезна всем, кто решил заняться разработкой ботов. Погнали!
Содержание:
Почему Azure Bot Service?
Анатомия бота в Azure Bot Services
Переходим к созданию бота
Правильно ли бот понимает вас?
Контроллеры и темплейты
Особенности Startup-а и наполнение вкладки ToDoDialog
Первый запуск и тестирование в Bot Framework Emulator
Как бот ориентируется во времени
Вместо заключения
Преимущество разработки ботов на Azure Bot Services — высокая степень поддержки Microsoft своего продукта. Специалисты компании активно общаются с комьюнити и оперативно выявляют и исправляют баги в своих сервисах. Кроме того, Microsoft дает возможность создавать кастомные JSON-файлы для работы с API некоторых мессенджеров, что открывает большой спектр возможностей при создании ботов.
Вспомним и о других преимуществах:
Инфраструктуру ботов на Azure можно расширять, добавляя в нее новый функционал. Например, вы можете добавить большее количество каналов и протестировать работу приложения на каждом из них.
Для хранения состояний диалогов и информации, которую вводит пользователь, можно использовать сервис Cosmos DB. А для обучения бота — добавить LUIS (Language Understanding). Сервис использует алгоритмы машинного обучения для лучшей коммуникации с пользователем. Но LUIS платный, и не каждый из ваших заказчиков захочет выделять на него дополнительное финансирование.
Структуру функционирования бота, создаваемого на Azure, можно представить следующим образом:
Справа — перечень возможных каналов, к которым можно подключить бота. Этот список постоянно пополняется новыми платформами. Внизу — доступные Microsoft Cognitive Services, с которыми может работать платформа Azure. Эти сервисы позволяют коммуницировать с ботом через голосовые запросы, мимику, жесты и многое другое.
Для разработки бота на Azure используется Bot Builder SDK. Продукт — в открытом доступе, и его главный плюс — постоянная поддержка разработчиками. На их GitHub вы всегда сможете получить актуальную информацию о сервисе или задать интересующие вас вопросы его разработчикам.
Прежде чем написать код, проанализируем нюансы, которые стоит учитывать перед созданием бота на Azure Bot Service:
Коммуникация с ботом происходит через пользовательский интерфейс. Именно он позволяет общаться с ботом на понятном ему языке. Для этого в 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.cs и посмотрим на ее наполнение. Здесь видим зарегистрированный обработчик ошибок — AdapterWithErrorHandler
. Он необходим для реакции приложения на ошибки в случае их появления в программе. Обратите внимание на регистрацию ConversationState
— его мы используем, чтобы бот понимал, с каким конкретно пользователем он общается, и на каком этапе этот диалог находится:
Рассмотрим содержимое вкладки ToDoDialog.cs. Я объявил waterfallSteps
— это набор шагов для waterfall
-диалога, о котором мы уже упоминали выше. В waterfallSteps
мы указываем, какие именно асинхронные функции будут использоваться для построения диалога пользователя с ботом на каждом из шагов:
Теперь посмотрим, какие типы вводимых Prompt
будет использовать наш бот. С наполнением здесь все довольно стандартно: бот задаст нам несколько вопросов о событии и затем предложит запланировать напоминание для него:
Теперь давайте запустим чат-бота и протестируем его работу при помощи интерфейса Bot Framework Emulator.
Bot Framework Emulator — это приложение, которое позволяет тестировать и отлаживать ботов как локально, так и удаленно. Используя эмулятор, вы можете общаться с ботом и проверять сообщения, которые он отправляет и получает. Эмулятор отображает сообщения точно так же, как они видны в пользовательском интерфейсе веб-чата.
При запуске приложения появляется ссылка на URL-адрес, где бот будет ждать сообщение от пользователя:
Перед началом тестирования укажем эту ссылку в Bot Framework Emulator:
На первом шаге общения бот просит пользователя ввести название события, для которого необходимо напоминание. Для этого вызовем следующий код:
Теперь при обращении к боту он вернет нам следующий текст: Please enter event description. После объявления события, для которого необходимо сделать напоминание (например: Buy milk), вызовем код второго шага — в нем бот предложит выбрать один из трех вариантов времени напоминания:
Обратите внимание на использование stepContext
. Он сохраняет всю информацию о диалоге, записывая промежуточные значения.
Для реализации списка возможного времени напоминания я использовал ChoicePrompt
. Этот метод предложит пользователю на выбор три варианта ответа с возможным временем напоминания (через 2 минуты, через 5 минут или на следующий день в это же время). Вариантов ответа может быть и больше, но я остановился на трех.
Обозначим каждое новое время выбора через Choice
и получим:
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
В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…
Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…
«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…
Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…
Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…
Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…