Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Из этого краткого руководства вы узнаете, как создать конвейер приема данных для обработки и подготовки пользовательских данных для приложений ИИ. Приложение использует Microsoft.Extensions.DataIngestion библиотеку для чтения документов, обогащения содержимого через использование ИИ, семантического анализа текста и хранения встраиваний в векторной базе данных для семантического поиска.
Прием данных имеет важное значение для сценариев дополненного поиска (RAG), где необходимо обработать большие объемы неструктурированных данных и сделать их доступными для поиска в приложениях ИИ.
Необходимые условия
- Пакет SDK для .NET 8.0 или более поздней версии — Установите пакет SDK для .NET 8.
- Подписка Azure — Создайте её бесплатно.
- Интерфейс командной строки разработчика Azure (опционально) — установить или обновить интерфейс командной строки разработчика Azure.
Создание приложения
Выполните следующие действия, чтобы создать консольное приложение .NET.
В пустом каталоге на компьютере используйте команду
dotnet newдля создания нового консольного приложения:dotnet new console -o ProcessDataAIИзмените каталог в папку приложения:
cd ProcessDataAIУстановите необходимые пакеты:
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
Создание службы ИИ
Чтобы подготовить службу и модель Azure OpenAI, выполните действия, описанные в статье "Создание и развертывание ресурса Службы OpenAI Azure ". В этом кратком руководстве необходимо подготовить две модели:
gpt-5иtext-embedding-3-small.В терминале или командной строке перейдите в корневой каталог проекта.
Выполните следующие команды, чтобы настроить конечную точку 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 .
Создание примеров данных
- Скопируйте файл sample.md в папку с именем
dataв каталоге проекта. - Настройте проект для копирования этого файла в выходной каталог. Если вы используете Visual Studio, щелкните правой кнопкой мыши файл в обозревателе решений, выберите "Свойства", а затем установите "Копировать в выходной каталог" в значение "Копировать, если новее".
Добавление кода приложения
Конвейер приема данных состоит из нескольких компонентов, которые работают вместе для обработки документов:
- Средство чтения документов: считывает файлы Markdown из каталога.
- Обработчик документов: обогащение изображений с помощью альтернативного текста, созданного СИ.
- Чанкер: разбивает документы на семантические части с помощью эмбеддингов.
- Обработчик блоков: создает сводки ИИ для каждого блока.
- Модуль записи векторного хранилища: хранит блоки с векторными встраиваниями в базе данных SQLite.
Program.csВ файле удалите существующий код и добавьте следующий код, чтобы настроить средство чтения документов:// Configure document reader. IngestionDocumentReader reader = new MarkdownReader();Класс MarkdownReader считывает документы Markdown и преобразует их в единый формат, который хорошо работает с большими языковыми моделями.
Добавьте код для настройки ведения журнала для конвейера:
using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddSimpleConsole());Добавьте код для настройки клиента ИИ для обогащения и чата:
// 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();Добавьте код для настройки обработчика документов, который обогащает изображения описаниями, созданными с помощью искусственного интеллекта.
// 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 использует большие языковые модели для создания описательного альтернативного текста для изображений в документах. Этот текст делает их более доступными и улучшает их семантический смысл.
Добавьте код для настройки генератора внедрения для создания векторных представлений:
// Configure embedding generator. IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = azureClient.GetEmbeddingClient(embeddingModel).AsIEmbeddingGenerator();Внедрение — это числовые представления семантического значения текста, что позволяет выполнять поиск сходства векторов.
Добавьте код для настройки блока, разделяющего документы на семантические блоки:
// 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 разбивает документы, анализируя семантическое сходство между предложениями, гарантируя, что связанное содержимое остаётся вместе. Этот процесс создает блоки, которые сохраняют значение и контекст лучше, чем простые символы или блоки на основе маркеров.
Добавьте код для настройки обработчика блоков, создающего сводки:
// Configure chunk processor to generate summaries for each chunk. IngestionChunkProcessor<string> summaryEnricher = new SummaryEnricher(enricherOptions);Автоматически SummaryEnricher генерирует краткие сводки для каждого блока, что может повысить точность извлечения, предоставив общий обзор содержимого.
Добавьте код для настройки хранилища векторов 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" });Хранилище векторов хранит блоки вместе с их внедрением, что позволяет быстро выполнять семантический поиск.
Добавьте код для создания всех компонентов в полный конвейер:
// Compose data ingestion pipeline using IngestionPipeline<string> pipeline = new(reader, chunker, writer, loggerFactory: loggerFactory) { DocumentProcessors = { imageAlternativeTextEnricher }, ChunkProcessors = { summaryEnricher } };IngestionPipeline<T> объединяет все компоненты в целостный рабочий процесс, который обрабатывает документы от начала до конца.
Добавьте код для обработки документов из каталога:
await foreach (IngestionResult result in pipeline.ProcessAsync( new DirectoryInfo("./data"), searchPattern: "*.md")) { Console.WriteLine($"Completed processing '{result.DocumentId}'. " + $"Succeeded: '{result.Succeeded}'."); }Конвейер обрабатывает все файлы Markdown в каталоге
./dataи сообщает о состоянии каждого документа.Добавьте код для включения интерактивного поиска обработанных документов:
// 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"]}"); } }Функция поиска преобразует запросы пользователей в эмбеддинги и находит наиболее семантически похожие фрагменты в хранилище векторов.
Запуск приложения
Используйте команду
dotnet runдля запуска приложения:dotnet runПриложение обрабатывает все файлы Markdown в каталоге
./dataи отображает состояние обработки для каждого документа. После завершения обработки можно ввести вопросы естественного языка для поиска обработанного содержимого.Введите вопрос в запросе на поиск данных:
Enter your question (or 'exit' to quit): What is data ingestion?Приложение возвращает наиболее релевантные фрагменты из документов вместе со своими оценками сходства.
Введите,
exitчтобы выйти из приложения.
Очистите ресурсы
Если они больше не нужны, удалите ресурс и развертывание модели Azure OpenAI.
- На портале Azureперейдите к ресурсу Azure OpenAI.
- Выберите ресурс Azure OpenAI и выберите Удалить.