Condividi tramite


Creare un assistente di intelligenza artificiale minimo con .NET

In questa guida introduttiva si apprenderà come creare un assistente di intelligenza artificiale minimo usando le librerie OpenAI o Azure OpenAI SDK. Gli assistenti di intelligenza artificiale forniscono funzionalità agentiche per aiutare gli utenti a completare le attività usando strumenti e modelli di intelligenza artificiale. Nelle sezioni successive si apprenderà quanto segue:

  • Componenti di base e concetti degli assistenti di intelligenza artificiale
  • Come creare un assistente usando Azure OpenAI SDK
  • Come migliorare e personalizzare le funzionalità di un assistente

Prerequisiti

Componenti di base degli assistenti di intelligenza artificiale

Gli assistenti di intelligenza artificiale si basano sui thread conversazionali con un utente. L'utente invia richieste all'assistente su un thread di conversazione, che indirizza l'assistente a completare le attività usando gli strumenti disponibili. Gli assistenti possono elaborare e analizzare i dati, prendere decisioni e interagire con utenti o altri sistemi per raggiungere obiettivi specifici. La maggior parte degli assistenti include i componenti seguenti:

Componente Descrizione
Assistente Il client e la logica di intelligenza artificiale di base che usano modelli OpenAI di Azure, gestiscono i thread di conversazione e usano gli strumenti configurati.
Discussione Sessione di conversazione tra un assistente e un utente. I thread archivia i messaggi e gestiscono automaticamente il troncamento per adattare il contenuto nel contesto di un modello.
Messaggio Messaggio creato da un assistente o da un utente. I messaggi possono includere testo, immagini e altri file. I messaggi vengono archiviati come elenco nel thread.
Esegui Attivazione di un assistente per iniziare l'esecuzione in base al contenuto del thread. L'assistente usa la configurazione e i messaggi del thread per eseguire attività chiamando modelli e strumenti. Nell'ambito di un processo, l'assistente aggiunge messaggi al thread.
Esegui passaggi Elenco dettagliato dei passaggi eseguiti dall'assistente durante un'operazione. Un assistente può chiamare strumenti o creare messaggi durante l'esecuzione. L'esame dei passaggi di esecuzione consente di comprendere come l'assistente ottiene i risultati finali.

Gli assistenti possono anche essere configurati per l'uso di più strumenti in parallelo per completare le attività, tra cui:

  • strumento dell'interprete del codice: scrive ed esegue codice in un ambiente di esecuzione in modalità sandbox.
  • Funzione che chiama: esegue funzioni personalizzate locali definite nel codice.
  • capacità di ricerca di file: potenzia l'assistente con conoscenze provenienti dall'esterno del modello.

Comprendendo questi componenti di base e il modo in cui interagiscono, è possibile creare e personalizzare potenti assistenti di intelligenza artificiale per soddisfare le esigenze specifiche.

Creare l'app .NET

Completare i passaggi seguenti per creare un'app console .NET e aggiungere il pacchetto necessario per lavorare con gli assistenti:

  1. In una finestra del terminale passare a una directory vuota nel dispositivo e creare una nuova app con il comando dotnet new:

    dotnet new console -o AIAssistant
    
  2. Aggiungi il pacchetto OpenAI all'app:

    dotnet add package OpenAI
    
  3. Aprire la nuova app nell'editor preferito, ad esempio Visual Studio Code.

    code .
    
  1. In una finestra del terminale passare a una directory vuota nel dispositivo e creare una nuova app con il comando dotnet new:

    dotnet new console -o AIAssistant
    
  2. Aggiungere il pacchetto Azure.AI.OpenAI all'app:

    dotnet add package Azure.AI.OpenAI
    
  3. Aprire la nuova app nell'editor preferito, ad esempio Visual Studio Code.

    code .
    

Creare il client assistente di intelligenza artificiale

  1. Aprire il Program.cs file e sostituire il contenuto del file con il codice seguente per creare i client necessari:

    using OpenAI;
    using OpenAI.Assistants;
    using OpenAI.Files;
    using Azure.AI.OpenAI;
    using Azure.Identity;
    
    // Create the OpenAI client
    OpenAIClient openAIClient = new("your-apy-key");
    
    // For Azure OpenAI, use the following client instead:
    AzureOpenAIClient azureAIClient = new(
            new Uri("your-azure-openai-endpoint"),
            new DefaultAzureCredential());
    
    #pragma warning disable OPENAI001
    AssistantClient assistantClient = openAIClient.GetAssistantClient();
    OpenAIFileClient fileClient = openAIClient.GetOpenAIFileClient();
    
  2. Creare un documento di esempio in memoria e caricarlo nel OpenAIFileClient:

    // Create an in-memory document to upload to the file client
    using Stream document = BinaryData.FromBytes("""
        {
            "description": "This document contains the sale history data for Contoso products.",
            "sales": [
                {
                    "month": "January",
                    "by_product": {
                        "113043": 15,
                        "113045": 12,
                        "113049": 2
                    }
                },
                {
                    "month": "February",
                    "by_product": {
                        "113045": 22
                    }
                },
                {
                    "month": "March",
                    "by_product": {
                        "113045": 16,
                        "113055": 5
                    }
                }
            ]
        }
        """u8.ToArray()).ToStream();
    
    // Upload the document to the file client
    OpenAIFile salesFile = fileClient.UploadFile(
        document,
        "monthly_sales.json",
        FileUploadPurpose.Assistants);
    
  3. Abilitare le funzionalità di ricerca file e gli strumenti per l'interpretazione del codice tramite il AssistantCreationOptions:

    // Configure the assistant options
    AssistantCreationOptions assistantOptions = new()
    {
        Name = "Example: Contoso sales RAG",
        Instructions =
            "You are an assistant that looks up sales data and helps visualize the information based"
            + " on user queries. When asked to generate a graph, chart, or other visualization, use"
            + " the code interpreter tool to do so.",
        Tools =
        {
            new FileSearchToolDefinition(), // Enable the assistant to search and access files
            new CodeInterpreterToolDefinition(), // Enable the assistant to run code for data analysis
        },
        ToolResources = new()
        {
            FileSearch = new()
            {
                NewVectorStores =
                {
                    new VectorStoreCreationHelper([salesFile.Id]),
                }
            }
        },
    };
    
  4. Creare il Assistant e un thread per gestire le interazioni tra l'utente e l'assistente:

    // Create the assistant
    Assistant assistant = assistantClient.CreateAssistant("gpt-4o", assistantOptions);
    
    // Configure and create the conversation thread
    ThreadCreationOptions threadOptions = new()
    {
        InitialMessages = { "How well did product 113045 sell in February? Graph its trend over time." }
    };
    
    ThreadRun threadRun = assistantClient.CreateThreadAndRun(assistant.Id, threadOptions);
    
    // Sent the prompt and monitor progress until the thread run is complete
    do
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
        threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id);
    }
    while (!threadRun.Status.IsTerminal);
    
    // Get the messages from the thread run
    var messages = assistantClient.GetMessagesAsync(
        threadRun.ThreadId,
        new MessageCollectionOptions()
        {
            Order = MessageCollectionOrder.Ascending
        });
    
  5. Stampare i messaggi e salvare l'immagine generata dalla conversazione con l'assistente:

    // Process the messages from the assistant
    await foreach (ThreadMessage message in messages)
    {
        // Print out the messages from the assistant
        Console.Write($"[{message.Role.ToString().ToUpper()}]: ");
        foreach (MessageContent contentItem in message.Content)
        {
            if (!string.IsNullOrEmpty(contentItem.Text))
            {
                Console.WriteLine($"{contentItem.Text}");
    
                if (contentItem.TextAnnotations.Count > 0)
                {
                    Console.WriteLine();
                }
    
                // Include annotations, if any
                foreach (TextAnnotation annotation in contentItem.TextAnnotations)
                {
                    if (!string.IsNullOrEmpty(annotation.InputFileId))
                    {
                        Console.WriteLine($"* File citation, file ID: {annotation.InputFileId}");
                    }
                    if (!string.IsNullOrEmpty(annotation.OutputFileId))
                    {
                        Console.WriteLine($"* File output, new file ID: {annotation.OutputFileId}");
                    }
                }
            }
            // Save the generated image file
            if (!string.IsNullOrEmpty(contentItem.ImageFileId))
            {
                OpenAIFile imageInfo = fileClient.GetFile(contentItem.ImageFileId);
                BinaryData imageBytes = fileClient.DownloadFile(contentItem.ImageFileId);
                using FileStream stream = File.OpenWrite($"{imageInfo.Filename}.png");
                imageBytes.ToStream().CopyTo(stream);
    
                Console.WriteLine($"<image: {imageInfo.Filename}.png>");
            }
        }
        Console.WriteLine();
    }
    

    Individuare e aprire l'immagine salvata nella directory dell'app bin , simile alla seguente:

    Grafico che mostra la visualizzazione generata dal modello di intelligenza artificiale.

Passaggi successivi