Oefening: een valutaconversieprogramma maken

Voltooid

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.

  1. Maak een nieuw bestand met de naam CurrencyConverter.cs in de map Plugins/ConvertCurrency

  2. Voeg 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 de Description decorator om een beschrijving toe te voegen van wat de functie doet. U kunt een Currency.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.

  3. 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 het Currency object op te halen voor de doel- en basisvaluta. Vervolgens gebruikt u het Currency 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.

  4. 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 uw InvokeAsync invoegtoepassingsfunctie aan te roepen. De InvokeAsync 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.

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

  1. Een nieuwe map maken met de naam GetTargetCurrencies in de map Prompts

  2. Maak in de map een nieuw bestand met de GetTargetCurrencies naam config.json

  3. 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
            }
        ]
    }
    
  4. Maak in de map een nieuw bestand met de GetTargetCurrencies naam skprompt.txt

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

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