Comment développer son Chatbot avec Rasa ? Seconde partie : de l’entraînement au déploiement

Résumé de l’épisode précédent : nous vous avons présenté les concepts de NLU et NLG et leur déclinaison dans Rasa. Nous vous avons expliqué les grandes étapes pour entraîner et construire votre Chatbot avec Rasa. Plongeons maintenant dans ces deux composants un peu plus en détails.

Focus sur Rasa NLU

La préparation des données d’entraînement

Les données d’entraînement sont des phrases types que l’utilisateur pourrait dire et dans lesquelles l’intention et les entités sont précisées. Le format des données est JSON – JavaScript Object Notation – cf. l’exemple ci-contre.

Toutes ces combinaisons de phrases doivent être créées et renseignées dans un unique fichier, afin de couvrir la grande majorité des cas de figure et ainsi améliorer l’apprentissage du NLU. Cette génération des données est fastidieuse, c’est pour cela que des outils comme Chatito ont été créés. Cet outil open source permet de générer automatiquement des phrases assez complexes.

Capture d’écran Chatito

 

L’ajout de prétraitements pour épauler le NLU

De base, Rasa NLU est assez « brut de fonderie ». Par exemple, il ne sait pas reconnaître les dates, les montants, etc. Heureusement, il peut être « étendu » de façon très simple avec l’ajout de prétraitements (ou pré-processing).

La première bibliothèque complémentaire à installer s’appelle spaCy : elle comporte un modèle français. C’est donc grâce à spaCy qu’il est possible de dialoguer en français avec Rasa. Les principaux traitements qu’elle fournit sont la « tokenisation » et le « named entity recognition ». Il faut également choisir un classifieur d’intentions (parmi les options : Scikit Learn ou un modèle d’embedding dans le framework TensorFlow).

Il existe également un module nommé « Duckling » (de Facebook) permettant de gérer les dates, les nombres, les sommes d’argent, les emails et les distances. Les algorithmes de prédiction d’intentions disposent de leurs propres paramètres qu’il est possible de régler mais pour cela il faut avoir des profils experts très techniques.

L’orchestration de tous ces éléments se fait via un fichier de configuration dans lequel il faut préciser la langue et le pipeline, c’est-à-dire le séquencement de tous les traitements effectués sur le texte (voir ci-dessous).

Les tests du modèle NLU

Pour tester Rasa NLU, inutile de lancer le Chatbot et de lui poser manuellement toutes les questions imaginables pour balayer l’ensemble de l’arbre conversationnel ou toutes les intentions possibles.

Des outils existent pour tester le modèle de classification des intentions. Pour cela, il suffit de générer un nouveau fichier de données via Chatito et d’utiliser la fonction evaluate de Rasa NLU.

La sortie de cette procédure est une matrice de confusion (cf. ci-contre). Cette dernière contient le résultat des inférences (prédictions) obtenues avec le jeu de données qui lui a été fourni en entrée. Chaque colonne de la matrice représente le nombre d’occurrences d’une classe estimée, tandis que chaque ligne représente le nombre d’occurrences d’une classe réelle (ou de référence).

Le modèle est alors considéré comme optimal ou correctement entraîné, lorsque la matrice est la plus proche de la diagonale bleue et qu’il n’y a que des valeurs nulles (ou minimales) pour les autres occurrences.

Focus sur la brique discussion (Rasa Core)

Dans le fichier de configuration de Rasa Core, il faut créer un fichier domain dans lequel sont listés les intentions, les entités, les slots avec leur types associés (floattextunfeaturized), les actions ainsi que le template des réponses basiques (cf. exemple ci-dessous).

Il est également possible d’insérer des boutons dans les réponses et de créer des carrousels qui seront affichés par le canal de communication (Facebook Messenger par exemple).

Exemple de code carrousel

Exemple de rendu de carrousel dans Facebook Messenger

 

 

Il existe deux types de format pour les actions customs :

  • Le format « action», dans lequel il faut définir le nom de l’action, et le run qui correspond à une liste d’instructions que l’agent doit effectuer. Par exemple : appeler une API pour récupérer le nom de l’utilisateur puis lui renvoyer un message en réponse.
  • Le format « FormAction » dans lequel il faut définir le nom de l’action et les slots nécessaires pour passer au submit (qui est l’équivalent du Run de l’action décrite précédemment). Tant que tous les slots ne sont pas remplis, le Chatbot va continuer à poser des questions pour renseigner chacun des slots manquants. Par exemple, si vous réservez un voyage, les slots nécessaires seront : la ville, le nombre de personne, le budget, etc…
  • Enfin, le submit sera matérialisé par l’envoi d’un message récapitulant les informations fournies par l’utilisateur.

La création de stories

Les stories sont des éléments essentiels du Chatbot. Elles constituent les données d’entrainement pour le modèle de discussion dans Rasa Core. Pour chaque décision à apprendre au bot, il faut ajouter la story associée. La création de stories consiste à transformer une discussion « type » en un enchaînement d’intentions et d’actions (voir l’image ci-dessous). Ce processus peut paraître très fastidieux à première vue. Il faut savoir que Rasa Core va créer automatiquement des stories plus longues en enchaînant 3 histoires. Ensuite, il existe un module d’entraînement online qui permet de créer des stories en discutant avec lui et en l’aidant à prendre les bonnes décisions.

L’entraînement du modèle

Une fois les stories et le fichier de configuration prêts, il faut entraîner le modèle. Ce dernier va choisir les actions à exécuter selon les informations précédentes. Dans Rasa, un modèle se décompose en trois parties appelées policy :

  • La première est Memorization. Cette stratégie se rappelle les exemples présents dans les stories et va les appliquer si la discussion se retrouve dans un état qu’elle connait.

 

  • La deuxième stratégie est basée sur un modèle de type réseau de neurone. Cette stratégie est le cœur de l’agent conversationnel intelligent, elle va essayer de créer un modèle prédictif qui va généraliser à partir des données d’entrainement. Il est possible de régler la taille de l’historique que le modèle considère pour prendre ses décisions ainsi que le nombre d’époques pour entraîner le réseau de neurones.

 

  • La dernière est la stratégie Fallback. Elle va prendre le dessus quand les deux autres stratégies auront échoué, c’est-à-dire lorsque la confiance associée à leurs décisions sera trop basse. Un message du type « Je n’ai pas compris, peux-tu reformuler ? » sera alors envoyé à l’utilisateur.

Mise en orchestration des briques

Une fois les 2 modèles NLU et Core entraînés, il convient maintenant de les déployer pour mettre en place l’agent, ainsi que sa connexion avec l’interface de discussion. Pour cela, Rasa a mis à disposition des modèles de création d’agents pour les principales interfaces actuelles (Facebook, Workplace, Slack, Telegram, etc.). Il faut alors renseigner les mots de passe et les tokens de sécurités nécessaires pour chaque canal.

Il est également possible de modifier les fichiers de références pour gérer les images et les fichiers audio retournés par Rasa lors des actions custom. Ces types de fichiers n’étant pas pris en compte dans le framework Rasa, il faut utiliser des briques extérieures pour transformer le message – image ou son – en texte compréhensible par le Chatbot.

Un mode « debug » est présent dans la solution. Il offre des détails sur le traitement du message de l’utilisateur tels que le niveau de confiance de la brique Rasa NLU ou les entités qui ont été récupérées. Le mode debug présente le choix des actions et l’états des slots pour la partie discussion (Rasa Core).

Capture écran mode débug

 

Afin de pouvoir communiquer avec des applications, il est possible d’utiliser une solution comme Ngrok pour créer un webhook4 local accessible publiquement sur Internet en mode proxy à partir de votre ordinateur. Une fois ce lien créé, il suffit de rentrer l’adresse du webhook généré, dans le client depuis lequel les utilisateurs parleront au Chatbot.

 

Capture écran Facebook

 

Le déploiement cible

Pour travailler sur un projet Rasa, il est possible d’utiliser Git, un outil de gestion de versions de code standard. Dans le dépôt Git de votre projet, il est conseillé d’y ajouter les données nécessaires pour que tous les entraînements aboutissent au même résultat. En effet, le modèle généré par Rasa contient énormément de dépendances et est potentiellement trop volumineux.

Il est donc impossible de le déployer d’une instance à l’autre lorsque vous travaillez sur un projet et que vous migrez d’un environnement de DEV vers un environnement de RECETTE par exemple. Il est alors fortement recommandé, pour ne pas dire obligatoire, d’entraîner le modèle sur chacune des machines sur lequel l’agent sera déployé.

L’inconvénient de cette approche : en cas de rollback, il faut restaurer les data et ré-entraîner le modèle avant de le déployer.

Pour vous simplifier le travail, la version Rasa Platform payante vous fournit un certain nombre d’outils pour notamment versionner les modèles, les Datas et propose un outil d’analyse des logs.

Selon le canal dans lequel le Chatbot est déployé, vous pouvez être confronté à des contraintes :

  • Impossibilité de déployer un Chatbot en mode privé afin de le tester avant go live ;
  • Impossibilité d’avoir une plateforme de messagerie de test car il n’en existe qu’une seule en production pour toute l’entreprise.

Dans ce cas, il est tout de même possible d’imaginer des modalités pour tester votre Chatbot et procéder à des montées de version sans interruption de service.

Ainsi, il est par exemple possible de créer et tester votre Chatbot Rasa sur Facebook, avant de le déployer en production sur le réseau social Workplace de votre entreprise. L’avantage de cette solution est que les interfaces sont quasi équivalentes. Une fois le bot dans un état jugé satisfaisant, les différentes branches sont mergées sur la branche principale, les modèles sont ré-entraînés, finalement le bot redéployé sur Workplace.

Conclusion

Dans cet article, nous avons présenté les différentes étapes pour développer un Chatbot fonctionnel.

Avec Rasa, il est possible de construire un Chatbot assez complexe, capable de comprendre des phrases avec plusieurs intentions et plusieurs entités. Peu importe l’ordre dans lesquels elles sont renseignées. Cette capacité n’est pas garantie ni toujours simple à faire avec d’autres solutions.

Cependant, il faut bien avoir en tête que le Chatbot est construit grâce à du Machine Learning et pour cela, il faut avoir les données de qualité pour l’aider à comprendre convenablement et à prendre les bonnes décisions. Et dans un sens, il peut avoir un comportement non déterministe, ainsi comprendre des choses qui vous paraîtront inattendues, mais qui dépendront totalement de la façon dont vous l’aurez entraîné.

Maintenant, vous disposez de tous les éléments pour faire un Chatbot efficace avec Rasa.

A vous de jouer !

Auteur : onepoint

beyond the obvious