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» из каталога доступных сервисов.

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

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

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

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

Хотя намерения определяют действия, которые пользователь может выполнять с помощью вашего диалогового интерфейса, сущности определяют объекты, которые имеют отношение к этим действиям. Например, в предложении «закажите мне билет из Нью-Йорка в Чикаго», «забронировать билет» будет намерение, а «Нью-Йорк» и «Чикаго» будут юридическими лицами. Детали диалога определяют фактические ответы, формируемые диалоговым пользовательским интерфейсом, и способы их обмена.
Шаг 1. Создание намерений
В этом уроке мы создадим очень простой Android chatbot, способный выполнять следующие действия:
- приветствовать пользователя
- представить себя
- говорить вдохновляющие цитаты
Соответственно, нашему чатботу нужны три цели.
Нажмите кнопку «Create New», чтобы создать первое намерение. В появившейся форме назовите намерение #Greeting, укажите несколько примеров слов или предложений, которые пользователь может использовать для намерения, например «hi» и «hello», и нажмите кнопку «Done».

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

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

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

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

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

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

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

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

3. Настройка Android Studio Project
Хотя с помощью любой сетевой сети Android можно взаимодействовать с услугой «Беседа», использование Watson Java SDK - лучшая идея, потому что она предлагает очень интуитивно понятный и высокоуровневый API. Чтобы добавить его в проект Android Studio, добавьте следующую зависимость compile
в файле build.gradle
модуля app:
compile 'com.ibm.watson.developer_cloud:java-sdk:3.7.2'
Кроме того, нам понадобится библиотека Fuel для извлечения вдохновляющих цитат с удаленного сервера и библиотека Design, которая сможет работать с несколькими виджетами Material Design.
compile 'com.android.support:design:23.4.0' compile 'com.github.kittinunf.fuel:fuel-android:1.9.0'
Как Fuel, так и Watson Java SDK требуют, чтобы ваше приложение имело разрешение INTERNET
, поэтому не забудьте запросить его в файле манифеста вашего проекта:
<uses-permission android:name="android.permission.INTERNET"/>
Наконец, откройте файл res/values/strings.xml и добавьте имя пользователя и пароль службы беседы, и идентификатор рабочей области диалога - как теги <string>
:
<string name="username">1234567890-abde-12349-abdef</string> <string name="password">ABCD123456</string> <string name="workspace">abdefg1234567890-abcdef</string>
Теперь вы можете нажать кнопку «Синхронизировать сейчас», чтобы завершить настройку проекта.
4. Определение макета
В этом уроке мы создадим текстового бота. Поэтому макет нашего приложения должен содержать виджет EditText
, в котором пользователи могут вводить свои сообщения, и виджет TextView
, в котором может отображаться разговор пользователя. При желании вы можете поместить виджет EditText
внутри контейнера TextInputLayout
, чтобы убедиться, что он соответствует рекомендациям Material Design.
Также полезно разместить виджет TextView
внутри контейнера ScrollView
, чтобы убедиться, что длинные разговоры не обрезаются.
<android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:id="@+id/user_input_container"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Message" android:id="@+id/user_input" android:imeOptions="actionDone" android:inputType="textShortMessage"/> </android.support.design.widget.TextInputLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/user_input_container"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/conversation" android:textSize="16sp" /> </ScrollView>
Обратите внимание, что мы установили значение атрибута imeOptions
виджета EditText
в actionDone
. Это позволяет пользователям нажимать кнопку «Done» на виртуальных клавиатурах, когда они заканчивают ввод своих сообщений.
5. Использование службы беседы
В классе ConversationService
Watson SDK есть все способы, с которыми вам нужно связаться с сервисом Беседа. Поэтому первое, что вам нужно сделать в вашем классе Activity
, это создать его экземпляр. Его конструктор ожидает дату версии, имя пользователя и пароль.
final ConversationService myConversationService = new ConversationService( "2017-05-26", getString(R.string.username), getString(R.string.password) );
Затем, чтобы иметь возможность работать с виджетами, присутствующими в XML-файле макета, вы должны получить ссылки на них с помощью метода findViewById()
.
final TextView conversation = (TextView)findViewById(R.id.conversation); final EditText userInput = (EditText)findViewById(R.id.user_input);
Когда пользователи закончили вводить свои входные сообщения, они будут нажимать кнопку «Done» на своих виртуальных клавиатурах. Чтобы прослушать это событие нажатия кнопки, вы должны добавить OnEditorActionListener
в виджет EditText
.
userInput.setOnEditorActionListener(new TextView .OnEditorActionListener() { @Override public boolean onEditorAction(TextView tv, int action, KeyEvent keyEvent) { if(action == EditorInfo.IME_ACTION_DONE) { // More code here } return false; } });
Внутри слушателя вы можете вызвать метод getText()
виджета EditText
для извлечения сообщения пользователя.
Виджет TextView
будет отображать как сообщения пользователя, так и ответы бота. Поэтому добавьте сообщение в виджет TextView
, используя его метод append()
.
final String inputText = userInput.getText().toString(); conversation.append( Html.fromHtml("<p><b>You:</b> " + inputText + "</p>") ); // Optionally, clear edittext userInput.setText("");
Сообщение пользователя должно быть отправлено в службу беседы, завернутую в объект MessageRequest
. Вы можете легко создать его с помощью класса MessageRequest.Builder
.
MessageRequest request = new MessageRequest.Builder() .inputText(inputText) .build();
После того как запрос будет готов, вы должны передать его методу message()
объекта ConversationService
вместе с идентификатором рабочей области. Наконец, чтобы отправить сообщение в службу беседы, вы должны вызвать метод enqueue()
.
Поскольку метод enqueue()
выполняется асинхронно, для получения ответа службы вам также потребуется объект ServiceCallback
.
myConversationService .message(getString(R.string.workspace), request) .enqueue(new ServiceCallback<MessageResponse>() { @Override public void onResponse(MessageResponse response) { // More code here } @Override public void onFailure(Exception e) {} });
Внутри метода onResponse()
вы можете вызвать метод getText()
объекта MessageResponse
, чтобы получить ответ службы беседы.
final String outputText = response.getText().get(0);
Теперь вы можете добавить ответ на виджет TextView
с помощью метода append()
. Однако убедитесь, что вы делаете это внутри метода runOnUiThread()
, потому что в настоящее время вы используете другой поток.
runOnUiThread(new Runnable() { @Override public void run() { conversation.append( Html.fromHtml("<p><b>Bot:</b> " + outputText + "</p>") ); } });
Наш бот почти готов. Если вы попробуете запустить приложение, вы сможете получить от него правильные ответы для целей #Greeting и #Name. Тем не менее, он все еще не может читать вдохновляющие цитаты. Поэтому теперь мы должны добавить код, чтобы явно искать намерение #RequestQuote и генерировать ответ вручную.
Чтобы извлечь имя обнаруженного намерения из объекта MessageResponse
, вы должны вызвать его метод getIntents()
, который возвращает список объектов MessageResponse.Intent
, выбрать первый элемент и вызывать его метод getIntent()
.
if(response.getIntents().get(0).getIntent() .endsWith("RequestQuote")) { // More code here }
Есть много сайтов со свободными API, которые вы можете использовать для получения вдохновляющих цитат. Forismatic - один из них. Его REST API предоставляет цитаты в виде обычного текста, который вы можете напрямую использовать в своем приложении.
Чтобы сделать HTTP-запрос к URL-адресу API Forismatic, вам нужно всего лишь вызвать метод get()
класса Fuel
. Поскольку метод выполняется асинхронно, вы должны обрабатывать HTTP-ответ, вызывая метод responseString()
и передавая ему объект Handler
.
Внутри метода success()
обработчика вы можете просто добавить цитату в виджет TextView
. В следующем коде показано, как:
String quotesURL = "https://api.forismatic.com/api/1.0/" + "?method=getQuote&format=text&lang=en"; Fuel.get(quotesURL) .responseString(new Handler<String>() { @Override public void success(Request request, Response response, String quote) { conversation.append( Html.fromHtml("<p><b>Bot:</b> " + quote + "</p>") ); } @Override public void failure(Request request, Response response, FuelError fuelError) { } });
Теперь бот завершен и сможет генерировать правильные ответы для всех намерений, которые мы добавили в рабочую область.

Заключение
Разговорные пользовательские интерфейсы сегодня в моде. Они настолько просты в использовании, что все их любят. В этом уроке вы узнали об основах создания таких интерфейсов на платформе Android с помощью службы обмена сообщениями IBM Watson.
Служба может делать многое. Чтобы узнать больше о ней, вы можете обратиться к официальной документации.
И не забудьте проверить некоторые из наших других статей об использовании машинного обучения для ваших приложений Android!
- Машинное обучениеПишем приложеник для Android с помощью IBM Watson Machine LearningАшраф Хатибелагал
- Android SDKКак использовать службы Google Cloud Machine для AndroidАшраф Хатибелагал
- Android SDKКак использовать API Google Cloud Vision в приложениях для AndroidАшраф Хатибелагал
- Android SDKСоздайте интеллектуальное приложение с API Google Cloud Speech и Natural Language APIАшраф Хатибелагал
- Android ThingsAndroid Things и Machine LearningПол Требилкокс-Руис
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post