Esercizio - Salvataggio di prompt nei file
Si supponga di voler suggerire destinazioni di viaggio e consigliare attività per un utente. In questo esercizio, ci si esercita a creare i prompt e a salvarli nei file. È ora di iniziare.
Aprire il progetto di Visual Studio Code creato nell'esercizio precedente.
Nel file Program.cs rimuovere le variabili
prompt
einput
create nell'esercizio precedente in modo da lasciare il codice seguente:using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Plugins.Core; var builder = Kernel.CreateBuilder(); builder.AddAzureOpenAIChatCompletion( "your-deployment-name", "your-endpoint", "your-api-key", "deployment-model"); var kernel = builder.Build();
Verificare che nel progetto siano presenti le cartelle seguenti:
- 'Prompts'
- 'Prompts/TravelPlugins'
- 'Prompts/TravelPlugins/SuggestDestinations'
- 'Prompts/TravelPlugins/GetDestination'
- 'Prompts/TravelPlugins/SuggestActivities'
Queste directory consentono di organizzare le richieste. Si crea prima di tutto un prompt che identifica la destinazione verso la quale l'utente vuole viaggiare. Per creare il prompt, è necessario creare i file config.json e skprompt.txt. È ora di iniziare.
Nella cartella GetDestination aprire il file config.json e immettere il codice seguente:
{ "schema": 1, "type": "completion", "description": "Identify the destination of the user's travel plans", "execution_settings": { "default": { "max_tokens": 1200, "temperature": 0 } }, "input_variables": [ { "name": "input", "description": "Text from the user that contains their travel destination", "required": true } ] }
Questa configurazione indica al kernel le operazioni eseguite dal prompt e le variabili di input da accettare. Specificare quindi il testo del prompt nel file skprompt.txt.
Nella cartella GetDestination aprire il file skprompt.txt e immettere il testo seguente:
<message role="system"> Instructions: Identify the destination the user wants to travel to. </message> <message role="user"> I am so excited to take time off work! My partner and I are thinking about going to Santorini in Greece! I absolutely LOVE Greek food, I can't wait to be some place warm. </message> <message role="assistant">Santorini, Greece</message> <message role="user">{{$input}}</message>
Questo prompt consente al modello linguistico di grandi dimensioni (LLM) di filtrare l'input dell'utente e di recuperare solo la destinazione dal testo.
Nella cartella SuggestDestinations aprire il file config.json e immettere il testo seguente:
{ "schema": 1, "type": "completion", "description": "Recommend travel destinations to the user", "execution_settings": { "default": { "max_tokens": 1200, "temperature": 0.3 } }, "input_variables": [ { "name": "input", "description": "Details about the user's travel plans", "required": true } ] }
In questa configurazione, è possibile aumentare leggermente la temperatura per rendere l'output più creativo.
Nella cartella SuggestDestinations aprire il file skprompt.txt e immettere il testo seguente:
The following is a conversation with an AI travel assistant. The assistant is helpful, creative, and very friendly. <message role="user">Can you give me some travel destination suggestions?</message> <message role="assistant">Of course! Do you have a budget or any specific activities in mind?</message> <message role="user">${input}</message>
Questo prompt suggerisce le destinazioni di viaggio all'utente in base all'input. A questo punto viene creato un plug-in per consigliare le attività nella destinazione.
Nella cartella SuggestActivities aprire il file config.json e immettere il testo seguente:
{ "schema": 1, "type": "completion", "description": "Recommend activities at a travel destination to the user", "execution_settings": { "default": { "max_tokens": 4000, "temperature": 0.3 } }, "input_variables": [ { "name": "history", "description": "Background information about the user", "required": true }, { "name": "destination", "description": "The user's travel destination", "required": true } ] }
In questa configurazione, si aumenta il
max_tokens
per consentire una maggiore quantità di testo per la cronologia e il testo generato.Nella cartella SuggestActivities aprire il file skprompt.txt e immettere il testo seguente:
You are a travel assistant. You are helpful, creative, and very friendly. Consider your previous conversation with the traveler: {{$history}} The traveler would like some activity recommendations, things to do, and points of interest for their trip. They want to go to {{$destination}}. Please provide them with a list of things they might like to do at their chosen destination.
A questo punto è possibile importare e testare i nuovi prompt.
Aggiornare il file Program.cs con il codice seguente:
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Plugins.Core; using Microsoft.SemanticKernel.ChatCompletion; var builder = Kernel.CreateBuilder(); builder.AddAzureOpenAIChatCompletion( "your-deployment-name", "your-endpoint", "your-api-key", "deployment-model"); var kernel = builder.Build(); kernel.ImportPluginFromType<ConversationSummaryPlugin>(); var prompts = kernel.ImportPluginFromPromptDirectory("Prompts/TravelPlugins"); ChatHistory history = []; string input = @"I'm planning an anniversary trip with my spouse. We like hiking, mountains, and beaches. Our travel budget is $15000"; var result = await kernel.InvokeAsync<string>(prompts["SuggestDestinations"], new() {{ "input", input }}); Console.WriteLine(result); history.AddUserMessage(input); history.AddAssistantMessage(result);
In questo codice si importano i plug-in creati. Si usa anche un oggetto
ChatHistory
per archiviare la conversazione dell'utente. Infine, si passano alcune informazioni al promptSuggestDestinations
e si registrano i risultati. Si chiede quindi all'utente dove vuole andare, in modo da potergli consigliare alcune attività.Aggiungere il codice seguente al file Program.cs:
Console.WriteLine("Where would you like to go?"); input = Console.ReadLine(); result = await kernel.InvokeAsync<string>(prompts["SuggestActivities"], new() { { "history", history }, { "destination", input }, } ); Console.WriteLine(result);
In questo codice, si ottengono alcuni input dall'utente per scoprire dove vuole andare. Chiamare quindi il prompt
SuggestActivities
con la destinazione e la cronologia delle conversazioni.Per testare il codice, immettere
dotnet run
nel terminale.L'output finale potrebbe essere simile al seguente:
Absolutely! Japan is a wonderful destination with so much to see and do. Here are some recommendations for activities and points of interest: 1. Visit Tokyo Tower: This iconic tower offers stunning views of the city and is a must-visit attraction. 2. Explore the temples of Kyoto: Kyoto is home to many beautiful temples, including the famous Kiyomizu-dera and Fushimi Inari-taisha. 3. Experience traditional Japanese culture: Attend a tea ceremony, try on a kimono, or take a calligraphy class to immerse yourself in Japanese culture.
A questo punto si è creato l'inizio di un assistente di viaggio con intelligenza artificiale! Provare a modificare l'input per vedere come risponde l’LLM.