Ce post est un retour de la présentation intitulée « Using Machine Learning and Chatbots to handle 1st line technical support » par Basia Fusińska dans la conférence NCrafts qui s’est déroulée à Paris entre le 18 et 19 mai 2017.

Un chatbot est un logiciel qui interagit avec des utilisateurs sur un chat en ligne.  L’interaction peut aller des simples commandes et/ou contrôles graphiques intégrés à l’interface chat à une simulation des discussions en langage naturel avec des utilisateurs.

La construction des chatbots n’a jamais été aussi simplifiée. La majorité des réseaux sociaux proposent des APIs ouvertes pour la création de bots : Facebook, Skype, Telegram, HipChat et Slack. Sur ces plateformes des millions d’utilisateurs effectuent déjà des achats, réservent des trains, des chambres d’hôtel et interagissent avec des chatbots en charge de la relation client.

Exemple de chatbot relation client

La présentation de Basia Fusińska dans NCrafts s’est concentrée sur l’utilisation des outils Microsoft : le Microsoft Bot Framework, pour la construction, déploiement dans le cloud et connexion à des réseaux sociaux ; et le service LUIS (Language Understanding Intelligent Service), pour le traitement du langage naturel.

Pour les plus curieux, le code source du bot discuté durant la présentation se trouve sur Github.

Dans ce billet, nous allons parler de l’architecture de base d’un chatbot. Nous verrons aussi comment les services de machine learning facilitent la construction des chatbots plus intelligents et j’espère vous donner envie de jouer avec les plateformes de création de chatbots et de machine learning.

L’architecture de base d’un chatbot

Le cycle de vie d’un bot consiste à attendre des messages des utilisateurs, traiter les informations dans ces messages et poster une réponse à chacun d’entre eux. Ce cycle de vie est illustré par le code suivant, écrit en C# utilisant le Microsoft Bot Framework :

Cycle de vie d'un bot illustré Microsoft Bot Framework

Sans aller dans les détails de fonctionnement du framework, le bot reçoit le message envoyé par l’utilisateur dans activity.Text. Suite à cela, il utilise la méthode context.PostAsync pour envoyer une réponse à l’utilisateur.

Certaines plateformes supportent des modes d’interaction plus avancées que le simple envoi de messages textuels. C’est ce qu’on appelle  « the interactives messages » sur Slack, ou les inline keyboards sur Telegram.

La figure suivante illustre ce mode d’interaction (plus de détails ici):

Un exemple d'interaction de chatbot

Exemple de message interactive envoyé par un bot Slack

Pour générer ce genre de réponse, un chatbot Slack doit attacher une description détaillée des contrôles graphiques à afficher dans l’interface graphique (voir document JSON suivant). Quand l’utilisateur clique sur l’un des boutons associés, le chatbot reçoit un message qui indique le bouton cliqué.

Document JSON chatbot

Pour aller au-delà des simples questions-réponses, plusieurs frameworks de création de chatbots supportent le concept de conversation. L’exemple suivant utilise l’API Botkit pour implémenter un bot qui prend des commandes de pizza.

La conversation est modélisée par des étapes, qui sont gérées par une fonction Javascript différente, ce qui permet de factoriser le code du bot.

Factoriser le code du bot

Les chatbots et le traitement du langage naturel

Le plus gros challenge dans la construction d’un chatbot reste la compréhension des messages en langage naturel envoyés par les utilisateurs. Dans cette section on présentera rapidement les défis rencontrés dans le traitement de ces messages sans pour autant présenter les algorithmes de traitement de textes utilisés en détail.

L’état de l’art dans le domaine consiste à utiliser des algorithmes de classification automatique et de reconnaissance d’entités nommés.

Dans le premier cas, on identifie l’intention de chaque message envoyé par l’utilisateur. C’est à dire, on range chaque message dans un ensemble de types de message prédéfinis qui sert à orienter le bot vers le type de traitement à appliquer à chaque requête.

Les algorithmes de reconnaissance d’entités nommés sont utilisés pour identifier dans un message textuel l’ensemble de noms / entités dans un document. Ces entités peuvent être utilisées comme des paramètres dans le traitement d’une requête.

Par exemple, si un chatbot reçoit le message « my phone broke » on pourrait identifier l’intention comme étant dans une catégorie qu’on appellerait « brokenItem », où l’on aurait des messages tels que « my car broke » or  « my cellphone is not working ».

Encore dans le message « my phone broke » on pourrait identifier « phone » comme l’entité concernée. Le chatbot pourra déclencher le traitement propre à des éléments cassés, en sachant que l’utilisateur parle d’un « phone ».

En général, un algorithme de classification, prend en entrée un ensemble de messages préclassifiés en catégories (base de données d’apprentissage) et un nouveau message, que l’algorithme doit ranger dans une des catégories présentes dans la base. Les algorithmes démarrent avec une analyse lexicale, où le message est en unités lexicales (par exemple, « Where is my math book ? » devient {‘Where’, ‘is’, ‘my’, ‘math’, ‘book’}).

D’autres traitements peuvent être appliqués aux unités lexicales, par exemple, on pourrait enlever de la liste les mots qui apportent le moins sémantiquement (par exemple, on garde {‘where’, ‘math’, ‘book’}).

Indépendamment des traitements appliqués, une fois le message traité, on obtient une représentation que l’on utilisera pour la comparer à celles des messages présents dans la base d’apprentissage.

Le cœur d’un algorithme de classification est dans la stratégie de comparaison de messages décomposés. On peut voir des messages comme des points dans un espace où la distance entre les points représente la proximité entre messages.

Les algorithmes définiront la position de chaque point de manière à que les messages dans une catégorie soient représentés par des points proches les uns des autres.

base d'apprentissage pré classifiée (chatbot)

Base d’apprentissage pré classifiée

Si on prend en compte la base décrite sur le tableau suivant, on dira que le message « Where is my math book » est plus proche des messages représentant l’intention « Find-object » que de ceux représentant l’intention « Find-location ».

Intention Exemple Exemple de représentation obtenue
Find-object Where is my pencil ? Where, pencil
Find-object Do you know where is my book ? Where, book
Find-location Where am I ? Where, I
Find-location How far is my car ? How far, car

Les algorithmes de reconnaissance d’entités nommés sont utilisés pour identifier dans un message textuel l’ensemble de noms / entités dans un document. Ce qui peut être utile à un chatbot pour savoir de quoi parle l’utilisateur.

Ces algorithmes prennent aussi en entrée une base de documents pré annotés. Dans l’exemple suivant, on voit une phrase annotée, où deux entités de types différents sont identifiées.

Deux entités de types différent (Algorithme)s

D’autres entrées possibles sont des modèles statistiques de la grammaire de la langue utilisé ; des bases de noms de personnes, villes et objets ; et même des expressions régulières pour aider à identifier des entités dans un document donné.

Il est aussi possible d’identifier, dans un seul outil, les entités et les intentions des messages dans une base d’apprentissage. Par exemple, dans la figure suivante, on voit une base d’apprentissage qui peut être donnée comme entrée à un outil de classification d’intention et d’extraction d’entités (en occurrence Rasa NLU).

Dans chaque phrase-exemple, on identifie l’intention et les entités.

Base d'apprentissage Rasa NLU

De l’intelligence artificielle as a service pour les chatbots

Dans les problèmes d’apprentissage, une fois sélectionnés les algorithmes à utiliser, au développeur il ne reste que la tâche de produire assez d’exemples pour constituer sa base d’apprentissage. Ce qui peut être fastidieux. Ces dernières années des plateformes de construction de chatbots qui offrent des services de traitement automatique du langage naturel ont vu le jour, par exemple, LUIS, RECAST.AI, et Chatfuel.

Un autre avantage de ces plateformes est le fait de bénéficier des exemples fournis par un projet pour améliorer les performances sur d’autres projets. Cela réduit le nombre d’exemples qui doivent être fournis par le développeur.

Les plateformes de machine learning s’interposent entre les réseaux sociaux et le code des bots. Ils traitent les messages textuels et renvoient au chatbot une version annotée de la discussion.

Dans l’exemple suivant, nous avons une réponse produite par LUIS. Pour une phrase donnée (my phone broke), l’algorithme identifie l’intention NotWorking, et l’objet cassé phone.

Réponse produite par LUIS - Chatbot

Le code du chatbot peut donc être écrit pour traiter les messages par rapport à l’intention de l’utilisateur et aux entités qui sont mentionnées dans le texte.

Dans le code suivant écrit avec le Microsoft Bot Framework, on voit l’intention (avec l’attribut LuisIntent) et entités (dans result.Entitites) utilisés en plus de la notion de dialog phase pour décider quelle réponse envoyer à l’utilisateur (en appelant la méthode Respond).

 Intention avec luisintent et result.entities

Limitations

Les services de machine learning ne sont pas aussi performants que les êtres humains dans la classification de messages et cela doit être pris en compte par des développeurs de chatbots. Une étude publiée par Snips.ai le démontre très clairement. Pour l’extraction d’entités, les principaux services d’apprentissage ont un niveau de rappel entre 0 et 97% et un niveau de précision entre 50 et 90%.

Pour aller plus loin

Le but de ce billet était de présenter les plateformes de construction de bots qui reposent sur des services d’intelligence artificielle “as a service” en backend. Comme on a vu, la technologie reste perfectible.

Pour ceux qui s’intéressent au sujet, il y a toute une catégorie de bots dont je n’ai pas parlé dans ce billet, on les appelle les chatbots génératifs. Les chatbots décrits dans ce poste utilisent des langages de programmation standard pour choisir une réponse à envoyer à l’utilisateur à partir d’une base de réponses prédéfinies.

Les chatbots génératifs reposent sur d’autres types d’algorithme d’intelligence artificielle tels que le deep learning et les réseaux de neurones pour générer des réponses mot à mot à partir des messages envoyés par les utilisateurs. Ces bots peuvent agir dans des situations non préprogrammées et pourraient probablement dans un avenir proche palier aux limitations des chatbots présentés dans cet article.

Voici quelques liens pour ceux qui veulent explorer un peu plus le sujet :

Cliquez pour plus d’articles sur la Big Data