Technikblog

RAG Engineering

RAG-Chunking: Quellenpositionen erhalten und Sucheinheiten prüfen

Ein ausführbarer Python-Splitter mit Offsets sowie Prüfungen für Kontext, Tabellen, Dokumentversionen und Tokenlimits.

RAGO-XVeröffentlicht Aktualisiert
#RAG#Chunking#Architecture
Konzeptdiagramm zur Aufteilung von Dokumenten in RAG-Chunks

Gleich lange Textstücke sind nicht automatisch brauchbare Belege. Werden bei „Vor dem Öffnen der Abdeckung den Strom trennen“ Bedingung und Handlung getrennt, kann die Suche nur die Handlung liefern. Chunking soll verständlichen Kontext und die Fundstelle gemeinsam erhalten.

Wir entwickeln eine zeichenbasierte Vergleichsbasis mit Python 3. Größe und Überlappung sind Versuchsparameter, keine produktiven RAGO-X-Vorgaben.

Erst die Textextraktion prüfen

Eine falsche Lesereihenfolge in mehrspaltigen PDFs, wiederholte Kopfzeilen oder vertauschte Tabellenzellen lassen sich nicht durch andere Chunkgrößen reparieren. Vergleichen Sie Überschriften, Absätze, Tabellen und Fußnoten mit dem Original. Beginnen Sie möglichst mit Abschnitten und Absätzen; teilen Sie sehr lange Absätze zusätzlich auf.

Eine Tabellenzeile benötigt häufig Spaltennamen und Einheiten. Verknüpfen Sie Teile langer Tabellen mit Titel und Spaltenüberschriften und erhalten Sie Seitenangaben. Ergänzte Überschriften sollten getrennt vom unveränderten Quellausschnitt gespeichert werden.

Eine Vergleichsbasis mit Offsets

Speichern Sie den Code als chunk_demo.py und führen Sie python3 chunk_demo.py aus. Das halboffene Intervall [start, end) macht den Text über text[start:end] reproduzierbar.

python
def split_text(text, size=80, overlap=15):
    if size <= 0 or not 0 <= overlap < size:
        raise ValueError("require size > 0 and 0 <= overlap < size")
    start = 0
    while start < len(text):
        end = min(start + size, len(text))
        yield {"start": start, "end": end, "text": text[start:end]}
        if end == len(text):
            break
        start = end - overlap


text = "Pump X17: disconnect power. Wait 30 seconds. Check the inlet filter."
chunks = list(split_text(text, size=40, overlap=10))
print([(c["start"], c["end"]) for c in chunks])
assert [(c["start"], c["end"]) for c in chunks] == [(0, 40), (30, 68)]
assert all(text[c["start"]:c["end"]] == c["text"] for c in chunks)
assert set().union(*(set(range(c["start"], c["end"])) for c in chunks)) == set(range(len(text)))
assert list(split_text("")) == []

Die Ausgabe lautet [(0, 40), (30, 68)]. Die Bereiche überlappen um 10 Zeichen und decken die gesamte Eingabe ab. Leere Eingaben erzeugen keine Chunks, ungültige Überlappungen einen Fehler. Leerzeichen werden nicht entfernt oder normalisiert, damit Positionen vergleichbar bleiben.

Die Länge einer Python-Zeichenfolge entspricht weder Bytes noch sichtbaren Graphemgruppen oder Modell-Tokens. Prüfen Sie Modellgrenzen mit dem jeweiligen Tokenizer. Der Code erkennt keine Satz- oder Überschriftengrenzen und ist deshalb noch kein vollständiger produktiver Splitter.

Benötigte Metadaten

Information Zweck
Dokument-ID und Revision Alte und aktuelle Inhalte unterscheiden
Chunk-ID und Version der Aufteilung Neuverarbeitung nachvollziehen
Seite, Abschnitt und Offsets Originalstelle prüfen
Organisation, Dokumentbereich und Rechte Nur erlaubte Inhalte abrufen
Originalausschnitt und Zusatzkontext Zitat von Suchhilfen unterscheiden

Offsets müssen sich auf eine bestimmte Version des extrahierten Textes beziehen. OCR oder normalisierte Leerzeichen können Positionen verschieben. Beim Dokumentwechsel müssen Chunks und Index konsistent umgestellt werden; alte Revisionen dürfen nicht unbemerkt weiter auftauchen. Die Tabelle beschreibt Entwurfsaspekte, kein öffentliches API-Schema.

Belege vor der Größenoptimierung festlegen

Markieren Sie die Passagen, die reale Fragen beantworten, und vergleichen Sie zwei Konfigurationen. Enthalten die ersten Treffer Antwort und Ausnahmen? Zeigt der Quellenlink dieselbe Version? Mehr Chunks oder längere Antworten belegen keine Verbesserung.

Beobachtung Erster Versuch
Bedingung und Schluss getrennt Satz-/Absatzgrenzen und nötigen Nachbarkontext nutzen
Mehrere Themen vermischt Nach Überschriften aufteilen und vergleichen
Wiederholte Belege füllen den Kontext Überlappung reduzieren oder Nachbartreffer zusammenführen
Tabellenzahlen falsch interpretiert Überschriften, Einheiten und Fußnoten erhalten
Falsche Zitatposition Extraktionsversion und Positionszuordnung prüfen

Überlappung kann Kontextverlust reduzieren, erhöht aber Speicherbedarf und redundante Treffer. Dokumentieren Sie Fragen, Eingabe-Tokens, Latenz und Zitatgenauigkeit, statt eine universelle Idealgröße anzunehmen. Weiterführend: hybride Suche vergleichen und vom Beleg zur Antwort.