Exercício - Encaminhar a intenção do usuário
Neste exercício, você deteta a intenção do usuário e encaminha a conversa para os plug-ins desejados. Você pode usar um plugin fornecido para recuperar a intenção do usuário. Vamos começar!
Atualize seu
Program.cs
arquivo com o seguinte código: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 }} );
Neste código, você usa o
GetIntent
prompt para detetar a intenção do usuário. Em seguida, armazene a intenção em uma variável chamadaintent
. Em seguida, você encaminha a intenção para o seuCurrencyConverter
plugin.Adicione o seguinte código ao seu
Program.cs
ficheiro: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; }
O
GetIntent
plugin retorna os seguintes valores: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Você usa umaswitch
instrução para rotear a intenção do usuário para o plug-in apropriado.Se a intenção do usuário for converter moeda, use o
GetTargetCurrencies
prompt para recuperar as informações de moeda. Em seguida, você usa oCurrencyConverter
plugin para converter o montante.Em seguida, você adiciona alguns casos para lidar com as outras intenções. Por enquanto, vamos usar o recurso de chamada automática de função do SDK do Kernel Semântico para rotear a intenção para os plug-ins disponíveis.
Crie a configuração de chamada de função automática adicionando o seguinte código ao seu
Program.cs
arquivo: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 }} );
Em seguida, você adiciona casos à instrução switch para as outras intenções.
Atualize seu
Program.cs
arquivo com o seguinte código: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; }
Neste código, você usa a
AutoInvokeKernelFunctions
configuração para chamar automaticamente funções e prompts que são referenciados em seu kernel. Se a intenção do usuário é converter moeda, oCurrencyConverter
plugin executa sua tarefa.Se a intenção do usuário é obter sugestões de destino ou atividade, traduzir uma frase ou obter frases úteis em um idioma, a
AutoInvokeKernelFunctions
configuração chama automaticamente os plug-ins existentes que foram incluídos no código do projeto.Você também pode adicionar código para executar a entrada do usuário como um prompt para o modelo de linguagem grande (LLM) se ele não se enquadrar em nenhum desses casos de intenção.
Atualize o caso padrão com o seguinte código:
default: Console.WriteLine("Sure, I can help with that."); var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings)); Console.WriteLine(otherIntentResult); break;
Agora, se o usuário tiver uma intenção diferente, o LLM pode lidar com a solicitação do usuário. Vamos experimentar!
Verifique o seu trabalho
Nesta tarefa, você executa seu aplicativo e verifica se seu código está funcionando corretamente.
Introduza
dotnet run
no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:What would you like to do? How many TTD is 50 Qatari Riyals?
Você verá uma saída semelhante à seguinte resposta:
$50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
Introduza
dotnet run
no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:What would you like to do? I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
Você verá uma saída semelhante à seguinte resposta:
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!
Introduza
dotnet run
no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:What would you like to do? Can you give me a recipe for chicken satay?
Você verá uma resposta semelhante à seguinte:
Sure, I can help with that. Certainly! Here's a recipe for chicken satay: ...
A intenção deve ser encaminhada para o seu caso padrão e o LLM deve lidar com o pedido de uma receita de satay de frango, que delicioso!
Nota
Se o código não produzir a saída esperada, você poderá revisar o código na pasta Solução .
Em seguida, vamos modificar a lógica de roteamento para fornecer algum histórico de conversas para determinados plugins. O fornecimento de histórico permite que os plugins recuperem respostas contextualmente mais relevantes às solicitações do usuário.