Exercice – Router l’intention de l’utilisateur

Effectué

Dans cet exercice, vous détectez l’intention de l’utilisateur et vous routez la conversation vers les plug-ins souhaités. Vous pouvez utiliser un plug-in fourni pour récupérer l’intention de l’utilisateur. C’est parti !

  1. Mettez à jour votre fichier Program.cs avec le code suivant :

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    
    

    Dans ce code, vous utilisez le prompt GetIntent pour détecter l’intention de l’utilisateur. Vous stockez ensuite l’intention dans une variable appelée intent. Ensuite, vous routez l’intention vers votre plug-in CurrencyConverter.

  2. Ajoutez le code suivant à votre fichier Program.cs :

    switch (intent) {
        case "ConvertCurrency": 
            var currencyText = await kernel.InvokeAsync<string>(
                prompts["GetTargetCurrencies"], 
                new() {{ "input",  input }}
            );
            var currencyInfo = currencyText!.Split("|");
            var result = await kernel.InvokeAsync("CurrencyConverter", 
                "ConvertAmount", 
                new() {
                    {"targetCurrencyCode", currencyInfo[0]}, 
                    {"baseCurrencyCode", currencyInfo[1]},
                    {"amount", currencyInfo[2]}, 
                }
            );
            Console.WriteLine(result);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    Le plug-in GetIntent retourne les valeurs suivantes : ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Vous utilisez une instruction switch pour router l’intention de l’utilisateur vers le plug-in approprié.

    Si l’intention de l’utilisateur est de convertir une devise, vous utilisez le prompt GetTargetCurrencies pour récupérer les informations sur la devise. Ensuite, vous utilisez le plug-in CurrencyConverter pour convertir le montant.

    Ensuite, vous ajoutez certains cas pour gérer les autres intentions. Pour l’instant, utilisons la capacité d’appel automatique de fonctions du Kit de développement logiciel (SDK) Noyau sémantique pour router l’intention vers les plug-ins disponibles.

  3. Créez le paramètre d’appel de fonction automatique en ajoutant le code suivant à votre fichier Program.cs :

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    OpenAIPromptExecutionSettings settings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    

    Ensuite, vous ajoutez des cas à l’instruction switch pour les autres intentions.

  4. Mettez à jour votre fichier Program.cs avec le code suivant :

    switch (intent) {
        case "ConvertCurrency": 
            // ...Code you entered previously...
            break;
        case "SuggestDestinations":
        case "SuggestActivities":
        case "HelpfulPhrases":
        case "Translate":
            var autoInvokeResult = await kernel.InvokePromptAsync(input!, new(settings));
            Console.WriteLine(autoInvokeResult);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    Dans ce code, vous utilisez le paramètre AutoInvokeKernelFunctions pour appeler automatiquement des fonctions et des prompts référencés dans votre noyau. Si l’intention de l’utilisateur est de convertir une devise, le plug-in CurrencyConverter effectue sa tâche.

    Si l’intention de l’utilisateur est d’obtenir des suggestions de destination ou d’activité, de traduire une expression ou d’obtenir des expressions utiles dans une langue, le paramètre AutoInvokeKernelFunctions appelle automatiquement les plug-ins existants qui ont inclus dans le code du projet.

    Vous pouvez également ajouter du code pour exécuter l’entrée de l’utilisateur en tant que prompt adressé au grand modèle de langage (LLM) si elle ne fait pas partie de ces cas de l’intention.

  5. Remplacez le cas par défaut par le code suivant :

    default:
        Console.WriteLine("Sure, I can help with that.");
        var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings));
        Console.WriteLine(otherIntentResult);
        break;
    

    Maintenant, si l’utilisateur a une intention différente, le LLM peut gérer la demande de l’utilisateur. Essayons-le !

Vérifier votre travail

Dans cette tâche, vous exécutez votre application et vous vérifiez que votre code fonctionne correctement.

  1. Entrez dotnet run dans le terminal. Quand vous y êtes invité, entrez un texte similaire au prompt suivant :

    What would you like to do?
    How many TTD is 50 Qatari Riyals?    
    
  2. Vous devez voir une sortie similaire à la réponse suivante :

    $50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
    
  3. Entrez dotnet run dans le terminal. Quand vous y êtes invité, entrez un texte similaire au prompt suivant :

    What would you like to do?
    I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
    
  4. Vous devez voir une sortie similaire à la réponse suivante :

    Based on your preferences for warm sunny beaches and delicious, spicy food, I have a few destination recommendations for you:
    
    1. Thailand: Known for its stunning beaches, Thailand offers a perfect combination of relaxation and adventure. You can visit popular beach destinations like Phuket, Krabi, or Koh Samui, where you'll find crystal-clear waters and white sandy shores. Thai cuisine is famous for its spiciness, so you'll have plenty of mouthwatering options to try, such as Tom Yum soup, Pad Thai, and Green Curry.
    
    2. Mexico: Mexico is renowned for its beautiful coastal regions and vibrant culture. You can explore destinations like Cancun, Playa del Carmen, or Tulum, which boast stunning beaches along the Caribbean Sea. Mexican cuisine is rich in flavors and spices, offering a wide variety of dishes like tacos, enchiladas, and mole sauces that will satisfy your craving for spicy food.
    
    ...
    
    These destinations offer a perfect blend of warm sunny beaches and delicious, spicy food, ensuring a memorable trip for you. Let me know if you need any further assistance or if you have any specific preferences for your trip!
    
  5. Entrez dotnet run dans le terminal. Quand vous y êtes invité, entrez un texte similaire au prompt suivant :

    What would you like to do?
    Can you give me a recipe for chicken satay?
    
    
  6. Vous devez voir une réponse similaire à la réponse suivante :

    Sure, I can help with that.
    Certainly! Here's a recipe for chicken satay:
    
    ...
    

    L’intention doit être routée vers votre cas par défaut et le LLM doit gérer la demande d’une recette de poulet satay, qui va être délicieuse !

    Remarque

    Si votre code ne produit pas le résultat attendu, vous pouvez passer en revue le code dans le dossier Solution.

Ensuite, nous allons modifier la logique du routage pour fournir un historique des conversations à certains plug-ins. Fournir l’historique permet aux plug-ins de récupérer des réponses aux demandes de l’utilisateur avec un contexte plus pertinent.