Création d’un chatbot en Node.js

Robot

J’ai eu la chance de participer à l’événement Microsoft Experiences qui s’est déroulé la semaine dernière au Palais des Congrès de Paris. J’ai assisté à plusieurs sessions techniques et l’une d’entre-elles était dédiée à la réalisation d’un robot conversationnel capable de comprendre les demandes des utilisateurs en langage naturel et d’y répondre. Évidemment, dès le lendemain, j’ai voulu essayer cette nouvelle technologie par moi-même ! Je vous propose donc qu’on crée ensemble un chatbot, de la première ligne de code jusqu’à la connexion aux différents services de messagerie. Ce robot écrit en Node.js aura pour mission de donner la météo d’une ville et pourra être connecté à Facebook Messenger, Skype ou encore Slack.

Juste pour vous faire saliver et vous motiver à lire la suite de ce long article, je vous laisse vous amuser un peu avec le robot que nous allons réaliser ensemble (s’il est inactif depuis un moment, il peut mettre un certain temps à répondre au premier message) :

Alors, vous êtes convaincus ?

Microsoft Bot Framework

L’intelligence artificielle est un terme à la mode en ce moment et pour cause, de nombreuses avancées sont faites dans ce domaine. Évidemment, Microsoft a voulu prendre sa part de ce marché en forte croissance et a développé de nombreux services : reconnaissance visuelle, reconnaissance vocale, compréhension du langage, modélisation des connaissances et recherche avancée d’informations. C’est ce qu’on appelle les Microsoft Cognitive Services.

Pour faciliter l’utilisation de ces services par les développeurs, Microsoft a développé différents frameworks. Celui que nous allons utiliser pour créer notre chatbot est le Microsoft Bot Framework. Il est composé du Bot Builder, une librairie disponible pour Node.js et ASP.NET, et d’une plateforme de connexion des robots aux différents services de messagerie. Voici l’architecture de ce framework :

Architecture du Bot Framework de Microsoft

Dans un premier temps, nous allons nous intéresser au cœur du robot, une simple API web écrite en Node.js utilisant le Microsoft Bot Builder. Ensuite, nous connecterons notre robot au Cognitive Services pour qu’il soit capable de comprendre les messages des utilisateurs en langage naturel. Enfin, nous publierons notre robot sur les services Azure de Microsoft. Vous êtes partants ?

Votre premier chatbot

Les fichiers de l’application sont disponibles sur Github, vous pouvez les consulter ou les télécharger. Je vous conseille toutefois de lire l’article pour comprendre comment fonctionne le Bot Framework de Microsoft.

Prérequis

Comme je vous le disais dans l’introduction, le robot que nous allons créer donnera la météo actuelle d’une ville (température, humidité et vent). Nous allons récupérer ces informations grâce à l’API OpenWeatherMap. Pour utiliser cette API, vous devez vous inscrire sur le site et récupérer votre clé d’API.

Dans la partie précédente, je vous disais que la librairie que Microsoft nous mettait à disposition pour développer des robots était disponible pour les langages Node.js et ASP.NET. Pour ce tutoriel, nous allons utiliser le Node.js. Si vous ne l’avez pas encore fait, installez les outils nécessaires sur votre poste.

Une dernière chose, vous allez avoir besoin d’un compte Microsoft pour utiliser les différents services. Si vous n’en avez pas encore, créez-en un sur la page dédiée.

Création du projet

Pour commencer, créez un répertoire weather-bot dans le dossier de votre choix, c’est dans ce répertoire que nous allons créer notre projet. Ouvrez l’invite de commande (ai-je vraiment besoin de vous rappeler comment le faire ?) et naviguez jusqu’au répertoire que vous venez de créer grâce à la commande cd :

cd c:\workspaces\node-js\weather-bot\

Toujours dans l’invite de commande, initialisez le projet Node.js en tapant cette commande :

npm init

Renseignez les différentes informations qui vous sont demandées (Nom du projet : weather-bot ; Version : 1.0.0 ; Description : Chatbot qui donne la météo d’une ville ; Entry point : app.js ; Test command : vide ; Git repository : vide ; Keywords : vide ; Author : votre nom et votre prénom ; Licence : ISC) puis validez pour créer le projet.

De base, Node.js ne sait pas faire beaucoup de choses. Heureusement, il existe des milliers de modules qu’on peut greffer à notre projet et qui permettent de faire à peu près tout et n’importe quoi. Dans ce projet, nous allons utiliser les modules BotBuilder (c’est la librairie de Microsoft qui permet de créer des robots), Restify (ça permet de créer une API REST en seulement quelques lignes de code) et enfin, Request (qui permet d’effectuer des requêtes HTTP vers d’autres sites). Pour ajouter ces modules à votre projet, tapez les commandes suivantes :

npm install --save botbuilder
npm install --save restify
npm install --save request

Créez un fichier app.js dans le répertoire de votre projet, ce fichier sera le point d’entrée de notre application. Il va contenir toute la logique de notre robot.

Ouvrez le fichier que vous venez de créer en mode édition, il est temps de commencer à coder ! La première chose à faire est de charger les modules Node.js dont nous allons avoir besoin :

var request = require('request');
var restify = require('restify');
var builder = require('botbuilder');

Ensuite, il faut définir quelques variables de configuration de façon à ce qu’on puisse modifier leur valeur simplement dans avoir à relire tout le code du fichier (pensez à remplir la variable openWeatherMapAppId avec votre clé d’API Open Weather Map) :

//---------------------------------------------------------
// Configuration
//---------------------------------------------------------

// Connector
var connectorAppId = process.env.MICROSOFT_APP_ID;
var connectorAppPassword = process.env.MICROSOFT_APP_PASSWORD;

// Open Weather Map
var openWeatherMapAppId = 'VotreApiKeyOpenWeatherMap';

Je vous ai dit que le robot était en fait une simple API web, nous allons donc avoir besoin d’un serveur HTTP :

//---------------------------------------------------------
// Setup
//---------------------------------------------------------

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

Le moment est venu de créer le robot en lui indiquant le connecteur qu’il va devoir utiliser. Le connecteur, c’est ce qui permet au robot d’interagir avec les utilisateurs. Il existe plusieurs types de connecteurs, notamment le ConsoleConnector qui permet de dialoguer avec le robot directement depuis la console. Ici, nous allons utiliser le ChatConnector, il permet de connecter le robot au Microsoft Bot Connector (Skype, Facebook, Slack, etc.) et au Bot Framework Channel Emulator (outil permettant de simuler un service de messagerie pour faire des tests). C’est quand même mieux que de saisir des messages depuis la console, vous ne trouvez pas ?

// Create connector and bot
var connector = new builder.ChatConnector({
    appId: connectorAppId,
    appPassword: connectorAppPassword
});

var bot = new builder.UniversalBot(connector);

Il faut ensuite indiquer à notre serveur HTTP que c’est le robot qui répondra aux appels REST :

server.post('/api/messages', connector.listen());

Pour sélectionner les actions à effectuer en fonction des messages qui lui sont envoyés, notre robot va devoir déterminer quelle intention se cache derrière chaque message. C’est l’IntentDialog qui va avoir ce rôle :

// Create the intent recognizer
var dialog = new builder.IntentDialog();
bot.dialog('/', dialog);

Notre robot est presque prêt, il ne reste plus qu’à définir les différents dialogues. Nous allons créer un dialogue qui sera déclenché si l’utilisateur écrit « Donne-moi la météo » et un dialogue par défaut qui sera déclenché si le robot n’arrive pas à identifier l’intention d’un message :

//---------------------------------------------------------
// Dialogs
//---------------------------------------------------------

dialog.matches(/^Donne-moi la météo/i, [
        function (session) {
            builder.Prompts.text(session, 'De quelle ville voulez-vous connaître la météo ?');
        },
        function (session, results) {        
            openweathermap(results.response, function(success, previsions) {
                if (!success) return session.send('Une erreur s\'est produite, veuillez réessayer.');
                
                var message = 'Voici la météo pour ' + results.response + ' :\n\n' +
                              '_ Température : ' + previsions.temperature + '°C\n\n' + 
                              '_ Humidité : ' + previsions.humidity + '%\n\n' +
                              '_ Vent : ' + previsions.wind + 'km/h';
                              
                session.send(message);
            });
        }
]);

dialog.onDefault(function (session) {
    session.send('Je n\'ai pas compris votre demande, il faut écrire "donne-moi la météo" !');
});

Dans le morceau de code que je viens de vous donner, vous avez dû remarquer qu’on utilise la fonction openweathermap qui n’est pas encore déclarée. Cette fonction va nous servir à récupérer la météo d’une ville grâce à l’API Open Weather Map, voici son code :

//---------------------------------------------------------
// Open Weather Map
//---------------------------------------------------------

var openweathermap = function(city, callback){
    var url = 'http://api.openweathermap.org/data/2.5/weather?q=' + city + '&lang=fr&units=metric&appid=' + openWeatherMapAppId;
    
    request(url, function(err, response, body){
        try{        
            var result = JSON.parse(body);
            
            if (result.cod != 200) {
                callback(false);
            } else {
                var previsions = {
                    temperature : Math.round(result.main.temp),
                    humidity : result.main.humidity,
                    wind: Math.round(result.wind.speed * 3.6),
                    city : result.name,
                };
                        
                callback(true, previsions);
            }
        } catch(e) {
            callback(false); 
        }
    });
}

Notre robot est prêt !

Test du robot

Pour exécuter le robot, retournez dans votre invite de commande puis tapez la commande suivante :

node app.js

L’API REST du robot peut maintenant être appelée. Pour simuler un service de messagerie quelconque, nous allons utiliser le Microsoft Bot Framework Channel Emulator dont je vous ai déjà parlé. Cet outil est téléchargeable sur le site du Bot Framework. Une fois le programme lancé, vous n’avez qu’à entamer la conversation :

Test du robot avec le Microsoft Bot Framework Channel Emulator

Ajout de l’intelligence

Vous venez de créer un robot conversationnel, c’est bien ! Mais un robot qui ne reconnaît l’intention de l’utilisateur que si les messages reçus sont écrits avec une syntaxe prédéfinie, ça ne sert pas à grand-chose. Dans cette partie, nous allons faire en sorte que notre robot soit capable de comprendre l’intention qui se cache derrière un message écrit en langage naturel.

Création du modèle d’apprentissage

Comme vous avez pu le voir sur le schéma dans la première partie de cet article, l’intelligence du robot ne se trouve pas dans le robot, il s’agit d’un service externe. Il en existe plusieurs. Ici, comme nous utilisons le Bot Framework, nous allons rester fidèles à Microsoft et utiliser son service de reconnaissance intelligente du langage qui se nomme LUIS.

Pour commencer, il faut se rendre sur le site dédié à LUIS et créer une application :

  • Une fois sur le site, cliquez sur « Sign in or create an account » puis sur « Sign in using a Microsoft account ».
  • Renseignez les identifiants de votre compte Microsoft.
  • Lorsque vous êtes connectés, cliquez sur le bouton « New App » puis « New Application ».
  • Renseignez le nom de l’application : Robot météo.
  • Dans le champ « Enter application usage scenario », sélectionnez « Bot ».
  • Cochez les domaines de notre application : Weather.
  • Si vous le souhaitez, entrez une brève description des services proposés par notre robot.
  • Choisissez « French » dans le champ « Choose Application Culture ».
  • Validez en cliquant sur « Add App ».

Informations sur l'application dans LUIS

À partir de maintenant, il y a deux éléments de langage que vous devez connaître :

  • Intention : J’ai déjà évoqué ce terme un peu plus haut dans l’article, cela désigne l’action qu’un utilisateur déclenche lorsqu’il envoie un message.
  • Entité : Ce sont les paramètres qui sont inclus dans le message de l’utilisateur.

Par exemple, si j’écris « Donne-moi la météo à Paris », l’intention est « donner la météo » et il y a une entité de type « Localisation » qui est « Paris ». Si j’écris « Quel temps fait-il ? », l’intention est toujours la même mais cette fois, aucun paramètre n’est fourni. Nous allons faire en sorte que notre robot comprenne ces deux demandes, même si elles sont écrites de manières différentes. Dans le cas où la ville n’est pas fournie, le robot la demandera. C’est mieux qu’une simple expression régulière, non ?

Dans l’interface de gestion de LUIS, commencez par créer l’entité « Localisation » ;

  • Cliquez sur le signe « + » situé à côté du titre « Entities » dans le panneau de gauche.
  • Entre le nom de l’entité, « Localisation » dans notre cas.
  • Cliquez sur « Save ».

Création de l'entité dans LUIS

Ensuite, nous allons créer l’intention :

  • De la même manière que pour l’entité, cliquez sur le signe « + » situé à côté du titre « Intents ».
  • Entrez « GetWeather » dans le champ « Intent name ».
  • Dans le champ suivant, saisissez une expression associée à cette intention : « Quel temps fait-il à Paris ? ».
  • Cliquez sur « Add Action » puis sur « Add Parameter » pour créer un paramètre.
  • Dans le formulaire qui s’affiche, laissez la case « Required » décochée de façon à ce que le paramètre ne soit pas obligatoire.
  • Tapez « Ville » dans le champ « Name ».
  • Sélectionnez « Localisation » dans le champ « Type ».
  • Cliquez sur « Save ».

Création de l'intention dans LUIS

Nous venons de créer une première intention avec un paramètre optionnel « Ville » de type « Localisation ». Un écran s’affiche avec la phrase d’exemple que vous avez saisi dans l’écran précédent. Il va falloir indiquer l’intention qui doit être retournée pour cette phrase et s’il y a ou non un paramètre :

  • Dans la liste déroulante, sélectionnez l’intention « GetWeather ».
  • Cliquez sur « Paris » puis sur « Localisation » pour indiquer que dans cette phrase, « Paris » représente le paramètre « Ville ».
  • Cliquez sur « Submit ».

Spécification des paramètres de l'expression dans LUIS

Nous allons maintenant ajouter une autre phrase que LUIS devra associer à l’intention « GetWeather » :

  • Cliquez sur l’onglet « New utterance ».
  • Saisissez la phrase « Quelle est la météo ? » puis validez.
  • Dans l’encart qui s’affiche, sélectionnez l’intention « GetWeather » puis cliquez sur « Submit ».

Cette deuxième phrase permettra elle aussi de connaître la météo mais cette fois, le paramètre « Ville » n’est pas fourni, le robot devra donc le demander à l’utilisateur. Si vous le souhaitez, vous pouvez ajouter d’autres phrases que le robot devra reconnaître. Plus il y a de phrases, mieux c’est.

Le modèle d’apprentissage est prêt. Pour qu’il soit utilisable par le robot, il faut le publier :

  • Cliquez en bas à gauche sur l’icône située juste à côté du libellé « Train » pour entraîner le modèle.
  • Cliquez sur « Publish en haut à gauche.
  • Dans la fenêtre qui s’ouvre, cliquez sur « Publish web service » et recopiez l’URL indiquée. Il s’agit de l’URL qui devra être appelée par votre robot pour identifier l’intention et les paramètres qui se cachent derrière un message.

Publication du modèle d'apprentissage dans LUIS

Notez que pour définir quelle intention se cache derrière un message, LUIS ne vérifie pas que le message reçu correspond mot à mot à une phrase que vous avez définie, il calcule un pourcentage de corrélation et définit quelle intention est la plus susceptible de se cacher derrière le message.

Modification du robot

Le temps est venu rendre notre robot intelligent. Pour cela, nous allons modifier son code pour indiquer à l’IntentDialog qu’il devra utiliser notre modèle d’apprentissage LUIS pour identifier l’intention de chaque message.

Créez une nouvelle variable luisModelUrl dans la section « Configuration » du fichier app.js et copiez l’URL de votre modèle d’apprentissage que LUIS vous a fournie :

// LUIS model
var luisModelUrl = 'UrlDeVotreModeleLuis';

Indiquez à l’IntentDialog qu’il va devoir utiliser LUIS pour identifier l’intention des messages :

var recognizer = new builder.LuisRecognizer(luisModelUrl);
var dialog = new builder.IntentDialog({ recognizers: [recognizer] });

L’IntentDialog ne devra plus choisir l’action à exécuter en fonction d’une expression régulière mais d’un nom d’intention qui sera renvoyé par LUIS. Remplacez donc l’expression régulière /^Donne-moi la météo/i par le nom de l’intention que nous avons créée dans LUIS :

dialog.matches('GetWeather', [

Enfin, lorsque nous avons créé l’intention « GetWeather », nous avons défini le paramètre « Ville ». Il faut donc récupérer la valeur de ce paramètre et demander la ville à l’utilisateur dans le cas où ce paramètre est vide :

function (session, args, next) {
    var city = builder.EntityRecognizer.findEntity(args.entities, 'Localisation');
    
    if (!city) {
        builder.Prompts.text(session, 'De quelle ville voulez-vous connaître la météo ?');
    } else {
        next({ response: city.entity });
    }
},
function (session, results) {
    openweathermap(results.response, function(success, previsions) {
        if (!success) return session.send('Une erreur s\'est produite.');
        
        var message = 'Voici la météo pour ' + previsions.city + ' :\n\n' +
                      '_ Température : ' + previsions.temperature + '°C\n\n' + 
                      '_ Humidité : ' + previsions.humidity + '%\n\n' +
                      '_ Vent : ' + previsions.wind + 'km/h';
                      
        session.send(message);
    });
}

Pensez aussi à modifier le dialogue par défaut car, dorénavant, les utilisateurs n’ont plus besoin d’écrire une phrase précise :

dialog.onDefault(function (session) {
    session.send('Je n\'ai pas compris votre demande, essayez plutôt de me demander la météo d\'une ville !');
});

Si vous le souhaitez, vous pouvez tester à nouveau le robot (voir partie précédente). Vous avez trouvé ça compliqué ?

Publication

Hébergement dans Microsoft Azure

Microsoft propose de nombreuses solutions d’hébergement via sa plateforme Azure et j’ai deux bonnes nouvelles. La première, c’est que certains services sont gratuits. La seconde, c’est que vous pouvez bénéficier d’un compte d’essai d’un mois crédité de 170€, ce qui vous permettra de tester les services payants. Ils sont généreux chez Microsoft ! Dans cette partie, je vais vous expliquer comment créer un service d’hébergement d’application web gratuit dans Azure. Si vous préférez, vous pouvez aussi utiliser n’importe quel autre service d’hébergement Node.js, il faut juste s’assurer que l’URL associée au robot est bien en HTTPS.

Dans un premier temps, créez votre compte Microsoft Azure d’essai en vous rendant sur la page dédiée. Vous aurez besoin d’une carte bancaire en cours de validité. C’est juste une garantie pour Microsoft : aucune somme ne sera prélevée. Une fois votre compte créé, vous arrivez sur la page d’accueil du portail.

Vous pouvez alors créer votre première ressource :

  • Cliquez sur le bouton « Nouveau » en haut à gauche.
  • Dans la liste qui s’affiche, choisissez « Web + mobile » puis sélectionnez « Application web ».

Création de l'application dans Azure

Le formulaire de création d’une application web s’affiche :

  • Renseignez un nom pour votre application (moi j’ai choisi « robot-meteo »).
  • Sélectionnez l’abonnement « Essai gratuit ».
  • Dans les options « Groupe de ressources », choisissez « Créer nouveau » et entrez un nom pour votre groupe (moi j’ai mis « WebApps »). Le groupe de ressources permet de gérer simultanément l’ensemble des ressources du groupe. En règle générale, il faut créer un groupe de ressources par application. Ce groupe contiendra alors toutes les ressources liées à l’application (application web, base de données, etc.). Dans notre cas, le groupe de ressources ne contiendra qu’une seule ressource alors ne vous prenez pas la tête !
  • Ne touchez pas au Plan App Service.
  • Laissez l’option « App Insights » désactivée.
  • Cliquez sur « Créer ».

Saisie des informations sur l'application dans Azure

La ressource qui va héberger notre robot est initialisée, nous allons consulter son détail pour récupérer quelques informations utiles :

  • Dans le panneau de gauche, cliquez sur « App Services ».
  • La liste de vos applications web et mobiles s’affiche, vous devriez alors voir la ressource que vous venez de créer. Cliquez sur son nom.
  • Le détail de la ressource s’affiche, recopiez l’URL (c’est l’URL à laquelle votre application sera accessible) et le nom d’hôte FTP.

Détails de la ressources dans Azure

Il faut maintenant créer les identifiants FTP que nous utiliserons pour mettre en ligne les fichiers de notre application :

  • Dans la catégorie « Déploiement des applications », sélectionnez le menu « Informations d’identification et de déploiement ».
  • Renseignez un nom d’utilisateur et un mot de passe, il s’agit des informations de connexion que vous utiliserez pour mettre en ligne vos fichiers.

Création des identifiants dans Azure

Lors de la création de notre application web, vous avez pu voir qu’il fallait choisir un Plan App Services. Cet élément définit les ressources disponibles pour toutes les App Services (applications web, applications mobiles, etc.) qui y sont rattachées. Évidemment, plus il y a de ressources disponibles, plus le niveau de tarification est élevé.

Quand nous avons créé notre application, Azure a automatiquement créé un Plan App Services avec un niveau de tarification standard. Hors, comme notre robot n’est pas très gourmand en ressources, il va pouvoir se contenter du niveau de tarification gratuit. Ainsi, nous pourrons utiliser le crédit Azure qui nous a été offert pour autre chose (une machine virtuelle, par exemple).

Voici les étapes à suivre pour modifier le niveau de tarification du Plan App Services :

  • Dans le panneau de gauche, cliquez sur « Toutes les ressources ».
  • L’ensemble de vos ressources s’affiche, cliquez sur votre Plan App Service pour afficher son détail (le mien se nomme « ServicePlan591fbfcc-874c »).
  • Dans la fenêtre qui s’ouvre, cliquez sur « Monter en puissance ». Cet élément se trouve dans la catégorie « Plan App Service » du menu.
  • Le panneau de droite présente alors les niveaux de tarification disponibles. Par défaut, seuls les niveaux payants sont affichés. Pour afficher tous les niveaux disponibles, cliquez sur « Afficher tout » en haut à droite de la fenêtre.
  • Choisissez le niveau « F1 Gratuit » puis cliquez sur « Sélectionner ».

Niveau de tarification dans Azure

À l’issu de la période d’essai d’un mois, votre compte sera automatiquement désactivé et tous vos services seront supprimés, sauf si vous souscrivez à un abonnement Azure payant à l’utilisation. Ce que je vous conseille vivement (si vous avez bien changé le niveau tarifaire de votre Plan App Service, vous n’avez rien à craindre).

Notre hébergement Azure est enfin prêt à accueillir le robot !

Connexion aux services de messagerie

Dans le schéma que je vous présentais au début de cet article, vous avez dû remarquer que les différents services de messagerie ne communiquent pas directement avec votre robot, il y a un service intermédiaire : le Microsoft Bot Connector. C’est grâce à lui que votre robot pourra interagir avec les utilisateurs de Skype, de Facebook Messenger et des autres services de messagerie.

Pour utiliser ce service, il faut déclarer notre robot. Ça se passe sur la page d’enregistrement d’un nouveau robot. Après vous être connecté avec votre compte Microsoft, vous devez remplir le formulaire.

Informations générales :

  • Saisissez le petit nom de votre robot dans le champ « Name ». Moi j’ai choisi « Robot météo », faites plus original.
  • Choisissez un identifiant unique pour votre robot et renseignez-le dans le champ « Bot handle ». De mon côté, j’ai mis « robot-meteo ».
  • Décrivez brièvement à quoi sert votre robot dans le champ dédié.

Profil du robot dans le Bot Connector

Configuration :

  • Saisissez l’URL HTTPS de votre robot (celle que nous avons récupérée dans les détails de notre ressource Azure) suivie de « /api/messages ». Dans mon cas, ça donne « https://robot-meteo.azurewebsites.net/api/messages ».
  • Cliquez sur le bouton « Create Microsoft App ID and password » pour générer les identifiants de votre robot.
  • Dans la fenêtre qui s’ouvre, cliquez sur « Générer un mot de passe pour l’application ».
  • Recopiez le mot de passe fourni, cliquez sur « OK ».
  • Recopiez l’id de l’application.
  • Cliquez sur « Terminer et revenir à Bot Framework ».

Configuraion du robot dans le Bot Connector

Profil de publication :

  • Tapez votre nom et votre prénom dans le champ « Publisher Name ».
  • Le champ « Publisher email » est normalement pré-rempli avec l’adresse mail de votre compte Microsoft.
  • Les champs « Privacy statement » et « Terms of Use » doivent respectivement contenir l’URL de la page indiquant les règles de confidentialité et les règles d’utilisation de votre robot. Si vous faites un robot pour vous amuser, vous pouvez vous permettre de ne pas créer ces pages, saisissez alors l’URL du robot dans ces deux champs. Si, au contraire, votre robot a vocation à être utilisé dans des conditions réelles, vous avez tout intérêt à créer ces pages et à indiquer leurs URL correctes.
  • Si vous avez fait une page dédiée à votre magnifique robot, vous pouvez indiquer son adresse dans le champ « Bot website ».
  • Renseignez quelques mots clés dans le champ « Hashtags ». Cela permettra aux utilisateurs de trouver plus facilement le robot dans la liste de ceux enregistrés sur le Bot Framework de Microsoft.
  • Dans le champ « Languages » et « Default Conversation Language », entrez « fr ».

Profil de publication dans le Bot Connector

Administration :

  • Le champ « Owners » est normalement pré-rempli avec votre adresse mail, c’est parfait.
  • Vous pouvez laisser le champ « Instrumentation key » vide.

Acceptez les conditions d’utilisation (après les avoir lues, bien-sûr) et cliquez sur « Register ». Vous venez d’enregistrer votre premier robot ! Laissez la page ouverte, vous en aurez besoin prochainement.

Informations d'administration dans le Bot Connector

Modifiez votre fichier app.js pour renseigner l’id et le mot de passe de votre robot avec les valeurs fournies par le Bot Connector :

// Connector
var connectorAppId = 'MonIdApplication';
var connectorAppPassword = 'MonMotDePasse';

Mise en ligne des fichiers

Par défaut, IIS (serveur web utilisé par les services Azure) ne sait pas héberger des applications Node.js. Heureusement, il existe un module qui ajoute cette fonctionnalité au serveur web, il se nomme « iisnode ». Ce module est préinstallé sur les services Azure et est automatiquement configuré lorsque votre application est publiée depuis un gestionnaire de dépôts (intégration continue). C’est super pratique mais nous, nous allons nous contenter de mettre en ligne nos fichiers via un simple client FTP. Nous allons donc devoir configurer « iisnode » manuellement pour lui indiquer le point d’entrée de notre application Node.js.

Pour cela, vous devez créer un fichier web.config à la racine de votre projet et y copier les lignes suivantes (source) :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <!-- Visit http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx for more information on WebSocket support -->
    <webSocket enabled="false" />
    <handlers>
      <!-- Indicates that the app.js file is a node.js site to be handled by the iisnode module -->
      <add name="iisnode" path="app.js" verb="*" modules="iisnode"/>
    </handlers>
    <rewrite>
      <rules>
        <!-- Do not interfere with requests for node-inspector debugging -->
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^app.js\/debug[\/]?" />
        </rule>

        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent">
          <action type="Rewrite" url="public{REQUEST_URI}"/>
        </rule>

        <!-- All other URLs are mapped to the node.js site entry point -->
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
          </conditions>
          <action type="Rewrite" url="app.js"/>
        </rule>
      </rules>
    </rewrite>

    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin"/>
        </hiddenSegments>
      </requestFiltering>
    </security>

    <!-- Make sure error responses are left untouched -->
    <httpErrors existingResponse="PassThrough" />

    <!--
      You can control how Node is hosted within IIS using the following options:
        * watchedFiles: semi-colon separated list of files that will be watched for changes to restart the server
        * node_env: will be propagated to node as NODE_ENV environment variable
        * debuggingEnabled - controls whether the built-in debugger is enabled

      See https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config for a full list of options
    -->
    <!--<iisnode watchedFiles="web.config;*.js"/>-->
  </system.webServer>
</configuration>

Envoyez les fichiers package.json, app.js, et web.config de votre projet sur votre ressource Azure grâce à votre client FTP préféré et aux informations de connexion récupérées lors de sa création (l’identifiant est de la forme « NomRessource\Login », pour moi ça donne « robot-meteo\robot-meteo-deploiement »).

Une fois les fichiers uploadés, retournez dans l’interface de gestion de votre ressource Azure et rendez-vous dans le menu « Console » de la catégorie « Outils de développement ». Dès que la console est ouverte, tapez la commande « npm install ». Cela va installer votre projet et télécharger automatiquement ses dépendances (ne tenez pas compte des messages qui s’affichent en rouge).

Installation des modules Node.js dans la console Azure

Votre robot est dorénavant opérationnel !

Entamez la conversation

Retournez sur l’administration de votre robot dans le Bot Connector, vous pouvez voir que votre robot est par défaut accessible depuis deux services de communication :

Services de messagerie dans le Bot Connector

Vous pouvez cliquer sur « Add to Skype » pour ajouter le robot dans vos contacts Skype et entamer la conversation. Si vous souhaitez le connecter à d’autres services de messagerie, c’est sur cette même page que ça se passe. La procédure est décrite pour chaque service, il suffit de cliquer sur le bouton « Add » de la ligne correspondante au service auquel vous souhaitez connecter votre robot.

Pour aller plus loin

Pour cette entrée en matière, nous avons pu utiliser les services de Microsoft et l’API Open Weather Map gratuitement mais si vous voulez déployer un chatbot à grande échelle, certains services deviennent payants (Tarifs : Open Weather Map, Microsoft Cognitive Services, Microsoft Azure).

Sachez que Microsoft n’est pas la seule entreprise à fournir des services d’intelligence artificielle. D’autres sociétés tentent de se faire une place sur ce marché, notamment Recast.AI qui propose un service similaire à LUIS. La plateforme proposée par cette startup a l’air beaucoup plus avancée que LUIS alors n’hésitez pas à la tester pour vous faire une idée. J’attends vos retours !

Je parie que nous allons de plus en plus utiliser des robots conversationnels dans notre quotidien : commande de pizzas, réservation d’hôtels, prise de rendez-vous chez le médecin, etc. Il y a même une conférence internationale qui s’est déroulée il y a quelques jours : ChatBotConf. J’espère que cette découverte des robots de chat vous à plu et qu’elle vous a fait prendre conscience des possibilités offertes par l’intelligence artificielle et les milliers d’API disponibles sur le web. J’attends avec impatience que vous me communiquiez le nom d’utilisateur de vos robots pour les tester !

Commentaires

Call center Madagascar - Il y a 6 années - Répondre

Merci beaucoup pour tout tes conseils !

Ludovic - Il y a 6 années

De rien, c’est toujours un plaisir ? Alors, tu vas créer ton robot ?

Arthur - Il y a 6 années - Répondre

Bonjour et merci pour ce tuto! Pour ma part j’utilise Recast et je le trouve vraiment bien conçu. Après, ils ont besoin de beaucoup plus d’utilisateurs pour que leur AI soit performante…

J’aurais une question : pourquoi le endpoint comporte /api/messages dans l’url ?

Ludovic - Il y a 6 années

Bonjour ! Les services proposés par Recast ont l’air vraiment top, il faudrait que je prenne le temps de les essayer. En plus, c’est une start-up française !

La partie /api/messages de l’URL c’est nous qui l’avons définie avec la ligne suivante :

server.post('/api/messages', connector.listen());

J’ai repris l’exemple fourni par Microsoft mais tu peux choisir le chemin que tu souhaites du moment que tu fournis la bonne URL au Bot Connector.

Bon développement !

Pascal - Il y a 6 années - Répondre

Merci pour ces informations surtout pour l’explication liée à l’entité et l’intention.

Ludovic - Il y a 6 années

Bonjour Pascal, c’est vrai que ces deux concepts ne sont pas évidents à comprendre au début 🙂 Tu as une idée de robot en tête ?

Imane - Il y a 6 années - Répondre

Merci j’ai bien aimé le tuto, et je veux savoir svp est ce que je peux lié mon bot a une interface (html, css, js) au lieu de la ConsoleConnector ou chatConnecteur, et comment faire ?
Je vous remercie !!

Ludovic - Il y a 6 années

Bonjour Imane,

Microsoft propose en effet une interface web permettant de dialoguer avec ses robots, c’est celle que j’utilise au début de cet article. Dans les paramètres de ton robot dans le Microsoft Bot Connector, il faut activer le canal « webchat ». Tu obtiendras un code HTML que tu pourras intégrer aux pages de ton choix. En plus, cette interface web et opensource. Si tu veux en savoir plus, tu peux consulter le projet sur GitHub : Microsoft Bot Framework WebChat.

Bon weekend !

kh - Il y a 6 années - Répondre

j’ai créer mon bot et je l’ai testé sur l’émulateur et il a bien marché maintenant mon grand souci c’est de l’intégrer avec hangouts y’a t’il qq qui peut m’aider et je serais vraiment reconnaissante

Ludovic - Il y a 6 années

Bonjour, le Microsoft Bot Framework n’est pas encore compatible avec Google Hangouts. Peut-être que ça viendra. En attendant, tu peux voir les différents services compatibles sur le site de Microsoft. Bon weekend !

Quentin - Il y a 5 années - Répondre

Bonjour,
Merci pour ce tuto 🙂
Petit soucis cela dit 🙁
Le bot fonctionne parfaitement en local, par contre, une fois déployé sur Azure, il ne me renvoie plus la météo..
Je lui demande le temps, puis lui précise la ville et le bot ne répond pas..
Est-ce que qqn saurait d’où peut venir le pb?
Merci d’avance

Ludovic - Il y a 5 années

Bonjour Quentin,

As-tu résolu ton problème ? Le bot ne répond jamais ou il ne répond plus uniquement après que tu lui aies spécifié la ville dont tu veux la météo ?

Bonne journée

Quentin - Il y a 5 années - Répondre

Bonjour Ludovic,
J’ai finalement résolu mon problème, j’avais oublié de venir le préciser ^^’
C’était un problème de clé, mais j’ai finalement réussi 😉

jalal - Il y a 5 années - Répondre

bonjour,
je vous remercie pour ce code.
j’ai un petit souris, alors que j’ai voulus exécuté votre code (bien sur après modification de la variable openWeatherMapAppId) j’ai une petite erreur sous http://localhost:3978/ :

{« code »: »ResourceNotFound », »message »: »/ does not exist »}

et je sais pas d’où ça vient.
Merci à vous

Ludovic - Il y a 5 années

Bonjour Jalal,

Je pense que dans Bot Framework Channel Emulateur, tu as fait une erreur dans l’URL du robot. Voici ce qu’il faut mettre : http://localhost:3978/api/messages.

Bonne journée

Ludovic

Téo - Il y a 5 années - Répondre

Bonjour Ludovic,
Merci beaucoup pour tes explications. 🙂
J’ai créé mon chatbot également.
Je l’ai fais avec Microsoft azure et sont azure bot service je l’ai connecté avec LUIS sont service cognitif d’IA, et je l’ai lié aussi avec une base de données QnMaker (de questions et réponses).
Mon chabot marche, il comprend les questions et répond quand il possède la réponse.

Mais lorsqu’il n’as pas de réponse il envoi à l’utilisateur un message: « je ne comprends pas votre question ».

Est – ce possible de récupérer la question que le bot n’a pas comprit ou il ne possède pas la réponse, pour pouvoir la stocker quelque part et donc par la suite la rajouter à la base de donnée?
Est-ce que vous avez une idée de comment procéder ?

Cordialement Téo
Merci d’avance 😉

Ludovic - Il y a 5 années

Bonjour Téo,

Voici un code qui te permettra d’appeler QnA Maker et d’enregistrer la question quand elle n’a pas été comprise (pense à changer les clés d’API et l’URL de l’API QnA Maker) :

var request = require('request');
var restify = require('restify');
var builder = require('botbuilder');

//---------------------------------------------------------
// Configuration
//---------------------------------------------------------

// Connector
var connectorAppId = process.env.MICROSOFT_APP_ID;
var connectorAppPassword = process.env.MICROSOFT_APP_PASSWORD;

// QnA maker : Score minimum
var minimumScore = 30;

//---------------------------------------------------------
// Setup
//---------------------------------------------------------

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

// Create connector and bot
var connector = new builder.ChatConnector({
    appId: connectorAppId,
    appPassword: connectorAppPassword
});

var bot = new builder.UniversalBot(connector);

server.post('/api/messages', connector.listen());

//---------------------------------------------------------
// Dialogs
//---------------------------------------------------------

bot.dialog('/', function (session) {
    qnamaker(session.message.text, function(result) {
        if (result.score >= minimumScore) {
            session.send(result.answer);
        } else {
            // Tu peux enregistrer session.message.text en base de données		
			session.send('Je n\'ai pas compris votre demande !');
        }
    });
});

//---------------------------------------------------------
// QnA maker
//---------------------------------------------------------

var qnamaker = function(question, callback){
    request.post({
		url: 'https://westus.api.cognitive.microsoft.com/qnamaker/v1.0/knowledgebases/87e56b9d-a5a0-459a-8be2-a2bfa6848d22/generateAnswer',
		headers: {
			'Ocp-Apim-Subscription-Key' : '4e97e0b3d9414dd2ac5ad01e696470c0',
			'content-type' : 'application/json'
		},
		form : {'question' : question}
	}, function(err, response, body) {
        try{        
            var result = JSON.parse(body);
            callback(result);
        } catch(e) {
            callback({
                'score': 0
            }); 
        }
    });
}

J’espère que c’est bien ce que tu cherches.

Bonne journée

Ludovic

ludivine - Il y a 4 années - Répondre

Bonjour, lorsque je suis sur bot framework emulateur et que je veux envoyer un message, j’ai ce message d’erreur qui s’affiche
request to http://localhost:3978/api/messages failed, reason: connect ECONNREFUSED 127.0.0.1:3978
Pourriez vous m’aider?

Ludovic - Il y a 4 années

Bonjour Ludivine,

Il semble que l’émulateur n’arrive pas à joindre l’API de ton robot. Il peut y avoir plusieurs raison : ton API n’est pas exposée à cette adresse (quand tu lances le robot, il me semble qu’il te dit à quelle adresse il est disponible) ou quelque chose empêche l’émulateur de joindre l’API (pare-feu).

Dis-moi si tu trouves une solution.

Bonne journée

Ludovic

Thérèse - Il y a 4 années - Répondre

Bonjour Ludovic . Merci pour tes conseils .
J’essaie de créer un chatbot test avec le tutoriel . Mais le soucis c’est qu’avec l’emulateur Bot Framework Emulator, on doit choisir un fichier .bot tandis que lors de la création du package avec npm init on a pas défini de fichier .bot donc je ne le retrouve pas sur mon ordinateur . Ca pose donc problème . Pourriez vous m’aider svp ?

Thérèse - Il y a 4 années - Répondre

Bonjour Ludovic et merci pour le tutoriel, ça m’aide assez.
Stp Je peux savoir svp comment tester le bot ? J’ai un peu de mal .
Merci d’avance.

Ludovic - Il y a 4 années

Bonjour Thérèse,

Désolé pour le délai de réponse ! Pour créer un nouveau fichier « .bot », il faut que tu fasses « Fichier » puis « Nouveau bot » dans Bot Framework Emulator. À partir de ce moment, il te demandera l’URL du robot. Tu trouveras plus d’informations sur cette page : https://docs.microsoft.com/fr-fr/azure/bot-service/bot-service-debug-bot

Dis-moi si tu as réussi 😉

Bonne journée !

Ludovic

placide - Il y a 3 années - Répondre

merci pour le tuto j ai crée mon chatbot selon mon besoin mais j assaie de telecharger le bot channel framework, on me demande de contacter le fournisseur d’acces internet et pourtant je suis belle et bien connecté. aider moi svp

Ludovic - Il y a 3 années

Bonjour,

Je ne comprends pas quel outil vous n’arrivez pas à télécharger, le Bot Framework Emulator ?

Bonne fin de journée


Vous avez aimé cet article ? Dites-le !

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.