Microsoft Bot Framework: créer un bot qui a de la conversation

Dans cet article nous allons exploiter les possibilités offertes par le Bot Framework de Microsoft afin d'offrir à vos utilisateurs une expérience la plus proche possible d'un véritable dialogue avec votre Bot. Si vous n'êtes pas familier avec les principes du BotFramework je vous recommande de lire la documentation en Anglais, puis de continuer. 

Bot State

Le but de ce service est de pouvoir sauvegarder le contexte d’un utilisateur, ses informations personnelles (des chaînes de caractères, des objets, etc..) dans un endroit centralisé et de pouvoir facilement les récupérer à tout moment. Cela permet de sauvegarder par exemple la dernière commande qu’il a effectuée ou bien ses préférences.

Il est aussi possible d’enregistrer des objets complexes, car le service les sérialise en Json et utilise donc les attributs Json (Serializable, NonSerialized, etc...).
Dans le principe cela fonctionne comme un dictionnaire cle/valeur. L'objet est ensuite sérialisé dan Json puis envoyé à une API (Connection Service) .

Un rapide exemple : Nous allons continuer d’écrire le message entier, mais nous allons le sauvegarder avec le BotState pour le réafficher au prochain message.

Nous partons d’un projet botframework standard et nous rajoutons dans la fonction "Post" de Controller/MessagesController.cs.
Pour prévenir toutes modifications concurrentielles faites par d’autres instances de bot, nous conseillons vivement d'utiliser la méthode proposée.

Cela fonctionne aussi avec un objet plus complexe et c'est tout aussi simple

// myObjet.Id ne vaut pas 42, car c’est une propriété private de la class et myObjet.Conv.Id est null, car on utilise l’attribut NonSerialized()

En résumé le service propose de sauvegarder le contexte d’un utilisateur grâce au service Connector avec l'aide d'une API. Il est donc possible de paramétrer le stockage des données pour qu’il puisse utiliser un serveur dédié, si vous êtes soucieux des échanges de données ou de leurs utilisations dans le cloud de Redmond.

Dialog

Les Dialogs introduisent avec eux les conversations entre le bot et l’utilisateur. Cela nous rapproche donc plus d’une vraie interaction entre l'utilisateur le bot. Pour fonctionner les “Dialog” utilisent le principe du “Bot State” présenté précédemment. Le statut de la conversation est donc persistant dans le temps et à travers les plateformes.

Il est donc possible de cumuler plusieurs Dialogs les uns à la suite des autres en permettant à la conversation de changer de direction, de contexte et donc d’adapter le flux de discussion.

Il y a deux fonctions qui sont très utiles pour comprendre le fonctionnement les Dialogs.

IDialogContext.Call : Elle permet de naviguer vers un autre Dialog. Elle prend donc l’instance de la conversation et la fonction appelée à la fin de cette partie de conversation.

IDialogContext.Wait : Elle permet de placer le curseur du contexte de discussion. Le curseur sera récupéré pour savoir quelle fonction exécuter au prochain message de l’utilisateur.

Exemple :

Au démarrage de la conversation rien ne semble se passer.

Utilisateur écrit par exemple “Hello Mr Bot”.

Le programme appelle : Post (MessageController.cs), Conversation.SendAsync (MessageController.cs), StartAsync (IntroDialog.cs) et exécute StartDialog (IntroDialog.cs) affiche “Bonjour, comment puis-je vous aider?” et place le curseur du contexte sur Dialog ManagementDialog

Au prochain message le programme appelle : Post (MessageController.cs), Conversation.SendAsync (MessageController.cs), mais exécute ManagementDialog et non plus IntroDialog.

A la fin de la conversation menée dans ManagementDialog le bot appelle la fonction Done (IntroDialog.cs) et rappelle le début du programme. La fin du Dialog peut être provoquée à tout moment avec context.Done(null) ou tout autre objet envoyé en paramètre de la fonction.

FormFlow

Les Forms sont une forme simplifiée des Dialogs qui permettent de prendre en charge la complétion d’objet simple comme des objets composés de chaînes de caractères de numéros, mais prennent aussi en charge des choix multiples. Pour les choix multiples on utilise des Enums pour définir toutes les options comme par exemple son choix de sandwich.

Il suffit donc de créer un objet, de définir une propriété SandwichOptions et d'implémenter la fonction BuildForm().

pour appeler ce Form depuis un Dialog

On peut donc initialiser l’objet en paramètre avant l’appel au Form, pour par exemple l’initialiser avec les préférences de l’utilisateur. Les propriétés déjà définies ne seront donc plus demandées pendant la complétion de l’objet.
On peut aussi demander l’état de l’objet avec la commande “statut”.
On peut personnaliser le texte inscrit pendant la demande, ou bien le nom de la propriété avec Prompt et Describe.

[Describe("remarque")] [Prompt("S'il vous plaît tapez votre {&}")] public string? FeedBack;

On peut aussi créer pendant le processus des Dialog de confirmation avec .Confirm()

 

Langage  naturel

A ce stade, votre bot dispose de capacité de dialogue assez avancée et il ne lui reste plus qu'à comprendre un langage plus naturel pour offrir la meilleure expérience à vos utilisateurs. Pour cela, Microsoft propose le service LUIS, basé sur un système de Deep Learning, qui permet très facilement de mettre en place une véritable reconnaissance des demandes des utilisateurs.

La configuration de LUIS sera traitée très bientôt dans un prochain article sur ce blog.

 
Florian Meyer