Please wait...

Blog

Чатботы

Разработка чатботов с использованием NodeJs и Motion AI.

Перевод статьи David Nelson. Оригинал доступен тут

Сегодня мы невероято рады представить дополнение Motion AI - "NodeJs Module", который позволит каждому пользователю с легкостью писать код для чатботов любой сложности непосредственно в браузере и без необходимости задесйствовать дополнительные серверные мощности

Эта интеграция стала возможна благодаря AWS Lambda, сервис который также анонсировал нашу интеграцию на AWS re:Invent. Можете ознакомиться с нашей документацией, а так же бесплатно зарегистрироваться и начать более подробно знакомиться с Motion AI.

Motion AI спроектирована вокруг модульной технологии разработки ботов, состоит из различных NLP блоков, чтобы позволить пользователям создавать чатботов на потоке. Как мы говорим: "Еслив вы в состоянии создать блок-схему, значит вы можете создать чатбота". Чатбот с помощью Motion AI

До сегодняшнего дня, пользователи управляли своими ботами за пределами платформы Motion AI, конфигурировали свои web-сервисы, чтобы получать и отправлять вэбхуки.

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

Каждой функции NodeJs, созданная с помощью Motion AI передается playload объект, которые содержит мета-данные сформированные на основании ответа боту от конечного пользователя. Этими данными можно управлять для того, чтобы сформировать ответ от чатбота пользователю в конце функции.

В качестве демонстрации, давайте создадим бота простого бота. Результаты вы можете в Facebook Messenger по https://www.messenger.com/login.php?next=https%3A%2F%2Fwww.messenger.com%2Ft%2Ftriviabotdemo%2F

Чатбот с помощью Motion AI

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

Чатбот с помощью Motion AI

Так как это достаточно простой базовый диалог, использование "NodeJs Module" было бы черезчур. Однако так как мы хотим получать простые вопросы, которые мы будем использовать в диалоге с пользователями, из большой базы данных с тысячами вопросов и ответов (через REST API), то тут как раз NodeJs становится очень необходим.

После того, как пользователь выберет уровень сложности, мы можем передать его одному из трех NodeJs модулей: “Fetch Trivia — Easy”, “Fetch Trivia — Medium” or “Fetch Trivia — Hard”.

Чатбот с помощью Motion AI

Все эти три модуля очень похожи по своей природе. Они подгружают вопросы из баз данных разделенных по уровню сложности.

Ниже на картинке можно увидеть код с комментариями, который извлекает вопросы из БД с низким уровнем сложности вопросов.

                  
                    // View a demonstration here: http://m.me/triviabotdemo

                    // The contents of this file should be pasted into a Node.js Module in Motion AI on https://dashboard.motion.ai

                    exports.handler = (event, context, callback) => {

                    /* "event" object contains payload from Motion AI
                        {
                            "from":"string", // the end-user's identifier (may be FB ID, email address, Slack username etc, depends on bot type)
                            "session":"string", // a unique session identifier
                            "botId":"string", // the Motion AI ID of the bot
                            "botType":"string", // the type of bot this is (FB, Slack etc)
                            "customPayload":"string", // a developer-defined payload for carrying information
                            "reply":"string", // the end-user's reply that led to this module
                            "moduleId":"string", // the current Motion AI Module ID
                            "result":"string" // any extracted data from the prior module, if applicable
                        }
                      */

                      // this is the object we will return to Motion AI in the callback
                      var responseJSON = {
                          "response": "", // what the bot will respond with (more is appended below)
                          "continue": false, // denotes that Motion AI should hit this module again, rather than continue further in the flow
                          "customPayload": "", // working data to examine in future calls to this function to keep track of state
                          "quickReplies": null, // a JSON object containing suggested/quick replies to display to the user
                          "cards": null // a cards JSON object to display a carousel to the user (see docs)
                      }

                      var request = require('request'); // require the request library so that we can make an API call below

                      if (event.customPayload) { // if the customPayload exists, that means we have some prior working data (in this case, the correct answer to the prior question)

                          var rand = getRandomInt(1,4);

                          if (event.customPayload == event.reply) {
                              if (rand == 1)
                              responseJSON.response = "Bingo!  Good job!";
                              if (rand == 2)
                              responseJSON.response = "I'm impressed.";
                              if (rand == 3)
                              responseJSON.response = "Well done.";
                              if (rand == 4)
                              responseJSON.response = "Very nice.";
                          } else {
                              responseJSON.response = "That is incorrect. It was: "+event.customPayload;
                          }

                      } else {
                          // customPayload was empty - AKA, this was the first trivia question
                      }

                      // API call to Open Trivia DB
                        request("https://www.opentdb.com/api.php?amount=1&difficulty=easy", function(error, response, body) {

                         var json = JSON.parse(body);

                         var qrArray = []; // prepare an array that contains quickReplies to display

                         qrArray.push(replaceHTMLEntities(json.results[0].correct_answer)); // push the correct answer to this question

                         for (var i = 0; i < json.results[0].incorrect_answers.length; i++) {
                          qrArray.push(replaceHTMLEntities(json.results[0].incorrect_answers[i])); // push each of the incorrect answers to list as multiple choice options
                         }

                        shuffle(qrArray); // shuffle the quick replies so that the correct one is not always first

                        // display results from last question and append next trivia question
                        responseJSON.response = responseJSON.response+" ::next-1000:: "+replaceHTMLEntities(json.results[0].question);

                        responseJSON.quickReplies = qrArray; // add our quick replies object to the callback JSON

                        // store the current correct answer in customPayload so that it can be compared against their answer
                        responseJSON.customPayload = replaceHTMLEntities(json.results[0].correct_answer);

                        // return the data to Motion AI!
                        callback(null, responseJSON);

                          });
                        };

                      // functions used above
                      function shuffle(a) {
                          var j, x, i;
                          for (i = a.length; i; i--) {
                              j = Math.floor(Math.random() * i);
                              x = a[i - 1];
                              a[i - 1] = a[j];
                              a[j] = x;
                          }
                      }

                      function getRandomInt(min, max) {
                          return Math.floor(Math.random() * (max - min + 1)) + min;
                      }

                      // this is only needed because our demo lives on FB Messenger, where HTML is not supported
                      function replaceHTMLEntities(str) {
                       	str = str.replace(/"/g, '"');
                       	return str.replace(/&(.*?);/g, '');
                      }
                  
                

В данном примере, так как наш callback к Motion AI содержит пару ключ-значение “continue = false”, Motion AI продолжит обращаться к тому же самому модулю до тех пор пока значение "continue" не станет равно false. Это требуемое и ожидаемое поведение в данной ситуации, когда простейшая игра может продолжаться столько сколько пожелает пользователь.

Motion AI предлагает “customPayload” ключ, который вы можете использовать для того, чтобы сохранять и извлекать рабочие данные. В данном конкретном случае, мы используем его для того чтобы последний правильный ответ для каждого вопроса. Это позволяет использовать его для сравнения с отетом пользователя и определять правильно ли пользователь ответил на вопрос.

Попробуйте готовый вариант чатбота для Facebook Messenger тут

Мы создали чат-бота, который может динамически задавать тысячи вопросов. Создание этой демонстрации заняло примерно 15 минут.

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

Взгляд за пределы демонстрации.

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

Чат-боты лишь одна из множества возможностей, где мы предполагаем возможность использовани serverless вычислений и бесконечное количество возможностей, которые приносит данное технологическое направление. Надеемся, что вы также впечатлены как и мы!