Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Tools & Frameworks

Semantisch chunken

Semantisch chunken knipt lange documenten in stukken op de plekken waar het onderwerp verandert, zodat een AI-assistent die erin zoekt hele passages vindt.

Ook bekend als: semantic splitting, SemanticChunker, semantisch chunken

Semantisch chunken knipt lange documenten in stukken die elk over één onderwerp gaan, voordat een AI-assistent erin zoekt. Zo'n assistent leest niet bij elke vraag je hele handboek: hij zoekt de paar stukken op die bij de vraag passen. Houdt een stuk halverwege een regel op, dan kan de assistent juist het belangrijke deel missen. Semantisch chunken legt de knip waar het onderwerp verandert.

Hoe werkt het?

Een RAG-systeem knipt documenten in stukken (chunks), zet elk stuk om in een embedding en haalt de stukken op die qua betekenis het dichtst bij de vraag liggen. De eenvoudigste splitter knipt na een vast aantal tokens of tekens, vaak met wat overlap tussen naburige stukken.

Semantisch chunken in enge zin komt uit de tutorial 5 Levels of Text Splitting van Greg Kamradt, een video uit januari 2024 met een notebook:

  1. Knip de tekst in zinnen.
  2. Maak van elke zin samen met zijn buren een embedding, een venster van drie zinnen.
  3. Bereken de cosinusafstand tussen elk venster en het volgende.
  4. Begin een nieuw stuk waar de afstand boven het 95e percentiel van alle afstanden ligt. Dat percentiel is de enige parameter om bij te stellen.

LlamaIndex nam de methode over als SemanticSplitterNodeParser, en LangChain als SemanticChunker. Bredere varianten knippen bij kopjes en alinea's, groeperen zinnen met vergelijkbare embeddings ook als ze niet naast elkaar staan, of laten een taalmodel de knippunten kiezen.

Vindt het beter terug?

De metingen zijn wisselend:

  • Qu e.a. (Vectara, oktober 2024) vergeleken stukken van vaste grootte met twee semantische chunkers bij het terugvinden van documenten, het terugvinden van bewijszinnen en het genereren van antwoorden. Semantisch chunken hielp bij kunstmatig aan elkaar geplakte documenten met veel onderwerpen, maar op datasets die echte documenten beter weerspiegelen, deden stukken van vaste grootte het vaak beter. De extra rekenkosten werden niet gerechtvaardigd door consequente winst, en de kwaliteit van de embeddings woog vaak zwaarder dan de manier van knippen.
  • In de evaluatie van Chroma (juli 2024) verschilden strategieën tot 9% in recall, het aandeel van de relevante tekst dat het zoeken terugvindt. De chunker van Kamradt scoorde met standaardinstellingen iets onder het gemiddelde, met een recall van 83,6% en stukken van gemiddeld zo'n 660 tokens. Een eenvoudige recursieve splitter met stukken van 200 tokens zonder overlap presteerde steeds goed. De hoogste recall kwam van twee nieuwe methoden: een chunker die kleine stukjes tekst groepeert op overeenkomst in embeddings (91,3%) en een die GPT-4o laat bepalen waar geknipt wordt (91,9%).
  • De eenheid die je indexeert, telt op zichzelf. In Dense X Retrieval (Chen e.a., 2023) vond indexeren op korte, op zichzelf staande uitspraken (proposities) beter terug dan indexeren op passages.

Waar gaat het mis?

  • Kosten. Elk zinsvenster heeft een embedding nodig voordat er iets geïndexeerd is, en een LLM-chunker vraagt om modelaanroepen: volgens Chroma kan zijn LLM-chunker tientallen minuten over een corpus doen.
  • Afstellen. LlamaIndex waarschuwt dat het opsplitsen in zinnen vooral voor Engels werkt en dat de percentieldrempel misschien moet worden bijgesteld.
  • Geen grip op de grootte. De drempel is relatief, een percentiel van alle afstanden, dus je stelt de lengte van een stuk niet zelf in. Chroma merkt op dat dit in grotere corpora tot grotere stukken kan leiden, terwijl elk stuk nog moet passen in wat het embeddingmodel aankan.
  • Geen algemeen antwoord. Kamradt schrijft zelf dat succes per domein verschilt en dat je chunking moet testen met evaluaties van het terugvinden.

Voorbeeld

Stel: een accountantskantoor zet zijn algemene voorwaarden in een AI-assistent. Een splitter die elke 300 woorden knipt, eindigt een stuk midden in het artikel over te late betaling, waardoor het rentepercentage in het volgende stuk belandt. Een vraag over rente op te late facturen vindt dan misschien de helft zonder het percentage. Een splitter die de artikelkoppen volgt, houdt het artikel bij elkaar, en een semantische splitter ook als de onderwerpwissel boven zijn drempel uitkomt. Welke aanpak op de eigen documenten van het kantoor beter terugvindt, test je met echte vragen van klanten.