Udostępnij za pośrednictwem


Tworzenie minimalnego asystenta sztucznej inteligencji przy użyciu platformy .NET

W tym przewodniku szybkiego startu dowiesz się, jak utworzyć minimalnego asystenta sztucznej inteligencji przy użyciu bibliotek SDK OpenAI lub Azure OpenAI. Asystenci sztucznej inteligencji udostępniają funkcje agentów, które ułatwiają użytkownikom wykonywanie zadań przy użyciu narzędzi i modeli sztucznej inteligencji. W kolejnych sekcjach poznasz następujące informacje:

  • Podstawowe składniki i pojęcia asystentów sztucznej inteligencji
  • Jak utworzyć asystenta przy użyciu zestawu Azure OpenAI SDK
  • Jak ulepszyć i dostosować możliwości asystenta

Warunki wstępne

  • zainstaluj program .NET 8.0 lub nowszy
  • programu Visual Studio Code (opcjonalnie)
  • Visual Studio (opcjonalnie)
  • Dostęp do wystąpienia usługi Azure OpenAI za pośrednictwem tożsamości platformy Azure lub klucza dostępu

Podstawowe składniki asystentów sztucznej inteligencji

Asystenci sztucznej inteligencji bazują na wątkach konwersacyjnych z użytkownikiem. Użytkownik wysyła monity do asystenta w wątku konwersacji, który kieruje asystenta do wykonywania zadań przy użyciu dostępnych narzędzi. Asystenci mogą przetwarzać i analizować dane, podejmować decyzje i wchodzić w interakcje z użytkownikami lub innymi systemami, aby osiągnąć określone cele. Większość asystentów obejmuje następujące składniki:

składników opis
Asystent Podstawowy klient i logika sztucznej inteligencji korzystająca z modeli usługi Azure OpenAI, zarządza wątkami konwersacji i korzysta ze skonfigurowanych narzędzi.
wątek Sesja konwersacji między asystentem a użytkownikiem. Wątki przechowują wiadomości i automatycznie obsługują skracanie, aby dopasować zawartość do kontekstu modelu.
komunikat Komunikat utworzony przez asystenta lub użytkownika. Wiadomości mogą zawierać tekst, obrazy i inne pliki. Komunikaty są przechowywane jako lista w wątku.
uruchom Aktywacja asystenta w celu rozpoczęcia działania na podstawie zawartości wątku. Asystent używa konfiguracji i komunikatów wątku do wykonywania zadań przez wywoływanie modeli i narzędzi. W ramach procesu asystent dołącza wiadomości do wątku.
kroki uruchamiania Szczegółowa lista kroków, które asystent wykonał w ramach procesu. Asystent może wywoływać narzędzia lub tworzyć komunikaty podczas jego uruchamiania. Analiza etapów uruchamiania pozwala zrozumieć, jak asystent uzyskuje swoje wyniki końcowe.

Asystentów można również skonfigurować tak, aby używać wielu narzędzi równolegle do wykonywania zadań, w tym następujących:

  • Narzędzie do interpretacji kodu: zapisuje i uruchamia kod w środowisku izolowanym (sandbox).
  • funkcja wywołująca: uruchamia lokalne funkcje niestandardowe zdefiniowane w kodzie.
  • możliwości wyszukiwania plików: rozszerza asystenta o wiedzę spoza modelu.

Zrozumienie tych podstawowych składników i sposobu ich interakcji umożliwia tworzenie i dostosowywanie zaawansowanych asystentów sztucznej inteligencji w celu spełnienia określonych potrzeb.

Tworzenie aplikacji .NET

Wykonaj następujące kroki, aby utworzyć aplikację konsolową platformy .NET i dodać pakiet wymagany do pracy z asystentami:

  1. W oknie terminalu przejdź do pustego katalogu na urządzeniu i utwórz nową aplikację za pomocą polecenia dotnet new:

    dotnet new console -o AIAssistant
    
  2. Dodaj pakiet OpenAI do swojej aplikacji.

    dotnet add package OpenAI --prerelease
    
  3. Otwórz nową aplikację w wybranym edytorze, na przykład Visual Studio Code.

    code .
    
  1. W oknie terminalu przejdź do pustego katalogu na urządzeniu i utwórz nową aplikację za pomocą polecenia dotnet new:

    dotnet new console -o AIAssistant
    
  2. Dodaj pakiet Azure.AI.OpenAI do aplikacji:

    dotnet add package Azure.AI.OpenAI --prerelease
    
  3. Otwórz nową aplikację w wybranym edytorze, na przykład Visual Studio Code.

    code .
    

Tworzenie klienta asystenta sztucznej inteligencji

  1. Otwórz plik Program.cs i zastąp zawartość pliku następującym kodem, aby utworzyć wymaganych klientów:

    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. Utwórz przykładowy dokument w pamięci i przekaż go do 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. Włącz funkcje narzędzi interpretera wyszukiwania plików i kodu za pośrednictwem 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. Utwórz Assistant i wątek do zarządzania interakcjami między użytkownikiem a asystentem.

    // 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. Wydrukuj komunikaty i zapisz wygenerowany obraz z konwersacji z asystentem:

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

    Znajdź i otwórz zapisany obraz w katalogu bin aplikacji, który powinien wyglądać podobnie do następującego:

    wykres przedstawiający wizualizację wygenerowaną przez model AI.

Następne kroki