Übung – Erstellen eines Währungskonverters

Abgeschlossen

Für diese Übung erstellen Sie ein Plug-In, mit dem der Benutzer Währungsbeträge von einer Währung in eine andere konvertieren kann. Da das Modell nicht auf das Internet zugreifen kann, um den aktuellen Wechselkurs zu ermitteln, müssen Sie die Wechselkurse in Ihrem Plug-In bereitstellen. Für diese Übung verwenden Sie eine vorhandene currencies.txt-Datei, um die Wechselkurse bereitzustellen.

Wichtig

Bevor Sie mit dieser Übung beginnen, müssen Sie die Setupanweisungen in der vorhergehenden Einheit, „Vorbereiten“, ausführen.

Erstellen einer systemeigenen Funktion

In dieser Aufgabe erstellen Sie eine systemeigene Funktion, die einen Betrag aus einer Basiswährung in eine Zielwährung konvertieren kann.

  1. Erstellen einer neuen Datei namens CurrencyConverter.cs im Plugins/ConvertCurrency-Ordner

  2. Fügen Sie in der CurrencyConverter.cs-Datei den folgenden Code hinzu, um eine Plug-In-Funktion zu erstellen:

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

    In diesem Code verwenden Sie den KernelFunction-Decorator, um Ihre systemeigene Funktion zu deklarieren. Sie verwenden auch den Description-Decorator, um eine Beschreibung der Funktion hinzuzufügen. Sie können Currency.Currencies verwenden, um ein Wörterbuch mit Währungen und deren Wechselkursen zu erhalten. Fügen Sie als Nächstes eine Logik hinzu, um einen bestimmten Betrag von einer Währung in eine andere zu konvertieren.

  3. Ändern Sie Ihre ConvertAmount-Funktion mit folgendem 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 diesem Code verwenden Sie das Currency.Currencies-Wörterbuch, um das Objekt für die Currency-Ziel- und Basiswährungen abzurufen. Anschließend verwenden Sie das Currency-Objekt, um den Betrag aus der Basiswährung in die Zielwährung zu konvertieren. Schließlich geben Sie eine Zeichenfolge mit dem konvertierten Betrag zurück. Als Nächstes testen wir Ihr Plug-In.

    Hinweis

    Wenn Sie das Semantic Kernel SDK in Ihren eigenen Projekten verwenden, müssen Sie keine Daten in Dateien hartcodieren, wenn Sie Zugriff auf RESTful-APIs haben. Stattdessen können Sie das Plugins.Core.HttpClient-Plug-In verwenden, um Daten aus APIs abzurufen.

  4. Importieren und aufrufen Sie in der Program.cs-Datei die neue Plug-In-Funktion mit dem folgenden 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 diesem Code verwenden Sie die ImportPluginFromType-Methode, um Ihr Plug-In zu importieren. Anschließend verwenden Sie die InvokeAsync-Methode, um Ihre Plug-In-Funktion aufzurufen. Die InvokeAsync-Methode verwendet den Plug-In-Namen, den Funktionsnamen und ein Wörterbuch mit Parametern. Schließlich drucken Sie das Ergebnis in der Konsole. Führen Sie als Nächstes den Code aus, um sicherzustellen, dass er funktioniert.

  5. Geben Sie im Terminal dotnet run ein. Die folgende Ausgabe wird angezeigt.

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

    Nachdem Ihr Plug-In ordnungsgemäß funktioniert, erstellen wir nun eine natürliche Sprachaufforderung, die erkennen kann, welche Währungen und welchen Betrag der Benutzer konvertieren möchte.

Erstellen einer Eingabeaufforderung

In dieser Aufgabe erstellen Sie eine Eingabeaufforderung, welche die Eingabe des Benutzers analysiert, um die Zielwährung, Basiswährung und den zu konvertierenden Betrag zu identifizieren.

  1. Erstellen eines neuen Ordners namens GetTargetCurrencies im Ordner Eingabeaufforderung

  2. Erstellen Sie im Ordner GetTargetCurrencies eine neue Datei namens config.json

  3. Fügen Sie den folgenden Text in die config.json-Datei ein:

    {
        "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. Erstellen Sie im Ordner GetTargetCurrencies eine neue Datei namens skprompt.txt

  5. Fügen Sie den folgenden Text in die skprompt.txt-Datei ein:

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

Arbeit überprüfen

In dieser Aufgabe führen Sie Ihre Anwendung aus und überprüfen, ob der Code ordnungsgemäß funktioniert.

  1. Testen Sie Ihre neue Aufforderung, indem Sie die Program.cs-Datei mit dem folgenden Code aktualisieren:

    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. Geben Sie im Terminal dotnet run ein. Die folgende Ausgabe wird angezeigt.

    AUD|KRW|140000
    

    Hinweis

    Wenn Ihr Code die erwartete Ausgabe nicht erzeugt, können Sie den Code im Projektmappenordner überprüfen. Möglicherweise müssen Sie die Eingabeaufforderung in der skprompt.txt-Datei anpassen, um genauere Ergebnisse zu erzielen.

Jetzt haben Sie ein Plug-In, das einen Betrag von einer Währung in eine andere konvertieren kann, und eine Eingabeaufforderung, die verwendet werden kann, um die Eingabe des Benutzers in ein Format zu analysieren, das die ConvertAmount-Funktion verwenden kann. In der nächsten Übung können Sie die Absicht des Benutzers nutzen, um Ihre Funktionen auszuführen.