Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A ingestão de dados é o processo de coleta, leitura e preparação de dados de diferentes fontes, como arquivos, bancos de dados, APIs ou serviços de nuvem para que possam ser usados em aplicativos downstream. Na prática, esse processo segue o fluxo de trabalho ETL (Extract-Transform-Load):
- Extraia dados de sua fonte original, seja um PDF, um documento do Word, um arquivo de áudio ou uma API Web.
- Transforme os dados limpando, agrupando, enriquecendo ou convertendo formatos.
- Carregue os dados em um destino como um banco de dados, um repositório de vetores ou um modelo de IA para recuperação e análise.
Para cenários de IA e machine learning, especialmente RAG (geração aumentada de recuperação), a ingestão de dados não se trata apenas de converter dados de um formato para outro. Trata-se de tornar os dados utilizáveis para aplicativos inteligentes. Isso significa representar documentos de uma maneira que preserva sua estrutura e significado, dividindo-os em partes gerenciáveis, enriquecendo-os com metadados ou inserções e armazenando-os para que possam ser recuperados de forma rápida e precisa.
Por que a ingestão de dados é importante para aplicativos de IA
Imagine que você está criando um chatbot alimentado por RAG para ajudar os funcionários a encontrar informações na vasta coleção de documentos da sua empresa. Esses documentos podem incluir PDFs, arquivos do Word, apresentações do PowerPoint e páginas da Web espalhadas por sistemas diferentes.
Seu chatbot precisa entender e pesquisar milhares de documentos para fornecer respostas contextuais precisas. Mas documentos brutos não são adequados para sistemas de IA. Você precisa transformá-los em um formato que preserve o significado, tornando-os pesquisáveis e recuperáveis.
É aí que a ingestão de dados se torna crítica. Você precisa extrair texto de diferentes formatos de arquivo, dividir documentos grandes em partes menores que se ajustem aos limites do modelo de IA, enriquecer o conteúdo com metadados, gerar inserções para pesquisa semântica e armazenar tudo de uma maneira que permita a recuperação rápida. Cada etapa requer uma consideração cuidadosa de como preservar o significado e o contexto originais.
Componentes básicos para ingestão de dados
A biblioteca Microsoft.Extensions.DataIngestion é criada em torno de vários componentes-chave que trabalham juntos para criar um pipeline de processamento de dados completo. Esta seção explora cada componente e como eles se encaixam.
Documentos e leitores de documentos
Na base da biblioteca está o IngestionDocument tipo, que fornece uma maneira unificada de representar qualquer formato de arquivo sem perder informações importantes.
IngestionDocument é centrado em Markdown porque os modelos de linguagem grandes funcionam melhor com a formatação do Markdown.
A IngestionDocumentReader abstração manipula o carregamento de documentos de várias fontes, sejam arquivos locais ou fluxos. Alguns leitores estão disponíveis:
Mais leitores (incluindo LlamaParse e Azure Document Intelligence) serão adicionados no futuro.
Esse design significa que você pode trabalhar com documentos de fontes diferentes usando a mesma API consistente, tornando seu código mais mantenedível e flexível.
Processamento de documentos
Os processadores de documentos aplicam transformações no nível do documento para aprimorar e preparar o conteúdo. A biblioteca fornece a ImageAlternativeTextEnricher classe como um processador interno que usa modelos de linguagem grandes para gerar texto alternativo descritivo para imagens dentro de documentos.
Blocos e estratégias de agrupamento
Depois de carregar um documento, normalmente você precisa dividi-lo em partes menores chamadas partes. As partes representam subseções de um documento que podem ser processadas, armazenadas e recuperadas com eficiência por sistemas de IA. Esse processo de agrupamento é essencial para cenários de geração aumentada de recuperação em que você precisa encontrar rapidamente as informações mais relevantes.
A biblioteca fornece várias estratégias de agrupamento para atender a diferentes casos de uso:
- Segmentação baseada em cabeçalho para dividir em cabeçalhos.
- Agrupamento baseado em seção para dividir em seções (por exemplo, páginas).
- Fragmentação semântico-consciente para preservar pensamentos completos.
Essas estratégias de agrupamento se baseiam na biblioteca Microsoft.ML.Tokenizers para dividir o texto de forma inteligente em partes de tamanho adequado que funcionam bem com modelos de linguagem grandes. A estratégia de agrupamento correta depende dos tipos de documento e de como você planeja recuperar informações.
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-5");
IngestionChunkerOptions options = new(tokenizer)
{
MaxTokensPerChunk = 2000,
OverlapTokens = 0
};
IngestionChunker<string> chunker = new HeaderChunker(options);
Processamento e enriquecimento em blocos
Depois que os documentos são divididos em partes, você pode aplicar processadores para aprimorar e enriquecer o conteúdo. Os processadores de segmentos funcionam em partes individuais e podem executar:
-
Enriquecimento de conteúdo , incluindo resumos automáticos (
SummaryEnricher), análise de sentimento (SentimentEnricher) e extração de palavra-chave (KeywordEnricher). -
Classificação para categorização de conteúdo automatizado com base em categorias predefinidas (
ClassificationEnricher).
Esses processadores usam Microsoft.Extensions.AI.Abstractions para aproveitar modelos de linguagem grandes para transformação de conteúdo inteligente, tornando suas partes mais úteis para aplicativos de IA downstream.
Gravador e armazenamento de documentos
IngestionChunkWriter<T> armazena partes processadas em um repositório de dados para recuperação posterior. A biblioteca, que usa Microsoft.Extensions.AI e Microsoft.Extensions.VectorDatafornece a VectorStoreWriter<T> classe. Este escritor oferece suporte ao armazenamento de partes em qualquer repositório de vetores compatível com Microsoft.Extensions.VectorData.
Os repositórios de vetores incluem opções populares como Qdrant, SQL Server, CosmosDB, MongoDB e ElasticSearch. Para obter mais informações sobre provedores, consulte provedores prontos para uso da Vector Store. (Apesar da inclusão de "SemanticKernel" nos nomes dos pacotes, esses provedores não têm nada a ver com Kernel Semântico e são utilizáveis em qualquer lugar no .NET, incluindo o Agent Framework.)
O escritor também pode gerar incorporações automaticamente para seus trechos usando Microsoft.Extensions.AI, preparando-os para cenários semânticos de pesquisa e recuperação.
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 processamento de documentos
A IngestionPipeline<T> API permite que você encadee os vários componentes de ingestão de dados em um fluxo de trabalho completo. Você pode combinar:
- Leitores para carregar documentos de várias fontes.
- Processadores para transformar e enriquecer o conteúdo do documento.
- Chunkers para dividir documentos em partes gerenciáveis.
- Escritores para armazenar os resultados finais no repositório de dados escolhido.
Essa abordagem de pipeline reduz o código clichê e facilita a compilação, teste e manutenção de fluxos de trabalho complexos de ingestão de dados.
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}'.");
}
Uma única falha de ingestão de documento não deve resultar na falha de todo o pipeline. É por isso que IngestionPipeline<T>.ProcessAsync implementa o sucesso parcial retornando IAsyncEnumerable<IngestionResult>. O chamador é responsável por lidar com falhas (por exemplo, tentar novamente documentos com falha ou parar no primeiro erro).