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

В этой статье я покажу вам, как мы это сделали, чтобы вы могли сделать то же самое.

Выбор каркаса

Для начала я протестировал множество различных фреймворков машинного обучения - Wit.AI, Microsoft Cognitive Services, я взглянул на Луиса… для меня оказалось, что API.AI был правильным выбором. Он был полностью бесплатным с хорошей скоростью отклика, у него был отличный пользовательский интерфейс для разработки, и его было легко настроить, начать работу и расширить.

Я не занимаюсь разработкой Api.ai, так как там уже есть отличные документы. Когда дело доходит до SDK для Node.js, есть только один недостаток; ни один из методов, использующих токен разработчика, не был реализован. Итак, я создал свой форк, который решает эту проблему. Не стесняйтесь клонировать и использовать его.

Уникальные проблемы - и решения

Когда вы создаете сервис, который будет использоваться многими пользователями, вы хотите, чтобы информация не дублировалась. Например, один пользователь может задать такой вопрос, как «Какой фреймворк машинного обучения лучший?» и задайте ответ «Api.ai», в то время как другой пользователь может указать «Wit.ai» в качестве ответа. Бот должен понимать, к какому пользователю обращается запрос, и возвращать соответствующий ответ.

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

Разрешение пользователям создавать свои собственные FAQ

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

Для создания новых намерений вам понадобится вилка github, о которой я говорил ранее.

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

В Универсальном чате мы справляемся с этим двумя способами:

  1. Для каждого ответа мы позволяем посетителям перейти к действующему оператору. Когда посетители делают это, мы также отмечаем вопрос, который они задали, чтобы правильный ответ можно было добавить в базу данных позже.
  2. Иногда Api.ai не может найти ответ - в этом случае он возвращает результат «input.unknown». Это еще одно место, где нужно остерегаться и создавать вопросы

Итак, теперь у нас есть все ингредиенты;

  • Api.ai как фреймворк машинного обучения
  • Форк Node.js, который может правильно создавать новые намерения
  • Дорожная карта о том, как это построить

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

Звонок в контексте

Мы создадим этот метод для запроса Api.ai:

функция ask (текст, параметры) {
let apiaiRequest = apiai.textRequest (текст, параметры);

apiaiRequest.on («ответ», (ответ) = ›{console.log (ответ);})

apiaiRequest.on (‘error’, (error) = ›{console.log (error);});

apiaiRequest.end ();
}

Затем вы можете запросить его следующим образом:

ask («вопрос», {
sessionId: «уникальный идентификатор сеанса»,
контексты: [{name: «пользователь 1»}]
}

Это все. Замените код console.log чем-нибудь более полезным. В github я показал, как можно переписать вышеприведенное, используя обещания для получения более чистой альтернативы.

Создание новых намерений

Чтобы создать новое намерение, используйте метод POST. Опять же, все это хорошо документировано и доступно, поэтому давайте рассмотрим только новое:

функция createIntent (options) {
return new Promise ((resolve, reject) = ›{
let request = app.intentPostRequest (options);

request.on (‘ответ’, (response) = ›{return resolve (response);});

request.on (‘error’, (error) = ›{return reject (error);});

request.end ();
})
}

Теперь назовите это примерно так:

var opts = {«name»: «‹ новый вопрос ›»,
«auto»: true,
«templates»: [«‹ новый вопрос ›»],
«контексты »: ['‹ Контекст ›'],
« userSays »: [
{« data »: [{« text »:« ‹новый вопрос› »}],« isTemplate »: false , «Count»: 0}],
«answers» = ›[{« Speech »:« ‹ответ› »}]};

createIntent (выбирает)

Важные моменты, на которые следует обратить внимание:

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

Бонус; создание намерений с помощью PHP SDK

Если вы настроили веб-сайт для управления этими вещами, вы можете использовать PHP SDK. Опять же, исходный вариант также не поддерживал создание намерений, поэтому мы добавили это в этой вилке. В Readme.md есть не требующий пояснений образец того, как это сделать, поэтому я не буду беспокоить вас об этом здесь.

Заключение

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