Dela via


Skapa en minimal AI-assistent med hjälp av .NET

I den här snabbstarten får du lära dig hur du skapar en minimal AI-assistent med hjälp av OpenAI- eller Azure OpenAI SDK-biblioteken. AI-assistenter tillhandahåller agentiska funktioner som hjälper användarna att utföra uppgifter med hjälp av AI-verktyg och modeller. I de kommande avsnitten får du lära dig följande:

  • Grundläggande komponenter och begrepp för AI-assistenter
  • Så här skapar du en assistent med Hjälp av Azure OpenAI SDK
  • Så här förbättrar och anpassar du funktionerna i en assistent

Förutsättningar

Kärnkomponenter i AI-assistenter

AI-assistenter baseras på konversationstrådar med en användare. Användaren skickar uppmaningar till assistenten i en konversationstråd, som instruerar assistenten att utföra uppgifter med hjälp av de verktyg som den har tillgängliga. Assistenter kan bearbeta och analysera data, fatta beslut och interagera med användare eller andra system för att uppnå specifika mål. De flesta assistenter innehåller följande komponenter:

Komponent Beskrivning
Assistent Ai-kärnklienten och logiken som använder Azure OpenAI-modeller, hanterar konversationstrådar och använder konfigurerade verktyg.
Tråd En konversationssession mellan en assistent och en användare. Trådar lagrar meddelanden och hanterar automatiskt trunkering för att passa in innehåll i en modells kontext.
Meddelande Ett meddelande som skapats av en assistent eller en användare. Meddelanden kan innehålla text, bilder och andra filer. Meddelanden lagras som en lista i tråden.
Springa Aktivering av en assistent för att starta baserat på innehållet i tråden. Assistenten använder sin konfiguration och trådens meddelanden för att utföra uppgifter genom att anropa modeller och verktyg. Som en del av en process lägger assistenten till meddelanden i konversationen.
Kör steg En detaljerad lista över steg som assistenten vidtog som en del av ett genomförande. En assistent kan anropa verktyg eller skapa meddelanden under körningen. Genom att undersöka körsteg kan du förstå hur assistenten kommer till sina slutliga resultat.

Assistenter kan också konfigureras för att använda flera verktyg parallellt för att utföra uppgifter, inklusive följande:

  • kodtolkar verktyg: Skriver och kör kod i en sandboxat exekveringsmiljö.
  • Funktion som anropar: Kör lokala anpassade funktioner som du definierar i koden.
  • Filsökningsfunktioner: Utökar assistenten med kunskap utanför modellen.

Genom att förstå dessa kärnkomponenter och hur de interagerar kan du skapa och anpassa kraftfulla AI-assistenter för att uppfylla dina specifika behov.

Skapa .NET-appen

Slutför följande steg för att skapa en .NET-konsolapp och lägg till paketet som behövs för att arbeta med assistenter:

  1. I ett terminalfönster navigerar du till en tom katalog på enheten och skapar en ny app med kommandot dotnet new:

    dotnet new console -o AIAssistant
    
  2. Lägg till OpenAI--paketet i din app:

    dotnet add package OpenAI --prerelease
    
  3. Öppna den nya appen i valfri redigerare, till exempel Visual Studio Code.

    code .
    
  1. I ett terminalfönster navigerar du till en tom katalog på enheten och skapar en ny app med kommandot dotnet new:

    dotnet new console -o AIAssistant
    
  2. Lägg till Azure.AI.OpenAI--paketet i din app:

    dotnet add package Azure.AI.OpenAI --prerelease
    
  3. Öppna den nya appen i valfri redigerare, till exempel Visual Studio Code.

    code .
    

Skapa AI-assistentklienten

  1. Program.cs Öppna filen och ersätt innehållet i filen med följande kod för att skapa de klienter som krävs:

    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. Skapa ett minnesinternt exempeldokument och ladda upp det till 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. Aktivera funktioner för filsökning och kodtolkning via 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. Skapa Assistant och en tråd för att hantera interaktioner mellan användaren och assistenten:

    // 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. Skriv ut meddelandena och spara den genererade bilden från konversationen med assistenten:

    // 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();
    }
    

    Leta upp och öppna den sparade avbildningen i appkatalogen bin , vilket bör likna följande:

    Ett diagram som visar visualiseringen som genereras av AI-modellen.

Nästa steg