Поделиться через


Обработка пользовательских данных для приложений ИИ

Из этого краткого руководства вы узнаете, как создать конвейер приема данных для обработки и подготовки пользовательских данных для приложений ИИ. Приложение использует Microsoft.Extensions.DataIngestion библиотеку для чтения документов, обогащения содержимого через использование ИИ, семантического анализа текста и хранения встраиваний в векторной базе данных для семантического поиска.

Прием данных имеет важное значение для сценариев дополненного поиска (RAG), где необходимо обработать большие объемы неструктурированных данных и сделать их доступными для поиска в приложениях ИИ.

Необходимые условия

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

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

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

    dotnet new console -o ProcessDataAI
    
  2. Измените каталог в папку приложения:

    cd ProcessDataAI
    
  3. Установите необходимые пакеты:

    dotnet add package Azure.AI.OpenAI
    dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease
    dotnet add package Microsoft.Extensions.Configuration
    dotnet add package Microsoft.Extensions.Configuration.UserSecrets
    dotnet add package Microsoft.Extensions.DataIngestion --prerelease
    dotnet add package Microsoft.Extensions.DataIngestion.Markdig --prerelease
    dotnet add package Microsoft.Extensions.Logging.Console
    dotnet add package Microsoft.ML.Tokenizers.Data.O200kBase
    dotnet add package Microsoft.SemanticKernel.Connectors.SqliteVec --prerelease
    

Создание службы ИИ

  1. Чтобы подготовить службу и модель Azure OpenAI, выполните действия, описанные в статье "Создание и развертывание ресурса Службы OpenAI Azure ". В этом кратком руководстве необходимо подготовить две модели: gpt-5 и text-embedding-3-small.

  2. В терминале или командной строке перейдите в корневой каталог проекта.

  3. Выполните следующие команды, чтобы настроить конечную точку Azure OpenAI и ключ API для примера приложения:

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_OPENAI_API_KEY <your-Azure-OpenAI-API-key>
    

Открытие приложения в редакторе

Откройте приложение в Visual Studio Code (или выбранный редактор).

code .

Создание примеров данных

  1. Скопируйте файл sample.md в папку с именем data в каталоге проекта.
  2. Настройте проект для копирования этого файла в выходной каталог. Если вы используете Visual Studio, щелкните правой кнопкой мыши файл в обозревателе решений, выберите "Свойства", а затем установите "Копировать в выходной каталог" в значение "Копировать, если новее".

Добавление кода приложения

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

  • Средство чтения документов: считывает файлы Markdown из каталога.
  • Обработчик документов: обогащение изображений с помощью альтернативного текста, созданного СИ.
  • Чанкер: разбивает документы на семантические части с помощью эмбеддингов.
  • Обработчик блоков: создает сводки ИИ для каждого блока.
  • Модуль записи векторного хранилища: хранит блоки с векторными встраиваниями в базе данных SQLite.
  1. Program.cs В файле удалите существующий код и добавьте следующий код, чтобы настроить средство чтения документов:

    // Configure document reader.
    IngestionDocumentReader reader = new MarkdownReader();
    

    Класс MarkdownReader считывает документы Markdown и преобразует их в единый формат, который хорошо работает с большими языковыми моделями.

  2. Добавьте код для настройки ведения журнала для конвейера:

    using ILoggerFactory loggerFactory =
        LoggerFactory.Create(builder => builder.AddSimpleConsole());
    
  3. Добавьте код для настройки клиента ИИ для обогащения и чата:

    // Configure IChatClient to use Azure OpenAI.
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .Build();
    
    string endpoint = config["AZURE_OPENAI_ENDPOINT"];
    string apiKey = config["AZURE_OPENAI_API_KEY"];
    string chatModel = "gpt-5";
    string embeddingModel = "text-embedding-3-small";
    
    AzureOpenAIClient azureClient = new(
        new Uri(endpoint),
        new AzureKeyCredential(apiKey));
    
    IChatClient chatClient =
        azureClient.GetChatClient(chatModel).AsIChatClient();
    
  4. Добавьте код для настройки обработчика документов, который обогащает изображения описаниями, созданными с помощью искусственного интеллекта.

    // Configure document processor.
    EnricherOptions enricherOptions = new(chatClient)
    {
        // Enricher failures should not fail the whole ingestion pipeline,
        // as they are best-effort enhancements.
        // This logger factory can create loggers to log such failures.
        LoggerFactory = loggerFactory
    };
    
    IngestionDocumentProcessor imageAlternativeTextEnricher =
        new ImageAlternativeTextEnricher(enricherOptions);
    

    ImageAlternativeTextEnricher использует большие языковые модели для создания описательного альтернативного текста для изображений в документах. Этот текст делает их более доступными и улучшает их семантический смысл.

  5. Добавьте код для настройки генератора внедрения для создания векторных представлений:

    // Configure embedding generator.
    IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator =
        azureClient.GetEmbeddingClient(embeddingModel).AsIEmbeddingGenerator();
    

    Внедрение — это числовые представления семантического значения текста, что позволяет выполнять поиск сходства векторов.

  6. Добавьте код для настройки блока, разделяющего документы на семантические блоки:

    // Configure chunker to split text into semantic chunks.
    IngestionChunkerOptions chunkerOptions = new(TiktokenTokenizer.CreateForModel(chatModel))
    {
        MaxTokensPerChunk = 2000,
        OverlapTokens = 0
    };
    
    IngestionChunker<string> chunker =
        new SemanticSimilarityChunker(embeddingGenerator, chunkerOptions);
    

    Интеллектуально SemanticSimilarityChunker разбивает документы, анализируя семантическое сходство между предложениями, гарантируя, что связанное содержимое остаётся вместе. Этот процесс создает блоки, которые сохраняют значение и контекст лучше, чем простые символы или блоки на основе маркеров.

  7. Добавьте код для настройки обработчика блоков, создающего сводки:

    // Configure chunk processor to generate summaries for each chunk.
    IngestionChunkProcessor<string> summaryEnricher = new SummaryEnricher(enricherOptions);
    

    Автоматически SummaryEnricher генерирует краткие сводки для каждого блока, что может повысить точность извлечения, предоставив общий обзор содержимого.

  8. Добавьте код для настройки хранилища векторов SQLite для хранения внедренных данных:

    // Configure SQLite Vector Store.
    using SqliteVectorStore vectorStore = new(
        "Data Source=vectors.db;Pooling=false",
        new()
        {
            EmbeddingGenerator = embeddingGenerator
        });
    
    // The writer requires the embedding dimension count to be specified.
    using VectorStoreWriter<string> writer = new(
        vectorStore,
        dimensionCount: 1536,
        new VectorStoreWriterOptions { CollectionName = "data" });
    

    Хранилище векторов хранит блоки вместе с их внедрением, что позволяет быстро выполнять семантический поиск.

  9. Добавьте код для создания всех компонентов в полный конвейер:

    // Compose data ingestion pipeline
    using IngestionPipeline<string> pipeline =
        new(reader, chunker, writer, loggerFactory: loggerFactory)
    {
        DocumentProcessors = { imageAlternativeTextEnricher },
        ChunkProcessors = { summaryEnricher }
    };
    

    IngestionPipeline<T> объединяет все компоненты в целостный рабочий процесс, который обрабатывает документы от начала до конца.

  10. Добавьте код для обработки документов из каталога:

    await foreach (IngestionResult result in pipeline.ProcessAsync(
        new DirectoryInfo("./data"),
        searchPattern: "*.md"))
    {
        Console.WriteLine($"Completed processing '{result.DocumentId}'. " +
            $"Succeeded: '{result.Succeeded}'.");
    }
    

    Конвейер обрабатывает все файлы Markdown в каталоге ./data и сообщает о состоянии каждого документа.

  11. Добавьте код для включения интерактивного поиска обработанных документов:

    // Search the vector store collection and display results
    VectorStoreCollection<object, Dictionary<string, object?>> collection =
        writer.VectorStoreCollection;
    
    while (true)
    {
        Console.Write("Enter your question (or 'exit' to quit): ");
        string? searchValue = Console.ReadLine();
        if (string.IsNullOrEmpty(searchValue) || searchValue == "exit")
        {
            break;
        }
    
        Console.WriteLine("Searching...\n");
        await foreach (VectorSearchResult<Dictionary<string, object?>> result in
            collection.SearchAsync(searchValue, top: 3))
        {
            Console.WriteLine($"Score: {result.Score}\n\tContent: {result.Record["content"]}");
        }
    }
    

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

Запуск приложения

  1. Используйте команду dotnet run для запуска приложения:

    dotnet run
    

    Приложение обрабатывает все файлы Markdown в каталоге ./data и отображает состояние обработки для каждого документа. После завершения обработки можно ввести вопросы естественного языка для поиска обработанного содержимого.

  2. Введите вопрос в запросе на поиск данных:

    Enter your question (or 'exit' to quit): What is data ingestion?
    

    Приложение возвращает наиболее релевантные фрагменты из документов вместе со своими оценками сходства.

  3. Введите, exit чтобы выйти из приложения.

Очистите ресурсы

Если они больше не нужны, удалите ресурс и развертывание модели Azure OpenAI.

  1. На портале Azureперейдите к ресурсу Azure OpenAI.
  2. Выберите ресурс Azure OpenAI и выберите Удалить.

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