Övning – Skapa en valutakonverterare

Slutförd

I den här övningen skapar du ett plugin-program som gör att användaren kan konvertera valutabelopp från en valuta till en annan. Eftersom modellen inte kan komma åt Internet för att fastställa den aktuella växelkursen måste du ange växelkurserna i plugin-programmet. I den här övningen använder du en befintlig currencies.txt-fil för att ange växelkurserna.

Viktigt!

Du måste slutföra installationsanvisningarna i föregående lektion, Förbered, innan du påbörjar den här övningen.

Skapa en intern funktion

I den här uppgiften skapar du en intern funktion som kan konvertera ett belopp från en basvaluta till en målvaluta.

  1. Skapa en ny fil med namnet CurrencyConverter.cs i mappen Plugins/ConvertCurrency

  2. CurrencyConverter.cs I filen lägger du till följande kod för att skapa en plugin-funktion:

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

    I den här koden använder du dekoratören KernelFunction för att deklarera din interna funktion. Du använder också dekoratören Description för att lägga till en beskrivning av vad funktionen gör. Du kan använda Currency.Currencies för att hämta en ordlista över valutor och deras växelkurser. Lägg sedan till viss logik för att konvertera ett visst belopp från en valuta till en annan.

  3. Ändra funktionen ConvertAmount med följande kod:

    [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})";
        }
    }
    

    I den här koden använder Currency.Currencies du ordlistan för att hämta Currency objektet för mål- och basvaluterna. Sedan använder Currency du objektet för att konvertera beloppet från basvalutan till målvalutan. Slutligen returnerar du en sträng med det konverterade beloppet. Nu ska vi testa plugin-programmet.

    Kommentar

    När du använder Semantic Kernel SDK i dina egna projekt behöver du inte hårdkoda data i filer om du har åtkomst till RESTful-API:er. I stället kan du använda plugin-programmet Plugins.Core.HttpClient för att hämta data från API:er.

  4. Program.cs I filen importerar och anropar du den nya plugin-funktionen med följande kod:

    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);
    

    I den här koden använder ImportPluginFromType du metoden för att importera plugin-programmet. Sedan använder InvokeAsync du metoden för att anropa plugin-funktionen. Metoden InvokeAsync tar plugin-namnet, funktionsnamnet och en ordlista med parametrar. Slutligen skriver du ut resultatet till konsolen. Kör sedan koden för att se till att den fungerar.

  5. Ange dotnet run i terminalen. Du bör se följande utdata:

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

    Nu när plugin-programmet fungerar som det ska ska vi skapa en fråga på naturligt språk som kan identifiera vilka valutor och belopp som användaren vill konvertera.

Skapa en uppmaning

I den här uppgiften skapar du en uppmaning som parsar användarens indata för att identifiera målvalutan, basvalutan och mängden som ska konverteras.

  1. Skapa en ny mapp med namnet GetTargetCurrencies i mappen Prompts

  2. Skapa en ny fil med GetTargetCurrencies namnet i mappen config.json

  3. Ange följande text i config.json filen:

    {
        "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. Skapa en ny fil med GetTargetCurrencies namnet i mappen skprompt.txt

  5. Ange följande text i skprompt.txt filen:

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

Kontrollera ditt arbete

I den här uppgiften kör du programmet och kontrollerar att koden fungerar korrekt.

  1. Testa den nya uppmaningen genom att uppdatera Program.cs filen med följande kod:

    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. Ange dotnet run i terminalen. Du bör se följande utdata:

    AUD|KRW|140000
    

    Kommentar

    Om koden inte ger utdata som du förväntade dig kan du granska koden i mappen Lösning . Du kan behöva justera kommandotolken i skprompt.txt-filen för att få mer exakta resultat.

Nu har du ett plugin-program som kan konvertera ett belopp från en valuta till en annan och en uppmaning som kan användas för att parsa användarens indata till ett format ConvertAmount som funktionen kan använda. I nästa övning kan du använda användarens avsikt för att köra dina funktioner.