Esercizio - Indirizzare l'intenzione dell'utente
In questo esercizio si rileva la finalità dell'utente e si instrada la conversazione ai plug-in desiderati. È possibile usare un plug-in fornito per recuperare la finalità dell'utente. Iniziamo!
Aggiornare il file
Program.cs
con il codice seguente: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 questo codice si usa il prompt
GetIntent
per rilevare l'intento dell'utente. Si archivia quindi la finalità in una variabile denominataintent
. Successivamente, si invia l'intento al plug-inCurrencyConverter
.Aggiungere il codice seguente al file
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; }
Il plug-in
GetIntent
restituisce i valori seguenti: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Si usa un'istruzioneswitch
per instradare l'intento dell'utente al plugin appropriato.Se la finalità dell'utente consiste nel convertire la valuta, usare il prompt
GetTargetCurrencies
per recuperare le informazioni sulla valuta. Quindi si usa il plug-inCurrencyConverter
per convertire l'importo.Aggiungere quindi alcuni casi per gestire le altre finalità. Per il momento, utilizziamo la capacità di chiamata automatica delle funzioni del Semantic Kernel SDK per instradare l'intento ai plug-in disponibili.
Creare l'impostazione di chiamata automatica della funzione aggiungendo il codice seguente al file
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 }} );
Successivamente, si aggiungono case all'istruzione switch per le altre finalità.
Aggiornare il file
Program.cs
con il codice seguente: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 questo codice si usa l'impostazione
AutoInvokeKernelFunctions
per chiamare automaticamente le funzioni e i prompt a cui viene fatto riferimento nel kernel. Se lo scopo dell'utente è convertire la valuta, il plug-inCurrencyConverter
esegue l'attività.Se l'intento dell'utente è ottenere suggerimenti di destinazione o attività, tradurre una frase o ottenere frasi utili in una lingua, l'impostazione
AutoInvokeKernelFunctions
chiama automaticamente i plug-in esistenti inclusi nel codice del progetto.È anche possibile aggiungere codice per eseguire l'input dell'utente come richiesta al modello LLM (Large Language Model) se non rientra in nessuno di questi casi di finalità.
Aggiornare il caso predefinito con il codice seguente:
default: Console.WriteLine("Sure, I can help with that."); var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings)); Console.WriteLine(otherIntentResult); break;
Ora, se l'utente ha una finalità diversa, l'LLM può gestire la richiesta dell'utente. Proviamolo!
Controlla il tuo lavoro
In questa attività si esegue l'applicazione e si verifica che il codice funzioni correttamente.
Immettere
dotnet run
nel terminale. Quando richiesto, immettere un testo simile al prompt seguente:What would you like to do? How many TTD is 50 Qatari Riyals?
Verrà visualizzato un output simile alla risposta seguente:
$50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
Immettere
dotnet run
nel terminale. Quando richiesto, immettere un testo simile al prompt seguente:What would you like to do? I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
Verrà visualizzato un output simile alla risposta seguente:
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!
Immettere
dotnet run
nel terminale. Quando richiesto, immettere un testo simile al prompt seguente:What would you like to do? Can you give me a recipe for chicken satay?
Verrà visualizzata una risposta simile alla risposta seguente:
Sure, I can help with that. Certainly! Here's a recipe for chicken satay: ...
L'intento deve essere indirizzato al caso predefinito e l'LLM deve gestire la richiesta di una ricetta per satay di pollo, che delizia!
Nota
Se il codice non produce l'output previsto, è possibile esaminare il codice nella cartella soluzione.
Modificare quindi la logica di routing per fornire una cronologia delle conversazioni a determinati plug-in. La cronologia consente ai plug-in di recuperare risposte più pertinenti contestualmente alle richieste dell'utente.