Если вы когда-нибудь общались с голосовыми личными помощниками, такими как Siri или Google Now, или общались с одним из множества текстовых ботов, работающих на платформах обмена сообщениями, таких как Facebook Messenger и Kik, вы, вероятно, понимаете, насколько это весело, интуитивно понятно и Мощные диалоговые пользовательские интерфейсы могут быть. Однако, поскольку большинство естественных языков чрезвычайно сложны, создание таких интерфейсов с нуля, как правило, сложно. К счастью, есть IBM Watson .
Используя службу IBM Watson Conversation , вы можете создавать диалоговые пользовательские интерфейсы на основе AI за считанные минуты, часто всего за несколько строк кода. В этом руководстве я познакомлю вас с сервисом и покажу, как использовать его в приложениях для Android.
Предпосылки
Чтобы максимально использовать этот учебник, вам понадобится следующее:
- учетная запись IBM Bluemix
- последняя версия Android Studio
- устройство под управлением Android 4.4 или выше
1. Создание службы общения
Прежде чем вы сможете использовать API-интерфейс IBM Watson Conversation, вы должны создать службу беседы на платформе IBM Bluemix и получить для нее учетные данные для входа. Для этого войдите в консоль Bluemix, выберите « Службы»> «Watson» и нажмите кнопку « Создать службу Watson» . На следующем экране выберите « Разговор» из каталога доступных услуг.
В форме конфигурации, которая отображается далее, введите подходящее имя для службы и нажмите кнопку « Создать» .
2. Создание рабочей области для разговора
Служба беседы может работать только в том случае, если с ней связано хотя бы одно рабочее пространство беседы. Пока вы можете рассматривать рабочее пространство как набор правил и деталей конфигурации, которые определяют возможности и индивидуальность вашего диалогового интерфейса.
Консоль Bluemix имеет простой в использовании инструмент, который позволяет создавать и управлять рабочими пространствами. Чтобы запустить его, нажмите кнопку « Запустить инструмент» .
На следующем экране нажмите кнопку « Создать» , чтобы создать новое рабочее пространство. В появившемся диалоговом окне дайте значимое имя рабочей области и выберите для нее язык.
После того, как рабочее пространство создано, вы должны добавить в него намерения, сущности и детали диалога.
В то время как намерения определяют действия, которые пользователь может выполнять с помощью вашего диалогового пользовательского интерфейса, сущности определяют объекты, которые имеют отношение к этим действиям. Например, в предложении «закажи мне билет из Нью-Йорка в Чикаго» слово «закажи билет» будет намерением, а «Нью-Йорк» и «Чикаго» будут сущностями. Детали диалога определяют фактические ответы, которые генерирует пользовательский интерфейс разговора, и как протекают его разговоры.
Шаг 1: Создать Intents
В этом уроке мы создадим очень простого Android-чата, способного выполнять следующие действия:
- приветствовать пользователя
- представиться
- цитаты вдохновляющие цитаты
Соответственно, нашему чатботу нужно три намерения.
Нажмите кнопку « Создать новый» , чтобы создать первое намерение. В появившейся форме назовите намерение #Greeting , предоставьте несколько примеров слов или предложений, которые пользователь может использовать для этого намерения, например «привет» и «привет», и нажмите кнопку « Готово» .
Лучшее в службе Watson Conversation заключается в том, что она интеллектуально обучается, используя примеры пользовательских данных, которые вы предоставляете намерению. Следовательно, он сможет реагировать на несколько вариантов этих входных данных. Например, он сможет правильно сопоставлять слова и фразы, такие как «привет», «доброе утро» и «йо!» на # Приветственное намерение.
Нажмите кнопку « Создать новый» еще раз, чтобы создать следующее намерение. Назовите его #Name и предоставьте следующие примеры пользователей.
Аналогично, назовите третье намерение #RequestQuote и предоставьте следующие примеры пользователей.
Шаг 2. Создайте диалог
Наш чат-бот настолько прост, что нам не нужно определять какие-либо сущности для него. Поэтому теперь мы можем непосредственно начать указывать, как он реагирует на каждое намерение, которое мы создали.
Для начала перейдите на вкладку Диалог и нажмите кнопку Создать . На следующем экране вы увидите, что два диалоговых узла создаются для вас автоматически: один с именем Welcome , который должен приветствовать пользователя, и другой с именем Anything else , который предназначен для отлова входных данных, которые бот не понимает.
А пока давайте оставим узел Anything else как есть и сконфигурируем узел Welcome . В появившемся диалоговом окне введите #Greeting в поле Если бот распознает , а затем добавьте несколько ответов. Очевидно, что чем больше ответов вы добавите, тем более похожим на человека будет ваш чатбот.
Затем создайте новый узел для намерения #Name , нажав кнопку Добавить узел . Опять же, заполните форму, показанную соответствующим образом.
Узел для намерения #RequestQuote будет немного другим. Мы не будем вводить вручную несколько вдохновляющих цитат в качестве ответов этого узла, потому что это сделает наш бот слишком статичным и неинтересным. Вместо этого наш Android-чатбот должен иметь возможность извлекать цитаты из внешнего API. Следовательно, ответы этого узла должны быть предложениями, которые просят пользователя подождать, пока бот ищет новую цитату.
На данный момент наше рабочее пространство готово. Вы можете проверить это прямо сейчас, щелкнув значок всплывающей подсказки. Не стесняйтесь проверять его различными предложениями, чтобы убедиться, что он связывает с ними правильные намерения.
Шаг 3: Определите учетные данные
Чтобы использовать службу беседы в приложении для Android, вам потребуется имя пользователя и пароль. Кроме того, вам потребуется идентификатор рабочей области беседы. Поэтому перейдите в раздел « Развертывание » и перейдите на вкладку « Учетные данные ».
Теперь вы сможете увидеть необходимые учетные данные. Отметив их все, вы можете закрыть консоль Bluemix.
3. Настройка Android Studio Project
Хотя возможно взаимодействовать со службой беседы с помощью любой сетевой библиотеки Android, лучше использовать Watson Java SDK, поскольку она предлагает очень интуитивный и высокоуровневый API. Чтобы добавить его в проект Android Studio, добавьте следующую зависимость compile
в файл build.gradle модуля app
:
1
|
compile ‘com.ibm.watson.developer_cloud:java-sdk:3.7.2’
|
Кроме того, нам понадобится сетевая библиотека Fuel для извлечения вдохновляющих цитат с удаленного сервера, а также библиотека поддержки проектирования, позволяющая работать с несколькими виджетами Material Design.
1
2
|
compile ‘com.android.support:design:23.4.0’
compile ‘com.github.kittinunf.fuel:fuel-android:1.9.0’
|
Как Fuel, так и Watson Java SDK требуют, чтобы ваше приложение имело разрешение INTERNET
, поэтому не забудьте запросить его в файле манифеста вашего проекта:
1
|
<uses-permission android:name=»android.permission.INTERNET»/>
|
Наконец, откройте файл res / values / strings.xml и добавьте имя пользователя и пароль службы беседы, а также идентификатор рабочей области беседы в виде тегов <string>
:
1
2
3
|
<string name=»username»>1234567890-abde-12349-abdef</string>
<string name=»password»>ABCD123456</string>
<string name=»workspace»>abdefg1234567890-abcdef</string>
|
Теперь вы можете нажать кнопку « Синхронизировать сейчас» , чтобы завершить настройку проекта.
4. Определение макета
В этом уроке мы будем создавать текстового бота. Поэтому макет нашего приложения должен содержать виджет EditText
который пользователи могут вводить свои сообщения, и виджет TextView
котором может отображаться диалог между пользователем и ботом. При желании вы можете разместить виджет EditText
внутри контейнера TextInputLayout
чтобы убедиться, что он соответствует рекомендациям по дизайну материалов.
Также хорошей идеей является размещение виджета TextView
внутри контейнера ScrollView
чтобы убедиться, что длинные разговоры не усекаются.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<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>
|
Обратите внимание, что мы установили значение атрибута actionDone
виджета EditText
в actionDone
. Это позволяет пользователям нажимать кнопку « Готово» на своих виртуальных клавиатурах, когда они заканчивают вводить свои сообщения.
5. Использование службы бесед
Класс ConversationService
пакета Watson SDK содержит все методы, необходимые для взаимодействия со службой бесед. Поэтому первое, что вам нужно сделать в классе Activity
— это создать его экземпляр. Его конструктор ожидает дату версии, имя пользователя службы и ее пароль.
1
2
3
4
5
6
|
final ConversationService myConversationService =
new ConversationService(
«2017-05-26»,
getString(R.string.username),
getString(R.string.password)
);
|
Затем, чтобы иметь возможность работать с виджетами, присутствующими в XML-файле макета, вы должны получить ссылки на них с findViewById()
метода findViewById()
.
1
2
|
final TextView conversation = (TextView)findViewById(R.id.conversation);
final EditText userInput = (EditText)findViewById(R.id.user_input);
|
Когда пользователи закончат вводить свои входные сообщения, они будут нажимать кнопку « Готово» на своих виртуальных клавиатурах. Чтобы иметь возможность прослушивать это событие нажатия кнопки, необходимо добавить OnEditorActionListener
в виджет EditText
.
01
02
03
04
05
06
07
08
09
10
11
|
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()
.
1
2
3
4
5
6
7
|
final String inputText = userInput.getText().toString();
conversation.append(
Html.fromHtml(«<p><b>You:</b> » + inputText + «</p>»)
);
// Optionally, clear edittext
userInput.setText(«»);
|
Сообщение пользователя должно быть отправлено службе беседы, обернутой в объект MessageRequest
. Вы можете легко создать его, используя класс MessageRequest.Builder
.
1
2
3
|
MessageRequest request = new MessageRequest.Builder()
.inputText(inputText)
.build();
|
Когда запрос готов, вы должны передать его методу message()
объекта ConversationService
вместе с идентификатором рабочей области. Наконец, чтобы действительно отправить сообщение службе беседы, необходимо вызвать метод enqueue()
.
Поскольку метод enqueue()
выполняется асинхронно, вам также понадобится объект ServiceCallback
чтобы получить ответ службы.
01
02
03
04
05
06
07
08
09
10
11
|
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
чтобы получить ответ службы беседы.
1
|
final String outputText = response.getText().get(0);
|
Теперь вы можете снова добавить ответ в виджет TextView
используя его метод append()
. Однако убедитесь, что вы делаете это внутри runOnUiThread()
поскольку в данный момент вы находитесь в другом потоке.
1
2
3
4
5
6
7
8
9
|
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()
.
1
2
3
4
|
if(response.getIntents().get(0).getIntent()
.endsWith(«RequestQuote»)) {
// More code here
}
|
Есть много сайтов с бесплатными API, которые вы можете использовать для получения вдохновляющих цитат. Forismatic является одним из них. Его REST API предоставляет кавычки в виде простого текста, который вы можете напрямую использовать в своем приложении.
Чтобы сделать HTTP-запрос к URL-адресу Forismatic API, все, что вам нужно сделать, это вызвать метод get()
класса Fuel
. Поскольку метод выполняется асинхронно, вы должны обработать HTTP-ответ, вызвав метод responseString()
и передав ему объект Handler
.
Внутри метода success()
обработчика вы можете просто добавить кавычку в виджет TextView
. Следующий код показывает вам, как:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
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 Conversation.
Сервис может сделать намного больше. Чтобы узнать больше об этом, вы можете обратиться к официальной документации .
И не забудьте проверить некоторые другие наши посты об использовании машинного обучения для ваших приложений Android!
-
Машинное обучениеКодирование приложения для Android с помощью машинного обучения IBM Watson
-
Android SDKКак использовать Google Cloud Machine Learning Services для Android
-
Android SDKКак использовать API Google Cloud Vision в приложениях для Android
-
Android SDKСоздайте интеллектуальное приложение с Google Cloud Speech и API на естественном языке
-
Android вещиAndroid вещи и машинное обучение