Exercice – Créer un convertisseur de devise

Effectué

Pour cet exercice, vous créez un plug-in qui permet à l’utilisateur de convertir des montants exprimés dans une devise en une autre devise. Comme le modèle ne peut pas accéder à Internet pour déterminer le taux de change actuel, vous devez fournir les taux de change dans votre plug-in. Pour cet exercice, vous utilisez un fichier currencies.txt existant pour fournir les taux de change.

Important

Vous devez avoir suivi les instructions de configuration de l’unité précédente, Se préparer, avant de commencer cet exercice.

Créer une fonction native

Dans cette tâche, vous créez une fonction native qui peut convertir un montant d’une devise de base en une devise cible.

  1. Créez un fichier nommé CurrencyConverter.cs dans le dossier Plugins/ConvertCurrency.

  2. Dans le fichier CurrencyConverter.cs , ajoutez le code suivant pour créer une fonction de plug-in :

    using AITravelAgent;
    
    class CurrencyConverter
    {
        [KernelFunction, 
        Description("Convert an amount from one currency to another")]
        public static string ConvertAmount()
        {
            var currencyDictionary = Currency.Currencies;
        }
    }
    

    Dans ce code, vous utilisez le décorateur KernelFunction pour déclarer votre fonction native. Vous utilisez également le décorateur Description pour ajouter une description de ce que fait la fonction. Vous pouvez utiliser Currency.Currencies pour obtenir un dictionnaire de devises et leurs taux de change. Ensuite, ajoutez la logique nécessaire pour convertir un montant donné d’une devise en une autre devise.

  3. Modifiez la fonction ConvertAmount avec le code suivant :

    [KernelFunction, Description("Convert an amount from one currency to another")]
    public static string ConvertAmount(
        [Description("The target currency code")] string targetCurrencyCode, 
        [Description("The amount to convert")] string amount, 
        [Description("The starting currency code")] string baseCurrencyCode)
    {
        var currencyDictionary = Currency.Currencies;
    
        Currency targetCurrency = currencyDictionary[targetCurrencyCode];
        Currency baseCurrency = currencyDictionary[baseCurrencyCode];
    
        if (targetCurrency == null)
        {
            return targetCurrencyCode + " was not found";
        }
        else if (baseCurrency == null)
        {
            return baseCurrencyCode + " was not found";
        }
        else
        {
            double amountInUSD = Double.Parse(amount) * baseCurrency.USDPerUnit;
            double result = amountInUSD * targetCurrency.UnitsPerUSD;
            return @$"${amount} {baseCurrencyCode} is approximately 
                {result.ToString("C")} in {targetCurrency.Name}s ({targetCurrencyCode})";
        }
    }
    

    Dans ce code, vous utilisez le dictionnaire Currency.Currenciespour obtenir l’objet Currency pour la devise cible et la devis de base. Vous utilisez ensuite l’objet Currency pour convertir le montant de la devise de base en devise cible. Enfin, vous retournez une chaîne avec le montant converti. Testons ensuite votre plug-in.

    Remarque

    Quand vous utilisez le Kit de développement logiciel (SDK) Noyau sémantique dans vos propres projets, vous n’avez pas besoin de coder en dur les données dans des fichiers si vous avez accès aux API RESTful. Au lieu de cela, vous pouvez utiliser le plug-in Plugins.Core.HttpClient pour récupérer des données auprès des API.

  4. Dans le fichier Program.cs, importez et appelez votre nouvelle fonction de plug-in avec le code suivant :

    kernel.ImportPluginFromType<CurrencyConverter>();
    kernel.ImportPluginFromType<ConversationSummaryPlugin>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    var result = await kernel.InvokeAsync("CurrencyConverter", 
        "ConvertAmount", 
        new() {
            {"targetCurrencyCode", "USD"}, 
            {"amount", "52000"}, 
            {"baseCurrencyCode", "VND"}
        }
    );
    
    Console.WriteLine(result);
    

    Dans ce code, vous utilisez la méthode ImportPluginFromType pour importer votre plug-in. Ensuite, vous utilisez la méthode InvokeAsync pour appeler votre fonction de plug-in. La méthode InvokeAsync prend le nom du plug-in, le nom de la fonction et un dictionnaire de paramètres. Enfin, vous affichez le résultat dans la console. Ensuite, exécutez le code pour vérifier qu’il fonctionne.

  5. Dans le terminal, entrez dotnet run. Vous devez normalement voir la sortie suivante.

    $52000 VND is approximately $2.13 in US Dollars (USD)
    

    Maintenant que votre plug-in fonctionne correctement, nous allons créer un prompt en langage naturel qui peut détecter les devises et le montant que l’utilisateur veut convertir.

Créer une invite

Dans cette tâche, vous créez un prompt qui analyse l’entrée de l’utilisateur pour identifier la devise cible, la devise de base et le montant à convertir.

  1. Créez un dossier nommé GetTargetCurrencies dans le dossier Prompts.

  2. Dans le dossier GetTargetCurrencies, créez un fichier nommé config.json.

  3. Entrez le texte suivant dans le fichier config.json :

    {
        "schema": 1,
        "type": "completion",
        "description": "Identify the target currency, base currency, and amount to convert",
        "execution_settings": {
            "default": {
                "max_tokens": 800,
                "temperature": 0
            }
        },
        "input_variables": [
            {
                "name": "input",
                "description": "Text describing some currency amount to convert",
                "required": true
            }
        ]
    }
    
  4. Dans le dossier GetTargetCurrencies, créez un fichier nommé skprompt.txt.

  5. Entrez le texte suivant dans le fichier skprompt.txt :

    <message role="system">Identify the target currency, base currency, and 
    amount from the user's input in the format target|base|amount</message>
    
    For example: 
    
    <message role="user">How much in GBP is 750.000 VND?</message>
    <message role="assistant">GBP|VND|750000</message>
    
    <message role="user">How much is 60 USD in New Zealand Dollars?</message>
    <message role="assistant">NZD|USD|60</message>
    
    <message role="user">How many Korean Won is 33,000 yen?</message>
    <message role="assistant">KRW|JPY|33000</message>
    
    <message role="user">{{$input}}</message>
    <message role="assistant">target|base|amount</message>
    

Vérifier votre travail

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

  1. Testez votre nouveau prompt en mettant à jour votre fichier Program.cs avec le code suivant :

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    var result = await kernel.InvokeAsync(prompts["GetTargetCurrencies"],
        new() {
            {"input", "How many Australian Dollars is 140,000 Korean Won worth?"}
        }
    );
    
    Console.WriteLine(result);
    
  2. Entrez dotnet run dans le terminal. Vous devez normalement voir la sortie suivante.

    AUD|KRW|140000
    

    Remarque

    Si votre code ne produit pas le résultat attendu, vous pouvez passer en revue le code dans le dossier Solution. Il peut être nécessaire d’ajuster le prompt dans le fichier skprompt.txt pour produire des résultats plus exacts.

Vous avez maintenant un plug-in qui peut convertir un montant d’une devise en une autre, et un prompt qui peut être utilisé pour analyser l’entrée de l’utilisateur dans un format que la fonction ConvertAmount peut utiliser. Dans l’exercice suivant, vous pouvez utiliser l’intention de l’utilisateur d’exécuter vos fonctions.