Advertisement
  1. Code
  2. Machine Learning
Code

Создание чатов на Android с IBM Watson

by
Length:MediumLanguages:
This post is part of a series called IBM Watson Machine Learning.
Coding an Android App With IBM Watson Machine Learning
Use Machine Learning to Recognize Images With IBM Watson

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Если вы когда-либо разговаривали с персональными помощниками на основе голоса, такими как Siri или Google Now, или побеседовали с одним из многих текстовых ботов, активных на платформах обмена сообщениями, таких как Facebook Messenger и Kik, вы, вероятно, понимаете, какими веселыми, интуитивными могут быть мощные диалоговые пользовательские интерфейсы. Однако, поскольку большинство естественных языков чрезвычайно сложны, создание таких интерфейсов с нуля, как правило, сложно. К счастью, есть IBM Watson.

Используя службу IBM Watson Conversation, вы можете создавать интерактивные пользовательские интерфейсы с AI-интерфейсом за считанные минуты, часто всего с несколькими строками кода. В этом уроке я расскажу вам о службе и покажу вам, как ее использовать в приложениях для Android.

Требования

Чтобы максимально использовать этот учебник, вам понадобится следующее:

  • учетная запись IBM Bluemix
  • последняя версия Android Studio
  • устройство под управлением Android 4.4 или выше

1. Создание службы беседы

Прежде чем вы сможете использовать IBM Watson Conversation API, вы должны создать сервис «Беседа» на платформе IBM Bluemix и получить учетные данные для входа в систему. Для этого войдите в консоль Bluemix, перейдите в раздел  Services > Watson и нажмите кнопку Create Watson service. На следующем экране выберите «Conversation» из каталога доступных сервисов.

Watson services catalog

В форме конфигурации, которая отображается ниже, введите соответствующее имя для службы и нажмите кнопку «Create».

Conversation service configuration form

2. Создание рабочей области разговора

Служба разговора может работать только в том случае, если у нее есть хотя бы одно рабочее пространство беседы, связанное с ней. На данный момент вы можете представить себе рабочую область как набор правил и деталей конфигурации, которая определяет возможности и индивидуальность вашего диалогового интерфейса.

Консоль Bluemix имеет простой в использовании инструмент, который позволяет создавать и управлять рабочими пространствами. Чтобы запустить его, нажмите кнопку Launch tool.

Conversation workspace tool launcher

На следующем экране нажмите кнопку «Create», чтобы создать новое рабочее пространство. В появившемся диалоговом окне введите содержательное имя в рабочее пространство и выберите язык для него.

Workspace configuration dialog

Как только рабочая область будет создана, вы должны добавить в нее намерения, сущности и детали диалога.

Intents entities and dialog tabs

Хотя намерения определяют действия, которые пользователь может выполнять с помощью вашего диалогового интерфейса, сущности определяют объекты, которые имеют отношение к этим действиям. Например, в предложении «закажите мне билет из Нью-Йорка в Чикаго», «забронировать билет» будет намерение, а «Нью-Йорк» и «Чикаго» будут юридическими лицами. Детали диалога определяют фактические ответы, формируемые диалоговым пользовательским интерфейсом, и способы их обмена.

Шаг 1. Создание намерений

В этом уроке мы создадим очень простой Android chatbot, способный выполнять следующие действия:

  • приветствовать пользователя
  • представить себя
  • говорить вдохновляющие цитаты

Соответственно, нашему чатботу нужны три цели.

Нажмите кнопку «Create New», чтобы создать первое намерение. В появившейся форме назовите намерение #Greeting, укажите несколько примеров слов или предложений, которые пользователь может использовать для намерения, например «hi» и «hello», и нажмите кнопку «Done».

Greeting intent creation

Самое лучшее в услуге Watson Conversation заключается в том, что он интеллектуально тренируется, используя примеры пользовательских входов, которые вы предоставляете намерению. Следовательно, он сможет реагировать на несколько вариантов этих входных данных. Например, он сможет правильно сопоставлять слова и фразы, такие как «howdy», «доброе утро» и «yo!». к #Greeting намерению.

Нажмите кнопку Create New еще раз, чтобы создать следующее намерение. Назовите его #Name и укажите следующие примеры пользователей.

Name intent creation

Аналогичным образом назовите третье намерение  #RequestQuote и укажите следующие пользовательские примеры.

RequestQuote intent creation

Шаг 2. Создание диалога.

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

Начните с перехода на вкладку Dialog и нажмите кнопку Create. На следующем экране вы увидите, что два диалоговых узла создаются для вас автоматически: один из них с именем Welcome, должен приветствовать пользователя, а другой - Anything else,  должен ловить входные данные, которые бот не понимает.

Default dialog nodes

Теперь давайте оставим узел Anything else так, как он есть, и настройте узел Welcome. В появившемся диалоговом окне введите #Greeting в поле If bot recognizes, а затем добавьте несколько ответов. Очевидно, что чем больше ответов вы добавите, тем больше будет человекоподобный ваш chatbot.

Dialog for Greeting

Затем создайте новый узел для намерения #Name, нажав кнопку Add Node. Снова заполните форму, показанную соответствующим образом.

Dialog for Name

Узел для намерения #RequestQuote будет немного отличаться. Мы не будем вручную вводить несколько вдохновляющих цитат в качестве ответов этого узла, потому что это сделает наш бот слишком статичным и неинтересным. Вместо этого наш чатбот Android должен иметь возможность извлекать цитаты из внешнего API. Поэтому ответы этого узла должны быть предложениями, которые просят пользователя подождать, пока бот ищет новую цитату.

Dialog for RequestQuote

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

Testing the workspace

Шаг 3: определение учетных данных

Чтобы иметь возможность использовать сервис «Беседа» в приложении для Android, вам понадобятся имя пользователя и пароль. Кроме того, вам потребуется идентификатор рабочей области диалога. Поэтому перейдите в раздел «Deploy» и перейдите на вкладку «Credentials».

Теперь вы должны иметь возможность видеть учетные данные, которые вам нужны. Записав их, вы можете закрыть консоль Bluemix.

Credentials tab

3. Настройка Android Studio Project

Хотя с помощью любой сетевой сети Android можно взаимодействовать с услугой «Беседа», использование Watson Java SDK - лучшая идея, потому что она предлагает очень интуитивно понятный и высокоуровневый API. Чтобы добавить его в проект Android Studio, добавьте следующую зависимость compile в файле build.gradle модуля app:

Кроме того, нам понадобится библиотека Fuel для извлечения вдохновляющих цитат с удаленного сервера и библиотека Design, которая сможет работать с несколькими виджетами Material Design.

Как Fuel, так и Watson Java SDK требуют, чтобы ваше приложение имело разрешение INTERNET, поэтому не забудьте запросить его в файле манифеста вашего проекта:

Наконец, откройте файл res/values/strings.xml и добавьте имя пользователя и пароль службы беседы, и идентификатор рабочей области диалога - как теги <string>:

Теперь вы можете нажать кнопку «Синхронизировать сейчас», чтобы завершить настройку проекта.

4. Определение макета

В этом уроке мы создадим текстового бота. Поэтому макет нашего приложения должен содержать виджет EditText, в котором пользователи могут вводить свои сообщения, и виджет TextView, в котором может отображаться разговор пользователя. При желании вы можете поместить виджет EditText внутри контейнера TextInputLayout, чтобы убедиться, что он соответствует рекомендациям Material Design.

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

Обратите внимание, что мы установили значение атрибута imeOptions виджета EditText в actionDone. Это позволяет пользователям нажимать кнопку «Done» на виртуальных клавиатурах, когда они заканчивают ввод своих сообщений.

5. Использование службы беседы

В классе ConversationService Watson SDK есть все способы, с которыми вам нужно связаться с сервисом Беседа. Поэтому первое, что вам нужно сделать в вашем классе Activity, это создать его экземпляр. Его конструктор ожидает дату версии, имя пользователя и пароль.

Затем, чтобы иметь возможность работать с виджетами, присутствующими в XML-файле макета, вы должны получить ссылки на них с помощью метода findViewById().

Когда пользователи закончили вводить свои входные сообщения, они будут нажимать кнопку «Done» на своих виртуальных клавиатурах. Чтобы прослушать это событие нажатия кнопки, вы должны добавить OnEditorActionListener в виджет EditText.

Внутри слушателя вы можете вызвать метод getText() виджета EditText для извлечения сообщения пользователя.

Виджет TextView будет отображать как сообщения пользователя, так и ответы бота. Поэтому добавьте сообщение в виджет TextView, используя его метод append().

Сообщение пользователя должно быть отправлено в службу беседы, завернутую в объект MessageRequest. Вы можете легко создать его с помощью класса MessageRequest.Builder.

После того как запрос будет готов, вы должны передать его методу message() объекта ConversationService вместе с идентификатором рабочей области. Наконец, чтобы отправить сообщение в службу беседы, вы должны вызвать метод enqueue().

Поскольку метод enqueue() выполняется асинхронно, для получения ответа службы вам также потребуется объект ServiceCallback.

Внутри метода onResponse() вы можете вызвать метод getText() объекта MessageResponse, чтобы получить ответ службы беседы.

Теперь вы можете добавить ответ на виджет TextView с помощью метода append(). Однако убедитесь, что вы делаете это внутри метода runOnUiThread(), потому что в настоящее время вы используете другой поток.

Наш бот почти готов. Если вы попробуете запустить приложение, вы сможете получить от него правильные ответы для целей #Greeting и #Name. Тем не менее, он все еще не может читать вдохновляющие цитаты. Поэтому теперь мы должны добавить код, чтобы явно искать намерение #RequestQuote и генерировать ответ вручную.

Чтобы извлечь имя обнаруженного намерения из объекта MessageResponse, вы должны вызвать его метод getIntents(), который возвращает список объектов MessageResponse.Intent, выбрать первый элемент и вызывать его метод getIntent().

Есть много сайтов со свободными API, которые вы можете использовать для получения вдохновляющих цитат. Forismatic - один из них. Его REST API предоставляет цитаты в виде обычного текста, который вы можете напрямую использовать в своем приложении.

Чтобы сделать HTTP-запрос к URL-адресу API Forismatic, вам нужно всего лишь вызвать метод get() класса Fuel. Поскольку метод выполняется асинхронно, вы должны обрабатывать HTTP-ответ, вызывая метод responseString() и передавая ему объект Handler.

Внутри метода success() обработчика вы можете просто добавить цитату в виджет TextView. В следующем коде показано, как:

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

The Android chatbot running

Заключение

Разговорные пользовательские интерфейсы сегодня в моде. Они настолько просты в использовании, что все их любят. В этом уроке вы узнали об основах создания таких интерфейсов на платформе Android с помощью службы обмена сообщениями IBM Watson.

Служба может делать многое. Чтобы узнать больше о ней, вы можете обратиться к официальной документации.

И не забудьте проверить некоторые из наших других статей об использовании машинного обучения для ваших приложений Android!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.