Semantic Chunking
Semantisches Chunking teilt Dokumente an Stellen auf, an denen sich das Thema ändert. Die Änderungen werden anhand der Ähnlichkeit der Embeddings benachbarter Sätze gemessen, damit jeder Abschnitt einen Gedanken enthält.
Semantisches Chunking unterteilt Dokumente für Retrieval-Augmented Generation (RAG) und Suchanwendungen an den Stellen, an denen sich das Thema ändert. Diese Stellen werden durch den Vergleich der Embeddings benachbarter Sätze ermittelt, statt alle festen Zeichen- oder Token-Abstände zu verwenden. Jeder Abschnitt behandelt dann eine Idee. Sein einzelner Vektor in der Vektordatenbank bildet diese Idee gut ab, und ein abgerufener Abschnitt liefert dem Sprachmodell (LLM) einen vollständigen Gedanken statt des Endes eines Abschnitts und des Anfangs des nächsten.
So funktioniert semantisches Chunking#
Der verbreitete Algorithmus wurde durch Greg Kamradts Anleitungen zur Textaufteilung bekannt und als SemanticChunker in LangChain implementiert. Er umfasst vier Schritte. Der Text wird in Sätze aufgeteilt, und jeder Satz wird eingebettet – oft zusammen mit benachbarten Sätzen, um Rauschen zu glätten. Die Kosinusähnlichkeit jedes aufeinanderfolgenden Satzpaars wird in einen Abstand umgerechnet. Ein Schwellenwert markiert Trennstellen, an denen der Abstand ungewöhnlich groß ist. LangChain verwendet standardmäßig das 95. Perzentil aller Abstände im Dokument und bietet außerdem Schwellenwerte auf Basis der Standardabweichung, des Interquartilsabstands und des Gradienten. Die Sätze zwischen den Trennstellen bilden einen Abschnitt. Der semantische Texttrenner in LlamaIndex verwendet dieselbe Trennstelle anhand des Perzentils.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# Kosinusabstand zwischen jedem Satz und dem folgenden Satz
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# Einen neuen Abschnitt beginnen, wenn der Abstand das 95. Perzentil überschreitet
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")Die Abstände zwischen den Nachbarn betragen 0.56, 0.64, 0.98 und 0.62. Die einzige Trennstelle liegt daher beim Sprung von 0.98 zwischen dem Pumpenlager und der Cafeteria. Das Ergebnis sind ein dreisätziger Abschnitt über die XR-12-Pumpe und ein zweisätziger Abschnitt über die Cafeteria.
Vergleich von Chunking-Strategien#
- Chunking mit fester Größe: Teilt den Text alle N Token auf, in der Regel mit einer gewissen Überlappung benachbarter Abschnitte. Das Verfahren ist schnell und vorhersehbar, berücksichtigt aber keine Themengrenzen.
- Rekursive Aufteilung: Teilt zunächst an Absatzumbrüchen, dann an Zeilenumbrüchen und schließlich an Satzgrenzen, bis jeder Teil eine Größenbegrenzung erfüllt. LangChain empfiehlt für allgemeine Texte seinen rekursiven Zeichentrenner.
- Strukturbewusste Aufteilung: Orientiert sich an Überschriften, Markdown-Abschnitten, HTML-Elementen oder dem Seitenlayout eines PDF-Dokuments.
- Semantisches Chunking: Orientiert sich an Bedeutungsänderungen, erfordert beim Indizieren aber das Einbetten jedes Satzes und führt zu stark variierenden Abschnittsgrößen. Deshalb fügen Implementierungen Mindest- und Höchstlängen hinzu.
- Spätes Chunking und kontextbezogener Abruf: Beheben fehlenden Kontext aus dem übrigen Dokument, etwa wenn sich ein Pronomen auf etwas in einem früheren Abschnitt bezieht, und lassen sich mit jeder der oben genannten Methoden zur Grenzziehung kombinieren.
Aktions-Chunking in der Robotik hat nur den Namen gemeinsam: Hier sagt eine Policy eine Folge künftiger Motorbefehle als Einheit voraus.
Semantisches Chunking über Text hinaus#
Transkripte von Spracherkennungssystemen haben keine Absatzumbrüche. Daher werden häufig einbettungsbasierte Trennstellen verwendet, um festzustellen, wo sich das Thema einer Besprechung oder eines Podcasts ändert. Auch Videos lassen sich nach Inhalten in Abschnitte teilen, sodass jeder Clip für Videoverständnis oder multimodales RAG ein Ereignis statt eines willkürlichen 10-Sekunden-Ausschnitts zeigt. Ultralytics YOLO26 liefert solche Grenzen für Szenen mit Personen und Fahrzeugen: Der Tracking-Modus weist jedem erkannten Objekt über mehrere Einzelbilder hinweg eine dauerhafte ID zu. So kann eine Pipeline einen Clip öffnen, wenn eine neue ID in der Szene auftaucht, und ihn schließen, sobald alle verfolgten IDs die Szene verlassen haben.
Verbessert semantisches Chunking den Abruf?#
Themenbasierte Grenzen sind besonders wichtig, wenn nicht zusammengehörige Themen ohne Überschriften nebeneinanderstehen, etwa in Transkripten, aus dem Web gesammelten Seiten und aneinandergefügten Notizen. Semantische Abschnitte hängen außerdem vom Einbettungsmodell und vom Schwellenwert ab. Ändert sich einer von beiden, wird dasselbe Dokument anders aufgeteilt. Beide sollten daher anhand des Recall für reale Anfragen abgestimmt werden. Die Studie Lohnt sich der Rechenaufwand für semantisches Chunking? (2024) verglich semantisches Chunking mit Chunking fester Größe beim Dokumentenabruf, beim Abruf von Belegen und bei der abrufgestützten Antwortgenerierung. Sie stellte fest, dass der zusätzliche Rechenaufwand des semantischen Chunkings keine konsistenten Vorteile gegenüber Abschnitten fester Größe brachte.










