Ajouter la compréhension du langage naturel à votre bot

S’APPLIQUE À : Kit de développement logiciel (SDK) v4

La capacité à comprendre ce que veut dire votre utilisateur du point de vue de la conversation et du contexte peut être une tâche difficile, mais peut donner à votre bot un sens de la conversation plus naturel. Le service de compréhension langagière, appelé Language Understanding (LUIS) , est un service d’API cloud qui vous permet justement de faire cela ; votre bot peut ainsi reconnaître l’intention des messages de l’utilisateur, prendre en charge un langage plus naturel de l’utilisateur et mieux orienter le flux de la conversation.

Cette rubrique vous guide dans l’ajout de LUIS à une application de réservation de vol pour reconnaître les différentes intentions et entités contenues dans les entrées utilisateur.

Prérequis

À propos de cet exemple

Cet exemple de bot de base montre l’exemple d’une application de réservation de vols d’un aéroport. Elle utilise un service LUIS pour reconnaître les entrées utilisateur et retourner les premières intentions LUIS reconnues.

Le modèle de langage contient trois intentions : Book Flight, Cancel et None. LUIS va utiliser ces intentions pour comprendre ce que l’utilisateur voulait dire lorsqu’il a envoyé un message au bot. Le modèle de langage définit également des entités que LUIS peut extraire de l’entrée de l’utilisateur, notamment l’aéroport d’origine ou de destination.

Après chaque traitement d’entrée utilisateur, DialogBot enregistre l’état actuel de UserState et de ConversationState. Lorsque toutes les informations nécessaires sont réunies, l’exemple de code crée une réservation de vol de démonstration. Dans cet article, nous allons aborder les aspects LUIS de cet exemple. Toutefois, le flux général de l’exemple est présenté ci-dessous :

  • OnMembersAddedAsync est appelé lorsqu’un nouvel utilisateur est connecté et affiche une carte de bienvenue.
  • OnMessageActivityAsync est appelé pour chaque entrée d’utilisateur reçue.

LUIS sample logic flow

Le module OnMessageActivityAsync exécute le dialogue approprié par le biais de la méthode d’extension de dialogue Run. Ensuite, la boîte de dialogue principale appelle l’assistance LUIS pour trouver l’intention de l’utilisateur de score le plus élevé. Si la meilleure intention pour l’entrée de l’utilisateur retourne « BookFlight », l’assistance remplit les informations de l’utilisateur retournées par LUIS. Après cela, le dialogue principal démarre BookingDialog, qui obtient des informations supplémentaires selon les besoins de l’utilisateur, par exemple :

  • Origin la ville d’origine
  • TravelDate la date de réservation du vol
  • Destination la ville de destination

Cet article explique comment ajouter LUIS à un bot. Pour plus d’informations sur l’utilisation de dialogues ou de l’état, consultez le guide pratique pour collecter les entrées utilisateur avec une invite de dialogue ou enregistrer les données d’utilisateur et de conversation, respectivement.

Créer une application LUIS dans le portail LUIS

  1. Connectez-vous au portail LUIS et, si nécessaire, créez un compte et uneressource de création.

  2. Dans la page Applications de conversation dans LUIS, sélectionnez la flèche vers le bas à droite de la nouvelle application , puis sélectionnez Importer en tant que JSON.

    Create a new LUIS app

  3. Dans la boîte de dialogue Importer une nouvelle application :

    1. Sélectionnez le fichier FlightBooking.json dans le dossier CognitiveModels de l’exemple.
    2. Entrez FlightBooking le nom facultatif de l’application, puis sélectionnez Terminé.
  4. Vous pouvez être invité à mettre à niveau vos entités composites. Vous pouvez ignorer cela et sélectionner Me rappeler plus tard :

    ignore-composite-entities

  5. Entraînez et publiez votre application dans l’environnement de production . Pour plus d’informations, consultez la documentation LUIS sur l’apprentissage et la publication d’une application.

Pourquoi utiliser des entités

Les entités LUIS permettent à votre bot de comprendre les événements au-delà des intentions standard. Cela vous permet de collecter des informations supplémentaires auprès des utilisateurs qui peuvent vous permettre de diffuser en continu vos questions et de répondre plus intelligemment. En plus des définitions des trois intentions LUIS « Réserver le vol », « Annuler » et « Aucune », le fichier FlightBooking.json contient un ensemble d’entités, telles que « From.Airport » et « To.Airport ». Ces entités permettent à LUIS de détecter et de retourner des informations supplémentaires contenues dans l’entrée d’origine de l’utilisateur, lorsque celui-ci fait une nouvelle demande de réservation de voyage.

Obtenir les valeurs de connexion à votre application LUIS

Une fois votre application LUIS publiée, vous pouvez y accéder à partir de votre bot. Vous devrez enregistrer plusieurs valeurs pour accéder à votre application LUIS à partir de votre bot. Vous pouvez récupérer ces informations à l’aide du portail LUIS.

Récupérer des informations sur l’application à partir du portail LUIS.ai

Le fichier de paramètres (appsettings.json, .env ou config.py) agit comme lieu de rassemblement pour toutes les références de service. Les informations que vous récupérez sont ajoutées à ce fichier dans la section suivante.

  1. Sélectionnez votre application LUIS publiée à partir du portail luis.ai.

  2. Ouvrez votre application LUIS publiée, et sélectionnez l’onglet MANAGE (Gérer).

  3. Sélectionnez l’onglet Paramètres sur le côté gauche et enregistrez la valeur affichée pour l’ID d’application comme <YOUR_APP_ID>.

    Manage LUIS application information

  4. Sélectionnez l’onglet Azure Resources (Ressources Azure) à gauche, puis sélectionnez le groupe Authoring Resource (Ressource de création). Enregistrez la valeur indiquée pour Location en tant que YOUR_REGION> et Clé primaire en tant que <<YOUR_AUTHORING_KEY>.

    Manage LUIS authoring information

Mettre à jour le fichier de paramètres

Ajoutez les informations requises pour accéder à votre application LUIS, notamment l’ID d’application, la clé de création et la région dans le appsettings.json fichier. Il s’agit des valeurs que vous avez enregistrées précédemment à partir de votre application LUIS publiée. Notez que le nom d’hôte d’API doit être au format <your region>.api.cognitive.microsoft.com.

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",

Configurer votre bot pour qu’il utilise votre application LUIS

Vérifiez que le package NuGet Microsoft.Bot.Builder.AI.Luis est installé pour votre projet.

Pour vous connecter au service LUIS, le bot tire (pull) du fichier appsetting.json les informations que vous avez ajoutées précédemment. La classe FlightBookingRecognizer contient le code avec vos paramètres à partir du fichier appsetting.json et interroge le service LUIS en appelant la méthode RecognizeAsync.

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

Le FlightBookingEx.cs contient la logique d’extraction De, À et la TravelDate ; ii étend la classe partielle FlightBooking.cs utilisée pour stocker les résultats de LUIS lors de l’appel de FlightBookingRecognizer.RecognizeAsync<FlightBooking> à partir de la MainDialog.cs.

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

LUIS est à présent configuré et connecté pour votre bot.

Tester le bot

Téléchargez et installez la dernière version de Bot Framework Emulator.

  1. Exécutez l’exemple en local sur votre machine. Si vous avez besoin d’instructions, reportez-vous au README fichier de l’exemple C#, de l’exemple JS ou de l’exemple Python.

  2. Dans l’émulateur, tapez un message tel que « voyage à paris » ou « aller de paris à berlin ». Utilisez n’importe quel énoncé trouvé dans le fichier FlightBooking.json pour l’apprentissage de l’intention « Réserver un vol ».

LUIS booking input

Si la meilleure intention retournée à partir de LUIS correspond à « Réserver un vol », votre bot pose des questions supplémentaires jusqu’à ce qu’il possède suffisamment de renseignements stockés pour créer une réservation de voyage. À ce stade, il retourne ces informations de réservation à votre utilisateur.

LUIS booking result

À partir d’ici, la logique du code de bot est réinitialisée et vous pouvez continuer à créer d’autres réservations.

Informations supplémentaires

Pour plus d’informations sur LUIS, consultez sa documentation :

Notes

Différentes parties du Kit de développement logiciel (SDK) définissent des classes d’entités ou des éléments distincts. Pour les entités de message, consultez Entités et types d’activité.

Étapes suivantes