Delen via


Een ongestructureerde gegevenspijplijn bouwen voor RAG

In dit artikel wordt beschreven hoe u een ongestructureerde gegevenspijplijn bouwt voor gen AI-toepassingen. Ongestructureerde pijplijnen zijn met name handig voor RAG-toepassingen (Generation) Retrieval-Augmented.

Leer hoe u ongestructureerde inhoud, zoals tekstbestanden en PDF's, converteert naar een vectorindex waarop AI-agents of andere retrievers query's kunnen uitvoeren. U leert ook hoe u uw pijplijn kunt experimenteren en afstemmen om segmentering, indexering en parsering van gegevens te optimaliseren, zodat u problemen kunt oplossen en experimenteren met de pijplijn om betere resultaten te bereiken.

Notebook voor niet-gestructureerde gegevenspijplijn

In het volgende notebook ziet u hoe u de informatie in dit artikel implementeert om een ongestructureerde gegevenspijplijn te maken.

Databricks ongestructureerde gegevenspijplijn

Notebook krijgen

Belangrijkste onderdelen van de gegevenspijplijn

De basis van een RAG-toepassing met ongestructureerde gegevens is de gegevenspijplijn. Deze pijplijn is verantwoordelijk voor het cureren en voorbereiden van de ongestructureerde gegevens in een indeling die de RAG-toepassing effectief kan gebruiken.

Diagram van de basisonderdelen van de RAG-gegevenspijplijn.

Hoewel deze gegevenspijplijn complex kan worden, afhankelijk van de use-case, zijn de volgende belangrijke onderdelen waarover u moet nadenken bij het bouwen van uw RAG-toepassing:

  1. Corpus samenstelling en opname: Selecteer de juiste gegevensbronnen en inhoud op basis van de specifieke use case.
  2. Voorverwerking van gegevens: Transformeer onbewerkte gegevens in een schone, consistente indeling die geschikt is voor het insluiten en ophalen van gegevens.
    1. parseren: relevante informatie extraheren uit de onbewerkte gegevens met behulp van de juiste parseringstechnieken.
    2. Verrijking: Gegevens verrijken met aanvullende metagegevens en ruis verwijderen.
      1. metagegevensextractie: nuttige metagegevens extraheren om sneller en efficiënter gegevens op te halen.
      2. ontdubbeling: analyseer de documenten om dubbele of bijna-dubbele documenten te identificeren en te elimineren.
      3. filteren: verwijder irrelevante of ongewenste documenten uit de verzameling.
  3. segmentering: de geparseerde gegevens opsplitsen in kleinere, beheerbare segmenten voor efficiënt ophalen.
  4. Insluiten: converteer de gesegmenteerde tekstgegevens naar een numerieke vectorweergave die de semantische betekenis vastlegt.
  5. indexering en opslag: maak efficiënte vectorindexen voor geoptimaliseerde zoekprestaties.

Corpus samenstelling en inname

Uw RAG-toepassing kan de informatie die is vereist voor het beantwoorden van een gebruikersquery niet ophalen zonder het juiste gegevenslichaam. De juiste gegevens zijn volledig afhankelijk van de specifieke vereisten en doelstellingen van uw toepassing, waardoor het essentieel is om tijd te besteden aan het begrijpen van de nuances van de beschikbare gegevens. Voor meer informatie, zie werkstroom voor ontwikkelaars van generatieve AI-apps.

Als u bijvoorbeeld een klantondersteuningsbot bouwt, kunt u overwegen het volgende op te nemen:

  • Knowledge Base-documenten
  • Veelgestelde vragen
  • Producthandleidingen en specificaties
  • Handleidingen voor probleemoplossing

Betrek domeinexperts en belanghebbenden vanaf het begin van elk project om relevante inhoud te identificeren en te cureren die de kwaliteit en dekking van uw gegevensinhoud kan verbeteren. Ze kunnen inzicht geven in de typen query's die gebruikers waarschijnlijk zullen indienen en helpen prioriteit te geven aan de meest kritieke informatie die moet worden opgenomen.

Databricks raadt u aan om gegevens op een schaalbare en incrementele manier op te nemen. Azure Databricks biedt verschillende methoden voor gegevensopname, waaronder volledig beheerde connectors voor SaaS-toepassingen en API-integraties. Als best practice moeten onbewerkte brongegevens worden opgenomen en opgeslagen in een doeltabel. Deze aanpak zorgt voor gegevensbehoud, traceerbaarheid en controle. Zie standardconnectoren in Lakeflow Connect.

voorverwerking van gegevens

Nadat de gegevens zijn opgenomen, is het essentieel om de onbewerkte gegevens op te schonen en op te maken in een consistente indeling die geschikt is voor het insluiten en ophalen van gegevens.

parseren

Nadat u de juiste gegevensbronnen voor uw retriever-toepassing hebt geïdentificeerd, extraheert de volgende stap de vereiste informatie uit de onbewerkte gegevens. Dit proces, ook wel parseren genoemd, omvat het transformeren van de ongestructureerde gegevens in een indeling die de RAG-toepassing effectief kan gebruiken.

De specifieke parseringstechnieken en hulpprogramma's die u gebruikt, zijn afhankelijk van het type gegevens waarmee u werkt. Voorbeeld:

  • Tekstdocumenten (PDF's, Word-documenten): Bibliotheken buiten de plank, zoals ongestructureerde en PyPDF2 , kunnen verschillende bestandsindelingen verwerken en opties bieden voor het aanpassen van het parseringsproces.
  • HTML-documenten: HTML-parseringsbibliotheken zoals BeautifulSoup- en lxml- kunnen worden gebruikt om relevante inhoud uit webpagina's te extraheren. Deze bibliotheken kunnen u helpen door de HTML-structuur te navigeren, specifieke elementen te selecteren en de gewenste tekst of kenmerken te extraheren.
  • afbeeldingen en gescande documenten: OCR-technieken (Optical Character Recognition) zijn doorgaans vereist om tekst uit afbeeldingen te extraheren. Populaire OCR-bibliotheken zijn opensourcebibliotheken zoals Tesseract- of SaaS-versies zoals Amazon Textract-, Azure AI Vision OCR-en Google Cloud Vision-API.

Aanbevolen procedures voor het parseren van gegevens

Parseren zorgt ervoor dat gegevens schoon, gestructureerd en gereed zijn voor het insluiten van generatie en Vector Search. Houd bij het parseren van uw gegevens rekening met de volgende aanbevolen procedures:

  • Gegevens opschonen: de geëxtraheerde tekst vooraf verwerken om irrelevante of luidruchtige informatie te verwijderen, zoals kopteksten, voetteksten of speciale tekens. Beperk de hoeveelheid overbodige of verkeerd gevormde informatie die uw RAG-keten moet verwerken.
  • Afhandeling van fouten en uitzonderingen: Implementeer foutafhandeling en logboekregistratiemechanismen om eventuele problemen te identificeren en op te lossen tijdens het parseringsproces. Dit helpt u om problemen snel te identificeren en op te lossen. Dit wijst vaak op upstream-problemen met de kwaliteit van de brongegevens.
  • Aanpassing van parseringslogica: afhankelijk van de structuur en opmaak van uw gegevens, moet u mogelijk de parseringslogica aanpassen om de meest relevante informatie te extraheren. Hoewel het vooraf extra inspanning vereist, investeert u de tijd om dit indien nodig te doen, omdat vaak veel problemen met downstreamkwaliteit worden voorkomen.
  • De parseringskwaliteit evalueren: beoordeel regelmatig de kwaliteit van de geparseerde gegevens door handmatig een voorbeeld van de uitvoer te controleren. Dit kan u helpen bij het identificeren van eventuele problemen of gebieden voor verbetering in het parseringsproces.

Verrijking

Verrijk gegevens met aanvullende metagegevens en verwijder ruis. Hoewel verrijking optioneel is, kan het de algehele prestaties van uw toepassing drastisch verbeteren.

metagegevensextractie

Het genereren en extraheren van metagegevens die essentiële informatie over de inhoud, context en structuur van het document vastleggen, kan de kwaliteit en prestaties van een RAG-toepassing aanzienlijk verbeteren. Metagegevens bieden aanvullende signalen die de relevantie verbeteren, geavanceerde filters inschakelen en domeinspecifieke zoekvereisten ondersteunen.

Hoewel bibliotheken zoals LangChain en LlamaIndex ingebouwde parsers bieden waarmee automatisch gekoppelde standaardmetagegevens kunnen worden geëxtraheerd, is het vaak handig om dit aan te vullen met aangepaste metagegevens die zijn afgestemd op uw specifieke use-case. Deze aanpak zorgt ervoor dat kritieke domeinspecifieke informatie wordt vastgelegd, waardoor downstream ophalen en genereren wordt verbeterd. U kunt ook grote taalmodellen (LLM's) gebruiken om de uitbreiding van metagegevens te automatiseren.

Typen metagegevens zijn onder andere:

  • metagegevens op documentniveau: bestandsnaam, URL's, auteursinformatie, tijdstempels maken en wijzigen, GPS-coördinaten en documentversiebeheer.
  • metagegevens op basis van inhoud: Geëxtraheerde trefwoorden, samenvattingen, onderwerpen, benoemde entiteiten en domeinspecifieke tags (productnamen en categorieën zoals PII of HIPAA).
  • structurele metagegevens: sectiekoppen, inhoudsopgave, paginanummers en semantische inhoudsgrenzen (hoofdstukken of subsecties).
  • contextuele metagegevens: bronsysteem, opnamedatum, vertrouwelijkheidsniveau van gegevens, oorspronkelijke taal of transnationale instructies.

Het opslaan van metagegevens naast gesegmenteerde documenten of de bijbehorende insluitingen is essentieel voor optimale prestaties. Het helpt ook bij het verfijnen van de opgehaalde informatie en het verbeteren van de nauwkeurigheid en schaalbaarheid van uw toepassing. Daarnaast kan het integreren van metagegevens in hybride zoekpijplijnen, wat betekent dat men vectorvergelijking zoeken met trefwoordenfiltering combineert, de relevantie verbeteren, vooral bij grote datasets of specifieke zoekcriteria of scenario's.

deduplicatie

Afhankelijk van uw bronnen kunt u uiteindelijk dubbele documenten of bijna-duplicaten gebruiken. Als u bijvoorbeeld van een of meer gedeelde schijven gebruikt maakt, kunnen meerdere kopieën van hetzelfde document op verschillende locaties aanwezig zijn. Sommige van deze kopieën kunnen subtiele wijzigingen hebben. Op dezelfde manier bevat uw Knowledge Base mogelijk kopieën van uw productdocumentatie of conceptkopieën van blogberichten. Als deze duplicaten in uw verzameling blijven staan, kunt u eindigen met zeer redundante segmenten in uw uiteindelijke index die de prestaties van uw toepassing kunnen verminderen.

U kunt enkele duplicaten alleen elimineren met behulp van metagegevens. Als een item bijvoorbeeld dezelfde titel en aanmaakdatum heeft, maar meerdere vermeldingen uit verschillende bronnen of locaties, kunt u deze filteren op basis van de metagegevens.

Dit kan echter niet voldoende zijn. Als u dubbele waarden wilt identificeren en elimineren op basis van de inhoud van de documenten, kunt u een techniek gebruiken die bekend staat als lokaliteitsgevoelige hashing. Een techniek genaamd MinHash- werkt hier goed en er is al een Spark-implementatie beschikbaar in Spark ML-. Het werkt door een hash voor het document te maken op basis van de woorden die het bevat en kan vervolgens op efficiënte wijze duplicaten of bijna-duplicaten identificeren door deze hashes samen te voegen. Op zeer hoog niveau is dit een proces met vier stappen:

  1. Maak een functievector voor elk document. Overweeg, indien nodig, technieken toe te passen zoals stopwoordverwijdering, stemming en lemmatisatie om de resultaten te verbeteren en vervolgens te tokeniseren in n-grammen.
  2. Pas een MinHash-model aan en hash de vectoren met behulp van MinHash voor Jaccard afstand.
  3. Voer een gelijkenis-join uit met behulp van deze hashes om een resultatenreeks te produceren voor elk duplicaat of bijna-duplicaat document.
  4. Filter de duplicaten die u niet wilt behouden.

Met een stap voor ontdubbeling van de basislijn kunt u de documenten selecteren die willekeurig moeten worden bewaard (zoals de eerste stap in de resultaten van elke duplicaat of een willekeurige keuze tussen de duplicaten). Een mogelijke verbetering is om de 'beste' versie van het duplicaat te selecteren met behulp van andere logica (zoals meest recent bijgewerkt, publicatiestatus of meest gezaghebbende bron). Houd er ook rekening mee dat u mogelijk moet experimenteren met de featurization-stap en het aantal hash-tabellen dat in het MinHash-model wordt gebruikt om de overeenkomende resultaten te verbeteren.

Zie de Spark-documentatie voor lokaliteitsgevoelige hashingvoor meer informatie.

filteren

Sommige documenten die u in uw corpus opneemt, zijn mogelijk niet nuttig voor uw agent, omdat ze niet relevant zijn voor het doel, te oud of onbetrouwbaar zijn, of omdat ze problematische inhoud zoals schadelijke taal bevatten. Andere documenten bevatten mogelijk gevoelige informatie die u niet beschikbaar wilt maken via uw agent.

Overweeg daarom een stap in uw pijplijn op te nemen om deze documenten te filteren met behulp van metagegevens, zoals het toepassen van een toxiciteitsclassificatie op het document om een voorspelling te produceren die u als filter kunt gebruiken. Een ander voorbeeld is het toepassen van een persoonsgegevensdetectiealgoritmen (PII) op de documenten om documenten te filteren.

Ten slotte zijn alle documentbronnen die u invoert in uw agent mogelijke aanvalsvectoren voor slechte actoren om aanvallen op gegevensvergiftiging te starten. U kunt ook detectie- en filtermechanismen toevoegen om deze te identificeren en te elimineren.

segmenteren

Diagram van documentgegevens die worden gesegmenteerd voor de vectorindex.

Na het parseren van de onbewerkte gegevens in een meer gestructureerde indeling, het verwijderen van duplicaten en het filteren van ongewenste informatie, is de volgende stap het opsplitsen in kleinere, beheerbare eenheden die segmenten worden genoemd. Door grote documenten in kleinere, semantisch geconcentreerde segmenten te segmenteren, zorgt u ervoor dat opgehaalde gegevens in de context van de LLM passen, terwijl de opname van afleidende of irrelevante informatie wordt geminimaliseerd. De keuzes die zijn gemaakt op segmentering zijn rechtstreeks van invloed op de opgehaalde gegevens die de LLM biedt, waardoor het een van de eerste lagen van optimalisatie in een RAG-toepassing is.

Houd rekening met de volgende factoren bij het segmenteren van uw gegevens:

  • Segmenteringsstrategie: de methode die u gebruikt om de oorspronkelijke tekst te verdelen in segmenten. Dit kan betrekking hebben op basistechnieken zoals het splitsen op zinnen, alinea's, specifieke tekens/tokentellingen en meer geavanceerde documentspecifieke splitsingsstrategieën.
  • segmentgrootte: Kleinere segmenten kunnen zich richten op specifieke details, maar enige omringende contextuele informatie verliezen. Grotere segmenten kunnen meer context bieden, maar kunnen irrelevante informatie bevatten of rekenkundig duur zijn.
  • Overlapping tussen segmenten: Om ervoor te zorgen dat belangrijke informatie niet verloren gaat bij het splitsen van de gegevens in segmenten, kunt u overwegen om enige overlapping tussen aangrenzende segmenten op te nemen. Overlapping kan zorgen voor continuïteit en contextbehoud tussen segmenten en de resultaten van het ophalen verbeteren.
  • Semantische coherentie:, indien mogelijk, streven naar het creëren van semantisch samenhangende segmenten die gerelateerde informatie bevatten, maar kunnen onafhankelijk staan als een zinvolle teksteenheid. Dit kan worden bereikt door rekening te houden met de structuur van de oorspronkelijke gegevens, zoals alinea's, secties of onderwerpgrenzen.
  • Metagegevens:Relevante metagegevens, zoals de naam van het brondocument, de sectiekop of productnamen, kan het ophalen verbeteren. Deze aanvullende informatie kan helpen om ophaalquery's met segmenten te laten overeenkomen.

Strategieën voor gegevenssegmentering

Het vinden van de juiste segmenteringsmethode is zowel iteratief als contextafhankelijk. Er is geen universele benadering. De optimale segmentgrootte en -methode zijn afhankelijk van de specifieke use case en de aard van de gegevens die worden verwerkt. In grote lijnen kunnen segmenteringsstrategieën als volgt worden weergegeven:

  • Segmentering met vaste grootte: Splits de tekst in segmenten van een vooraf bepaalde grootte, zoals een vast aantal tekens of tokens (bijvoorbeeld LangChain CharacterTextSplitter). Hoewel splitsen op basis van een willekeurig aantal tekens of tokens snel en eenvoudig kan worden ingesteld, resulteert dit meestal niet in consistent semantisch samenhangende segmenten. Deze benadering werkt zelden voor toepassingen op productieniveau.
  • Chunking op basis van alinea's: gebruik de natuurlijke alineagrenzen in de tekst om delen te definiëren. Met deze methode kunt u de semantische samenhang van de segmenten behouden, omdat alinea's vaak gerelateerde informatie bevatten (bijvoorbeeld LangChain RecursiveCharacterTextSplitter).
  • Indelingsspecifieke segmentering: Indelingen zoals Markdown of HTML hebben een inherente structuur waarmee segmentgrenzen (bijvoorbeeld Markdown-headers) kunnen worden gedefinieerd. Hulpprogramma's zoals MarkdownHeaderTextSplitter of op HTML-header/- en section-gebaseerde splitters kunnen hiervoor worden gebruikt.
  • semantische segmentering: technieken zoals onderwerpmodellering kunnen worden toegepast om semantische coherente secties in de tekst te identificeren. Deze benaderingen analyseren de inhoud of structuur van elk document om de meest geschikte segmentgrenzen te bepalen op basis van onderwerpverschuivingen. Hoewel meer betrokken zijn dan basismethoden, kan semantische segmentering helpen bij het maken van segmenten die meer zijn uitgelijnd met de natuurlijke semantische delen in de tekst (zie bijvoorbeeld LangChain SemanticChunker).

Voorbeeld: Segmentering met een vaste grootte

Afbeelding van een voorbeeld van de verdeling van een document in stukken van vaste grootte.

Voorbeeld van segmentering met vaste grootte met behulp van RecursiveCharacterTextSplitter van LangChain met chunk_size=100 en chunk_overlap=20. ChunkViz biedt een interactieve manier om te visualiseren hoe verschillende segmentgroottes en overlapwaarden van segmenten met Langchain's karaktersplitsers invloed hebben op de resulterende segmenten.

insluiten

Diagram van hoe gegevenssegmenten worden gevectoriseerd op basis van semantische betekenis.

Na het segmenteren van uw gegevens is de volgende stap het converteren van de tekstsegmenten naar een vectorweergave met behulp van een insluitmodel. Een insluitmodel converteert elke tekstsegment naar een vectorweergave die de semantische betekenis vastlegt. Door segmenten weer te geven als compacte vectoren, kunnen insluitingen snel en nauwkeurig de meest relevante segmenten ophalen op basis van hun semantische gelijkenis met een ophaalquery. De ophaalquery wordt op het moment van de query getransformeerd met hetzelfde embeddermodel dat wordt gebruikt om segmenten te embedden in de gegevenspijplijn.

Houd rekening met de volgende factoren bij het selecteren van een insluitmodel:

  • modelkeuze: Elk insluitmodel heeft nuances en de beschikbare benchmarks kunnen mogelijk niet de specifieke kenmerken van uw gegevens vastleggen. Het is van cruciaal belang om een model te selecteren dat is getraind op vergelijkbare gegevens. Het kan ook nuttig zijn om alle beschikbare insluitingsmodellen te verkennen die zijn ontworpen voor specifieke taken. Experimenteer met verschillende kant-en-klare insluitingsmodellen, zelfs modellen die lager kunnen worden gerangschikt op standaard leaderboards zoals MTEB. Enkele voorbeelden om rekening mee te houden:
  • Maximumtokens: De maximale tokenlimiet voor het gekozen insluitingsmodel kennen. Als u segmenten doorgeeft die deze limiet overschrijden, worden ze afgekapt, waardoor belangrijke informatie mogelijk verloren gaat. bge-large-en-v1.5 heeft bijvoorbeeld een maximumtokenlimiet van 512.
  • modelgrootte: grotere insluitingsmodellen presteren over het algemeen beter, maar vereisen meer rekenresources. Op basis van uw specifieke use case en beschikbare resources moet u de prestaties en efficiëntie van elkaar afwegen.
  • Verfijnen: Als uw RAG-toepassing te maken heeft met domeinspecifieke taal (zoals interne bedrijfscroniemen of terminologie), kunt u overwegen om het insluitmodel op domeinspecifieke gegevens af te stemmen. Dit kan het model helpen de nuances en terminologie van uw specifieke domein beter vast te leggen en kan vaak leiden tot verbeterde ophaalprestaties.

indexering en opslag

De volgende stap in de pijplijn bestaat uit het maken van indexen voor de insluitingen en de metagegevens die in de vorige stappen zijn gegenereerd. Deze fase omvat het organiseren van high-dimensionale vector embeddings in efficiënte gegevensstructuren die snelle en nauwkeurige overeenkomsten mogelijk maken.

Mozaïek AI Vector Search maakt gebruik van de nieuwste indexeringstechnieken wanneer u een eindpunt en index voor vectorzoekopdrachten implementeert om snelle en efficiënte zoekacties voor uw vectorzoekquery's te garanderen. U hoeft zich geen zorgen te maken over het testen en kiezen van de beste indexeringstechnieken.

Nadat uw index is gebouwd en geïmplementeerd, kunt u deze opslaan in een systeem dat schaalbare query's met lage latentie ondersteunt. Gebruik voor productie RAG-pijplijnen met grote gegevenssets een vectordatabase of schaalbare zoekservice om lage latentie en hoge doorvoer te garanderen. Sla aanvullende metagegevens op naast insluitingen om efficiënt filteren mogelijk te maken tijdens het ophalen.