В Универсальном чате мы реализовали чат-бота, который может обучить любой желающий без особых усилий. Логика проста; просто задайте ему свои вопросы и ответы, и бот ответит любому клиенту, который задаст что-то подобное.
В этой статье я покажу вам, как мы это сделали, чтобы вы могли сделать то же самое.
Выбор каркаса
Для начала я протестировал множество различных фреймворков машинного обучения - Wit.AI, Microsoft Cognitive Services, я взглянул на Луиса… для меня оказалось, что API.AI был правильным выбором. Он был полностью бесплатным с хорошей скоростью отклика, у него был отличный пользовательский интерфейс для разработки, и его было легко настроить, начать работу и расширить.
Я не занимаюсь разработкой Api.ai, так как там уже есть отличные документы. Когда дело доходит до SDK для Node.js, есть только один недостаток; ни один из методов, использующих токен разработчика, не был реализован. Итак, я создал свой форк, который решает эту проблему. Не стесняйтесь клонировать и использовать его.
Уникальные проблемы - и решения
Когда вы создаете сервис, который будет использоваться многими пользователями, вы хотите, чтобы информация не дублировалась. Например, один пользователь может задать такой вопрос, как «Какой фреймворк машинного обучения лучший?» и задайте ответ «Api.ai», в то время как другой пользователь может указать «Wit.ai» в качестве ответа. Бот должен понимать, к какому пользователю обращается запрос, и возвращать соответствующий ответ.
Чтобы решить эту проблему, мы использовали переменные контекста - определяя контекст, мы могли разделить ответы для каждого пользователя и его клиентов в отдельном потоке.
Разрешение пользователям создавать свои собственные FAQ
Api.ai довольно умен - превращение его в диалогового агента означает лишь добавление новых намерений и определение реакции бота. Вы также можете обогатить опыт, импортировав готовые шаблоны из библиотеки Api.ai, что даст вам преимущество в вашей нише.
Для создания новых намерений вам понадобится вилка github, о которой я говорил ранее.
Еще одна проблема, прежде чем мы начнем; чат-бот не всегда будет точным. Нам нужен способ отступить, когда это произойдет.
В Универсальном чате мы справляемся с этим двумя способами:
- Для каждого ответа мы позволяем посетителям перейти к действующему оператору. Когда посетители делают это, мы также отмечаем вопрос, который они задали, чтобы правильный ответ можно было добавить в базу данных позже.
- Иногда 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 минуты. Просто убедитесь, что вы использовали подходящие резервные варианты, чтобы сохранить скин бота, когда он попадает в более сложные запросы.