Создание минимального помощника по искусственному интеллекту с помощью .NET

Из этого краткого руководства вы узнаете, как создать минимального помощника по искусственному интеллекту с помощью библиотек OpenAI или Azure OpenAI SDK. Помощники по искусственному интеллекту предоставляют агентические функции, помогающие пользователям выполнять задачи с помощью средств и моделей ИИ. В следующих разделах вы узнаете следующее:

  • Основные компоненты и концепции помощников по искусственному интеллекту
  • Создание помощника с помощью пакета SDK для Azure OpenAI
  • Как улучшить и настроить возможности помощника

Предпосылки

Основные компоненты помощников по искусственному интеллекту

Помощники по искусственному интеллекту основаны на беседных потоках с пользователем. Пользователь отправляет запрос помощнику в потоке беседы, который направляет помощника на выполнение задач с помощью доступных средств. Помощники могут обрабатывать и анализировать данные, принимать решения и взаимодействовать с пользователями или другими системами для достижения конкретных целей. Большинство помощников включают следующие компоненты:

Компонент Описание
Помощник Основной клиент ИИ и логическая система, использующие модели Azure OpenAI, управляют потоками разговоров и применяют настроенные инструменты.
поток Сеанс беседы между помощником и пользователем. Ветки обсуждения хранят сообщения и автоматически выполняют усечение, чтобы поместить содержимое в контекст модели.
Сообщение Сообщение, созданное помощником или пользователем. Сообщения могут включать текст, изображения и другие файлы. Сообщения хранятся в потоке в виде списка.
Выполнить Активация помощника для начала работы на основе содержимого потока. Помощник использует свою конфигурацию и сообщения потока для выполнения задач путем вызова моделей и инструментов. В рамках выполнения помощник добавляет сообщения в поток сообщений.
выполнение шагов Подробный список шагов, которые помощник предпринял в рамках выполнения задачи. Помощник может вызывать инструменты или создавать сообщения во время своей работы. Изучение шагов выполнения позволяет понять, как помощник добивается своих крайних результатов.

Помощники также можно настроить для использования нескольких инструментов параллельно с выполнением задач, включая следующие:

  • инструмент интерпретатора кода: записывает и выполняет код в изолированной среде выполнения.
  • Вызов функции: выполняет определенные в вашем коде локальные пользовательские функции.
  • возможности поиска файлов: добавляет помощнику знания из внешних источников.

Понимая эти основные компоненты и как они взаимодействуют, вы можете создавать и настраивать мощных помощников по искусственному интеллекту в соответствии с вашими потребностями.

Создание приложения .NET

Выполните следующие действия, чтобы создать консольное приложение .NET и добавить пакет, необходимый для работы с помощниками:

  1. В окне терминала перейдите к пустому каталогу на устройстве и создайте новое приложение с помощью команды dotnet new:

    dotnet new console -o AIAssistant
    
  2. Добавьте пакет OpenAI в приложение:

    dotnet add package OpenAI
    
  3. Откройте новое приложение в выбранном редакторе, например Visual Studio Code.

    code .
    
  1. В окне терминала перейдите к пустому каталогу на устройстве и создайте новое приложение с помощью команды dotnet new:

    dotnet new console -o AIAssistant
    
  2. Добавьте в приложение пакет Azure.AI.OpenAI:

    dotnet add package Azure.AI.OpenAI
    
  3. Откройте новое приложение в выбранном редакторе, например Visual Studio Code.

    code .
    

Создание клиента помощника по искусственному интеллекту

  1. Program.cs Откройте файл и замените содержимое файла следующим кодом, чтобы создать необходимые клиенты:

    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. Создайте пример документа в памяти и отправьте его в 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. Включите возможности поиска файлов и инструментов интерпретации кода с помощью 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. Создайте Assistant и поток для управления взаимодействием между пользователем и помощником:

    // 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. Печать сообщений и сохранение созданного изображения из беседы с помощником:

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

    Найдите и откройте сохраненный образ в каталоге приложений bin , который должен выглядеть следующим образом:

    Граф, показывающий визуализацию, созданную моделью ИИ.

Дальнейшие действия