Un bot parmi nous ? – 2nde partie

La première partie de ce billet vous a permis de constituer le squelette de votre bot et de l'enregistrer sur le site de Microsoft dédié afin de définir les éléments clés qui permettront aux différents utilisateurs de communiquer avec votre bot.

Il est désormais temps de faire vos premiers pas avec le Bot Framework.

Premier pas avec le Bot Framework

La première étape pour commencer à utiliser votre bot consiste à télécharger l'émulateur vous permettant d'interagir avec votre bot.

L'émulateur est disponible en téléchargement ici.

Figure 1 : Interface de l'émulateur

Cet émulateur se présente sous la forme d'un logiciel de messagerie simple, agrémenté de quelques fonctionnalités additionnelles, présentent dans les applications « réelles », telles que :

  • L'ajout du bot à une conversation
  • La suppression du bot d'une conversation
  • Entrée d'un utilisateur dans la conversation
  • Départ d'un utilisateur de la conversation
  • Fin de la conversation
  • Ping
  • Suppression des données d'utilisateurs stockées

Suite à cela, il vous faudra configurer votre application afin qu'elle ait en sa possession les informations d'authentification qui vous ont été fournies lors de l'enregistrement de votre bot (les mêmes que dans l'émulateur).

Pour se faire, rendez-vous dans le fichier Web.config, et remplacez les valeurs des clés AppId et AppSecret (tout en haut du fichier) par les valeurs présentent sur l'interface de gestion de votre bot.

Figure 2 : Visualisation des informations d'authentification du bot

Une fois toutes ces actions effectuées, vous devriez être en mesure de lancer votre bot en local dans Visual Studio, et ainsi pouvoir interagir avec lui via l'émulateur :

Architecture du modèle d'application pour le Bot Framework

Maintenant que notre bot est configuré et fonctionnel, nous allons commencer à pouvoir rentrer un peu plus dans le détail des fonctionnalités proposées par le Bot Framework. Nous allons voir les différentes interfaces permettant de mettre en place des interactions de haut niveau avec notre bot.

Contrôleur et routage

Dans son mode de fonctionnement, le Bot Framework se présente comme une simple API REST utilisant donc le protocole HTTP pour formuler des requêtes et recevoir des réponses. L'architecture du projet est donc très similaire à tout projet ASP.NET, sans la partie « vue ».

Chaque application contient donc un ou plusieurs, contrôleurs qui sont en charge de :

  • Recevoir les requêtes,
  • Vérifier les paramètres et/ou traiter ces derniers,
  • Et éventuellement interagir avec la base de données,

Afin de générer la réponse.

(Ces contrôleurs sont placés dans le dossier Controllers de votre application)

Figure 3 : Contrôleur de base fournit avec le modèle du Bot Framework

Le contrôleur n'est que la partie émergée de l'iceberg, cependant, quelques notions sont à savoir :

  • Le nom de votre contrôleur est important. Il détermine l'URL qui permettra de cibler celui-ci. Par exemple, MessagesController sera accessible via https://host:port/messages
  • Afin de recevoir une requête sur votre contrôleur, vous devez posséder dans celui-ci une méthode qui correspond avec la méthode HTTP (GET, POST, PUT, etc.) qui véhiculera le message. Dans le contrôleur de base fournit, on peut voir qu'une méthode POST est exposée permettant d'interagir via HTTP POST.
  • La classe Message est fournie par le Bot Framework et contient tout le contexte actuel dans lequel le message a été envoyé (la langue, les participants, les pièces jointes, etc.)

Pour la suite, il vous faudra installer la bibliothèque manuellement en ouvrant le gestionnaire de paquets NuGet et en installant Microsoft.Bot.Builder via la commande Install-Package.

Figure 4 : Installation de la bibliothèque Microsoft.Bot.Builder

Dialogues

La première abstraction fournie par cet outil concerne les interactions entre le bot et une ou plusieurs personne. Dans un dialogue, il est nécessaire de posséder un contexte, potentiellement de pouvoir faire des parallèles avec d'autres idées cohérentes dans le contexte actuel, etc.

C'est ce que tend à fournir l'interface IDialog, laquelle peut prendre en argument le type des réponses émises par les implémentations dérivées.

Elle permet aussi de faciliter la mise en œuvre d'une approche « avec état » (statefull) se traduisant ainsi par un contexte sauvegardé entre plusieurs messages.

En outre, cette interface supporte potentiellement toutes les spécialisations que vous saurez, à n'en pas douter, apporter à votre bot ; les ingénieurs de Microsoft ont mis à votre disposition des dialogues génériques, tels que PromptDialog ou Chain.

Ces derniers vous permettent notamment de solliciter l'intervention de l'utilisateur (PromptDialog) en demandant une confirmation, un nombre ou encore un choix, et, plus important, ils utilisent des mécanismes de validation de l'entrée fournie par l'utilisateur. Chain quant à lui vous permets de chainer simplement vos dialogues, à l'image d'une liste chainée.

L'interface IDialog est donc la première brique mettant en œuvre l'interaction nouvelle génération via le Bot Framework.

Formulaires

A l'image de ceux que l'on peut trouver sur le web, permettant de saisir différentes informations, et de valider celles-ci, les formulaires sont présents dans la bibliothèque, et ce, avec divers points d'entrés.

La première méthode consiste à laisser le bot automatiquement inférer les champs nécessaires pour remplir le formulaire. Pour se faire il suffit de définir une classe contenant tous les champs requis, et d'utiliser la classe IFormBuilder afin de générer automatiquement les instructions pour le bot. Un exemple est disponible ici.

La seconde reprend les bases de la première, mais vous apporte une flexibilité accrue sur les actions possibles, le type des champs de données, prend en charge les demandes de confirmation, etc.

Pour se faire, un langage spécifique de modèle a été créé et permet d'exprimer certaines informations de manière dynamique. Les spécifications de ce « micro langage » sont disponibles ici.

Par exemple :

[Prompt("What kind of {&} would you like? {||}")]

public SandwichOptions? Sandwich;

  • {&} : Description du champ dont on souhaite définir la valeur
  • {||} : Enumération des choix possibles (de manière automatique si le type est une enum)

Vous pouvez agir sur différents aspects des réponses du bot :

  • La manière dont le renseignement d'un champ spécifique est demandé à l'utilisateur
  • La manière générale dont les renseignements sont demandés à l'utilisateur
  • La manière générale dont les demandes de redéfinitions sont demandées à l'utilisateur
  • Indiquer l'optionalité d'un champ
  • La manière dont sera générée la représentation textuelle d'une énumération

Toutes ces personnalisations sont disponibles ici.

Dialogues avancés avec LUIS (Language Understanding Intelligence Service)

Laissez nous vous présenter LUIS

L'une des fonctionnalités majeures proposées par le bot s'effectue en collaboration avec LUIS (Language Understanding Intelligent Service) qui vous rend possible le traitement du langage naturel par un ordinateur.

LUIS est à l'heure actuelle dans une phase avancée de développement, et est de fait d'ores et déjà disponible pour vos développements. LUIS fournit des APIs REST afin d'interagir avec le bot, le rendant totalement agnostique au langage de programmation que vous utilisez.

La configuration et le suivi des performances de LUIS s'opèrent via son interface web sur laquelle sont détaillées un certain nombre d'informations.

Figure 5 : Interface de gestion d'une application LUIS

LUIS se base sur 3 concepts principaux :

  • Les Intents : Ils correspondent à des actions, lesquelles seront déduites via le texte
  • Les Entities : Ce sont les variables de votre modèle, c.à.d. les éléments clés d'une phase
  • Les Utterances : Les expressions et phases qui seront ingérées par LUIS

Figure 6 : Schéma haut niveau du fonctionnement de LUIS

Enfin, afin de rendre LUIS fonctionnel, vous devrez l'entrainer en amont à extraire les entités importantes. Pour cela, il suffira de rentrer des phrases type dans l'interface web, et d'identifier les entités ainsi que l'action qui en résulte. Suite à quoi, LUIS pourra être en mesure de prédire automatiquement ces informations.

Un exemple détaillé vous est proposé dans la suite de ce billet.

Intégration dans le Bot Framework

La combinaison de LUIS et du Bot Framework peut donc s'avérer être très bénéfique notamment, via cette capacité d'extraction, puis de restitution des informations pertinentes déduites directement du langage naturel.

Pour cela, le Bot Framework fournit une interface de haut niveau pour manipuler le service LUIS, en encapsulant toute l'interaction avec LUIS, vous permettant de vous concentrer uniquement sur la plus-value que vous apportera LUIS.

Le point d'entrée de LUIS dans le Bot Framework s'effectue via la classe LuisDialog et les différentes annotations liées : LuisModel, LuisIntent. Ainsi, vous pouvez dériver de la classe LuisDialog pour proposer votre implémentation spécifique, et décorer les méthodes adéquates de votre classe dérivée, afin qu'elles réagissent à une action spécifique.

Enfin, le Bot Framework expose toutes les informations reçues après un appel à LUIS via les classes LuisResult, IntentRecommendation et EntityRecommendation. Cette dernière fournit des méthodes afin de récupérer les différentes variables (Entities) extraites par votre modèle LUIS.

Nous en avons terminé avec cette seconde partie qui nous a permis d'aborder le Bot Framework et de vous en proposer, nous l'espérons, une vue d'ensemble.

Vous pouvez compléter cette vue d'ensemble avec la session suivante Building a Conversational Bot: From 0 to 60 de la conférence #Build2016. Le code associé est disponible ici sur la forge GitHub.

Dans la troisième et dernière partie de ce billet, nous allons « digérer » toutes ces informations en mettant en œuvre l'ensemble des points clés abordés jusqu'à présent sur un petit projet.