Ingestion des données

L’ingestion des données est le processus de collecte, de lecture et de préparation des données à partir de différentes sources telles que des fichiers, des bases de données, des API ou des services cloud afin qu’elles puissent être utilisées dans les applications en aval. Dans la pratique, ce processus suit le flux de travail Extract-Transform-Load (ETL) :

  • Extrayez des données de sa source d’origine, qu’il s’agisse d’un document PDF, d’un document Word, d’un fichier audio ou d’une API web.
  • Transformez les données en nettoyant, en segmentant, en enrichissant ou en convertissant des formats.
  • Chargez les données dans une destination telle qu’une base de données, un magasin vectoriel ou un modèle IA pour la récupération et l’analyse.

Pour les scénarios IA et Machine Learning, en particulier la génération augmentée par récupération (RAG), l’ingestion de données n’est pas seulement la conversion de données d’un format à un autre. Il s’agit de rendre les données utilisables pour les applications intelligentes. Cela signifie représenter des documents d’une manière qui conserve leur structure et leur signification, les fractionnant en blocs gérables, en les enrichissant avec des métadonnées ou des incorporations, et en les stockant afin qu’ils puissent être récupérés rapidement et avec précision.

Pourquoi l’ingestion des données est importante pour les applications IA

Imaginez que vous créez un chatbot alimenté par RAG pour aider les employés à trouver des informations dans la vaste collection de documents de votre entreprise. Ces documents peuvent inclure des fichiers PDF, des fichiers Word, des présentations PowerPoint et des pages web dispersées sur différents systèmes.

Votre chatbot doit comprendre et rechercher des milliers de documents pour fournir des réponses contextuelles précises. Mais les documents bruts ne conviennent pas aux systèmes IA. Vous devez les transformer dans un format qui conserve la signification tout en les rendant accessibles à la recherche et récupérables.

C’est là que l’ingestion des données devient critique. Vous devez extraire du texte à partir de différents formats de fichiers, diviser les documents volumineux en blocs plus petits qui s’intègrent dans les limites du modèle IA, enrichir le contenu avec des métadonnées, générer des incorporations pour la recherche sémantique et stocker tout ce qui permet une récupération rapide. Chaque étape nécessite une considération minutieuse de la façon de préserver la signification et le contexte d’origine.

Éléments de base pour l’ingestion de données

La bibliothèque Microsoft.Extensions.DataIngestion est construite autour de plusieurs composants clés qui fonctionnent ensemble pour créer un pipeline de traitement des données complet. Cette section explore chaque composant et explique comment ils s’intègrent ensemble.

Documents et lecteurs de documents

Au fondement de la bibliothèque est le IngestionDocument type, qui fournit un moyen unifié de représenter n’importe quel format de fichier sans perdre d’informations importantes. IngestionDocument est centré sur Markdown, car les modèles de langage volumineux fonctionnent mieux avec la mise en forme Markdown.

L’abstraction IngestionDocumentReader gère le chargement des documents à partir de différentes sources, qu’il s’agisse de fichiers locaux ou de flux de données. Quelques lecteurs sont disponibles :

D’autres lecteurs (y compris LlamaParse et Azure Document Intelligence) seront ajoutés à l’avenir.

Cette conception signifie que vous pouvez utiliser des documents provenant de différentes sources à l’aide de la même API cohérente, ce qui rend votre code plus facile à gérer et flexible.

Traitement du document

Les processeurs de documents appliquent des transformations au niveau du document pour améliorer et préparer du contenu. La bibliothèque fournit la classe ImageAlternativeTextEnricher en tant que processeur intégré qui utilise des modèles de langue à grande échelle pour générer un texte alternatif descriptif pour les images dans les documents.

Segments et stratégies de division en unités

Une fois que vous avez chargé un document, vous devez généralement le décomposer en morceaux plus petits appelés blocs. Les blocs représentent des sous-sections d’un document qui peut être traité, stocké et récupéré efficacement par les systèmes IA. Ce processus de segmentation est essentiel pour les scénarios de génération augmentée de récupération dans lesquels vous devez trouver rapidement les informations les plus pertinentes.

La bibliothèque fournit plusieurs stratégies de segmentation pour répondre à différents cas d’usage :

  • Segmentation basée sur l’en-tête pour diviser selon les en-têtes.
  • Segmentation basée sur les sections pour diviser par sections (par exemple, pages).
  • Découpage sensible au contexte sémantique pour conserver les pensées complètes.

Ces stratégies de segmentation s’appuient sur la bibliothèque Microsoft.ML.Tokenizers pour fractionner intelligemment du texte en éléments de taille appropriée qui fonctionnent bien avec les modèles de langage volumineux. La stratégie de segmentation appropriée dépend de vos types de documents et de la façon dont vous prévoyez de récupérer des informations.

Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-5");
IngestionChunkerOptions options = new(tokenizer)
{
    MaxTokensPerChunk = 2000,
    OverlapTokens = 0
};
IngestionChunker<string> chunker = new HeaderChunker(options);

Traitement et enrichissement de morceaux

Une fois que les documents sont divisés en blocs, vous pouvez appliquer des processeurs pour améliorer et enrichir le contenu. Les processeurs de segments fonctionnent sur des éléments individuels et peuvent effectuer les opérations suivantes :

  • Enrichissement du contenu , y compris les résumés automatiques (SummaryEnricher), l’analyse des sentiments (SentimentEnricher) et l’extraction de mots clés (KeywordEnricher).
  • Classification pour la catégorisation de contenu automatisée basée sur des catégories prédéfinies (ClassificationEnricher).

Ces processeurs utilisent Microsoft.Extensions.AI.Abstractions pour tirer parti de modèles de langage volumineux pour la transformation de contenu intelligente, ce qui rend vos blocs plus utiles pour les applications IA en aval.

Enregistreur de documents et stockage

IngestionChunkWriter<T> stocke les blocs traités dans un magasin de données pour une récupération ultérieure. La bibliothèque, qui utilise Microsoft.Extensions.AI et Microsoft.Extensions.VectorDatafournit la VectorStoreWriter<T> classe. Cet enregistreur prend en charge le stockage de blocs dans n’importe quel magasin vectoriel pris en charge par Microsoft.Extensions.VectorData.

Les magasins vectoriels incluent des options populaires telles que Qdrant, SQL Server, CosmosDB, MongoDB et ElasticSearch. Pour plus d’informations sur les fournisseurs, consultez les fournisseurs prêts à l'emploi de magasins de vecteurs. (Malgré l’inclusion de « SemanticKernel » dans les noms de package, ces fournisseurs n’ont rien à voir avec le noyau sémantique et sont utilisables n’importe où dans .NET, y compris Agent Framework.)

L'auteur peut également générer automatiquement des vecteurs d'intégration pour vos blocs à l'aide de Microsoft.Extensions.AI, les préparant ainsi pour des scénarios de recherche sémantique et de récupération.

OpenAIClient openAIClient = new(
    new ApiKeyCredential(Environment.GetEnvironmentVariable("OPENAI_API_KEY")!));

IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator =
    openAIClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator();

using SqliteVectorStore vectorStore = new(
    "Data Source=vectors.db;Pooling=false",
    new()
    {
        EmbeddingGenerator = embeddingGenerator
    });

// The writer requires the embedding dimension count to be specified.
// For OpenAI's `text-embedding-3-small`, the dimension count is 1536.
using VectorStoreWriter<string> writer = new(vectorStore, dimensionCount: 1536);

Pipeline de traitement de documents

L’API IngestionPipeline<T> vous permet de chaîner les différents composants d’ingestion de données dans un flux de travail complet. Vous pouvez combiner :

  • Lecteurs pour charger des documents à partir de différentes sources.
  • Processeurs pour transformer et enrichir le contenu du document.
  • Segments pour décomposer des documents en éléments gérables.
  • Modules d'écriture pour stocker les résultats finaux dans votre magasin de données choisi.

Cette approche de pipeline réduit le code réutilisable et facilite la génération, le test et la gestion de flux de travail d’ingestion de données complexes.

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

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

L'échec de l'ingestion d'un seul document ne devrait pas entraîner l'échec du pipeline entier. C’est pourquoi IngestionPipeline<T>.ProcessAsync implémente une réussite partielle en retournant IAsyncEnumerable<IngestionResult>. L’appelant est responsable de la gestion des défaillances (par exemple, en réessayant les documents ayant échoué ou en s’arrêtant lors de la première erreur).