Cvičení – vytvoření převaděče měn

Dokončeno

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.

  1. Vytvořte nový soubor pojmenovaný CurrencyConverter.cs ve složce Plugins/ConvertCurrency .

  2. 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žijete Description k přidání popisu toho, co funkce dělá. Můžete použít Currency.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.

  3. 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í objektu Currency pro cílové a základní měny. Pak pomocí objektu Currency 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.

  4. 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 metodu InvokeAsync k vyvolání funkce modulu plug-in. Metoda InvokeAsync 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.

  5. 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.

  1. Vytvoření nové složky pojmenované GetTargetCurrencies ve složce Výzvy

  2. GetTargetCurrencies Ve složce vytvořte nový soubor s názvemconfig.json

  3. 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
            }
        ]
    }
    
  4. GetTargetCurrencies Ve složce vytvořte nový soubor s názvemskprompt.txt

  5. 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ě.

  1. 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);
    
  2. 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.