Cvičení – vytvoření převaděče měn
V tomto cvičení vytvoříte modul plug-in, který uživateli umožní převést částky měny z jedné měny na jinou. Vzhledem k tomu, že model nemůže získat přístup k internetu, abyste určili aktuální směnný kurz, musíte do modulu plug-in zadat směnné kurzy. V tomto cvičení použijete existující soubor currencies.txt k poskytnutí směnných kurzů.
Důležité
Před zahájením tohoto cvičení musíte dokončit pokyny k nastavení v předchozí lekci Příprava.
Vytvoření nativní funkce
V tomto úkolu vytvoříte nativní funkci, která může převést částku ze základní měny na cílovou měnu.
Vytvořte nový soubor pojmenovaný
CurrencyConverter.cs
ve složce Plugins/ConvertCurrency .CurrencyConverter.cs
Do souboru přidejte následující kód pro vytvoření funkce modulu plug-in:using AITravelAgent; class CurrencyConverter { [KernelFunction, Description("Convert an amount from one currency to another")] public static string ConvertAmount() { var currencyDictionary = Currency.Currencies; } }
V tomto kódu pomocí dekorátoru
KernelFunction
deklarujete svou nativní funkci. Dekorátor také použijeteDescription
k přidání popisu toho, co funkce dělá. Můžete použítCurrency.Currencies
k získání slovníku měn a jejich směnných kurzů. Dále přidejte logiku, která převede danou částku z jedné měny na jinou.Upravte funkci
ConvertAmount
následujícím kódem:[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})"; } }
V tomto kódu použijete
Currency.Currencies
slovník k získání objektuCurrency
pro cílové a základní měny. Pak pomocí objektuCurrency
převedete částku ze základní měny na cílovou měnu. Nakonec vrátíte řetězec s převedenou částkou. V dalším kroku otestujeme modul plug-in.Poznámka:
Pokud používáte sadu SDK sémantického jádra ve vlastních projektech, nemusíte data pevně zakódovat do souborů, pokud máte přístup k rozhraním RESTful API. Místo toho můžete pomocí modulu
Plugins.Core.HttpClient
plug-in načíst data z rozhraní API.Program.cs
V souboru naimportujte a vyvolejte novou funkci modulu plug-in s následujícím kódem: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);
V tomto kódu použijete metodu k importu
ImportPluginFromType
modulu plug-in. Pak použijete metoduInvokeAsync
k vyvolání funkce modulu plug-in. MetodaInvokeAsync
přebírá název modulu plug-in, název funkce a slovník parametrů. Nakonec výsledek vytisknete do konzoly. Pak spusťte kód, abyste měli jistotu, že funguje.Do terminálu zadejte
dotnet run
. Měl by se zobrazit následující výstup:$52000 VND is approximately $2.13 in US Dollars (USD)
Teď, když modul plug-in funguje správně, vytvoříme výzvu přirozeného jazyka, která dokáže zjistit, jaké měny a množství chce uživatel převést.
Vytvoření výzvy
V této úloze vytvoříte výzvu, která parsuje vstup uživatele a identifikuje cílovou měnu, základní měnu a částku, kterou chcete převést.
Vytvoření nové složky pojmenované
GetTargetCurrencies
ve složce VýzvyGetTargetCurrencies
Ve složce vytvořte nový soubor s názvemconfig.json
Do souboru zadejte následující text
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 } ] }
GetTargetCurrencies
Ve složce vytvořte nový soubor s názvemskprompt.txt
Do souboru zadejte následující text
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>
Kontrola práce
V této úloze spustíte aplikaci a ověříte, že kód funguje správně.
Otestujte novou výzvu aktualizací
Program.cs
souboru následujícím kódem: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);
Zadejte
dotnet run
v terminálu. Měl by se zobrazit následující výstup:AUD|KRW|140000
Poznámka:
Pokud váš kód nevygeneruje očekávaný výstup, můžete kód zkontrolovat ve složce Řešení . Možná budete muset upravit výzvu v souboru skprompt.txt, aby se zobrazily přesnější výsledky.
Teď máte modul plug-in, který může převést částku z jedné měny na jinou a výzvu, která se dá použít k analýze vstupu uživatele do formátu, ConvertAmount
který může funkce použít. V dalším cvičení můžete pomocí záměru uživatele spouštět funkce.