Недавно прошла конференция //BUILD, на которой Майкрософт традиционно представляет новые технологии для разработчиков. В ключевом докладе первого дня была высказана одна очень важная мысль – по мере того, как общение с компьютерами становится всё более естественным, возрастает роль диалогового общения на естественном языке. Речь здесь не только о том, что мы сможем просить голосовой помощник Cortana просить поставить нам будильник, но и что множество других задач (заказать пиццу, забронировать гостиницу, купить билеты и т.д.) может быть решено с помощью диалога. Более того, это может быть не только диалог между пользователем и компьютером: в более сложном случае человек может попросить Cortana спланировать путешествие, и затем Cortana будет сама общаться с другими ботами, совершая заказ гостиницы и билетов.
![](https://habrastorage.org/r/w780q1/files/1d3/c73/357/1d3c733576a04825a4e03ca1e6326a35.jpg)
Здесь интересно то, что само “общение” может происходить а различных местах: на десктопе с помощью клиента Cortana, но также и в других традиционно используемых для чата каналах: в Skype, Telegram, Slack и т.д. Личность и память нашего персонального ассистента не зависит от канала общения, а располагается где-то в облаке, готовая пообщаться с нами на любом из так называемых “conversational canvases”.
Для создания ботов была представлена предварительная версия Microsoft Bot Framework и соответствующие API, о которых мы поговорим ниже. Мы также покажем, как можно создать своего простейшего бота, поддерживающего беседу с пользователем на английском языке.
Для работы с ботами используются следующие ключевые элементы:
Отличный пример бота – это Murphy, созданный в рамках проекта http://www.projectmurphy.net/. Зайдя на сайт, вы можете установить Murphy себе в Skype и начать с ним общаться (только убедитесь, что вы используете последнюю версию Skype, которая поддерживает ботов). Этому боту можно задавать вопросы вида “What if Cindy Crawford were a superman?” (пример диалога вы видите ниже), или “What if I were a programmer” (в этом случае он попросит вас загрузить свою фотографию).
![](https://habrastorage.org/r/w1560/files/eb6/c06/ee9/eb6c06ee935241308959145764ea2064.png)
В качестве примера давайте рассмотрим, как создать простейшего бота на базе Bot Framework. Вспомним, что сердце и мозг бота – это веб-сервис, который обычно располагается в облаке.
![](https://habrastorage.org/r/w1560/files/9e2/bfc/1ac/9e2bfc1acf1643d8a29ca61b80341c23.png)
Для создания такого сервиса проще всего скачать Bot Framework Template для Visual Studio (убедитесь, что у вас стоит Visual Studio 2015 Update 1 с веб-инструментами). Полученный ZIP-файл положите в каталог с шаблонами Visual Studio, обычно это “%USERPROFILE%\Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C#". После этого в Visual Studio вы сможете создать новый проект типа Bot Application:
![](https://habrastorage.org/r/w1560/files/367/cea/ea0/367ceaea05284dfba9639d29e229bfe9.png)
В созданном проекте за основную функциональность бота отвечает метод Post в файле Controllers/MessagesController.cs. Для простейшего Hello-бота реализуем этот метод следующим образом:
Чтобы протестировать бота, запустим проект на локальном веб-сервере (F5), скопируем адрес и порт из адресной строки открывшегося браузера, и откроем его в Microsoft Bot Framework Emulator (его необходимо предварительно скачать и установить). Обратите внимание, что к адресной строке сайта необходимо дописать путь /api/messages.
![](https://habrastorage.org/r/w1560/files/aea/da2/7e2/aeada27e2504467fb0c44f9151f894fd.png)
Чтобы заставить бот делать что-то чуть более полезное, я использовал порт на C# известной программы Eliza. Получившийся чат-бот вы можете скачать в нашем репозитории GitHub. В первой версии схема построения бота мало чем отличается от приведенной выше программы, только для формирования ответа вызывается метод готовой библиотеки Eliza.
Такая простая реализация не очень подходит для поддержки длительных диалогов с пользователем, поскольку метод Post используется для обработки запросов всех пользователей, и нет разделения состояния между ними. Чтобы это сделать, можно в явном виде смотреть на идентификатор сессии (message.ConversationID), использовать объекты BotUserData/BotConversationData, или же задействовать более продвинутые API с поддержкой диалогов (о них мы расскажем в дальнейших статьях). Пока же не будем обращать внимания на эти детали, считая, что бот является stateless.
Чтобы запустить бота в облаке, нам для начала нужно опубликовать получившися Web API в Azure. Затем следует войти на сайт http://dev.botframework.com и зарегистрировать нового бота. Важно придумать для бота уникальный AppID, и получить сгенерированный автоматически App Secret.
После этого необходимо сделать важный шаг – в файле Web.Config нашего приложения необходимо добавить App ID и App Key:
После чего необходимо повторно развернуть бота в облаке, чтобы Web Config обновился.
![](https://habrastorage.org/r/w1560/files/071/5cf/d06/0715cfd0632c4ff0b53462e2d60577fa.png)
Сделав это, можно протестировать работоспособность бота в панели свойств на сайте Bot Framework, или же воспользоваться уже знакомым нам эмулятором – правда в этом случае надо будет ввести правильные AppID и App Secret:
![](https://habrastorage.org/r/w1560/files/e17/e0e/5f5/e17e0e5f5fe047d7976b5d947d8e0bcd.png)
Теперь, когда бот работает в эмуляторе, можно привязать его к различным каналам связи. Для этого в панели управления ботом на сайте Bot Framework необходимо добавить и сконфигурировать эти каналы. Для этого выбираем предпочитаемый канал связи, и следуем инструкциям:
![](https://habrastorage.org/r/w1560/files/7e3/f55/7ff/7e3f557ff15e4a6d8a51b5424d2cbe41.png)
Например, в случае с Telegram необходимо создать новый бот в Telegram с помощью беседы со специальным ботом Bot Father, после чего получить Access Tokem, и предоставить его сайту Bot Framework. После этого Bot Connector возьмет на себя все посреднические операции между Telegram API и вашим ботом, и вы сможете общаться с вашим ботом из Telegram. Кстати, мой бот называется в телеграме @ElllizaBot, можете с ним поговорить!
Подробнее про создание бота с нуля с помощью Bot Framework вы можете посмотреть в этом англоязычном докладе в BUILD.
Основная прелесть Bot Framework API состоит в том, что мы можем теперь писать боты, не ориентируясь на какой-то один канал общения. По сути дела, Bot Framework даёт нам правильный уровень абстракции для реализации механизмов беседы и диалогов, а конкретную связь с различными инструментами общения берет на себя Bot Connector. Это разделение позволяет программисту написать бот один раз, а общаться с ним отовсюду. Можно сформулировать этот принцип следующим образом, перефразируя известный из мира Java слоган: Write Once – Chat Everywhere.
Ещё одна новость, объявленная на //BUILD – это доступность отдельного Skype API для создания ботов. На самом деле создавать Skype-ботов можно и через Bot Framework, но возможности Bot Framework пока позволяют нам работать только с текстом (плюс с некоторыми видами attachemnt-ов), в то время как Skype Bot API несколько шире, и позволяет в том числе создавать видео-боты. При выборе технологии следует отдавать предпочтение Bot Framework, из-за её универсальности, однако если вы хотите создать действительно удивительный бот именно для Skype – посмотрите на Skype Bot SDK.
Диалог – это естественная форма взаимодействия людей, и может статься, что она станет естественной формой взаимодействия людей и компьютеров. Майкрософт предлагает удобную программную абстракцию в виде Bot Framework, которая позволяет начать достаточно просто создавать свои чат-боты, работающие сразу со многими каналами общения. Это не только перспективно, но ещё и очень занимательно! Давайте пока экспериментировать с созданием ботов, а через несколько лет (или месяцев) посмотрим, являются ли боты заменой веб-сайтам или мобильным приложениям, как о том говорят аналитики.
![](https://habrastorage.org/files/1d3/c73/357/1d3c733576a04825a4e03ca1e6326a35.jpg)
Здесь интересно то, что само “общение” может происходить а различных местах: на десктопе с помощью клиента Cortana, но также и в других традиционно используемых для чата каналах: в Skype, Telegram, Slack и т.д. Личность и память нашего персонального ассистента не зависит от канала общения, а располагается где-то в облаке, готовая пообщаться с нами на любом из так называемых “conversational canvases”.
Для создания ботов была представлена предварительная версия Microsoft Bot Framework и соответствующие API, о которых мы поговорим ниже. Мы также покажем, как можно создать своего простейшего бота, поддерживающего беседу с пользователем на английском языке.
Для работы с ботами используются следующие ключевые элементы:
- Bot Builder SDK (доступен для C# и для Node.js) предназначен для создания ключевой функциональности бота. Он основан на WebAPI, и определяет протокол общения бота с внешним миром. В рамках SDK есть эмулятор, позволяющий отлаживать ботов, а также набор классов для упрощения реализации некоторых ключевых абстракций, таких, как продолжительные диалоги с состоянием.
- Cognitive Services (ранее известные как LUIS, составная часть Project Oxford) позволяют упростить анализ естественного языка и выделение смысла из текстовых предложений. С помощью веб-интерфейса мы можем определить основные синтаксические конструкции, и автоматически присвоить им соответствующие намерения пользователя (intents), на которые затем будет реагировать бот.
- Bot Connector позволяет привязать наш бот к одному или нескольким каналам общения, таким, как Skype, Slack, Telegram и др. Для этого достаточно сконфигурировать соединение бота на сайте botframework.com.
- Каталог ботов, в котором со временем можно будет публиковать ссылки на различные боты.
Пример: знакомимся с Murphy Bot
Отличный пример бота – это Murphy, созданный в рамках проекта http://www.projectmurphy.net/. Зайдя на сайт, вы можете установить Murphy себе в Skype и начать с ним общаться (только убедитесь, что вы используете последнюю версию Skype, которая поддерживает ботов). Этому боту можно задавать вопросы вида “What if Cindy Crawford were a superman?” (пример диалога вы видите ниже), или “What if I were a programmer” (в этом случае он попросит вас загрузить свою фотографию).
![](https://habrastorage.org/files/eb6/c06/ee9/eb6c06ee935241308959145764ea2064.png)
Hello, Bot! Пишем себе собеседника
В качестве примера давайте рассмотрим, как создать простейшего бота на базе Bot Framework. Вспомним, что сердце и мозг бота – это веб-сервис, который обычно располагается в облаке.
![](https://habrastorage.org/files/9e2/bfc/1ac/9e2bfc1acf1643d8a29ca61b80341c23.png)
Для создания такого сервиса проще всего скачать Bot Framework Template для Visual Studio (убедитесь, что у вас стоит Visual Studio 2015 Update 1 с веб-инструментами). Полученный ZIP-файл положите в каталог с шаблонами Visual Studio, обычно это “%USERPROFILE%\Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C#". После этого в Visual Studio вы сможете создать новый проект типа Bot Application:
![](https://habrastorage.org/files/367/cea/ea0/367ceaea05284dfba9639d29e229bfe9.png)
В созданном проекте за основную функциональность бота отвечает метод Post в файле Controllers/MessagesController.cs. Для простейшего Hello-бота реализуем этот метод следующим образом:
public async Task<Message> Post([FromBody]Message message)
{
if (message.Type == "Message")
{
var reply =
message.Text.ToLower() == "hello" ?
"Hello!" :
"I do not understand you!";
return message.CreateReplyMessage(reply);
}
else
{
return HandleSystemMessage(message);
}
}
Чтобы протестировать бота, запустим проект на локальном веб-сервере (F5), скопируем адрес и порт из адресной строки открывшегося браузера, и откроем его в Microsoft Bot Framework Emulator (его необходимо предварительно скачать и установить). Обратите внимание, что к адресной строке сайта необходимо дописать путь /api/messages.
![](https://habrastorage.org/files/aea/da2/7e2/aeada27e2504467fb0c44f9151f894fd.png)
Чтобы заставить бот делать что-то чуть более полезное, я использовал порт на C# известной программы Eliza. Получившийся чат-бот вы можете скачать в нашем репозитории GitHub. В первой версии схема построения бота мало чем отличается от приведенной выше программы, только для формирования ответа вызывается метод готовой библиотеки Eliza.
Такая простая реализация не очень подходит для поддержки длительных диалогов с пользователем, поскольку метод Post используется для обработки запросов всех пользователей, и нет разделения состояния между ними. Чтобы это сделать, можно в явном виде смотреть на идентификатор сессии (message.ConversationID), использовать объекты BotUserData/BotConversationData, или же задействовать более продвинутые API с поддержкой диалогов (о них мы расскажем в дальнейших статьях). Пока же не будем обращать внимания на эти детали, считая, что бот является stateless.
Чтобы запустить бота в облаке, нам для начала нужно опубликовать получившися Web API в Azure. Затем следует войти на сайт http://dev.botframework.com и зарегистрировать нового бота. Важно придумать для бота уникальный AppID, и получить сгенерированный автоматически App Secret.
После этого необходимо сделать важный шаг – в файле Web.Config нашего приложения необходимо добавить App ID и App Key:
<configuration>
<appSettings>
<add key="AppId" value="YourAppId" />
<add key="AppSecret" value="YourAppSecret" />
</appSettings>
После чего необходимо повторно развернуть бота в облаке, чтобы Web Config обновился.
![](https://habrastorage.org/files/071/5cf/d06/0715cfd0632c4ff0b53462e2d60577fa.png)
Сделав это, можно протестировать работоспособность бота в панели свойств на сайте Bot Framework, или же воспользоваться уже знакомым нам эмулятором – правда в этом случае надо будет ввести правильные AppID и App Secret:
![](https://habrastorage.org/files/e17/e0e/5f5/e17e0e5f5fe047d7976b5d947d8e0bcd.png)
Теперь, когда бот работает в эмуляторе, можно привязать его к различным каналам связи. Для этого в панели управления ботом на сайте Bot Framework необходимо добавить и сконфигурировать эти каналы. Для этого выбираем предпочитаемый канал связи, и следуем инструкциям:
![](https://habrastorage.org/files/7e3/f55/7ff/7e3f557ff15e4a6d8a51b5424d2cbe41.png)
Например, в случае с Telegram необходимо создать новый бот в Telegram с помощью беседы со специальным ботом Bot Father, после чего получить Access Tokem, и предоставить его сайту Bot Framework. После этого Bot Connector возьмет на себя все посреднические операции между Telegram API и вашим ботом, и вы сможете общаться с вашим ботом из Telegram. Кстати, мой бот называется в телеграме @ElllizaBot, можете с ним поговорить!
Подробнее про создание бота с нуля с помощью Bot Framework вы можете посмотреть в этом англоязычном докладе в BUILD.
Канальная абстрация
Основная прелесть Bot Framework API состоит в том, что мы можем теперь писать боты, не ориентируясь на какой-то один канал общения. По сути дела, Bot Framework даёт нам правильный уровень абстракции для реализации механизмов беседы и диалогов, а конкретную связь с различными инструментами общения берет на себя Bot Connector. Это разделение позволяет программисту написать бот один раз, а общаться с ним отовсюду. Можно сформулировать этот принцип следующим образом, перефразируя известный из мира Java слоган: Write Once – Chat Everywhere.
Несколько слов про Skype Bot API
Ещё одна новость, объявленная на //BUILD – это доступность отдельного Skype API для создания ботов. На самом деле создавать Skype-ботов можно и через Bot Framework, но возможности Bot Framework пока позволяют нам работать только с текстом (плюс с некоторыми видами attachemnt-ов), в то время как Skype Bot API несколько шире, и позволяет в том числе создавать видео-боты. При выборе технологии следует отдавать предпочтение Bot Framework, из-за её универсальности, однако если вы хотите создать действительно удивительный бот именно для Skype – посмотрите на Skype Bot SDK.
Заключение
Диалог – это естественная форма взаимодействия людей, и может статься, что она станет естественной формой взаимодействия людей и компьютеров. Майкрософт предлагает удобную программную абстракцию в виде Bot Framework, которая позволяет начать достаточно просто создавать свои чат-боты, работающие сразу со многими каналами общения. Это не только перспективно, но ещё и очень занимательно! Давайте пока экспериментировать с созданием ботов, а через несколько лет (или месяцев) посмотрим, являются ли боты заменой веб-сайтам или мобильным приложениям, как о том говорят аналитики.
А вот и другие наши статьи по схожей тематике: