Übung – Erstellen eines Währungskonverters
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.
Erstellen einer neuen Datei namens
CurrencyConverter.cs
im Plugins/ConvertCurrency-OrdnerFü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 denDescription
-Decorator, um eine Beschreibung der Funktion hinzuzufügen. Sie könnenCurrency.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.Ä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 dieCurrency
-Ziel- und Basiswährungen abzurufen. Anschließend verwenden Sie dasCurrency
-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.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 dieInvokeAsync
-Methode, um Ihre Plug-In-Funktion aufzurufen. DieInvokeAsync
-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.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.
Erstellen eines neuen Ordners namens
GetTargetCurrencies
im Ordner EingabeaufforderungErstellen Sie im Ordner
GetTargetCurrencies
eine neue Datei namensconfig.json
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 } ] }
Erstellen Sie im Ordner
GetTargetCurrencies
eine neue Datei namensskprompt.txt
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.
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);
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.