Nous avons vu dans l’article précédent comment créer notre solution de Chatbot, comment le déployer et l’intégrer sur une page web ou un autre canal.
Voyons désormais comment le rendre utile et intelligent !
De quoi a besoin notre chatbot pour être utile et intelligent ?
Pour qu’il soit utile, notre chatbot doit aider l’utilisateur dans un objectif précis : dans notre cas, le chatbot WeBotNet va aider l’utilisateur à rechercher et à réserver l’hôtel qui lui correspond.
Pour qu’il soit intelligent, le chatbot doit comprendre automatiquement les messages de l’utilisateur, et bien identifier les filtres de recherche exprimés par l’utilisateur. Pour cela nous allons utiliser LUIS qui est la solution Microsoft pour la compréhension automatique des textes. C’est un service qui va nous permettre à partir d’un texte passé en paramètre (le message reçu de l’utilisateur) d’identifier les critères de recherche ainsi que l’intention de l’utilisateur.
Faire évoluer notre chatbot en WebBotNet !
C’est quoi LUIS ?
LUIS est un service cloud sous forme d’API qui applique une intelligence de type « Machine Learning » sur un texte en langage naturel provenant d’un utilisateur afin de comprendre sa demande et d’en extraire des informations pertinentes. (https://docs.microsoft.com/fr-fr/azure/cognitive-services/luis/what-is-luis).
Un exemple d’utilisation du service LUIS :
Après réception et analyse du message de la part de LUIS, ce dernier nous renvoie une réponse JSON, qui contient :
- Une première propriété « query» : C’est le message reçu par LUIS
- Un objet « TopScoringIntent» : C’est l’intention la plus probable de l’utilisateur. Ici par exemple, LUIS estime que l’intention (nous allons revenir sur ce terme) de l’utilisateur derrière son message correspond à l’action « HRContact ».
Il module ce choix d’intention via une probabilité de 0.92 soit 92% - La dernière propriété de son retour est un tableau d’objet nommé « entities» : Il contient les différents compléments d’intentions intéressants que LUIS a pu extraire automatiquement du message. Dans notre exemple c’est la variable de type « Contact Type », que LUIS a pu identifier et qui possède la valeur « call » soit un appel téléphonique. LUIS a identifié cette variable entre les 10e et 13e caractère du message, avec une probabilité de justesse de 76%.
Lorsque vous avez déclaré plusieurs intentions auprès de LUIS, les scores vous permettent de connaître celle qui se rapproche le plus du message de l’utilisateur. LUIS fournir un score entre 0 et 1 (1 représentant 100% de probabilité) pour chaque intention reconnue et entités trouvées. C’est à vous ensuite de décider à partir de quel pourcentage de probabilité vous décidez de prendre en compte un résultat.
Dans l’exemple précédent, on peut considérer que l’intention détectée est correcte car elle dispose d’une probabilité de 92%. LUIS n’étant certain qu’à 76% qu’il s’agit d’une demande de contact par téléphone, on pourrait décider de négliger cette variable et choisir de poser la question du type de contact souhaité à l’utilisateur au moyen d’une liste prédéfinie afin de s’assurer de son souhait.
Utilisation de LUIS
Rendez-vous sur le site https://www.luis.ai, et allez sur «Go to my apps » :
Ensuite créer un nouveau service LUIS, en cliquant sur « Create new app » :
Chaque service est lié à une langue bien définie pour laquelle il tentera de comprendre la demande de l’utilisateur. Si on dispose d’une application multilingue on disposera donc d’un pool de services LUIS, chacun étant dédié à une langue. On pourra alors soit utiliser le service correspondant à la langue déclarée de l’utilisateur ou alors interroger l’ensemble du pool et se fier à l’intention disposant de la plus forte probabilité pour établir la langue de l’utilisateur.
La page d’accueil de notre service
Qu’est-ce que les « Intents » ?
« Intent » signifie intention en français.
L’idée de cette rubrique est de déclarer l’ensemble des questions et/ou actions que l’utilisateur pourrait chercher à poser/effectuer et pour lesquelles vous souhaitez pouvoir répondre/réagir.
Par défaut, le service dispose d’une intention « None ».
Pour chaque intention que vous déclarez, Luis vous répondra systématiquement avec un score.
Il vous sera donc possible dans le code de votre bot de décider quelle intention privilégier en fonction des probabilités renvoyées ou encore d’indiquer à l’utilisateur l’incompréhension de sa demande (en lui demandant de la reformuler différemment ou en l’aiguillant au moyen de liste de choix).
Créons notre première intention : Recherche d’hôtels
En appuyant sur « Create new intent », on est redirigé sur la page ci-dessous, après avoir saisi le nom de l’intention (dans notre cas c’est « Recherche d’hôtels »). C’est sur cette page que nous allons commencer à apprendre à LUIS des exemples de messages qu’un utilisateur pourrait saisir dans le but de réaliser cette intention.
LUIS suggère de mettre 5 exemples (« Utterance »), mais vous pouvez mettre autant d’exemples que vous le souhaitez. Bien au contraire, plus cette liste est complète, meilleure sera la reconnaissance de LUIS par la suite. Sachez que plus l’entrée de l’utilisateur se rapprochera d’une de ces phrases types, plus LUIS indiquera un score haut sur l’intention liée.
Dans notre exemple, vous voyez sur la colonne de gauche les messages d’exemple, et à droite de chacun d’entre eux le nom de l’intention liée ainsi que sa probabilité associée. Ici on lit une probabilité de 1 (100%), car nous n’avons déclaré qu’une seule intention.
Dans le cas où l’on a appris à LUIS le même message mais pour deux intentions différentes alors cette probabilité va changer. Elle serait ainsi de 50% pour les deux intentions et il vous faudrait arbitrer l’intention à privilégier directement dans le code de votre chatbot.
Ok mais connaître l’intention de l’utilisateur n’est pas toujours suffisant pour récupérer des filtres de recherche. Comment faire ?
LUIS nous permet de définir des variables à identifier dans les messages des utilisateurs.
Pour cela un simple passage de curseur sur nos messages d’apprentissage suffit à nous permettre de définir ces dernières.
Dans notre cas le deuxième message (« Je recherche un hôtel sur Paris ») contient la localisation souhaitée de l’hôtel (« Paris »). On positionne donc notre curseur sur « Paris » et une popin apparaît.
Dans celle-ci, on choisit de créer une nouvelle entité (variable) que nous allons nommer « Ville »
On sélectionne ensuite le type de notre variable :
Dans notre cas, c’est une variable simple.
Quand on revient sur l’interface, on s’aperçoit que LUIS a remplacé Paris par le nom de la variable :
Une fois vos variables définies, c’est le moment d’entrainer LUIS en appuyant sur le bouton « Train » :
Il ne reste plus qu’à tester !
Nous avons un aperçu de la réponse de LUIS et on remarque dans l’exemple ci-dessus qu’il a bien identifié la ville comme variable.
Vous pouvez vous vous amusez à tester votre LUIS pour voir s’il arrive à bien identifier l’intention de l’utilisateur même sur des messages qui ne sont pas ceux référencés dans la fenêtre d’apprentissage :
Nous pouvons constater qu’il est sûr à 89% que le message a bien comme intention la réservation d’hôtels.
Pour WebBotNet nous avons défini plusieurs variables, comme la date de la réservation, la durée du séjour et le budget :
Une fois satisfait du paramétrage de votre service LUIS, vous pouvez le publier à l’aide du bouton « Publish » en haut à droite.
Une fois publié vous êtes redirigé sur l’interface ci-dessous qui contient les différents paramètres permettant de l’intégrer à votre chatbot :
Vous pouvez alors tester votre service LUIS via l’API REST, en utilisant l’url donnée sur votre navigateur ou tout autre outil, en passant le texte du message dans le paramètre « q » à la fin de l’url :
Vous voyez que LUIS a bien identifié l’intention de l’utilisateur, ainsi que la date à partir du mot « demain » et la ville, avec des probabilités sûres.
Comment intégrer LUIS à notre projet ?
Pour intégrer LUIS à notre projet on définit notre propre dialogue.
J’ai nommé le dialogue HotelsDialog qui hérite de la classe LuisDialog<object>, et en ajoutant les références nécessaires pour cette classe, ainsi que les paramètres fournis par LUIS dans les attributs de LuisModel de la classe :
Une fois que WebBotNet reçoit un message qu’il identifie comme une intention de recherche d’hôtel à l’aide de l’attribut LuisIntent, il fait appel à la méthode searchHotel(), en passant en paramètre un objet LuisResult qui va contenir l’intention ainsi que les variables identifiées.
Comment tester sur l’émulateur ?
Après avoir installé Bot Framework Emulator, on exécute le projet, qui va publier un site en local, et on passe notre url avec les différents paramètres à notre émulateur :
On peut par exemple placer un point d’arrêt sur notre méthode searchHotel puis discuter avec notre chatbot. Cela nous permet d’observer que l’intention de recherche d’hôtel est déclenchée à la réception du message « je cherche un hôtel sur Paris pour 3 jours dès demain », et de visualiser les différentes variables qui nous sont renvoyées et dont nous avons besoin pour les traitements (date, durée et ville).
Comment fonctionne WebBotNet ?
(1) « RootDialog » : la racine des dialogues lance la discussion avec l’utilisateur, avant de passer la main à « HotelsDialog »
« HotelsDialog » intercepte à l’aide de LUIS (3) l’intention de l’utilisateur de demande de réservation, et on mappe les filtres identifiés par LUIS sur notre « FormDialog » (4), ce dernier qui définit comme model un objet de type HotelsQuery (5).
« HotelsQuery » permet au « FormDialog », de poser les questions concernant les paramètres qui ne sont pas encore mappés à l’aide de la méthode (AddRemainingFields)
(6) sur notre méthode « searchHotel », on fait appel au « ClassementDialog », ce dernier va demander à l’utilisateur ses préférences de classement de l’hôtel recherché.
Qui va passer la parole ensuite à « BudgetDialog »(8) qui, de manière identique, va demander des précisions par rapport au budget :
Une fois que « BudgetDialog » finit sa tâche, on fait appel à la méthode « SearchHotelBudgetDialogAfter », qui va faire appel à notre service de recherche d’hôtel (8 – 9), afin de renvoyer le message avec les résultats de recherche, sous forme de « HeroCards » (10) à l’utilisateur.
Ainsi, on arrive au résultat final (cf captures d’écrans ci-dessous), illustrant toute la discussion jusqu’à l’obtention des résultats correspondants à notre recherche.
A travers cet article, nous avons pu examiner la facilité de mise en place d’un chatbot en utilisant les technologies Microsoft. C’est le résultat d’une grande ambition que Microsoft réserve pour le marché de l’intelligence artificielle, où le chatbot représente l’interface de communication entre l’humain et l’intelligence artificielle.