Wird geladen

Text-Chunking-Strategien

Lektion 3410 Min.

Text-Chunking ist einer der kritischsten Schritte beim Aufbau einer RAG-Pipeline (Retrieval Augmented Generation). Wie du deine Dokumente aufteilst, wirkt sich direkt auf die Qualität deines gesamten Systems aus. Eine schlechte Chunking-Strategie kann dazu führen, dass irrelevanter Kontext in deine Prompts eingefügt wird, was dazu führt, dass deine KI völlig falsche Antworten gibt.

Betrachte dieses Beispiel: Du hast ein Dokument mit Abschnitten zu medizinischer Forschung und Softwareentwicklung. Wenn du schlecht chunkst, könnte ein Nutzer, der fragt „Wie viele Bugs haben die Ingenieure dieses Jahr behoben?", Informationen über medizinische Forschung statt über Softwareentwicklung erhalten, einfach weil der medizinische Abschnitt das Wort „Bug" in einem anderen Kontext enthielt.

Dies zeigt, warum die Chunking-Strategie so wichtig ist. Das Ziel ist es, Chunks zu erstellen, die semantische Kohärenz bewahren und bei der Abfrage nützlichen Kontext liefern.

Drei Haupt-Chunking-Strategien

Es gibt drei primäre Ansätze, um Text in Chunks aufzuteilen:

  • Größenbasiert: Teile den Text in Zeichenketten gleicher Länge auf
  • Strukturbasiert: Teile basierend auf der Dokumentstruktur (Überschriften, Absätze, Abschnitte)
  • Semantisch-basiert: Gruppiere verwandte Sätze oder Abschnitte mithilfe von NLP-Techniken

Größenbasiertes Chunking

Größenbasiertes Chunking ist der einfachste Ansatz. Du teilst dein Dokument einfach in Chunks mit ungefähr gleicher Zeichen- oder Wortanzahl auf. Es ist einfach zu implementieren und funktioniert zuverlässig über verschiedene Dokumenttypen hinweg.

Dieser Ansatz hat jedoch klare Nachteile:

  • Wörter werden mitten im Satz abgeschnitten
  • Chunks verlieren wichtigen Kontext aus dem umgebenden Text
  • Zusammengehörige Inhalte können über mehrere Chunks verteilt werden

Überlappung hinzufügen

Um das Kontextproblem zu lösen, kannst du eine Überlappungsstrategie implementieren. Jeder Chunk enthält einige Zeichen aus benachbarten Chunks, was zusätzlichen Kontext bietet und sicherstellt, dass wichtige Informationen an den Chunk-Grenzen nicht verloren gehen.

Obwohl dies zu einer gewissen Duplizierung führt, ist der Kompromiss in der Regel den verbesserten Kontext wert, den jeder Chunk erhält.

Strukturbasiertes Chunking

Wenn deine Dokumente eine konsistente Formatierung haben (wie Markdown mit klaren Überschriften), kann strukturbasiertes Chunking ausgezeichnete Ergebnisse liefern. Du teilst anhand struktureller Elemente wie Überschriften auf und erstellst Chunks, die sich an der natürlichen Organisation des Dokuments orientieren.

Dies funktioniert wunderbar für gut formatierte Dokumente, erfordert aber Garantien bezüglich der Dokumentstruktur. Es funktioniert nicht zuverlässig mit reinen Textdateien oder inkonsistent formatierten Dokumenten.

Implementierungsbeispiele

Hier sind drei praktische Chunking-Funktionen, die du implementieren kannst:

Zeichenbasiertes Chunking

python
def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
    chunks = []
    start_idx = 0
    
    while start_idx < len(text):
        end_idx = min(start_idx + chunk_size, len(text))
        chunk_text = text[start_idx:end_idx]
        chunks.append(chunk_text)
        
        start_idx = (
            end_idx - chunk_overlap if end_idx < len(text) else len(text)
        )
    
    return chunks

Satzbasiertes Chunking

python
def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
    sentences = re.split(r"(?<=[.!?])\s+", text)
    chunks = []
    start_idx = 0
    
    while start_idx < len(sentences):
        end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
        current_chunk = sentences[start_idx:end_idx]
        chunks.append(" ".join(current_chunk))
        
        start_idx += max_sentences_per_chunk - overlap_sentences
        
        if start_idx < 0:
            start_idx = 0
    
    return chunks

Abschnittsbasiertes Chunking

python
def chunk_by_section(document_text):
    pattern = r"\n## "
    return re.split(pattern, document_text)

Die richtige Strategie wählen

Deine Wahl der Chunking-Strategie hängt vollständig von deinem spezifischen Anwendungsfall ab:

  • Zeichenbasiert: Zuverlässigste Rückfalloption, funktioniert mit jedem Dokumenttyp
  • Satzbasiert: Gute Balance zwischen Kontext und Bedeutung für Fließtext
  • Abschnittsbasiert: Ausgezeichnete Ergebnisse, wenn du strukturierte Dokumente hast

Für von Nutzern hochgeladene Dokumente ohne Formatierungsgarantien ist zeichenbasiertes Chunking oft die sicherste Wahl. Für gut strukturierte interne Dokumente kann abschnittsbasiertes Chunking überlegene Ergebnisse liefern. Satzbasiertes Chunking funktioniert gut für die meisten Fließtexte, kann aber bei Code oder technischen Dokumenten, die Punkte auf unerwartete Weise verwenden, Probleme bereiten.

Denke daran, dass Chunking oft ein iterativer Prozess ist. Beginne mit einem einfachen Ansatz, teste ihn mit deinen spezifischen Dokumenten und Anwendungsfällen und verfeinere ihn dann basierend auf der Qualität der Ergebnisse, die du von deinem RAG-System erhältst.