Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Mon premier bot

Poster un commentaire

En ce moment je m’intéresse beaucoup aux Cognitive Services de Microsoft et bien entendu aux bots. Je vais essayer de faire une série d’articles sur ce thème afin de partager mes découvertes.

Dans ce premier article il ne s’agira que de bots, j’intègrerai des services cognitifs comme LUIS dans un prochain article.

On va donc construire un bot style « hello world« , mais suffisant pour poser quelques bases et comprendre l’architecture générale.

On fera quelques expériences puis on le déploiera sur Azure afin de le tester avec d’autres canaux, Skype en l’occurrence.

C’est quoi un bot?

Un bot c’est une contraction de ROBOT. Un bot est donc un robot, mais à ma connaissance le terme s’emploi uniquement au sujet de robots logiciels.

Le concept n’est pas très nouveau, certaines formes de bots (comme les chat-bots) sont presque aussi anciens que l’informatique et depuis toujours Internet est parcourus en permanence par de nombreux bots au point de représenter aujourd’hui plus de la moitié du trafic Internet (ou encore ici).

Ce qui est nouveau est que ces bots commence à s’intéresser de plus en plus à … nous et sont sur le point d’arriver massivement dans notre vie quotidienne.

Certains œuvrerons dans les coulisses sans interactions directe avec nous. On peut imaginer des bots capables de nous assister dans notre vie quotidienne pour par exemple prendre rendez vous automatiquement chez votre garagiste pour la visite annuelle de votre véhicule, planifier la venue du jardinier qui va entretenir la haie ou les pelouses de votre résidence….

D’autres seront plus bavards. C’est nous qui les solliciterons si on a une question. D’ailleurs ce genre de bot ne vous rappellent pas quelque chose?

 

Architecture Microsoft

La BUILD 2016 fut l’occasion pour Microsoft de lancer sont SDK de développement Microsoft Bot Framework dont on trouvera toutes les informations ici:

https://dev.botframework.com/

L’outil, tout comme l’ensemble de Cognitive Services est encore en preview. Attendez vous donc à des changements radicaux d’une version l’autre, des rugosités et un manque de docs et de retours d’expérience.

Mais on peut tout de même travailler.

 

Dans l’architecture Microsoft, un bot se présente comme un service Web. On peut dialoguer directement avec (Postman par exemple), mais pour nous, humains, on va plutôt utiliser une UI que l’on appelle un canal (channel).

2017-01-22_11-18-58

Le bot Microsoft est multicanal. Actuellement plusieurs canaux sont supportés nativement, par exemple Skype, Office 365 SMS, Slack, Facebook…

2017-01-22_11-36-28

 

Chaque canal a bien entendu sa propre interface de communication. Un message Facebook, par exemple, ne peut être lu et compris par Telegram.

D’un autre côté le Framework de bot se doit de fournir une expérience développeur identique quel que soit le canal choisit. On a donc besoin de placer au milieu un composant qui va traduire un message d’un canal en un message pour le bot et inversement.

Il s’agit d’un connecteur (connector).

2017-01-22_11-32-12

L’échange des messages se fait à l’aide de paquets JSON. Le connecteur transforme les messages du format du canal vers le format du bot et inversement.

Dans la terminologie du Framework, un message lisible par le bot s’appelle une activité (Activity). Une classe du même nom est proposée comme point d’entrée.

 

Je donnerai des informations supplémentaires sur l’architecture dans les prochains articles.

Construire son premier projet

Prérequis

Vous aurez besoin de:

 

Microsoft fournit une version .Net et une version NodeJS de son framework. Les prochaines démos seront faites en .Net. Le SDK est open source, vous pouvez le consulter ici:

https://github.com/Microsoft/BotBuilder

 

Création du projet

Depuis VS, ajoutez un nouveau projet:

2017-01-20_15-42-19

On sélectionne le nouveau template de projet: Bot Application et on fait OK.

Un projet Web Api très simple se construit. Deux classes sont intéressantes:

WebApiConfig.cs:

2017-01-20_15-44-25

On voit surtout une redéfinition des paramètres par défaut JSON. Même si le SDK le masque, dans les coulisses tout est du JSON.

Et un contrôleur:

2017-01-20_15-46-36

Je reviendrai dessus plus tard. Pour l’instant on fait F5 pour lancer le service qui par défaut écoute sur le port 3979:

2017-01-20_15-49-24

Le bot affiche une page d’accueil que l’on peut personnaliser (c’est le fichier default.htm) pour donner quelques informations utiles relatives au bot.

Tester le projet

Un bot écoute, mais comment communiquer avec?

Le plus simple à ce stade est d’utiliser l’émulateur que l’on lance.

2017-01-20_15-52-08

L’interface a changée récemment. Elle est plus dépouillée, mais aussi moins confortable et présente moins de fonctionnalités!!!????

 

L’émulateur est un canal dans l’architecture de bot. Les bots sont par défaut configurés pour savoir travailler avec ce canal. Avant cela on doit dire avec quel bot dialoguer en copiant le point de terminaison du service dans la zone adéquate:

http://localhost:3979/api/messages

 

2017-01-20_15-55-35

 

En production il est sain de sécuriser les accès au bot par une authentification assurée en décorant le contrôleur de [BotAuthentication].

Les credentials doivent apparaître dans le fichier de configuration:

2017-01-20_15-57-48

L’émulateur sais prendre en charge l’authentification si elle est fournie et ceux-ci doivent être corrects, mais accepte aussi des credentials vides. On va donc se contenter de faire OK.

2017-01-20_15-59-16

Si les logs ressemblent à ceci, tout va bien, le canal est à l’écoute. Il ne reste plus qu’à tester le bot.

 

Saisissez une message dans la zone ‘Type your message’:

2017-01-20_16-01-24

Le bot nous a répondu. Ce n’est pas un bot très passionnant, mais on débute…

Comment ça marche?

Penchons nous sur le code pour voir ce qu’il peut nous apprendre.

Nous avons vu précédemment que le contrôleur est composé d’une unique méthode POST. Chaque fois que l’on lance une saisie depuis le canal choisit, une requête est faite, une requête POST est formulée et interceptée par le contrôleur.

2017-01-22_12-21-00

On remarque immédiatement que le paramètre de l’action est de type Activity. C’est le format de communication d’un bot Microsoft avec le monde extérieur comme il a été indiqué plus haut.

Note: pour rappel, Activity c’est simplement le message que le bot échange avec votre canal favori.

 

La méthode porte l’implémentation du bot.

Une des propriétés importante d’une activité est Type. Il s’agit d’une chaîne qui contient le type de l’activité reçue. Actuellement il s’agit de:

  • ContactRelationUpdate
  • ConversationUpdate
  • DeleteUserData
  • Message
  • Ping
  • Typing

On reconnaît facilement le rôle de quelques un d’entre eux.

 

Le type Message est celui qui sera le plus souvent reçu, on fait donc un traitement à part. Message traduit un dialogue entre le bot et l’uilisateur.

Les autres messages seront traités dans la méthode HandleSystemMessage.

ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// calculate something for us to return
int length = (activity.Text ?? string.Empty).Length;
 
//// return our reply to the user
Activity reply = activity.CreateReply($"You sent {activity.Text} which was {length} characters");
await connector.Conversations.ReplyToActivityAsync(reply);

 

Prenez le temps de lire ce code qui est en rien difficile. Remarquez en particulier qu’en entrée on reçoit une instance d’Activity qui correspond au message émit par l’utilisateur et en sortie on renvoie une autre instance d’Activity qui contient la réponse du bot sous la forme de la variable reply.

La méthode importante est ReplyToActivityAsync qui renvoie une activité vers le canal afin qu’il soit affiché. On peut l’appeler autant de fois que nécessaire. Dans notre exemple une fois suffit.

 

Ce dialogue, si je peux appeler ça un dialogue, est très simple. Il peut parfois suffire, par exemple votre bot n’a pas d’autres rôle qu’afficher la fiche d’identité d’une personne dont on lui fournit le nom.

Pour avoir un vrai dialogue il faudrait pouvoir créer des états pour que le bot puisse rattacher un message à une conversation particulière parmi peut être les centaines qu’il traite simultanément afin de créer une notion de de contexte… Il a aussi besoin de savoir à quel moment de la conversation il se trouve pour pouvoir la reprendre…

On peut également avoir besoin d’un bot un peu plus intelligent et capable de répondre à différents types de question.

 

C’est évidemment possible, nous verrons cela dans les prochains articles.

 

Terminons la dessus:

En général les canaux supportent le langage markdown, on pourrait par exemple réécrire le message ainsi:


Activity reply = activity.CreateReply($"You sent **{activity.Text}** which was **{length}** characters");

 

Et il s’affiche:

2017-01-22_12-10-11

 

Certains canaux comme Facebook proposent de créer des templates d’affichage et de les utiliser. Microsoft Bot Framework supporte ce scénario.

Déployer le bot

Notre bot est prêt, nous en sommes content, il est maintenant temps de le rendre disponible à toute sortes d’autres canaux plus intéressants que l’émulateur.

 

Le bot est pour l’essentiel un service web. Si vous en avez la possibilité, déployez le directement sur Azure avec un publish. Dans mon cas le point de terminaison est:

http://botamethyste.azurewebsites.net/

 

On va sécuriser le bot ce qui n’a pas encore été fait et est nécessaire dans Azure. Rendons nous sur le site:

dev.botframework.com

2017-01-22_13-19-39

On clique sur Register a bot. Un formulaire d’enregistrement s’ouvre que l’on renseigne.

Tout d’abord la zone Profil:

2017-01-22_14-41-06

Le handle est le paramètre BotId du fichier de configuration. Enfin c’est ce que j’ai cru comprendre, mais les essais que j’ai pu faire ne montrent pas beaucoup de différences, de fait je ne suis pas certain de comprendre à quoi sert le paramètre.

 

On renseigne la zone Configuration:

2017-01-22_14-41-19

On entre le point de terminaison (HTTPS) vers le bot.

On clique sur le gros bouton bleu pour obtenir des credentials.

2017-01-22_14-51-17

Récupérez l’ID et le mot de passe.

2017-01-22_14-53-21

Revenez au premier formulaire.

Pour finir cochez la case et faites REGISTER:

2017-01-22_14-41-43

Au bout de quelques secondes on arrive ici:

2017-01-22_14-55-15

 

Note: Remarquez le bouton PUBLISH. J’y reviendrai

 

Normalement un clic sur TEST devrait échouer:

2017-01-22_14-56-41

Pour résoudre le problème, éditez le fichier de configuration du bot et renseignez les champs AppId et AppPassword:

2017-01-22_14-58-02

Puis republiez.

Note: quand je dis republiez, c’est pas forcément la meilleure solution pour une Web Apps. Il est possible d’éditer des paramètres AppSettings directement dans le portail ce qui évite de les laisser trainer dans votre repository de code source.

 

Cette fois:

2017-01-22_14-59-48

On peut aussi tester le bot depuis l’interface Web:

2017-01-22_15-01-07

 

Tester avec Skype

Par défaut le bot est déjà préconfiguré pour Skype:

2017-01-22_15-12-25

Pour les autres canaux il vous faudra cliquer sur Add.

Nous allons cliquer sur Add to Skype.

2017-01-22_15-14-00

Faire Add to contact pour ajouter le bot à notre liste de contact Skype.

2017-01-22_15-15-43

 

 

Peut être ne trouvez vous pas votre bot parmi les contact?

Par défaut le bot est publié en mode private. cela signifie que seul le compte avec lequel il a été publié peut y accéder.

Si votre compte Skype est différent, il est normal de ne pas le voir.

Pour rendre un bot public, il faut le publier en cliquant sur le bouton PUBLISH aperçu précédemment.

 

Bibliographie

 

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s