Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gegevensopname is het proces van het verzamelen, lezen en voorbereiden van gegevens uit verschillende bronnen, zoals bestanden, databases, API's of cloudservices, zodat deze kunnen worden gebruikt in downstreamtoepassingen. In de praktijk volgt dit proces de ETL-werkstroom (Extract-Transform-Load):
- Gegevens extraheren uit de oorspronkelijke bron, of dat nu een PDF-, Word-document, audiobestand of web-API is.
- Transformeer de gegevens door indelingen op te schonen, te segmenteren, te verrijken of te converteren.
- Laad de gegevens in een doel, zoals een database, vectorarchief of AI-model voor het ophalen en analyseren.
Voor AI- en machine learning-scenario's, met name Retrieval-Augmented Generation (RAG), gaat gegevensopname niet alleen over het converteren van gegevens van de ene indeling naar de andere. Het gaat erom gegevens bruikbaar te maken voor intelligente toepassingen. Dit betekent dat documenten worden weergegeven op een manier die hun structuur en betekenis behoudt, ze opsplitst in beheerbare segmenten, ze verrijken met metagegevens of insluitingen, en ze opslaan, zodat ze snel en nauwkeurig kunnen worden opgehaald.
Waarom gegevensopname belangrijk is voor AI-toepassingen
Stel dat u een RAG-chatbot bouwt om werknemers te helpen informatie te vinden in de enorme verzameling documenten van uw bedrijf. Deze documenten kunnen PDF's, Word-bestanden, PowerPoint-presentaties en webpagina's bevatten die verspreid zijn over verschillende systemen.
Uw chatbot moet duizenden documenten begrijpen en doorzoeken om nauwkeurige, contextuele antwoorden te bieden. Maar onbewerkte documenten zijn niet geschikt voor AI-systemen. U moet ze transformeren in een indeling die betekenis behoudt terwijl ze doorzoekbaar en ophaalbaar worden.
Hier wordt gegevensopname kritiek. U moet tekst uit verschillende bestandsindelingen extraheren, grote documenten opsplitsen in kleinere segmenten die binnen de limieten van ai-modellen passen, de inhoud verrijken met metagegevens, insluitingen genereren voor semantische zoekopdrachten en alles opslaan op een manier die snel ophalen mogelijk maakt. Voor elke stap moet u zorgvuldig nadenken over het behoud van de oorspronkelijke betekenis en context.
De bibliotheek Microsoft.Extensions.DataIngestion
Het 📦 pakket Microsoft.Extensions.DataIngestion biedt fundamentele .NET-bouwstenen voor gegevensopname. Hiermee kunnen ontwikkelaars documenten lezen, verwerken en voorbereiden voor AI- en machine learning-werkstromen, met name Retrieval-Augmented Generation-scenario's (RAG).
Met deze bouwstenen kunt u robuuste, flexibele en intelligente pijplijnen voor gegevensopname maken die zijn afgestemd op uw toepassingsbehoeften:
- Geïntegreerde documentweergave: Vertegenwoordig elk bestandstype (bijvoorbeeld PDF, Afbeelding of Microsoft Word) in een consistente indeling die goed werkt met grote taalmodellen.
- Flexibele gegevensopname: Lees documenten uit zowel cloudservices als lokale bronnen met behulp van meerdere ingebouwde lezers, zodat u eenvoudig gegevens kunt ophalen van waar deze zich ook bevinden.
- Ingebouwde AI-verbeteringen: Inhoud automatisch verrijken met samenvattingen, sentimentanalyse, trefwoordextractie en classificatie, waarbij uw gegevens worden voorbereid op intelligente werkstromen.
- Aanpasbare segmenteringsstrategieën: Splits documenten in segmenten met behulp van op tokens gebaseerde, sectiegebaseerde of semantische benaderingen, zodat u kunt optimaliseren voor uw behoeften voor het ophalen en analyseren.
- Opslag die gereed is voor productie: Sla verwerkte segmenten op in populaire vectordatabases en documentarchieven, met ondersteuning voor het genereren van insluitingen, zodat uw pijplijnen klaar zijn voor echte scenario's.
- End-to-end pijplijnsamenstelling: Koppel lezers, processors, chunkers en schrijvers aan de IngestionPipeline<T> API, verminder de standaardplaat en maak het eenvoudig om volledige werkstromen te bouwen, aan te passen en uit te breiden.
- Prestaties en schaalbaarheid: Deze onderdelen zijn ontworpen voor schaalbare gegevensverwerking en kunnen grote hoeveelheden gegevens efficiënt verwerken, waardoor ze geschikt zijn voor hoogwaardige toepassingen.
Al deze onderdelen zijn standaard open en uitbreidbaar. U kunt aangepaste logica en nieuwe connectors toevoegen en het systeem uitbreiden om opkomende AI-scenario's te ondersteunen. Door te standaardiseren hoe documenten worden weergegeven, verwerkt en opgeslagen, kunnen .NET-ontwikkelaars betrouwbare, schaalbare en onderhoudbare gegevenspijplijnen bouwen zonder het wiel opnieuw uit te vinden voor elk project.
Gebouwd op stabiele fundamenten
Deze bouwstenen voor gegevensopname zijn gebouwd op basis van bewezen en uitbreidbare onderdelen in het .NET-ecosysteem, waardoor betrouwbaarheid, interoperabiliteit en naadloze integratie met bestaande AI-werkstromen mogelijk zijn:
- Microsoft.ML.Tokenizers: Tokenizers bieden de basis voor het segmenteren van documenten op basis van tokens. Dit maakt het nauwkeurig splitsen van inhoud mogelijk, wat essentieel is voor het voorbereiden van gegevens voor grote taalmodellen en het optimaliseren van ophaalstrategieën.
- Microsoft.Extensions.AI: Deze set bibliotheken zorgt voor verrijkingstransformaties met behulp van grote taalmodellen. Het maakt functies mogelijk zoals samenvatting, sentimentanalyse, trefwoordextractie en het genereren van insluiten van trefwoorden, waardoor u uw gegevens eenvoudig kunt verbeteren met intelligente inzichten.
- Microsoft.Extensions.VectorData: Deze set bibliotheken biedt een consistente interface voor het opslaan van verwerkte segmenten in een groot aantal vectorarchieven, waaronder Qdrant, Azure SQL, CosmosDB, MongoDB, ElasticSearch en nog veel meer. Dit zorgt ervoor dat uw gegevenspijplijnen gereed zijn voor productie en kunnen worden geschaald op verschillende back-ends van opslag.
Naast vertrouwde patronen en hulpprogramma's zijn deze abstracties gebaseerd op reeds uitbreidbare onderdelen. Invoegtoepassingen en interoperabiliteit zijn van cruciaal belang, dus naarmate de rest van het .NET AI-ecosysteem groeit, groeien de mogelijkheden van de gegevensopnameonderdelen ook. Deze aanpak stelt ontwikkelaars in staat om eenvoudig nieuwe connectors, verrijkingen en opslagopties te integreren, zodat hun pijplijnen toekomstklaar en aanpasbaar blijven aan veranderende AI-scenario's.
Bouwstenen voor gegevensopname
De bibliotheek Microsoft.Extensions.DataIngestion is gebouwd rond verschillende belangrijke onderdelen die samenwerken om een volledige pijplijn voor gegevensverwerking te maken. In deze sectie wordt elk onderdeel verkend en hoe deze bij elkaar passen.
Documenten en documentlezers
Aan de basis van de bibliotheek is het IngestionDocument type, dat een uniforme manier biedt om elke bestandsindeling weer te geven zonder belangrijke informatie te verliezen.
IngestionDocument is Markdown-gericht omdat grote taalmodellen het beste werken met Markdown-opmaak.
De IngestionDocumentReader abstractie verwerkt het laden van documenten uit verschillende bronnen, of dit nu lokale bestanden of streams zijn. Er zijn enkele lezers beschikbaar:
Meer lezers (waaronder LlamaParse en Azure Document Intelligence) worden in de toekomst toegevoegd.
Dit ontwerp betekent dat u met documenten uit verschillende bronnen kunt werken met behulp van dezelfde consistente API, waardoor uw code beter onderhoudbaar en flexibel is.
Documentverwerking
Documentprocessors passen transformaties toe op documentniveau om inhoud te verbeteren en voorbereiden. De bibliotheek biedt de ImageAlternativeTextEnricher klasse als een ingebouwde processor die gebruikmaakt van grote taalmodellen voor het genereren van beschrijvende alternatieve tekst voor afbeeldingen in documenten.
Segmenten en segmenteringsstrategieën
Zodra u een document hebt geladen, moet u het meestal opsplitsen in kleinere stukken, chunks genoemd. Segmenten vertegenwoordigen subsecties van een document dat efficiënt kan worden verwerkt, opgeslagen en opgehaald door AI-systemen. Dit segmenteringsproces is essentieel voor het ophalen van uitgebreide generatiescenario's waarbij u snel de meest relevante stukjes informatie moet vinden.
De bibliotheek biedt verschillende segmentstrategieën voor verschillende gebruiksscenario's:
- Segmentering op basis van headers om te splitsen op kopteksten.
- Segmentering op basis van secties om te splitsen in secties (bijvoorbeeld pagina's).
- Semantisch-bewust segmenteren om volledige gedachten te behouden.
Deze segmenteringsstrategieën bouwen voort op de bibliotheek Microsoft.ML.Tokenizers om tekst intelligent te splitsen in stukken met de juiste grootte die goed werken met grote taalmodellen. De juiste segmenteringsstrategie is afhankelijk van uw documenttypen en hoe u informatie wilt ophalen.
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-4");
IngestionChunkerOptions options = new(tokenizer)
{
MaxTokensPerChunk = 2000,
OverlapTokens = 0
};
IngestionChunker<string> chunker = new HeaderChunker(options);
Segmentverwerking en verrijking
Nadat documenten zijn gesplitst in segmenten, kunt u processors toepassen om de inhoud te verbeteren en te verrijken. Blokprocessors werken aan afzonderlijke stukken en kunnen het volgende uitvoeren:
-
Inhoudsverrijking inclusief automatische samenvattingen (
SummaryEnricher), sentimentanalyse (SentimentEnricher) en trefwoordextractie (KeywordEnricher). -
Classificatie voor geautomatiseerde inhoudscategorisatie op basis van vooraf gedefinieerde categorieën (
ClassificationEnricher).
Deze processors gebruiken Microsoft.Extensions.AI.Abstractions om grote taalmodellen te gebruiken voor intelligente inhoudstransformatie, waardoor uw segmenten nuttiger zijn voor downstream AI-toepassingen.
Documentschrijver en -opslag
IngestionChunkWriter<T> slaat verwerkte segmenten op in een gegevensarchief voor later ophalen. Met behulp van Microsoft.Extensions.AI en Microsoft.Extensions.VectorData.Abstractions biedt de bibliotheek de klasse die ondersteuning biedt voor het VectorStoreWriter<T> opslaan van segmenten in een vectorarchief dat wordt ondersteund door Microsoft.Extensions.VectorData.
Vectorarchieven bevatten populaire opties zoals Qdrant, SQL Server, CosmosDB, MongoDB, ElasticSearch en nog veel meer. De schrijver kan ook automatisch insluitingen genereren voor uw segmenten met behulp van Microsoft.Extensions.AI, zodat ze klaar zijn voor semantische zoek- en ophaalscenario's.
OpenAIClient openAIClient = new(
new ApiKeyCredential(Environment.GetEnvironmentVariable("GITHUB_TOKEN")!),
new OpenAIClientOptions { Endpoint = new Uri("https://models.github.ai/inference") });
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);
Pijplijn voor documentverwerking
Met IngestionPipeline<T> de API kunt u de verschillende onderdelen voor gegevensopname aan elkaar koppelen in een volledige werkstroom. U kunt het volgende combineren:
- Lezers voor het laden van documenten uit verschillende bronnen.
- Processors voor het transformeren en verrijken van documentinhoud.
- Chunkers om documenten op te splitsen in beheerbare stukken.
- Schrijvers voor het opslaan van de uiteindelijke resultaten in uw gekozen gegevensarchief.
Deze pijplijnbenadering vermindert standaardcode en maakt het eenvoudig om complexe gegevensopnamewerkstromen te bouwen, te testen en te onderhouden.
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}'.");
}
Een fout bij het opnemen van één document mag de hele pijplijn niet laten falen. Daarom implementeert IngestionPipeline<T>.ProcessAsync gedeeltelijk succes door naar IAsyncEnumerable<IngestionResult> terug te keren. De beller is verantwoordelijk voor het afhandelen van eventuele fouten (bijvoorbeeld door mislukte documenten opnieuw te proberen of bij eerste fout te stoppen).