Статьи

Создание интеллектуальных чат-ботов на Android с IBM Watson

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

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

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

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

Каталог услуг Watson

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

Форма конфигурации службы разговоров

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

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

Средство запуска инструмента рабочего пространства для разговоров

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

Диалог конфигурации рабочего пространства

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

Внутренние объекты и вкладки диалога

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

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

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

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

Нажмите кнопку « Создать новый» , чтобы создать первое намерение. В появившейся форме назовите намерение #Greeting , предоставьте несколько примеров слов или предложений, которые пользователь может использовать для этого намерения, например «привет» и «привет», и нажмите кнопку « Готово» .

Создание приветствия

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

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

Название намерение создания

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

RequestQuote намерение создания

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

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

Диалоговые узлы по умолчанию

А пока давайте оставим узел Anything else как есть и сконфигурируем узел Welcome . В появившемся диалоговом окне введите #Greeting в поле Если бот распознает , а затем добавьте несколько ответов. Очевидно, что чем больше ответов вы добавите, тем более похожим на человека будет ваш чатбот.

Диалог для приветствия

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

Диалог для имени

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

Диалог для RequestQuote

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

Тестирование рабочей области

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

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

Вкладка учетные данные

Хотя возможно взаимодействовать со службой беседы с помощью любой сетевой библиотеки 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>

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

В этом уроке мы будем создавать текстового бота. Поэтому макет нашего приложения должен содержать виджет 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 . Это позволяет пользователям нажимать кнопку « Готово» на своих виртуальных клавиатурах, когда они заканчивают вводить свои сообщения.

Класс 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-чат работает

Разговорные пользовательские интерфейсы сегодня в моде. Они так просты в использовании, что все любят их. В этом руководстве вы узнали основы создания таких интерфейсов на платформе 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 вещи и машинное обучение
    Пол Требилкокс-Руис