Creare un'app di chat IA con .NET

Scegliere un servizio host per OpenAI

È possibile iniziare a usare OpenAI e Semantic Kernel creando una semplice applicazione di chat console .NET 8. L'applicazione verrà eseguita in locale e userà il modello gpt-3.5-turbo OpenAI. Eseguire la procedura seguente per ottenere l'accesso a OpenAI e imparare a usare il kernel semantico.

Prerequisiti

  • .NET 8.0 SDK - Installare .NET 8.0 SDK.
  • Una chiave API da OpenAI per poter eseguire questo esempio.
  • In Windows è necessario PowerShell v7+. Per convalidare la versione, eseguire pwsh in un terminale. Dovrebbe restituire la versione corrente. Se restituisce un errore, eseguire il comando seguente: dotnet tool update --global PowerShell.

È possibile iniziare a usare OpenAI e Semantic Kernel creando una semplice applicazione di chat console .NET 8. L'applicazione verrà eseguita in locale e si connetterà al modello gpt-35-turbo di OpenAI distribuito in OpenAI di Azure. Seguire questa procedura per effettuare il provisioning di OpenAI di Azure e imparare a usare Semantic Kernel.

Prerequisiti

Ottenere il progetto di esempio

Clonare il repository GitHub che contiene le app di esempio per tutte le guide introduttive:

git clone https://github.com/dotnet/ai-samples.git

Creare il servizio Azure OpenAI

Il repository GitHub di esempio è strutturato come modello dell'interfaccia della riga di comando per sviluppatori di Azure (azd), che azd può essere usato per effettuare il provisioning del servizio Azure OpenAI e del modello.

  1. Da un terminale o un prompt dei comandi passare alla directory src\quickstarts\azure-openai del repository di esempio.

  2. Eseguire il comando per effettuare il azd up provisioning delle risorse OpenAI di Azure. La creazione del Servizio Azure OpenAI e la distribuzione del modello possono richiedere alcuni minuti.

    azd up
    

    azd configura anche i segreti utente necessari per l'app di esempio, ad esempio la chiave di accesso OpenAI.

    Nota

    Se si verifica un errore durante la distribuzione di azd up, visitare la sezione di risoluzione dei problemi.

Provare l'esempio HikerAI

  1. Da un terminale o un prompt dei comandi passare alla directory openai\02-HikerAI.

  2. Usare i comandi seguenti per configurare la chiave API di OpenAI come segreto per l'app di esempio:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. Usare il comando dotnet run per eseguire l'app:

    dotnet run
    
  1. Da un terminale o un prompt dei comandi passare alla directory azure-openai\02-HikerAI.

  2. Usare il comando dotnet run per eseguire l'app:

    dotnet run
    

    Suggerimento

    Se viene visualizzato un messaggio di errore, è possibile che la distribuzione delle risorse di Azure OpenAI non sia stata completata. Attendere un paio di minuti e riprovare.

Esplorare il codice

L'app usa il pacchetto Microsoft.SemanticKernel per inviare e ricevere richieste a un Servizio OpenAI.

Il codice dell'app è contenuto nel file Program.cs. Le prime righe di codice impostano i valori di configurazione e consentono di ottenere la chiave OpenAI impostata in precedenza tramite il comando dotnet user-secrets.

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];

Il servizio OpenAIChatCompletionService facilita le richieste e le risposte.

// Create the OpenAI Chat Completion Service
OpenAIChatCompletionService service = new(model, key);

Esplorare il codice

L'applicazione usa il pacchetto Microsoft.SemanticKernel per inviare e ricevere richieste a un servizio Azure OpenAI distribuito in Azure.

L'intera applicazione è contenuta all'interno del file Program.cs. Le prime righe di codice recuperano i segreti e i valori di configurazione impostati automaticamente in dotnet user-secrets durante il provisioning dell'applicazione.

// Retrieve the local secrets saved during the Azure deployment
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

Il servizio AzureOpenAIChatCompletionService facilita le richieste e le risposte.

// Create the Azure OpenAI Chat Completion Service
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);

Aggiungere un prompt di sistema per fornire più contesto al modello, che influenza il comportamento del modello e i completamenti generati durante la conversazione.

// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area. 
    You are upbeat and friendly. You introduce yourself when first saying hello.
    When helping people out, you always ask them for this information
    to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length
    after you get that information. You will also share an interesting fact about
    the local nature on the hikes when making a recommendation.
    """);

Aggiungere un messaggio utente alla cronologia chat usando la funzione AddUserMessage. Usare la funzione GetChatMessageContentAsync per indicare al modello di generare una risposta in base al prompt di sistema e alla richiesta dell'utente.


// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");

// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

// Get response
var response = await service.GetChatMessageContentAsync(
    chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });

Aggiungere la risposta del modello per mantenere la cronologia della chat.

// Add response to chat history
chatHistory.Add(response);

// Print Response to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

Personalizzare la richiesta di sistema e il messaggio utente per verificare in che modo il modello risponde per individuare un'escursione interessante.

Pulire le risorse

Rimuovere la distribuzione corrispondente e tutte le risorse quando l'applicazione o le risorse di esempio non sono più necessarie.

azd down

Risoluzione dei problemi

In Windows è possibile che vengano visualizzati i messaggi di errore seguenti dopo l'esecuzione di azd up:

postprovision.ps1 è privo di firma digitale. Lo script non verrà eseguito nel sistema

Lo script postprovision.ps1 viene eseguito per impostare i segreti utente .NET usati nell'applicazione. Per evitare questo errore, eseguire il comando di PowerShell seguente:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Eseguire nuovamente il comando azd up.

Un altro possibile errore:

'pwsh' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch. AVVISO: hook 'postprovision' non riuscito con codice di uscita: '1', Percorso: '.\infra\post-script\postprovision.ps1'. : codice di uscita: 1 L'esecuzione continuerà perché ContinueOnError è stato impostato su true.

Lo script postprovision.ps1 viene eseguito per impostare i segreti utente .NET usati nell'applicazione. Per evitare questo errore, eseguire manualmente lo script usando il comando di PowerShell seguente:

.\infra\post-script\postprovision.ps1

A questo punto, i segreti utente nelle app .NET basate su intelligenza artificiale sono stati configurati e possono essere testati.

Passaggi successivi