Exercice – Créer un convertisseur de devise
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.
Créez un fichier nommé
CurrencyConverter.cs
dans le dossier Plugins/ConvertCurrency.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écorateurDescription
pour ajouter une description de ce que fait la fonction. Vous pouvez utiliserCurrency.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.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.Currencies
pour obtenir l’objetCurrency
pour la devise cible et la devis de base. Vous utilisez ensuite l’objetCurrency
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.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éthodeInvokeAsync
pour appeler votre fonction de plug-in. La méthodeInvokeAsync
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.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.
Créez un dossier nommé
GetTargetCurrencies
dans le dossier Prompts.Dans le dossier
GetTargetCurrencies
, créez un fichier nomméconfig.json
.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 } ] }
Dans le dossier
GetTargetCurrencies
, créez un fichier nomméskprompt.txt
.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.
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);
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.