Docling für RAG

Vom Dokument zu retrieval-fertigen Chunks: Welcher Chunker passt, wie Chunks mit dem richtigen Tokenizer bemessen werden, wie Tabellen und Zitate überleben, welche Framework-Integration sitzt und welcher Vektor-Store dazu passt — geprüft gegen die offiziellen Chunking-Konzepte und die Serialisierungs-Referenz.

1
Step 1

1. Welcher RAG-Weg passt?

SituationWegWarum
Bereits auf LangChainlangchain-docling DoclingLoaderOffizieller Loader; DOC_CHUNKS-Modus chunkt nativ, MARKDOWN-Modus + Header-Splitter als Fallback.
Bereits auf LlamaIndexDoclingReader + Docling Node ParserReader lädt verlustfrei JSON oder verlustbehaftet Markdown; Parser macht daraus Nodes.
Bereits auf Haystackdocling-haystack-KonverterDocling als Haystack-Konverter-Komponente.
Framework-frei / eigener StoreHybridChunker direktVolle Kontrolle: chunken, kontextualisieren, embedden, überall upserten (Qdrant, Milvus, Chroma, Pinecone …).
Chunk-Dateien schnell brauchenCLI --to chunksKein Python: hybride oder hierarchische Chunks direkt aus dem Terminal.
Massen-Ingestion im großen MaßstabData Prep Kit + DoclingChunk- + Tokenize-Pipelines für große Korpora.
2
Step 2

2. Wo Docling in RAG sitzt

Eine RAG-Pipeline hat sechs Stufen; Docling besitzt die ersten drei — jene, die Antwortqualität entscheiden, bevor ein Embedding existiert. Zwei Chunking-Philosophien: nach Markdown exportieren und nachsplitten (z. B. LangChains MarkdownHeaderTextSplitter) oder nativ auf dem DoclingDocument chunken. Natives Chunken erhält Tabellen, Überschriften und Provenienz, die Markdown-Nachsplitten still fallen lässt — bevorzugen, sofern kein Grund dagegenspricht.

  • Parsen — Layout, Lesereihenfolge, Tabellen, Formeln, Bilder → ein strukturiertes DoclingDocument.
  • Serialisieren / chunken — strukturbewusste Chunks mit Überschriften, Captions und Provenienz (oder Markdown-/HTML-/JSON-Export zum Nachsplitten).
  • Text anreicherncontextualize() stellt Überschriftenkontext voran, sodass jeder Chunk allein steht.
  • Embedden → speichern → retrieven → generieren — eigenes Embedding-Modell, Vektor-Store und Framework; Docling-agnostisch.
3
Step 3

3. Umwandeln: DoclingDocument behalten

Für eine programmatische Pipeline in Python umwandeln und das Dokumentobjekt behalten — Chunker arbeiten darauf, nicht auf Dateien:

docling convert report.pdf --to md
from docling.document_converter import DocumentConverter

converter = DocumentConverter()
result = converter.convert("report.pdf")
document = result.document
4
Step 4

4. Export wählen: Markdown, JSON, HTML, DocTags

Exporte sind Kurzformen über Serializer (MarkdownDocSerializer u. a.). Für RAG zählt die Wahl vor allem bei Tabellen. Falls verbundene Header-Zellen Antworten entscheiden, HTML oder JSON statt Markdown bevorzugen — oder Markdown behalten, aber beim Chunken Tabellen-Header wiederholen (Abschnitt 7). Serializer sind anpassbar: BaseTableSerializer u. a. subklassieren für volle Kontrolle (siehe Advanced-Chunking-&-Serialization-Beispiel).

ExportTabellen-SpansRAG-Nutzen
export_to_markdown()Abgeflacht — keine Span-Syntax; überspannte Zellen rendern leerStandard-Textpfad; ok, sofern verbundene Header egal sind.
export_to_html()Erhalten — native rowspan/colspanBester Textexport, wenn verbundene Zellen Bedeutung tragen.
export_to_dict() / JSONVerlustfrei erhalten — volles TableData inkl. SpansVerlustfreier Pfad (LlamaIndex-Reader-JSON-Modus); schwerste Payloads.
DocTags / Docling LanguageErhalten — OTSL-FortsetzungstokensKompaktes strukturerhaltendes Format für Docling-natives Tooling.
5
Step 5

5. Chunker-Vergleich

Alle nativen Chunker implementieren BaseChunker (chunk() → Chunk-Strom, contextualize() → angereicherter Text), sodass LlamaIndex-artige Integrationen jeden eingebauten, eigenen oder Dritt-Chunker über dieselbe Schnittstelle nehmen.

ChunkerStrategieWann wählen
HybridChunker (Standard)Hierarchische Struktur + tokenizer-bewusstes Splitten bei Übergröße + Mergen bei UntergrößeStandard für RAG. Ausgewogen, überschriften- und tabellenbewusst.
HierarchicalChunkerEin Chunk je Dokumentelement; mergt Listeneinträge (opt-out via merge_list_items)Feingranular, elementweise Chunks mit vollen Metadaten.
LineBasedTokenChunkerHält Zeilengrenzen; splittet eine Zeile nur, falls sie allein das Limit sprengtTabellen, Code, Logs, Listen — alles Zeilenstrukturierte.
TrivialChunkerMinimales Basis-ChunkenDebuggen und Benchmarking, kein Produktions-Retrieval.
Markdown-NachsplittenNach Markdown exportieren, dann splitten (z. B. MarkdownHeaderTextSplitter)Nur wenn eine Framework-Pipeline Markdown-Input verlangt.
6
Step 6

6. HybridChunker im Detail (Standard)

So arbeitet er: Von hierarchischen Chunks starten, dann ein Durchlauf splittet nur übergroße Chunks (token-bewusst) und ein weiterer mergt nur untergroße aufeinanderfolgende Peers mit gleichen Überschriften & Captions. Wichtige Parameter:

Den kontextualisierten Text embedden, nicht chunk.text:

Zwei operative Hinweise: Die transformers-Warnung „Token indices sequence length …“ beim Chunken ist ein dokumentierter Fehlalarm (siehe offizielle FAQ), und TOKENIZERS_PARALLELISM=false setzen, um Fork-Warnungen in Servern zu beruhigen.

  • tokenizer — auf den Tokenizer des Embedding-Modells abstimmen (Abschnitt 9). Standard leitet Limits vom Tokenizer ab.
  • max_tokens — Cap je Chunk; die angereicherte (kontextualisierte) Form sollte passen.
  • merge_peers=True — untergroße Peers mergen; für striktes Splitten auf False.
  • repeat_table_header=True — jeder Tabellen-Chunk startet mit der Header-Zeile (Abschnitt 7).
  • omit_header_on_overflow=False — Header für Zeilen droppen, die ohne passen, mit aber überlaufen (breite Tabellen, strikte Budgets).
  • serializer_provider — z. B. Markdown-Tabellen via ChunkingSerializerProvider zur Chunk-Text-Formkontrolle.
from docling.chunking import HybridChunker

chunker = HybridChunker()
chunks = list(chunker.chunk(document))
print(len(chunks), chunks[0].text[:120])
for chunk in chunker.chunk(document):
    enriched = chunker.contextualize(chunk)  # Überschriften vorangestellt — DAS embedden
    vector = embed(enriched)
7
Step 7

7. Tabellen in RAG: Header, Spans, Formate

Ausgearbeitete Demos: Hybrid-Chunking (inkl. Header-Wiederholung an breiter CSV), zeilenbasiertes Chunking, Tabellenextraktion.

docling convert data.csv --to md
  • Header wiederholen (repeat_table_header=True, Standard): Jeder Chunk einer geteilten Tabelle startet mit der Header-Zeile, sodass jeder Chunk fürs Embedding-Modell selbstbeschreibend ist.
  • Overflow-Notausgang (omit_header_on_overflow=True): Für breite Tabellen überspringen Zeilen, die ohne Header passen, mit aber überlaufen, den Header — Token-Effizienz ohne Zeilenbruch.
  • Verbundene Zellen: Markdown flacht Spans ab; falls verbundene Header zählen, Tabellen aus HTML-/JSON-Serialisierung chunken oder eigenen Tabellen-Serializer nutzen.
  • Zeilenbasierte Alternative: LineBasedTokenChunker mit wiederholtem Präfix hält CSV-artige Zeilen intakt und kennt dieselbe Overflow-Logik via omit_prefix_on_overflow.
8
Step 8

8. Metadaten & Zitate (DocMeta)

Jeder Chunk trägt dl_meta — im Vektor-Payload behalten; es macht aus „einer Antwort“ eine „Antwort mit Quelle“. Provenienz enthält Seitennummern und Bounding-Boxen je Item — genug für „Seite 3“-Zitate oder Quellregion-Highlighting (siehe Visual Grounding). Metadaten nie zum „Platzsparen“ droppen: ohne sie sind Zitate unmöglich.

FeldEnthältNutzen für
headingsÜberschriftenpfad, z. B. ["3.2 AI models"]Abschnittslabels, Kontextpräfixe, Filter.
originMimetype, Dateiname, Binary-HashDokumentidentität, Dedup, Quelllinks.
doc_itemsSelf-Refs, Labels, Provenienz: page_no, bbox, charspanSeitenzitate, Bounding-Box-Highlighting, Visual Grounding.
9
Step 9

9. Tokenizer: zum Embedding-Modell passen

Die Regel ist absolut: Chunks mit dem Tokenizer des Embedding-Modells bemessen. Gemischte Tokenizer bemessen Chunks still falsch und brechen Merge-/Split-Entscheidungen. Im großen Maßstab wendet die Data-Prep-Kit-Chunk+Tokenize-Pipeline dasselbe Prinzip im Batch an.

TokenizerInstallationHinweise
HuggingFace (HuggingFaceTokenizer)pip install "docling-core[chunking]"Standardpfad. max_tokens optional — vom Tokenizer abgeleitet. Beispiel: sentence-transformers/all-MiniLM-L6-v2 (auch CLI-Standard).
OpenAI / tiktoken (OpenAITokenizer)pip install "docling-core[chunking-openai]"Braucht explizite max_tokens (Context-Window, z. B. 128 * 1024 für gpt-4o).
from transformers import AutoTokenizer
from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer
from docling.chunking import HybridChunker

EMBED_MODEL_ID = "sentence-transformers/all-MiniLM-L6-v2"
tokenizer = HuggingFaceTokenizer(
    tokenizer=AutoTokenizer.from_pretrained(EMBED_MODEL_ID),
    max_tokens=512,
)
chunker = HybridChunker(tokenizer=tokenizer, merge_peers=True)
10
Step 10

10. Framework-Integrationen

LangChain — langchain-docling: Zwei Modi: DOC_CHUNKS (Standard — ein LangChain-Document je nativem Chunk, Metadaten erhalten) und MARKDOWN (ein Document je Datei; downstream splitten, z. B. mit MarkdownHeaderTextSplitter auf #/##/###). Voller Flow im offiziellen LangChain-RAG-Beispiel (Milvus + Mixtral) und der LangChain-Anleitung.

LlamaIndex — Reader + Node Parser: DoclingReader befüllt LlamaIndex-Documents (verlustfrei JSON oder verlustbehaftet Markdown); der Docling Node Parser macht daraus mit Formatwissen Nodes. Jede BaseChunker-Implementierung passt an dieselbe Schnittstelle. Siehe offizielles LlamaIndex-RAG-Beispiel.

Haystack und der Rest: Haystack liefert Docling als Konverter-Komponente (Beispiel, Integrations-Docs). Jenseits der großen drei: txtai, Kotaemon, DocETL, Vectara, Semantica, Hector, haiku.rag, Bee, CrewAI, Langflow, Open WebUI, spaCy, NVIDIA, Granite-Cookbook-RAG und Data Prep Kit integrieren alle Docling — stöbern im offiziellen Integrationsindex.

pip install langchain-docling langchain-huggingface langchain_milvus
pip install llama-index-readers-docling llama-index-node-parser-docling
pip install docling-haystack
from transformers import AutoTokenizer
from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer
from docling.chunking import HybridChunker
from langchain_docling import DoclingLoader
from langchain_docling.loader import ExportType

tokenizer = HuggingFaceTokenizer(
    tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
)
loader = DoclingLoader(
    file_path=["https://arxiv.org/pdf/2408.09869"],
    export_type=ExportType.DOC_CHUNKS,  # native Chunks (Standard)
    chunker=HybridChunker(tokenizer=tokenizer),
)
docs = loader.load()  # ein LangChain-Document je Chunk, dl_meta in metadata
from llama_index.readers.docling import DoclingReader

reader = DoclingReader(export_type="json")  # verlustfrei; "markdown" für verlustbehaftet
documents = reader.load_data("report.pdf")
11
Step 11

11. Vektor-Stores: ausgearbeitete Beispiele

Der Store beeinflusst Docling nie — Chunks + Embeddings upserten überall. Offizielle Beispiele existieren für:

StoreBeispielHinweise
MilvusRAG mit MilvusAuch Store im LangChain-Beispiel (lokales docling.db, FLAT-Index).
WeaviateRAG mit WeaviateNative Vektor- + Hybrid-Search-Optionen.
QdrantRetrieval mit QdrantRetrieval-fokussiertes Rezept.
OpenSearchRAG mit OpenSearchSuche + Vektor in einer Engine.
MongoDB + VoyageAIRAG mit MongoDBAtlas Vector Search + VoyageAI-Embeddings.
Azure AI SearchRAG mit Azure AI SearchManaged Retrieval auf Azure.
Chroma / Pinecone / andereKein offizielles Rezept; gleiches Muster: contextualize(chunk) embedden, Text + DocMeta upserten.
12
Step 12

12. Chunks aus der CLI (ohne Python)

--chunks-type nimmt hybrid (Standard) oder hierarchical; der Tokenizer steht standardmäßig auf sentence-transformers/all-MiniLM-L6-v2. Remote-Conversion (docling convert-remote / docling-serve) unterstützt dieselben Chunk-Optionen serverseitig. Siehe die Befehlssuche.

docling convert report.pdf --to chunks --chunks-type hybrid
docling convert report.pdf --to chunks --chunks-type hybrid --chunks-max-tokens 512 --chunks-tokenizer sentence-transformers/all-MiniLM-L6-v2
13
Step 13

13. Produktions-Checkliste für Ingestion

  • Tokenizer == Embedding-Modell. Immer. Bei jedem Modellwechsel erneut prüfen.
  • contextualize()-Output embedden, chunk.text daneben für Anzeige speichern.
  • DocMeta behalten (headings, page_no, bbox, origin) im Payload für Zitate.
  • Tabellen-Header wiederholen; für Merged-Cell-Tabellen HTML-/JSON-Quelle nutzen.
  • Conversions-Kosten trimmen: --no-ocr für digitale PDFs, ungenutzte Enrichments überspringen, batch-umwandeln und Modelle vorab laden (docling-tools models download --all).
  • Scale-out: Data-Prep-Kit-Chunk+Tokenize für Korpora; docling-serve-/v1/convert/source mit --to chunks hinter einer Queue für Services.
  • PII zuerst: PII vor dem Embedden erkennen und obfuskieren (siehe PII-Beispiel) — ein Leak lässt sich nicht un-embedden.
14
Step 14

14. RAG-Ingestion-Fehlerbehebung

  • Antworten ohne Kontext / „Waisen“-Chunkschunk.text geembeddet; auf contextualize() wechseln und Überschriften prüfen.
  • Tabellenantworten falschrepeat_table_header aktivieren; Merged Cells prüfen (Markdown flacht Spans ab → HTML/JSON nutzen).
  • Transformers-Sequenzlängen-Warnung — dokumentierter Fehlalarm, gefahrlos ignorierbar (offizielle FAQ).
  • Chunks zu groß/klein fürs Embedding-Modell — Tokenizer-Mismatch; Chunker-Tokenizer aufs Embedding-Modell setzen und max_tokens justieren.
  • Keine Zitate möglich — Metadaten beim Upsert gedroppt; dl_meta (page_no, headings, origin) persistieren.
  • Ingestion zu langsam — siehe Umwandlung ist langsam: ungenutzte OCR/Enrichments deaktivieren, GPU nutzen, batchen.
15
Step 15

15. RAG-FAQ

Mit welchem Chunker starten?
HybridChunker mit dem Tokenizer des Embedding-Modells. Standard aus gutem Grund: strukturbewusst, größenkontrolliert, überschriften-angereichert, tabellenbewusst. Nur bei konkretem Bedarf zu Hierarchical (elementweise) oder LineBased (zeilenstrukturiert) wechseln.
chunk.text oder contextualize() — was embedden?
Immer chunker.contextualize(chunk) für Embeddings. Es stellt den Überschriftenpfad voran und macht Chunks retrieval-fähig in sich. chunk.text für Anzeige behalten.
Brauche ich LangChain / LlamaIndex / Haystack überhaupt?
Nein. Sie sind Bequemlichkeiten: Loader, Reader und Konverter um dieselben Chunker. Ein Dutzend Zeilen HybridChunker + eigener Embedding-Call + beliebiger Vektor-Store sind eine komplette Pipeline.
Markdown-Export + Text-Splitter vs. natives Chunken?
Natives Chunken erhält Tabellen, Überschriften, Provenienz und Spans, die Markdown-Export abflacht oder droppt. Markdown-Nachsplitten nur, wenn eine Downstream-Komponente Markdown-Input verlangt.
Wie bleibt Tabellenstruktur im Retrieval?
Header wiederholen (repeat_table_header), Overflow beachten (omit_header_on_overflow), und Tabellen aus HTML/JSON sourcen, wenn Merged Cells zählen. LineBasedTokenChunker ist der Spezialist für zeilenorientierte Daten.
Wie zitieren Antworten Seiten?
Jedes Chunks dl_meta (headings, page_no, bbox, origin) im Vektor-Payload persistieren und mit Hits zurückgeben. Provenienz trägt Seitenzitate bis Bounding-Box-Highlighting.
Welcher Vektor-Store passt zu Docling?
Jeder. Docling liefert Chunks + Metadaten; Stores halten nur Vektoren. Offizielle Rezepte decken Milvus, Weaviate, Qdrant, OpenSearch, MongoDB und Azure AI Search — Chroma, Pinecone u. a. folgen identischem Muster.
Wie skaliere ich Ingestion?
Batch-Conversion, vorab geladene Modelle, GPU für Layout/OCR, keine ungenutzten Enrichments — plus Data-Prep-Kit-Chunk+Tokenize-Pipelines für Korpora oder docling-serve-Chunk-Output hinter einer Queue für Services.

Verifiziert mit Docling v2.129.0 · Zuletzt geprüft 2026-09-22 · Offizielle Quelle