Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Tutoriel LUIS

Poster un commentaire

Cela fait déjà plusieurs articles consacrés aux bots. Celui-ci est un peu particulier car il ne se consacre pas tant aux bots eux-même, qu’aux moyens de leurs donner des capacités d’interagir avec nous même un peu moins mécaniques.

 

Je ne suis pas fan du terme « intelligence artificielle ». Je ne vois pas clairement ce qu’il signifie. Je vais plutôt dire que l’enjeu de cet article sera de rapprocher le modèle d’interaction des bots avec ceux auxquels nous sommes plus habitués.

Jusqu’à présent nos bots ne réagissaient qu’à des commandes, a nous de deviner et retenir lesquelles. Par exemple « hello » est une phrase de salutation, mais pas « alors vieille branche? » parce que « hello » et « salut » sont les seuls termes reconnus par une expression régulière.

 

Depuis pas mal d’années Microsoft Research travaille sur ce genre de sujets et en particulier le projet Oxford qui est le nom de code d’un ensemble d’outils capables de mettre entre des mains (pas trop expertes) des outils de simulation de capacité cognitives très sophistiquées. Maintenant on parle plutôt de Microsoft Cognitive Services.

C’est par exemple de ce projet qu’est issue le moteur de recherche Bing.

 

Une vingtaine de services sont proposés aux développeurs:

https://www.microsoft.com/cognitive-services/en-us/apis

Ils sont classés en 5 catégories:

  1. Vision
  2. Speech
  3. Language
  4. Knowledge
  5. Search

Chaque catégorie regroupe actuellement 4 ou 5 services.

 

Pour nous il s’agit d’un jeu d’API prêtes à être exploitées par nos applications. Dans les coulisses s’active une Machine Learning. Qui dit ML, dit aussi phase d’apprentissage. C’est un point qui peut sembler déroutant. La plupart des API que nous rencontrons sont prêtes à l’emploi. Cette fois on devra l’entraîner.

Heureusement toutes ces API proposent des services intégrés préconfigurés qui correspondent à des situations prêtes à l’emploi. Le travail d’apprentissage sera donc limité.

Je vous propose de faire la connaissance de LUIS (Language Understanding Intelligence Service).

Dans ce premier article, je ne vais parler que de LUIS. L’article suivant montrera comment intégrer LUIS dans un bot. Un bot car c’est le thème de cette série d’articles. Mais n’importe quelle application fait aussi l’affaire.

 

Edit 12/03: Le sujet est encore très chaud. Comme vous le constaterez, depuis que j’ai rédigé ce tuto, les écrans on pas mal changés

 

Quelques définitions

Luis est un outil dans le registre de la linguistique. Il n’est donc pas étonnant que le vocabulaire qui l’entoure en soit imprégné. Il y a donc quelques petites choses à comprendre avant de continuer.

 

L’unité linguistique analysée par LUIS s’appelle un énoncé (utterance). L’énoncé est l’unité de sens minimale analysée par LUIS.

Je vous laisserai lire la page Wikipédia pour ce terme (j’ai rien compris!). Mais en ce qui nous concerne, un énoncé est simplement un jeu d’entraînement destiné à LUIS, c’est à dire les phrases que LUIS va associer à des intentions et des identités.

 

Le modèle de language (language model ou problem domain) est le domaine d’expertise dans lequel s’inscrit l’énoncé.

Par exemple le terme « armure » à un sens dans le domaine militaire qui est très différent de celui où l’entendent les fabricants de tissus. Un  outil d’analyse de sens d’un énoncé devra donc savoir prendre en compte ce genre de nuance.

Un modèle de langage est constitué de deux parties:

  1. l’intention
  2. l’entité

L’intention désigne ce que l’utilisateur souhaite faire, par exemple:

« Achète des fleurs à ta femme »

L’intention est « Acheter« . Une intention correspond en général à un verbe d’action.

 

Les entités sont les centres d’intérêt de l’intention, c’est à dire ce sur quoi le bot prendra des actions. Dans notre exemple il y en a deux, « Fleur » et « Femme« .

Outre les entités génériques que nous venons de voir, LUIS supporte 2 autres entités:

  1. Hiérarchique
  2. Composite

 

Un entité hiérarchique correspond à une entité générique qui regroupe des sous-entités plus spécifiques. Par exemple on peut avoir une entité générique appelée « Pays » avec des sous entités comme: France, Espagne, Australie

 

Considérons maintenant l’énoncé: « la voiture est une 2 CV rouge de 1982« . On distingue 4 entités génériques:

  1. type
  2. marque
  3. couleur
  4. année

 

Que l’on décompose ainsi:

  • voiture -> type
  • 2 CV -> marque
  • rouge  -> couleur
  • 1982 -> année

Ces 4 entités appartiennent au même contexte: elles décrivent une voiture. Il pourrait donc être intéressant de les composer (regrouper) sous une entité unique appelée Voiture.

2017-02-19_10-59-44

 

LUIS reconnaît par défaut certaines entités d’usage fréquent. C’est très pratique car on peut les utiliser directement sans avoir besoin de procéder par soi-même à toute la phase d’apprentissage correspondant.

On va par exemple disposer d’une entité date avec ses diverses termes associés comme: demain, aujourd’hui, lundi, le 13 mai

On trouve la liste dans la doc:

https://www.luis.ai/Help#PreBuiltEntities

2017-02-19_11-01-38

 

 

C’est à nous d’ajouter à notre modèle les entités (prédéfinies ou non) dont on aura besoin.

Parmi les entités par défaut l’une joue un rôle particulier, c’est NONE. C’est l’entité associée à tous les énoncés que l’on n’a pu lier à une entité du modèle. Elle est toujours définie dans tous les modèles. On a pas à s’en préoccuper.

Combien ça coûte?

LUIS est en partie gratuit:

2017-02-16_21-51-52

Une fois le quota mensuel ou par seconde atteint, une erreur HTTP 439 est levée.

Pour l’instant l’outils est en béta, rien ne dit que cette tarification sera celle du produit terminé.

Première démonstration

L’avantage de notre première démo est que l’on ne va pas écrire de code. C’est pratique car on pourra se concentrer sur l’outils plutôt que la technique.

 

La page d’accueil LUIS est celle-ci:

https://www.luis.ai/

2017-02-15_22-38-05

 

Nous devons nous inscrire et nous loguer. Nous arrivons ici:

 

2017-02-15_22-39-41

Remarquez le lien vers la doc dans le menu. Je vous encourage à cliquer sur le tutorial qui est intéressant.

 

On remarque aussi le menu « Cortana pre-built apps« .

C’est une application par défaut qui sera notre première démo. Cliquons:

2017-02-15_22-57-46

La démo est configurée pour plusieurs langue. Choisissez celle de votre choix, mais il faudra parler dans cette langue sous peine… d’être ridicule!

 

Le formulaire qui s’ouvre est en anglais pour toutes les langues (oui j’ai vérifié):

2017-02-15_23-00-49

En 3 choisissez une clef dans la liste déroulante et entrez un énoncé (utterance) en 1. L’url 3 s’active et la bobinette a cherrée:

2017-02-15_23-04-43

 

Cliquons sur l’url pour voir l’analyse de l’énoncé proposée LUIS:

2017-02-15_23-06-27

LUIS nous annonce que l’intention est set_alarm ce qui est correct. LUIS identifie ensuite « 6 heure du matin » comme étant une entité et une entité de type start_time ce qui est bien vu.

Je ne suis pas bien sûr de ce que représente la résolution, pas trouvé d’infos dans la doc.

 

Globalement l’analyse a donc fonctionnée. On pourrait exploiter ce résultat pour déclencher des actions particulières dans notre bot.

On va faire un autre essai, mais avant jetons un œil sur la doc de cette appli pour voir ce qu’elle sait faire, il suffit de cliquer sur le lien fournit:

https://www.luis.ai/Help/Index#PreBuiltApp

 

Choisissez l’intention que vous souhaitez et fournissez un énoncé qui lui correspond, par exemple send_email:

2017-02-15_23-23-13

Note: quand on fait une démo il est important d’être modeste et ne pas se la péter. Moi, pas exemple, je suis comme vous, juste nettement mieux!!!!

 

Que nous dit LUIS?

2017-02-15_23-25-27

LUIS a découvert l’intention visée. Il découvre également deux entités qu’il réussi à typer correctement. Trop fort le LUIS!

 

Voilà, je vous laisse jouer un peu, c’est bluffant je trouve.

 

Le point à retenir est que LUIS peut analyser la sémantique d’un énoncé. Notre bot peut alors choisir de jouer un IDialog associé à chaque intention rencontrée, le dialogue prenant comme paramètre les entités qu’il peut analyser connaissant leur type.

Création de notre premier modèle LUIS

La démo qui précède vous a fait rêver? Vous aussi vous avez envie de faire des trucs cool comme ça? Et bien allons y.

Notre contexte sera celui d’une agence de voyage qui souhaite ajouter un Chatbot à son site afin d’aider ses clients à faire des réservations dans un langage plus accessible que la jungle des menus et écrans de leur site officiel.

 

Création de l’application

On commence par se connecter au portail LUIS:

2017-02-19_14-02-54

On clique sur le menu « My Application » (1), puis « New App » (2). Un sous-menu apparaît:

2017-02-19_14-05-18

On sélectionne « New application« . On arrive sur un nouvel écran:

2017-02-19_16-31-14

Notre application LUIS s’appellera TravelingAgency, on sélectionne l’anglais comme langue de travail ainsi qu’un domaine d’application. Le domaine d’application est obligatoire, mais la doc ne précise pas pourquoi. Le scénario d’usage est Bot.

Là aussi je ne suis pas certain de ce que cela implique dans les coulisses.

 

Note: je choisis l’anglais, les autres langues ne sont pas encore bien au point. En tout cas j’ai pas réussi à tout faire fonctionner.

 

On valide et on arrive à l’écran de configuration de l’application.

2017-02-19_14-09-50

Regardez la partie gauche de l’écran:

2017-02-19_11-14-12

C’est dans cette zone que nous allons définir nos intentions et énoncés. Il suffira de cliquer sur l’icône 2017-02-19_11-17-15 qui ouvrira une popin.

Remarquez la zone Intentions (Intents). Elle n’est pas vide. Elle contient toujours au moins l’intention None qui sera proposée chaque fois que LUIS ne comprend pas un énoncé. Il n’est bien sûr pas possible de la supprimer.

 

Création d’intentions

 

On commence par créer les intentions.

  • Congratulation
    Message d’accueil et de bienvenue
  • Reservation
    Réponse à une demande de réservation d’un voyage

L’intention Congratulation sera déclarée ainsi:

2017-02-19_16-41-17

On a besoin de préciser une intension, mais on verra plus tard comment en créer d’autres. On fait SAVE et:

2017-02-19_16-43-51

L’intention est enregistrée et on passe automatiquement à l’onglet New Utterance.

2017-02-19_16-44-43

On a juste à vérifier que l’énoncé correspond à la bonne intention, corriger au besoin, puis on clique sur Submit pour enregistrer l’énoncé. Cette opération s’appelle labellisation d’un énoncé. Nous rencontrerons des cas un peu plus sophistiqués plus tard.

Si on le souhaite on peut vérifier que tout est correct en ressaisissant l’énoncé:

2017-02-19_16-46-14

Intéressons nous un peu au chiffre entre parenthèses. Ils représentent la probabilité pour laquelle LUIS estime avoir fait une bonne analyse. Il est donc certain à 100% que cet énoncé correspond à l’intention Congratulation. Un bot ou un autre logiciel pourra donc entamer un dialogue d’accueil avec le client dans lequel il pourra par exemple présenter l’agence de voyage, demander au client son nom, ses coordonnées…

 

Un autre menu intéressant est « Review Labels« . Sélectionnons « Show all labeled utterance » dans la liste déroulante:

2017-02-19_16-48-42

 

Pour l’instant il n’y a qu’un seul énoncé labellisé. Mais c’est ici que vous pouvez voir ce que LUIS connaît déjà, ce qu’il a deviné avec la probabilité correspondante et le cas échéant corriger pour améliorer les capacité de LUIS.

A ce stade le moteur LUIS n’est pas encore fonctionnel. Si vous entrez n’importe quoi, LUIS dira qu’il reconnaît Congratulation.

2017-02-19_14-47-31

Si je rajoute une autre intention complètement fantaisiste:

2017-02-19_14-49-06

Et que l’on refait les exemples qui précèdent:

2017-02-19_14-50-38

LUIS nous renvoi la première intention qu’il rencontre dans la liste.

Ce n’est pas très intéressant.

Supprimons l’intention « avertissement » et corrigeons le problème en entraînant LUIS. La commande se situe en bas à gauche de l’écran:

2017-02-19_14-53-06

 

2017-02-19_14-54-55Cette fois le résultat est cohérent.

 

Essayons maintenant une phrase d’accueil plus sophistiquée:

2017-02-19_16-51-41

Cette fois LUIS est moins percutant. C’est pas grave, on va lui apprendre. Forcez ‘Congratulation’ et cliquez sur Submit.

Faites ensuite TRAIN (c’est le truc que l’on oublie tout le temps) et testez une phrase similaire, mais différente:

2017-02-19_16-53-25

Vous voyez que LUIS s’est amélioré nettement et sait reconnaître toute une palette de phrases comme étant des phrases d’accueil.

 

Cette situation peut également se poser:

2017-02-19_16-54-27

LUIS reconnaît correctement l’intention et même avec un score élevé qui n’est pas 100%. Vous pouvez laisser tel quel ou bien cliquer sur Submit puis Train.

Les listes de phrase

Essayons une formule d’accueil plus… poétique:

2017-02-19_18-06-27

Ok, il a reconnu l’intention, mais c’est tout de même chanceux à la vue du score. On pourrait cliquer sur Submit et entraîner LUIS.

Mais il existe une autre possibilité avec les Phrases List Feature:

2017-02-19_16-01-34Une liste de phrase est une liste d’énoncés qui partagent le même sens.

 

Ouvrons le formulaire:

2017-02-19_16-02-32

On va créer une liste appelée Salutations:

2017-02-19_18-16-23

On ajoute une liste de mots séparés par une virgule. On y place des énoncés déjà identifiés comme Hi ou Hello, puis les autres.

On fait Save, puis Train:

2017-02-19_18-17-56

Le score est (un peu) meilleur.

 

2017-02-19_18-19-21

Notre liste n’a qu’une seule entrée. Remarquez la case à cocher. Il est possible de désactiver une liste sans la supprimer. Bien entendu il faut relancer l’entraînement également.

 

Ajouter des entités

Nous allons voir des entités apparaître avec la deuxième intention: Reservation.

Commençons donc par la créer.

2017-02-19_16-55-55

Et donc:

2017-02-19_16-56-43

Important: ne pas cliquer sur Submit. Sinon le reste ne fonctionnera pas correctement. Je ne sais si s’il s’agit d’un bug ou d’autre chose.

 

Pour traiter une réservation, l’intention n’est pas suffisante, j’ai aussi besoin d’identifier la destination? On a donc besoin d’une entité qui va s’appeler Destination.

On a en fait besoin de distinguer la destination de départ de la destination d’arrivée. On va donc créer une entité hiérarchique:

2017-02-19_16-57-47

On clique sur Entities dans le portail:

2017-02-19_15-19-55

Je saisi le nom de l’entité, puis je coche « Include Children » et sélectionne hierarchical:

2017-02-19_16-58-54

On clique deux fois sur le bouton 2017-02-19_11-17-15.

2017-02-19_17-00-21

Je définis les deux sous-entités, puis je fais Save.

2017-02-19_17-01-36

Il ne reste plus qu’à apprendre à LUIS à identifier ces identités. On retourne dans l’onglet Utterance:

2017-02-19_17-02-44

Relancez la recherche et cliquer sur le (ou les) termes qui correspondent à l’entité. Dans notre cas c’est Paris. On a une seule entité pour l’instant, donc seule Destination est proposée dans la liste. Destination est une entité hiérarchique, on va donc être plus précis et sélectionner To. On sélectionne également l’intention Reservation, puis submit.

Si vous relancez ce même énoncé:

2017-02-19_17-06-28

Vous constatez également que LUIS affiche en couleur les entités qu’il a reconnu et si on passe la souris sur le terme:

2017-02-19_17-07-20

Testons un autre énoncé:

2017-02-19_17-08-22

L’intention est correctement reconnue, mais pas l’entité. Une fois de plus, c’est parce que l’on a pas entraîné LUIS!

Cliquez sur Train et recommencez:

2017-02-19_17-09-12

Cette fois LUIS décompose complètement l’énoncé en tous ses éléments intéressants.

Note: c’est ceci qui ne fonctionnerai pas si vous aviez cliqué sur Submit précédemment.

 

On va un peu compléter avec d’autres énoncés pour définir un point d’arrivée. La procédure est exactement la même que précédemment:

On teste un énoncé:

2017-02-19_17-10-07

On labélise:

2017-02-19_17-11-15

Submit + Train et on teste.

2017-02-19_17-13-47

 

Faites des tests, parfois il faut proposer plusieurs énoncés dans lesquels on change juste le nom des villes pour que LUIS fonctionne. Le modèle prédictif peut nécessiter de nombreux énoncés pour être pleinement fonctionnel.

 

Ok, on sait récupérer les destinations. Nous avons encore besoin de connaître la date à laquelle le client souhaite voyager.

La reconnaissance d’une date est justement une des entité par défaut reconnues par LUIS:

2017-02-19_16-23-52

On a juste à l’ajouter au modèle:

2017-02-19_16-25-37

Puis à créer des énoncés:

2017-02-19_17-16-53

La labélisation s’est passé correctement, on a juste à faire submit et tester d’autres énoncés:

2017-02-19_17-18-57

 

Publier l’application

Nous disposons de la commande Publish:

2017-02-19_15-08-04

Cliquons:

2017-02-19_15-09-01

Puis « Publish web service« :

2017-02-19_15-10-02

TravelingAgency est maintenant exposée comme un service HTTP.

Vous devriez même reconnaître cet écran que l’on a déjà rencontré dans la démo qui précède. Je ne vais donc pas y passer plus de temps.

 

Entraîner LUIS avec les suggestions

Les requêtes via le service n’aboutissent pas toutes. Parfois parce qu’elles ont aucun sens (passe moi le sel par exemple), mais aussi parce que LUIS n’a pas été correctement entraîné sur certains énoncés.

 

Essayez les deux énoncés:

  1. booking a flight to paris
  2. make a reserevation to paris

 

2017-02-19_17-38-44

L’intention est reconnue, mais parfois avec des scores assez bas donc assez fragiles. Clairement il est nécessaire d’améliorer l’entraînement de LUIS.

Rendez-vous dans l’onglet Suggest:

2017-02-19_17-41-42

On retrouve les résultats vus tout à l’heure. Corrigez (éventuellement) l’intention, puis faites Submit et Train.

On n’oublie pas de republier le service:

2017-02-19_17-43-49

Et cette fois le score remonte:

2017-02-19_17-45-28

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