Bij het werken met tekstdata in documentverwerkingssystemen is de eerste uitdaging vaak het extraheren van de tekst uit verschillende bestandsformaten. Voor dit doel zijn er verschillende Python-bibliotheken beschikbaar die kunnen helpen bij het extraheren van tekst uit documenten, zoals PyPDF2, MarkItDown en Docling. Deze tools bieden verschillende manieren om gegevens te extraheren, afhankelijk van het bestandsformaat en de complexiteit van de documenten. Elk van deze tools heeft zijn eigen sterktes en zwaktes, afhankelijk van de aard van de documenten waarmee we werken.

PyPDF2 is bijvoorbeeld een populaire keuze voor het extraheren van tekst uit PDF-bestanden. Deze bibliotheek is eenvoudig te implementeren en ondersteunt meerdere besturingssystemen, zoals Windows, MacOS en Linux. Voor eenvoudige documenten, zoals vergadernotulen van de Federal Reserve Open Market Committee, is PyPDF2 prima geschikt, omdat deze documenten meestal geen grafieken of complexe lay-out bevatten. Het proces van het extraheren van tekst uit een PDF met PyPDF2 is relatief simpel: je opent het bestand in binaire modus, maakt een PDF-lezer-object aan, en haalt vervolgens de tekst van elke pagina op.

MarkItDown daarentegen, ontwikkeld door Microsoft, biedt een breder scala aan mogelijkheden voor het omzetten van verschillende bestandstypen naar Markdown. Het ondersteunt een breed scala aan formaten, van PDF en PowerPoint tot audio- en beeldbestanden. Het is vooral handig voor documentindexering en toepassingen die gebruik maken van Large Language Models (LLM’s). Dit maakt het een uitstekende keuze voor bedrijven die met diverse formaten werken en een gestandaardiseerde manier van documentverwerking nodig hebben.

Docling is een geavanceerder hulpmiddel dat, ontwikkeld door IBM Research, in staat is om documenten in verschillende formaten te analyseren en om te zetten. Het biedt krachtige mogelijkheden voor documentbegrip, inclusief ondersteuning voor opmaak, tabellen en lay-outanalyse in PDF-bestanden. Met Docling kunnen we complexe documenten efficiënt verwerken, waarbij de documentstructuur behouden blijft, wat essentieel is voor toepassingen die afhankelijk zijn van het behoud van de context van een document.

Zodra de tekst is geëxtraheerd, is het echter vaak nog niet in een bruikbare vorm voor verdere verwerking. Bijvoorbeeld, wanneer we tekst extraheren uit een lang PDF-document, kan de resulterende tekst een enorme hoeveelheid gegevens bevatten, soms samengevoegd in één gigantische string. Dit is problematisch voor toepassingen zoals Large Language Models (LLM), omdat deze modellen vaak niet effectief kunnen omgaan met zulke grote hoeveelheden ongestructureerde tekst. De oplossing voor dit probleem is chunking – het opdelen van de tekst in kleinere, beheersbare delen.

Chunking kan op verschillende manieren worden uitgevoerd, afhankelijk van het type data en het gewenste resultaat. De meest eenvoudige en veelgebruikte methode is fixed-size chunking, waarbij we de tekst opdelen in stukken van een vast aantal tokens. Dit kan nuttig zijn wanneer we snel willen werken en geen bijzondere contextbewuste methoden nodig hebben. Bij deze benadering kan het handig zijn om een kleine overlap tussen de stukken te behouden, zodat de semantische context tussen de chunks niet verloren gaat.

Een meer geavanceerde aanpak is content-aware chunking, waarbij we natuurlijke grenzen binnen de tekst zoeken, zoals zinnen of alinea’s. Dit zorgt ervoor dat elk stuk tekst een volledige gedachte of idee bevat, wat het gemakkelijker maakt voor een LLM om de inhoud effectief te begrijpen. Tools zoals NLTK en spaCy kunnen helpen bij het splitsen van tekst op een manier die de betekenis behoudt, zelfs als de tekst wordt opgeknipt.

Recursive chunking gaat nog verder door de tekst op een hiërarchische manier te verdelen, waarbij telkens kleinere stukken worden geëxtraheerd met behulp van een set scheidingstekens. Dit is een iteratief proces dat ervoor zorgt dat de tekst logisch en coherent blijft, zelfs wanneer deze verder wordt opgesplitst.

De meest geavanceerde vorm van chunking is context-aware chunking, waarbij de omringende context van elk stuk tekst wordt meegenomen om ervoor te zorgen dat de betekenis van het stuk behouden blijft. Hierbij worden technieken zoals semantic chunking gebruikt, waarbij de tekst wordt opgesplitst op basis van de semantische inhoud. Dit zorgt ervoor dat elk chunk betrekking heeft op een specifiek onderwerp of thema, wat de prestaties van een LLM aanzienlijk kan verbeteren.

Een van de belangrijkste redenen waarom chunking van cruciaal belang is, is dat het de prestaties van LLM’s beïnvloedt. Zonder goede chunking kan de kwaliteit van de gegenereerde output sterk verminderen, omdat de modellen dan geen volledig begrip van de tekst kunnen krijgen. Dit toont aan hoe belangrijk de data zelf is voor de prestaties van AI-modellen, zelfs voor krachtige modellen zoals foundation LLM’s. De manier waarop we onze data verwerken – in dit geval door chunking – heeft invloed op hoe goed het model in staat is om op die data te reageren.

Wanneer de tekst eenmaal correct is opgesplitst, kan deze efficiënt worden doorgegeven aan een LLM, en dit is waar de technologische toepassing die bekend staat als Retrieval Augmented Generation (RAG) zijn intrede doet. RAG is een krachtige benadering waarbij LLM’s worden versterkt met actuele en private gegevens. Omdat LLM’s vaak getraind zijn op verouderde publieke gegevens, is het noodzakelijk om actuele gegevens toe te voegen voor specifieke domeinen, zoals bedrijfsrapporten, om de modelantwoorden relevant en accuraat te maken. In de praktijk houdt dit in dat we de relevante chunk van de tekst, bijvoorbeeld een bedrijfsrapport, eerst extraheren en chunken voordat we deze doorgeven aan het model voor verdere verwerking.

RAG biedt enorme voordelen voor bedrijfsomgevingen, omdat het bedrijven in staat stelt om snel en accuraat antwoorden te genereren op basis van hun eigen interne gegevens. Dit kan bijvoorbeeld gebruikt worden voor kennisbeheer binnen bedrijven, waarbij LLM’s de mogelijkheid hebben om antwoord te geven op vragen door informatie te putten uit verschillende interne bronnen, zoals documenten, databases en communicatiekanalen.

Hoe beperkingen van RAG-systemen kunnen worden overwonnen bij het genereren van lange inhoud

In de afgelopen jaren heeft het gebruik van retrieval-augmented generation (RAG) systemen nieuwe mogelijkheden geboden voor het verbeteren van de kwaliteit en de relevantie van gegenereerde tekst. Desondanks blijven er aanzienlijke beperkingen bestaan bij de toepassing van deze systemen, vooral met betrekking tot het herschikken van documenten en het omgaan met grote hoeveelheden tekst. Recente onderzoeken hebben nieuwe inzichten verschaft over de kritieke beperkingen van belangrijke technieken die in RAG-systemen worden gebruikt, vooral wat betreft het herwaarderen van documenten. De belangrijkste tekortkomingen omvatten het vervallen rendement, slechte documentdifferentiatie en inconsistenties in prestaties, afhankelijk van het aantal verwerkte documenten.

Het vervallen rendement verwijst naar de degradatie van de prestaties naarmate het aantal documenten (K) toeneemt, wat soms resulteert in slechtere prestaties dan basisretrievers wanneer grote datasets worden verwerkt. Daarnaast kunnen herschikkers vaak worden misleid door irrelevante documenten, wat leidt tot het toekennen van hoge scores aan inhoud die slechts minimaal relevant is voor de zoekopdracht. Bovendien kunnen inconsistenties optreden, waarbij de prestaties en de relatieve rangschikking tussen verschillende herschikkers aanzienlijk kunnen variëren, afhankelijk van het aantal documenten dat wordt verwerkt. Deze beperkingen zijn niet verrassend gezien de status van RAG als een relatief nieuw en evoluerend toepassingsparadigma, maar ze bieden tegelijkertijd kansen voor verdere ontwikkeling en verbetering van deze technologie.

Ondanks deze uitdagingen blijft RAG de meest prominente implementatie van Large Language Model-Based Applications (LLMBAs), wat niet alleen de uitdagingen vergroot, maar ook de mogelijkheid biedt om waarde toe te voegen door deze problemen te begrijpen en op te lossen. Voor gebruikers die diepgaandere technieken en architecturen nodig hebben, kunnen aanvullende bronnen nuttig zijn om verder te verkennen.

Een belangrijk aspect van het toepassen van RAG-systemen is het concept van content chunking met contextual linking. Deze techniek is een effectieve manier om lange inhoud te verwerken door het op te splitsen in kleinere, beter beheersbare secties, terwijl de context tussen de secties behouden blijft. Dit maakt het mogelijk om lange, samenhangende teksten te genereren ondanks de inherente beperkingen van de contextgrootte en het aantal uitvoerbare tokens van de modellen. Dit stelt RAG-systemen in staat om niet alleen grote hoeveelheden informatie te verwerken, maar ook om te zorgen voor samenhang in de gegenereerde tekst.

Het proces van content chunking met contextual linking omvat verschillende stappen die zorgvuldig moeten worden uitgevoerd om de coherentie van de inhoud te waarborgen. Ten eerste wordt de inhoud opgedeeld in kleinere stukken die elk afzonderlijk kunnen worden verwerkt. Dit maakt het mogelijk om per chunk een gedetailleerd en volledig antwoord te genereren, zonder de beperking van de contextgrootte van het model. Vervolgens wordt voor elke chunk de context van de vorige stukken gekoppeld, zodat de output van het model consistent blijft en de tekst logisch in elkaar overgaat. Door gebruik te maken van dynamische promptparameters wordt de relevantie van de context behouden bij het genereren van de inhoud per chunk.

Deze techniek biedt niet alleen een oplossing voor de beperkingen die gepaard gaan met contextgrootte en de beperking van het aantal uitvoerbare tokens, maar stelt ook in staat om lange, samenhangende inhoud te genereren. Dit wordt gerealiseerd door de afzonderlijke output van elke chunk samen te voegen tot een langer rapport of artikel, waarbij de samenhang behouden blijft. Het gebruik van slimme chunkingstrategieën is cruciaal bij het omgaan met de beperkingen van RAG-systemen, vooral wanneer men te maken heeft met grote hoeveelheden complexe gegevens, zoals bijvoorbeeld bedrijfsrapporten zoals een 10-K.

Het is belangrijk om te begrijpen dat het succes van deze aanpak niet alleen afhankelijk is van de techniek van chunking, maar ook van hoe de context tussen de verschillende stukken wordt onderhouden. Zonder een solide structuur voor het bijhouden van de context kunnen de gegenereerde teksten gemakkelijk incoherent worden. Daarom wordt bij het implementeren van deze technieken altijd een basissjabloon voor de prompt gebruikt, waarin de rol van het model, de context, de instructies en de specifieke eisen voor de uitvoer duidelijk worden gedefinieerd. Dit zorgt ervoor dat het model consistent blijft in zijn output, zelfs wanneer de tekst in kleinere delen wordt verwerkt.

Een voorbeeld van het implementeren van deze techniek is het genereren van een lang rapport op basis van een 10-K, waarin de inhoud in chunks wordt opgesplitst en elke chunk afzonderlijk wordt verwerkt. Nadat alle chunks zijn verwerkt, worden de antwoorden gecombineerd om een samenhangend rapport te creëren. Dit proces maakt gebruik van langchain, een populaire tool voor het implementeren van tekstverwerkingsstrategieën die de tekst opdeelt in tokens en tegelijkertijd zorgt voor het behoud van de context.

Het proces begint met het splitsen van de inhoud in beheersbare stukken, met behulp van een CharacterTextSplitter die de tekst in tokens verdeelt. Elke chunk krijgt een dynamische prompt die zowel de inhoud van de chunk zelf als de context van de voorafgaande chunks omvat. Het model genereert vervolgens de output op basis van deze prompt, waarbij het de relevantie van de context bewaakt. De output van elke chunk wordt vervolgens gecombineerd om de uiteindelijke lange inhoud te vormen, waarbij de limieten van uitvoerbare tokens van het model worden omzeild, zonder concessies te doen aan de samenhang van de tekst.

In dit proces is de rol van contextbeheer cruciaal. Wanneer de context tussen de verschillende chunks niet effectief wordt behouden, kunnen de gegenereerde teksten als onsamenhangend worden ervaren. De techniek van content chunking met contextual linking biedt hier een krachtige oplossing, waarmee RAG-systemen lange en complexe teksten kunnen genereren die zowel coherent als inhoudelijk rijk zijn.

Naast het behoud van context en het chunkingproces zelf, is het belangrijk om te erkennen dat de prestaties van RAG-systemen verder kunnen worden geoptimaliseerd door de juiste balans te vinden tussen de hoeveelheid documenten die worden verwerkt en de efficiëntie van het herschikken. RAG-systemen moeten dus voortdurend worden geëvalueerd en verbeterd, vooral naarmate de datasets groter en complexer worden.

Wat zijn de belangrijkste risicofactoren en marktrisico's voor Apple volgens de jaarverslagen?

Het Formulier 10-K, ingediend bij de Amerikaanse Securities and Exchange Commission, biedt een gedetailleerde blik op de financiële gezondheid van Apple Inc. Het document bevat uitgebreide informatie over de verschillende risicofactoren die de bedrijfsvoering van het bedrijf kunnen beïnvloeden, evenals marktrisico’s die van invloed kunnen zijn op de toekomstige prestaties. De analyse richt zich met name op de belangrijkste risicofactoren die de winstgevendheid en de marktwaarde van Apple beïnvloeden.

Een van de voornaamste risicofactoren is de afhankelijkheid van derde partij ontwikkelaars voor het succes van Apple. De beperkte marktaandelen van Apple in de smartphone-, personal computer- en tabletmarkten, vergeleken met concurrenten als Android en Windows, maken het moeilijk voor Apple om volledig op interne software te vertrouwen. Dit vergroot de kans dat ontwikkelaars zich meer richten op andere platforms, wat kan leiden tot een verminderde kwaliteit en kwantiteit van apps voor Apple’s ecosystemen. Hierdoor kan de klanttevredenheid en uiteindelijk de verkoop van Apple-apparaten worden beïnvloed. Dit risico vereist een voortdurende monitoring van ontwikkelaars en de appkwaliteit op concurrerende platforms. Bij een verschuiving van de ontwikkelaarsfocus weg van iOS zou dit een negatief signaal voor de markt kunnen zijn.

Daarnaast zijn de dynamiek van de App Store en de afhankelijkheid van digitale contentleveranciers cruciale aandachtspunten. De commissie die Apple via de App Store ontvangt, is onderhevig aan wijzigingen door wet- en regelgeving zoals de Digital Markets Act in de EU. Deze veranderingen kunnen een aanzienlijke invloed hebben op de inkomsten van Apple. Het monitoren van de ontwikkelingen rondom de regelgeving en hun impact op de omzet van de App Store is essentieel. Het niet kunnen verkrijgen van aantrekkelijke content kan bovendien de gebruikersbetrokkenheid en de omzet van Apple’s diensten negatief beïnvloeden. Daarom is het van belang om het succes van Apple’s eigen originele contentinitiatieven te volgen en de voortgang van contractverlengingen met derde partijen goed in de gaten te houden.

Naast deze externe risico’s speelt de bedrijfsvoering van Apple zelf ook een belangrijke rol. Het toenemende onderzoeks- en ontwikkelingsbudget kan op korte termijn de winstgevendheid verminderen, hoewel het op lange termijn kan bijdragen aan de technologische vooruitgang van het bedrijf. De geografische concentratie van Apple’s verkoop in landen als de Verenigde Staten en China maakt het bedrijf kwetsbaar voor fluctuaties in deze markten. Een zwakte in de Chinese markt of een stagnatie in de verkoop van iPhones kan de financiële prestaties van Apple sterk beïnvloeden. Een ander risico dat niet over het hoofd gezien mag worden, betreft de interne controle en het belastingbeleid. Apple heeft aanzienlijke onzekerheden met betrekking tot belastingposities, waarvan een groot deel ($22 miljard) ongerealiseerd is. Dit kan een aanzienlijke impact hebben op de financiële resultaten van Apple, vooral als er wijzigingen in belastingwetten of ongunstige belastinguitspraak plaatsvinden.

Er is ook aandacht voor de bredere macro-economische factoren die de bedrijfsvoering van Apple beïnvloeden. De wereldwijde economische onzekerheid, evenals de fluctuerende wisselkoersen, kunnen de verkoop en winstgevendheid beïnvloeden. De afstemming van Apple op de wereldwijde toeleveringsketens, met name in Azië, is ook een kritiek punt. De afhankelijkheid van enkele belangrijke leveranciers voor specifieke onderdelen vergroot de kwetsbaarheid voor verstoringen in de toeleveringsketen, zoals politieke of economische veranderingen in belangrijke regio's.

Hoewel Apple een sterke liquiditeitspositie behoudt en een robuust kapitaalretourprogramma heeft, blijft het belangrijk om de marktrisico's nauwgezet te volgen. Specifieke marktrisico’s, zoals veranderingen in de App Store-regels, fluctuerende ontwikkelaarsactiviteiten en onzekere belastingpositie, moeten voortdurend worden geëvalueerd om te beoordelen hoe deze factoren de toekomstige prestaties van Apple kunnen beïnvloeden. Hoewel het bedrijf goed gepositioneerd is om zijn activiteiten voort te zetten, kunnen onvoorziene gebeurtenissen en veranderingen in de marktomstandigheden het potentieel hebben om de stabiliteit van het bedrijf te beïnvloeden.

Naast deze risicofactoren moeten ook de interne processen van Apple, zoals de beheersing van de personeelsomzet en de afhankelijkheid van leveranciers, in de gaten worden gehouden. Deze interne risico’s kunnen net zo invloedrijk zijn als externe marktomstandigheden. Vooral in een snel veranderende technologische wereld is het cruciaal dat Apple zijn interne controlemechanismen en risicomanagementsystemen blijft verbeteren.

Wat is de rol van chunking en frameworks in het verbeteren van LLM-prestaties?

Het gebruik van Language Learning Models (LLM’s) om grote hoeveelheden gegevens te verwerken, heeft onmiskenbare voordelen, maar er zijn aanzienlijke uitdagingen in de manier waarop deze modellen omgaan met complexe informatie. Een van de belangrijkste overwegingen is hoe we deze gegevens splitsen en structureren om de prestaties van het model te optimaliseren. Hier komt de zogenaamde chunking-strategie in beeld, een cruciaal onderdeel van het proces dat de kwaliteit van de resultaten kan beïnvloeden. Dit artikel bespreekt hoe chunking, samen met frameworks zoals Langchain en LlamaIndex, de efficiëntie van informatieverwerking in RAG (Retrieval-Augmented Generation) systemen kan verbeteren, en hoe de keuze van een chunking-strategie de uiteindelijke prestatie van het model bepaalt.

De basis van chunking is relatief eenvoudig: het betreft het opdelen van een tekst in kleinere secties, die vervolgens door een LLM kunnen worden verwerkt zonder de limieten van het tokenaantal te overschrijden. Dit lijkt een simpele taak, maar het is een gebied van intensief onderzoek. Verschillende chunking-technieken, zoals de semantische chunking benadering, kunnen het begrip van de tekst aanzienlijk verbeteren door te zorgen dat elk stuk inhoud betekenisvol is en een logische samenhang behoudt. Het model heeft dan minder moeite om de informatie te verwerken en kan sneller en accurater antwoorden genereren. Een voorbeeld hiervan is het gebruik van een Contextual Retrieval techniek, ontwikkeld door Anthropic. Hierbij wordt een LLM zelf gebruikt om de context per chunk te genereren voordat beide elementen samen aan de LLM worden gepresenteerd. Dit biedt een significante verbetering in de retrieval-capaciteiten en de kwaliteit van de output.

De keuze van een chunking-strategie is echter niet altijd eenvoudig. Het gebruik van een brute force aanpak waarbij simpelweg de tekst in gelijke delen wordt gesplitst, kan leiden tot verwarring en verlies van belangrijke context. Dit risico is vooral relevant wanneer gedeelten van de tekst die belangrijke verbanden bevatten, worden verdeeld over meerdere chunks. Alternatief kunnen meer geavanceerde methoden, zoals semantisch chunking, de coherentie van de tekst behouden en de leesbaarheid verbeteren. Het implementeren van semantisch chunking vereist echter een zorgvuldige preprocessing, waarbij de tekst op de juiste manier moet worden geanalyseerd en verdeeld.

Het concept van chunking is slechts één van de vele elementen die de prestaties van een LLM beïnvloeden. De keuze van het model, de parametrisatie en de prompt-template spelen allemaal een cruciale rol. Wanneer een systeem moet worden geëvalueerd, is het vaak eenvoudiger om te schakelen tussen verschillende modellen van uiteenlopende grootte en oorsprong. Het testen van verschillende chunking-strategieën daarentegen is veel complexer, gezien de enorme variëteit aan mogelijke combinaties van tekstindelingen en benaderingen.

Langchain en LlamaIndex zijn twee populaire open-source frameworks die het mogelijk maken snel RAG-systemen te prototypen. Ze bieden een hogere mate van abstractie door verschillende onderliggende concepten samen te brengen, zoals het gebruik van vector-databases en de integratie van LLM’s voor documentretrieval. Door deze frameworks te gebruiken, kunnen ontwikkelaars efficiënter werken, maar dit mag niet afleiden van de noodzaak om de onderliggende concepten te begrijpen. Het gebruik van zulke tools zonder de basisprincipes te begrijpen kan leiden tot suboptimale resultaten.

Langchain en LlamaIndex bieden bijvoorbeeld handige methoden om verschillende bestandstypen te parseren, zoals PDF’s, PowerPoint-presentaties of Excel-bestanden. Deze tools maken het eenvoudig om documenten te laden en op te slaan in een vector-database, waarna ze met behulp van een LLM kunnen worden doorzocht. Het nadeel van dergelijke frameworks is dat ze de complexe details van de onderliggende technologie maskeren. Het is daarom raadzaam om eerst de basisconcepten van RAG en chunking goed te begrijpen voordat men overstapt op deze abstracte niveaus van ontwikkeling.

Er is bovendien een groeiende discussie over de effectiviteit van lange-contextmodellen (LCM’s), die mogelijk de noodzaak voor RAG-systemen overbodig maken. Het idee is dat, met steeds krachtiger wordende LLM’s, we wellicht grote hoeveelheden tekst, zoals een heel boek, in één keer kunnen invoeren zonder de noodzaak voor chunking of andere voorbereidende stappen. Hoewel de technologie in ontwikkeling is, heeft onderzoek aangetoond dat LCM’s zowel voordelen als nadelen hebben. Aan de ene kant kunnen ze prestaties verbeteren door een grotere hoeveelheid informatie tegelijkertijd te verwerken. Aan de andere kant vergt deze aanpak veel meer rekenkracht, wat de kosten verhoogt.

Wat betreft de kosten-batenanalyse tussen RAG en LCM, is RAG vaak een kosteneffectiever alternatief. Het vereist minder rekenkracht doordat het de hoeveelheid tokens die aan de LLM worden gevoed minimaliseert, wat resulteert in lagere kosten. De prestaties kunnen echter verminderen in vergelijking met LCM’s, die de volledige context binnen een groter venster kunnen begrijpen en gebruiken. De uitdaging ligt dan ook in het vinden van de juiste balans tussen kosten en prestaties.

De keuze van de juiste techniek is dus afhankelijk van de specifieke behoeften van de gebruiker. Het is niet eenvoudig om te zeggen dat de ene benadering altijd beter is dan de andere; het hangt af van de grootte van de documenten, de complexiteit van de vraagstellingen en de benodigde snelheid van de verwerking. Hoewel LCM’s veelbelovend zijn, is het de taak van de ontwikkelaar om te beslissen welke benadering het beste aansluit bij de specifieke eisen van hun toepassing.