Übung – Benutzerabsicht weiterleiten

Abgeschlossen

In dieser Übung erkennen Sie die Absicht des Benutzers und leiten die Unterhaltung an die gewünschten Plug-Ins weiter. Sie können ein bereitgestelltes Plug-In verwenden, um die Absicht des Benutzers abzurufen. Fangen wir an!

  1. Aktualisieren Sie Ihre Program.cs Datei mit dem folgenden Code:

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    
    

    In diesem Code verwenden Sie die GetIntent Eingabeaufforderung, um die Absicht des Benutzers zu erkennen. Anschließend speichern Sie die Absicht in einer Variablen namens intent. Als Nächstes leiten Sie die Absicht an Ihr CurrencyConverter-Plug-In weiter.

  2. Fügen Sie ihrer Program.cs-Datei den folgenden Code hinzu:

    switch (intent) {
        case "ConvertCurrency": 
            var currencyText = await kernel.InvokeAsync<string>(
                prompts["GetTargetCurrencies"], 
                new() {{ "input",  input }}
            );
            var currencyInfo = currencyText!.Split("|");
            var result = await kernel.InvokeAsync("CurrencyConverter", 
                "ConvertAmount", 
                new() {
                    {"targetCurrencyCode", currencyInfo[0]}, 
                    {"baseCurrencyCode", currencyInfo[1]},
                    {"amount", currencyInfo[2]}, 
                }
            );
            Console.WriteLine(result);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    Das GetIntent-Plug-In gibt die folgenden Werte zurück: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Sie verwenden eine switch-Anweisung, um die Absicht des Benutzers an das entsprechende Plug-In weiterzuleiten.

    Wenn der Benutzer die Währung umrechnen möchte, verwenden Sie die GetTargetCurrencies Eingabeaufforderung, um die Währungsinformationen abzurufen. Anschließend verwenden Sie das CurrencyConverter-Plug-In, um den Betrag zu konvertieren.

    Als Nächstes fügen Sie einige Fälle hinzu, um die anderen Absichten zu behandeln. Verwenden wir nun die automatische Funktionsaufruffunktion des semantischen Kernel-SDK, um die Absicht an die verfügbaren Plug-Ins weiterzuleiten.

  3. Erstellen Sie die Einstellung für den automatischen Funktionsaufruf, indem Sie der datei Program.cs den folgenden Code hinzufügen:

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    OpenAIPromptExecutionSettings settings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    

    Als Nächstes fügen Sie der Switch-Anweisung Fälle für die anderen Absichten hinzu.

  4. Aktualisieren Sie Ihre Program.cs Datei mit dem folgenden Code:

    switch (intent) {
        case "ConvertCurrency": 
            // ...Code you entered previously...
            break;
        case "SuggestDestinations":
        case "SuggestActivities":
        case "HelpfulPhrases":
        case "Translate":
            var autoInvokeResult = await kernel.InvokePromptAsync(input!, new(settings));
            Console.WriteLine(autoInvokeResult);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    In diesem Code verwenden Sie die einstellung AutoInvokeKernelFunctions, um Automatisch Funktionen und Eingabeaufforderungen aufzurufen, auf die im Kernel verwiesen wird. Wenn der Benutzer die Währung umrechnen möchte, führt das plug-In CurrencyConverter seine Aufgabe aus.

    Wenn der Benutzer Beabsichtigt ist, Ziel- oder Aktivitätsvorschläge abzurufen, einen Ausdruck zu übersetzen oder hilfreiche Ausdrücke in einer Sprache zu erhalten, ruft die einstellung AutoInvokeKernelFunctions automatisch die vorhandenen Plug-Ins auf, die im Projektcode enthalten waren.

    Sie können auch Code hinzufügen, um die Eingabe des Benutzers als Eingabeaufforderung für das große Sprachmodell (LLM) auszuführen, wenn dies in keinem dieser Absichtsfälle fällt.

  5. Aktualisieren Sie den Standardfall mit dem folgenden Code:

    default:
        Console.WriteLine("Sure, I can help with that.");
        var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings));
        Console.WriteLine(otherIntentResult);
        break;
    

    Wenn der Benutzer nun eine andere Absicht hat, kann der LLM die Anforderung des Benutzers verarbeiten. Probieren wir es aus!

Überprüfen Sie Ihre Arbeit

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

  1. Geben Sie dotnet run im Terminal ein. Wenn Sie dazu aufgefordert werden, geben Sie einen Text ein, der der folgenden Eingabeaufforderung ähnelt:

    What would you like to do?
    How many TTD is 50 Qatari Riyals?    
    
  2. Sie sollten eine Ausgabe sehen, die der folgenden Antwort ähnelt:

    $50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
    
  3. Geben Sie dotnet run im Terminal ein. Wenn Sie dazu aufgefordert werden, geben Sie einen Text ein, der der folgenden Eingabeaufforderung ähnelt:

    What would you like to do?
    I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
    
  4. Die Ausgabe sollte ähnlich wie die folgende Antwort aussehen:

    Based on your preferences for warm sunny beaches and delicious, spicy food, I have a few destination recommendations for you:
    
    1. Thailand: Known for its stunning beaches, Thailand offers a perfect combination of relaxation and adventure. You can visit popular beach destinations like Phuket, Krabi, or Koh Samui, where you'll find crystal-clear waters and white sandy shores. Thai cuisine is famous for its spiciness, so you'll have plenty of mouthwatering options to try, such as Tom Yum soup, Pad Thai, and Green Curry.
    
    2. Mexico: Mexico is renowned for its beautiful coastal regions and vibrant culture. You can explore destinations like Cancun, Playa del Carmen, or Tulum, which boast stunning beaches along the Caribbean Sea. Mexican cuisine is rich in flavors and spices, offering a wide variety of dishes like tacos, enchiladas, and mole sauces that will satisfy your craving for spicy food.
    
    ...
    
    These destinations offer a perfect blend of warm sunny beaches and delicious, spicy food, ensuring a memorable trip for you. Let me know if you need any further assistance or if you have any specific preferences for your trip!
    
  5. Geben Sie dotnet run im Terminal ein. Wenn Sie dazu aufgefordert werden, geben Sie einen Text ein, der der folgenden Eingabeaufforderung ähnelt:

    What would you like to do?
    Can you give me a recipe for chicken satay?
    
    
  6. Sie sollten eine Antwort ähnlich der folgenden Antwort sehen:

    Sure, I can help with that.
    Certainly! Here's a recipe for chicken satay:
    
    ...
    

    Die Absicht sollte an Ihren Standardfall weitergeleitet werden und das LLM sollte die Anforderung für ein Hühner-Satay-Rezept verarbeiten, das ist ja lecker!

    Anmerkung

    Wenn Ihr Code die erwartete Ausgabe nicht erzeugt, können Sie den Code im Ordner Lösung überprüfen.

Als Nächstes passen wir die Routinglogik an, um bestimmten Plugins einen Konversationsverlauf bereitzustellen. Das Bereitstellen des Verlaufs ermöglicht es den Plug-Ins, kontextbezogenere Antworten auf die Anforderungen des Benutzers abzurufen.