Ćwiczenie — kierowanie intencji użytkownika
W tym ćwiczeniu wykryjesz intencję użytkownika i przeprowadzisz konwersację do żądanych wtyczek. Aby pobrać intencję użytkownika, możesz użyć podanej wtyczki. Zaczynamy!
Program.cs
Zaktualizuj plik przy użyciu następującego kodu: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 }} );
W tym kodzie użyjesz monitu
GetIntent
, aby wykryć intencję użytkownika. Następnie należy przechowywać intencję w zmiennej o nazwieintent
. Następnie należy kierować intencję do wtyczkiCurrencyConverter
.Dodaj następujący kod do pliku
Program.cs
: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; }
Wtyczka
GetIntent
zwraca następujące wartości: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Instrukcja służyswitch
do kierowania intencji użytkownika do odpowiedniej wtyczki.Jeśli intencją użytkownika jest przekonwertowanie waluty, użyj monitu
GetTargetCurrencies
, aby pobrać informacje o walucie. Następnie użyjeszCurrencyConverter
wtyczki, aby przekonwertować kwotę.Następnie dodasz kilka przypadków, aby obsłużyć inne intencje. Na razie użyjemy funkcji automatycznej funkcji wywołującej zestaw SDK jądra semantycznego, aby kierować intencję do dostępnych wtyczek.
Utwórz ustawienie automatycznego wywoływania funkcji, dodając następujący kod do
Program.cs
pliku: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 }} );
Następnie dodasz przypadki do instrukcji switch dla innych intencji.
Program.cs
Zaktualizuj plik przy użyciu następującego kodu: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; }
W tym kodzie używasz
AutoInvokeKernelFunctions
tego ustawienia do automatycznego wywoływania funkcji i monitów, do których odwołuje się jądro. Jeśli intencją użytkownika jest konwersja waluty,CurrencyConverter
wtyczka wykonuje swoje zadanie.Jeśli celem użytkownika jest uzyskanie sugestii dotyczących miejsca docelowego lub działania, tłumaczenie frazy lub uzyskiwanie przydatnych fraz w języku,
AutoInvokeKernelFunctions
ustawienie automatycznie wywołuje istniejące wtyczki uwzględnione w kodzie projektu.Możesz również dodać kod w celu uruchomienia danych wejściowych użytkownika jako monitu do dużego modelu językowego (LLM), jeśli nie mieści się w żadnym z tych przypadków intencji.
Zaktualizuj przypadek domyślny przy użyciu następującego kodu:
default: Console.WriteLine("Sure, I can help with that."); var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings)); Console.WriteLine(otherIntentResult); break;
Teraz, jeśli użytkownik ma inną intencję, usługa LLM może obsłużyć żądanie użytkownika. Wypróbujmy to!
Sprawdź swoją pracę
W tym zadaniu uruchomisz aplikację i sprawdzisz, czy kod działa poprawnie.
Wprowadź w terminalu polecenie
dotnet run
. Po wyświetleniu monitu wprowadź tekst podobny do następującego:What would you like to do? How many TTD is 50 Qatari Riyals?
Powinny zostać wyświetlone dane wyjściowe podobne do następującej odpowiedzi:
$50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
Wprowadź w terminalu polecenie
dotnet run
. Po wyświetleniu monitu wprowadź tekst podobny do następującego:What would you like to do? I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
Powinny zostać wyświetlone dane wyjściowe podobne do następującej odpowiedzi:
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!
Wprowadź w terminalu polecenie
dotnet run
. Po wyświetleniu monitu wprowadź tekst podobny do następującego:What would you like to do? Can you give me a recipe for chicken satay?
Powinna zostać wyświetlona odpowiedź podobna do następującej:
Sure, I can help with that. Certainly! Here's a recipe for chicken satay: ...
Intencja powinna być kierowana do domyślnego przypadku, a LLM powinien obsługiwać wniosek o przepis satay kurczaka, jak pyszne!
Uwaga
Jeśli kod nie generuje oczekiwanych danych wyjściowych, możesz przejrzeć kod w folderze Rozwiązanie .
Następnie zmodyfikujmy logikę routingu, aby zapewnić pewną historię konwersacji niektórym wtyczkom. Zapewnianie historii umożliwia wtyczkom pobieranie bardziej kontekstowych odpowiedzi na żądania użytkownika.