Oefening: een valutaconversieprogramma maken
Voor deze oefening maakt u een invoegtoepassing waarmee de gebruiker valutabedragen van de ene valuta naar de andere kan converteren. Omdat het model geen toegang heeft tot internet om de huidige wisselkoers te bepalen, moet u de wisselkoersen in uw invoegtoepassing opgeven. Voor deze oefening gebruikt u een bestaand currencies.txt-bestand om de wisselkoersen op te geven.
Belangrijk
U moet de installatie-instructies in de vorige les voltooien, Voorbereiden voordat u met deze oefening begint.
Een systeemeigen functie maken
In deze taak maakt u een systeemeigen functie waarmee een bedrag van een basisvaluta kan worden geconverteerd naar een doelvaluta.
Maak een nieuw bestand met de naam
CurrencyConverter.cs
in de map Plugins/ConvertCurrencyVoeg in het
CurrencyConverter.cs
bestand de volgende code toe om een invoegtoepassingsfunctie te maken:using AITravelAgent; class CurrencyConverter { [KernelFunction, Description("Convert an amount from one currency to another")] public static string ConvertAmount() { var currencyDictionary = Currency.Currencies; } }
In deze code gebruikt u de
KernelFunction
decorator om uw systeemeigen functie te declareren. U gebruikt ook deDescription
decorator om een beschrijving toe te voegen van wat de functie doet. U kunt eenCurrency.Currencies
woordenlijst met valuta's en hun wisselkoersen ophalen. Voeg vervolgens een aantal logica toe om een bepaald bedrag van de ene valuta naar de andere te converteren.Wijzig uw
ConvertAmount
functie met de volgende code:[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})"; } }
In deze code gebruikt u de
Currency.Currencies
woordenlijst om hetCurrency
object op te halen voor de doel- en basisvaluta. Vervolgens gebruikt u hetCurrency
object om het bedrag van de basisvaluta te converteren naar de doelvaluta. Ten slotte retourneert u een tekenreeks met het geconverteerde bedrag. Vervolgens gaan we uw invoegtoepassing testen.Notitie
Wanneer u de Semantic Kernel SDK in uw eigen projecten gebruikt, hoeft u geen gegevens in bestanden te coderen als u toegang hebt tot RESTful-API's. In plaats daarvan kunt u de
Plugins.Core.HttpClient
invoegtoepassing gebruiken om gegevens op te halen uit API's.Importeer en roep in het
Program.cs
bestand de nieuwe invoegtoepassingsfunctie aan met de volgende code: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);
In deze code gebruikt u de
ImportPluginFromType
methode om uw invoegtoepassing te importeren. Vervolgens gebruikt u de methode om uwInvokeAsync
invoegtoepassingsfunctie aan te roepen. DeInvokeAsync
methode gebruikt de naam van de invoegtoepassing, de functienaam en een woordenlijst met parameters. Ten slotte drukt u het resultaat af op de console. Voer vervolgens de code uit om te controleren of deze werkt.Voer
dotnet run
in de terminal in. U moet de volgende uitvoer zien:$52000 VND is approximately $2.13 in US Dollars (USD)
Nu uw invoegtoepassing correct werkt, gaan we een prompt voor natuurlijke taal maken waarmee kan worden gedetecteerd welke valuta's en hoeveel de gebruiker wil converteren.
Een prompt maken
In deze taak maakt u een prompt waarmee de invoer van de gebruiker wordt geparseerd om de doelvaluta, basisvaluta en het te converteren bedrag te identificeren.
Een nieuwe map maken met de naam
GetTargetCurrencies
in de map PromptsMaak in de map een nieuw bestand met de
GetTargetCurrencies
naamconfig.json
Voer de volgende tekst in het
config.json
bestand in:{ "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 } ] }
Maak in de map een nieuw bestand met de
GetTargetCurrencies
naamskprompt.txt
Voer de volgende tekst in het
skprompt.txt
bestand in:<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>
Controleer uw werk
In deze taak voert u uw toepassing uit en controleert u of uw code correct werkt.
Test uw nieuwe prompt door het
Program.cs
bestand bij te werken met de volgende code: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);
Voer
dotnet run
in de terminal in. U moet de volgende uitvoer zien:AUD|KRW|140000
Notitie
Als uw code niet de verwachte uitvoer produceert, kunt u de code controleren in de map Oplossing . Mogelijk moet u de prompt in het skprompt.txt-bestand aanpassen om exactere resultaten te produceren.
U hebt nu een invoegtoepassing die een bedrag van de ene valuta naar de andere kan converteren en een prompt die kan worden gebruikt om de invoer van de gebruiker te parseren in een indeling die de ConvertAmount
functie kan gebruiken. In de volgende oefening kunt u de intentie van de gebruiker gebruiken om uw functies uit te voeren.