Упражнение. Маршрутизация намерения пользователя
В этом упражнении вы обнаружите намерение пользователя и перенаправите беседу на нужные подключаемые модули. Вы можете использовать предоставленный подключаемый модуль для получения намерения пользователя. Приступим.
Обновите
Program.cs
файл с помощью следующего кода: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 }} );
В этом коде вы используете
GetIntent
запрос для обнаружения намерения пользователя. Затем вы сохраняете намерение в переменной с именемintent
. Затем вы перенаправите намерение в подключаемыйCurrencyConverter
модуль.Добавьте в файл
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; }
Подключаемый
GetIntent
модуль возвращает следующие значения: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Вы используете инструкциюswitch
для маршрутизации намерения пользователя в соответствующий подключаемый модуль.Если пользователь намерен преобразовать валюту, используйте
GetTargetCurrencies
запрос на получение сведений о валюте. Затем вы используете подключаемыйCurrencyConverter
модуль для преобразования суммы.Затем вы добавите некоторые случаи для обработки других намерений. Теперь давайте будем использовать функцию автоматического вызова функции пакета SDK для семантического ядра для маршрутизации намерения в доступные подключаемые модули.
Создайте параметр автоматической функции, добавив в файл следующий код
Program.cs
: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 }} );
Затем вы добавите случаи в инструкцию switch для других намерений.
Обновите
Program.cs
файл с помощью следующего кода: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; }
В этом коде
AutoInvokeKernelFunctions
используется параметр для автоматического вызова функций и запросов, на которые ссылается ядро. Если пользователь намерен преобразовать валюту,CurrencyConverter
подключаемый модуль выполняет свою задачу.Если цель пользователя — получить предложения назначения или действия, перевести фразу или получить полезные фразы на языке,
AutoInvokeKernelFunctions
параметр автоматически вызывает существующие подключаемые модули, включенные в код проекта.Вы также можете добавить код для выполнения входных данных пользователя в виде запроса на большую языковую модель (LLM), если он не попадает в любой из этих случаев намерения.
Обновите вариант по умолчанию следующим кодом:
default: Console.WriteLine("Sure, I can help with that."); var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings)); Console.WriteLine(otherIntentResult); break;
Теперь, если пользователь имеет другое намерение, LLM может обрабатывать запрос пользователя. Давайте попробуем!
Проверьте свою работу
В этой задаче вы запустите приложение и убедитесь, что код работает правильно.
Введите в терминале
dotnet run
. При появлении запроса введите текст, аналогичный следующему запросу:What would you like to do? How many TTD is 50 Qatari Riyals?
Вы должны увидеть выходные данные, аналогичные следующему ответу:
$50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
Введите в терминале
dotnet run
. При появлении запроса введите текст, аналогичный следующему запросу:What would you like to do? I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
Вы должны увидеть выходные данные, аналогичные следующему ответу:
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!
Введите в терминале
dotnet run
. При появлении запроса введите текст, аналогичный следующему запросу:What would you like to do? Can you give me a recipe for chicken satay?
Вы увидите ответ, аналогичный следующему ответу:
Sure, I can help with that. Certainly! Here's a recipe for chicken satay: ...
Намерение должно быть перенаправлено в ваш случай по умолчанию, и LLM должен обрабатывать запрос на куриный рецепт satay, насколько вкусным!
Примечание.
Если ваш код не создает ожидаемые выходные данные, можно просмотреть код в папке решения .
Затем давайте изменим логику маршрутизации, чтобы предоставить журнал бесед определенным подключаемым модулям. Предоставление журнала позволяет подключаемым модулям получать более контекстно релевантные ответы на запросы пользователя.