[{"data":1,"prerenderedAt":666},["ShallowReactive",2],{"blog-pdf-document-parsing-for-rag-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":57,"og":58,"expertise":59,"locales":60,"lang":62,"title":64,"description":65,"coverAlt":66,"metaTitle":67,"takeaways":68,"faq":74,"toc":90,"blocks":121,"others":441},"pdf-document-parsing-for-rag","2026-10-16",9,"rag",[9,10,11,12,13],"RAG","PDF parsing","OCR","Docling","Document AI",[15,16,17,18,19,20,21,22,23,24],"pdf parsing for rag","best pdf parser for rag","docling vs marker","marker vs mineru","pdf to markdown for llm","extract tables from pdf for rag","ocr for rag pipeline","olmocr bench","scanned pdf rag","document parsing llm",[26,29,32],{"name":27,"url":28},"PDF","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPDF",{"name":30,"url":31},"Optical character recognition","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOptical_character_recognition",{"name":33,"url":34},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[36,39,42,45,48,51,54],{"title":37,"url":38},"Docling: README, features and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdocling-project\u002Fdocling",{"title":40,"url":41},"Auer et al.: Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.17887",{"title":43,"url":44},"Datalab: Marker README, olmOCR-bench results and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdatalab-to\u002Fmarker",{"title":46,"url":47},"OpenDataLab: MinerU README and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU",{"title":49,"url":50},"Poznanski et al.: olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.18443",{"title":52,"url":53},"Claude Platform Docs: PDF support","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fpdf-support",{"title":55,"url":56},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval","\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fog.jpg","ai-engineer",[61,62,63],"en","de","hu","PDF-Parsing für RAG: Layout-Pipelines, OCR und Vision-Modelle im Vergleich","Warum das PDF-Parsing die RAG-Qualität bestimmt, wie sich Docling, Marker, MinerU und VLM-OCR unterscheiden und wie man einen Parser selbst testet.","Eine PDF-Seite durchläuft Layout-Erkennung, OCR und Tabellenrekonstruktion und wird zu sauberen Markdown-Chunks für einen Suchindex.","PDF-Parsing für RAG: Docling, Marker, MinerU · Balázs Csorba",[69,70,71,72,73],"Die meisten schlechten RAG-Antworten über PDFs beginnen beim Parsing: falsche Lesereihenfolge, zerfallene Tabellen und wiederholte Kopfzeilen verderben jeden Chunk.","Digital erzeugte PDFs brauchen eine Layout-Pipeline, die den Textlayer liest; Scans und formelreiche Seiten brauchen OCR oder ein Vision-Modell für die ganze Seite.","Veröffentlichte Parser-Benchmarks stammen meist vom Hersteller und aus einem Dokumentmix, also vor der Wahl 30 bis 50 eigene Seiten testen.","Tabellen als HTML- oder Markdown-Tabellen behalten, eine Tabelle pro Chunk mit Kopfzeile und Beschriftung, statt sie in Fließtext zerfallen zu lassen.","Das geparste Dokument mit der Parser-Version speichern, damit man neu chunken und embedden kann, ohne die OCR erneut zu bezahlen.",[75,78,81,84,87],{"q":76,"a":77},"Welcher PDF-Parser ist der beste für RAG?","Einen klaren Sieger gibt es nicht. In den olmOCR-bench-Zahlen, die Datalab veröffentlicht, liegt Marker im Balanced-Modus vor MinerUs Pipeline-Backend und Docling, aber das sind Messungen des Herstellers. Docling hat die freizügigste Lizenz (MIT) und die breiteste Formatunterstützung. Zwei oder drei Parser an einer Stichprobe eigener Dokumente testen.",{"q":79,"a":80},"Brauche ich für jedes PDF OCR?","Nein. Digital erzeugte PDFs aus Word, einem PIM oder einem CMS haben einen Textlayer, den Layout-Pipelines direkt und günstig lesen. OCR braucht man für Scans, Fotos und Seiten mit unbrauchbarem eingebettetem Text, und gute Pipelines erkennen solche Seiten und erkennen nur sie per OCR.",{"q":82,"a":83},"Kann ich das PDF nicht einfach an Claude oder GPT schicken?","Für ein paar Dokumente in einem Gespräch ja: Claude nimmt PDFs bis 32 MB und 600 Seiten pro Anfrage an. Für einen Korpus, den man einmal indexiert und oft abfragt, ist vorheriges Parsen in Text viel günstiger und erlaubt Chunking, Embedding und Zitate pro Seite.",{"q":85,"a":86},"Wie chunkt man Tabellen für RAG?","Jede Tabelle als Ganzes als HTML- oder Markdown-Tabelle behalten, mit Beschriftung und nächster Überschrift, in einem eigenen Chunk. Ist sie zu lang, nach Zeilen teilen und die Kopfzeile in jedem Teil wiederholen.",{"q":88,"a":89},"Ist Parsing über eine Cloud-API DSGVO-konform?","Das hängt von den Daten und vom Vertrag ab. Docling, Marker und MinerU laufen alle lokal, damit bleiben personenbezogene Daten auf eigenen Rechnern. Bei einem gehosteten Parser oder einer LLM-API braucht man einen Auftragsverarbeitungsvertrag und Klarheit, wo verarbeitet wird.",[91,94,97,100,103,106,109,112,115,118],{"id":92,"title":93},"why-parsing-decides-rag-quality","Warum entscheidet das PDF-Parsing über die RAG-Qualität?",{"id":95,"title":96},"three-parser-families","Welche drei Familien von PDF-Parsern gibt es?",{"id":98,"title":99},"what-benchmarks-say","Was sagen die Benchmarks wirklich?",{"id":101,"title":102},"tables-for-rag","Wie extrahiert und chunkt man Tabellen?",{"id":104,"title":105},"structure-aware-chunking","Wie chunkt man geparste Dokumente?",{"id":107,"title":108},"send-pdf-to-model","Wann schickt man das PDF direkt an das Modell?",{"id":110,"title":111},"licenses-and-data-protection","Welche Lizenz- und Datenschutzfragen zählen?",{"id":113,"title":114},"test-a-parser","Wie testet man einen Parser an eigenen Dokumenten?",{"id":116,"title":117},"b2b-documents","Was ändert sich bei B2B-Datenblättern und Handbüchern?",{"id":119,"title":120},"sources","Quellen",[122,126,129,132,135,159,168,169,172,211,226,235,236,243,280,283,284,287,320,321,329,336,338,339,346,349,350,377,385,386,389,391,394,401,402,414,417,418],{"type":123,"content":124},"paragraph",[125],"Wer ein schwaches RAG-System debuggt, fängt meist beim Embedding-Modell, der Chunk-Größe oder dem Prompt an. Bei PDFs liegt das Problem oft davor: Der Parser hat ein zweispaltiges Datenblatt in verschachtelte Halbsätze verwandelt, eine Preistabelle zu einer Zahlenkette plattgedrückt und die Fußzeile in jeden Chunk kopiert. Kein Reranker repariert Text, der schon vor dem Embedding falsch war.",{"type":123,"content":127},[128],"Dieser Artikel vergleicht die drei Familien von PDF-Parsern im Jahr 2026, Textlayer-Extraktion, Layout-Pipelines wie Docling, Marker und MinerU sowie Vision-Modelle für ganze Seiten, anhand der Zahlen, die die Projekte selbst veröffentlichen. Danach geht es um Tabellen, strukturbewusstes Chunking, den direkten Versand an ein Modell, Lizenzen und einen kleinen Test an eigenen Dokumenten, bevor man sich festlegt.",{"type":130,"level":131,"id":92,"text":93},"heading",2,{"type":123,"content":133},[134],"Ein PDF speichert Glyphen an Koordinaten, keine Absätze. Alles, was eine RAG-Pipeline braucht, Lesereihenfolge, welcher Text eine Überschrift ist, wo eine Tabellenzelle beginnt, muss rekonstruiert werden. Jeder Fehler landet direkt im Index:",{"type":136,"items":137},"list",[138,144,149,154],[139,143],{"tag":140,"children":141},"strong",[142],"Lesereihenfolge:"," Mehrspaltige Layouts, Randspalten und Bildunterschriften werden zeilenweise vermischt, ein Chunk enthält dann zwei unzusammenhängende Sätze.",[145,148],{"tag":140,"children":146},[147],"Tabellen:"," Ohne Strukturrekonstruktion wird eine Tabelle zu einer Folge von Werten ohne Spaltennamen, und das Modell rät, welche Zahl zu welchem Produkt gehört.",[150,153],{"tag":140,"children":151},[152],"Wiederkehrende Elemente:"," Kopfzeilen, Fußzeilen und Seitenzahlen stehen auf jeder Seite und ziehen irrelevante Chunks in die Top-Ergebnisse.",[155,158],{"tag":140,"children":156},[157],"Scans und kaputte Textlayer:"," Gescannte Seiten haben gar keinen Text, und manche exportierte PDFs tragen einen fehlerhaften Textlayer, der am Bildschirm gut aussieht, aber als Zeichensalat extrahiert wird.",{"type":123,"content":160},[161,162,167],"Deshalb bewerte ich Retrieval und Generierung getrennt, wie in ",{"tag":163,"to":164,"children":165},"link","\u002Fblog\u002Frag-evaluation-metrics",[166],"RAG evaluieren"," beschrieben. Scheitert das Retrieval bei PDFs, zuerst den geparsten Text der betroffenen Seite öffnen, bevor man irgendetwas anderes anfasst.",{"type":130,"level":131,"id":95,"text":96},{"type":123,"content":170},[171],"Parser unterscheiden sich vor allem darin, was sie lesen: den eingebetteten Textlayer, ein gerendertes Bild der Seite oder beides.",{"type":173,"head":174,"rows":183},"table",[175,177,179,181],[176],"Familie",[178],"Beispiele",[180],"Stärke",[182],"Schwäche",[184,193,202],[185,187,189,191],[186],"Textlayer-Extraktion",[188],"PyMuPDF, pdfplumber, pypdf",[190],"Schnell, nur CPU, exakte Zeichen",[192],"Kein Layout, keine Tabellen, nichts bei Scans",[194,196,198,200],[195],"Layout-Pipelines",[197],"Docling, Marker, MinerU (pipeline), Unstructured",[199],"Lesereihenfolge, Tabellen, Überschriften; OCR nur wo nötig",[201],"Mehrere Modelle im Betrieb; verschachtelte Layouts brechen weiterhin",[203,205,207,209],[204],"Vision-Modelle für ganze Seiten",[206],"olmOCR, Chandra, MinerU (VLM), GraniteDocling",[208],"Am besten bei Scans, Formeln und unordentlichen Seiten",[210],"GPU-Kosten; kann Text halluzinieren, der nicht auf der Seite steht",{"type":123,"content":212},[213,214,217,218,221,222,225],"Die Grenzen verschwimmen. ",{"tag":215,"href":38,"children":216},"a",[12]," (MIT-Lizenz) lässt standardmäßig Layout- und Tabellenstrukturmodelle über den Textlayer laufen, kann aber auf eine VLM-Pipeline mit dem 258M-Parameter-Modell GraniteDocling umschalten. ",{"tag":215,"href":44,"children":219},[220],"Marker"," leitet Layout, OCR und Tabellenerkennung inzwischen über sein lokal betriebenes surya-VLM, liest digitalen Text aber weiterhin direkt aus dem PDF. ",{"tag":215,"href":47,"children":223},[224],"MinerU"," bietet ein Pipeline- und ein VLM-Backend. In der Praxis lautet die Frage weniger welches Tool als welcher Modus für welche Seiten.",{"type":227,"attrs":228,"inner":232,"caption":233},"diagram",{"viewBox":229,"role":230,"aria-labelledby":231},"0 0 720 170","img","pdfr1-t pdfr1-d","\u003Ctitle id=\"pdfr1-t\">Parsing-Weg pro Seite wählen\u003C\u002Ftitle>\u003Cdesc id=\"pdfr1-d\">Eine Seite wird auf einen brauchbaren Textlayer geprüft. Digitale Seiten gehen in eine Layout-Pipeline, die den Textlayer liest und Tabellen rekonstruiert. Seiten ohne brauchbaren Text gehen an OCR oder ein Vision-Modell. Beide Wege liefern strukturiertes Markdown oder JSON, das nach Überschriften und Tabellen gechunkt wird.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"pdfr1-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"79\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">PDF-Seite\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Textlayer?\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#pdfr1-ah)\" \u002F>\u003Crect x=\"160\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"220\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Layout\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Reihenfolge\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#pdfr1-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">OCR \u002F VLM\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">nur Scans\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#pdfr1-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Tabellen\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">HTML-Zellen\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#pdfr1-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Chunks\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">nach Struktur\u003C\u002Ftext>",[234],"Gute Pipelines entscheiden pro Seite, nicht pro Dokument: OCR nur dort, wo der Textlayer fehlt oder kaputt ist.",{"type":130,"level":131,"id":98,"text":99},{"type":123,"content":237},[238,239,242],"Der derzeit nützlichste gemeinsame Maßstab ist olmOCR-bench vom Allen Institute for AI, eingeführt mit dem ",{"tag":215,"href":50,"children":240},[241],"olmOCR-Paper",": rund 1.400 PDFs mit Tausenden Pass\u002FFail-Unit-Tests für Formeln, Tabellen, Lesereihenfolge, Kopf- und Fußzeilen und alte Scans. Unit-Tests passen besser zu RAG als Editierdistanz, weil sie Fakten prüfen, auf die es ankommt, etwa ob eine Tabellenzelle neben der richtigen Kopfzeile steht.",{"type":173,"head":244,"rows":253},[245,247,249,251],[246],"System (Messung Datalab, GPU)",[248],"Gesamt",[250],"Nur digitale PDFs",[252],"Durchsatz",[254,263,272],[255,257,259,261],[256],"Marker, Balanced-Modus",[258],"76.0",[260],"83.5",[262],"2.9 pg\u002Fs",[264,266,268,270],[265],"MinerU, Pipeline-Backend",[267],"72.7",[269],"83.3",[271],"0.54 pg\u002Fs",[273,274,276,278],[12],[275],"50.3",[277],"64.0",[279],"2.1 pg\u002Fs",{"type":123,"content":281},[282],"Die Tabelle ist mit Vorsicht zu lesen: Datalab entwickelt Marker und hat alle drei auf eigener Hardware gemessen, Docling lief in seiner Standard-Pipeline, und MinerUs VLM-Backend, das laut Datalab selbst besser abschneidet, fehlt. Datalab führt sein eigenes Dokument-VLM Chandra auf demselben Benchmark mit 85,8. Zwei Dinge gelten trotzdem. Bei digitalen PDFs liegen die beiden führenden Pipelines fast gleichauf, also können Geschwindigkeit und Lizenz entscheiden. Und Vision-Modelle für ganze Seiten gewinnen bei schwierigen Seiten, deshalb lohnt sich das Routing pro Seite.",{"type":130,"level":131,"id":101,"text":102},{"type":123,"content":285},[286],"Tabellen tragen in technischen und kaufmännischen Dokumenten genau die Fakten, nach denen Nutzer am häufigsten fragen: Maße, Toleranzen, Preise, Lieferzeiten. Man sollte sie als eigene Objekte behandeln:",{"type":136,"ordered":288,"items":289},true,[290,295,300,305,315],[291,294],{"tag":140,"children":292},[293],"Struktur im Output behalten."," Tabellen als HTML- oder Markdown-Tabellen exportieren, nicht als Text. Marker gibt Tabellen als HTML-Blöcke aus, Docling exportiert Markdown, HTML und verlustfreies JSON.",[296,299],{"tag":140,"children":297},[298],"Eine Tabelle, ein Chunk,"," zusammen mit Beschriftung und nächster Überschrift, damit der Chunk sagt, worum es geht.",[301,304],{"tag":140,"children":302},[303],"Lange Tabellen nach Zeilen teilen"," und die Kopfzeile in jedem Teil wiederholen; eine Zeile ohne Spaltennamen ist Rauschen.",[306,309,310,314],{"tag":140,"children":307},[308],"Seitenübergreifende Tabellen zusammenführen."," Das ist eine bekannte Schwachstelle; Markers optionaler Modus ",{"tag":311,"children":312},"code",[313],"--use_llm"," nutzt ein LLM, um Tabellen über Seiten hinweg zusammenzuführen und zu formatieren, gegen Aufpreis.",[316,319],{"tag":140,"children":317},[318],"Gibt es die Daten anderswo, diese nutzen."," Eine Preisliste aus dem ERP gehört in eine Datenbank, die der Agent abfragen kann, nicht in ein PDF, das man zurückparst.",{"type":130,"level":131,"id":104,"text":105},{"type":123,"content":322},[323,324,328],"Hat der Parser die Überschriften rekonstruiert, entlang dieser chunken, statt alle N Tokens zu schneiden. Ein Abschnitt unter einer Überschrift ist meist ein Thema, und der Überschriftenpfad (Dokumenttitel, Kapitel, Abschnitt) ergibt ein kurzes, günstiges Kontextpräfix für jeden Chunk. Chunk-Größen, hybride Suche und Reranking behandle ich in ",{"tag":163,"to":325,"children":326},"\u002Fblog\u002Frag-pipeline-chunking-hybrid-search-reranking",[327],"Eine produktive RAG-Pipeline, Schritt für Schritt",".",{"type":123,"content":330},[331,332,335],"Anthropics ",{"tag":215,"href":56,"children":333},[334],"Contextual Retrieval"," geht einen Schritt weiter: Ein LLM schreibt vor dem Embedding für jeden Chunk einen kurzen Kontextsatz aus dem ganzen Dokument. Mit Prompt-Caching schätzte Anthropic die einmaligen Kosten auf 1,02 Dollar pro Million Dokument-Tokens. Am besten wirkt es auf sauberem Parsing, denn der Kontextsatz ist nur so gut wie der Dokumenttext, den das Modell liest.",{"type":311,"code":337},"# Illustrative: chunk a parsed Markdown document by headings, keep tables whole\nimport re\n\ndef chunks(md: str, doc_title: str, max_chars: int = 3000):\n    path, buf = [doc_title], []\n    for block in re.split(r\"\\n(?=#{1,3} )|\\n\\n\", md):\n        if m := re.match(r\"(#{1,3}) (.+)\", block):\n            yield from flush(path, buf); buf = []\n            level = len(m.group(1)); path = path[:level] + [m.group(2)]\n        elif block.lstrip().startswith((\"|\", \"\u003Ctable\")):\n            yield from flush(path, buf); buf = []\n            yield {\"context\": \" > \".join(path), \"text\": block, \"kind\": \"table\"}\n        else:\n            buf.append(block)\n            if sum(map(len, buf)) > max_chars:\n                yield from flush(path, buf); buf = []\n    yield from flush(path, buf)\n\ndef flush(path, buf):\n    if buf:\n        yield {\"context\": \" > \".join(path), \"text\": \"\\n\\n\".join(buf), \"kind\": \"text\"}\n",{"type":130,"level":131,"id":107,"text":108},{"type":123,"content":340},[341,342,345],"Frontier-Modelle lesen PDFs nativ. ",{"tag":215,"href":53,"children":343},[344],"Claudes PDF-Unterstützung"," akzeptiert Anfragen bis 32 MB und 600 Seiten (100 Seiten, wenn das Kontextfenster der Anfrage unter einer Million Tokens liegt) und verarbeitet jede Seite als Bild. Lädt ein Nutzer einen Vertrag in einen Chat, ist das die einfachste und oft beste Option.",{"type":123,"content":347},[348],"Für einen Korpus kippt die Rechnung. Jede Anfrage würde das erneute Lesen der Seiten bezahlen, man kann keine Seiten ranken, die man nicht embedded hat, und Zitate brauchen stabile Seiten- und Chunk-IDs. Die olmOCR-Autoren beziffern die Konvertierung von einer Million Seiten mit GPT-4o auf über 6.240 Dollar, gegenüber 176 Dollar mit ihrem offenen 7B-Modell auf eigenen GPUs. Einmal parsen, indexieren und dem Modell nur die gefundenen Chunks schicken.",{"type":130,"level":131,"id":110,"text":111},{"type":173,"head":351,"rows":358},[352,354,356],[353],"Parser",[355],"Code-Lizenz",[357],"Modellgewichte",[359,365,371],[360,361,363],[12],[362],"MIT",[364],"Lizenzen der einzelnen Modelle",[366,367,369],[220],[368],"Apache 2.0",[370],"Modifizierte OpenRAIL-M: frei für Forschung, privat und Start-ups unter 5 Mio. Dollar Finanzierung oder Umsatz; darüber kostenpflichtig",[372,373,375],[224],[374],"MinerU Open Source License (Apache 2.0 mit Zusatzbedingungen)",[376],"Siehe Repository",{"type":123,"content":378},[379,380,384],"Vor dem Go-live eines Kundenprojekts die Lizenz der Gewichte prüfen, nicht nur die des Codes; besonders die Marker-Bedingungen hängen von der Unternehmensgröße ab. Alle drei laufen lokal, was zählt, wenn die Dokumente personenbezogene Daten enthalten, etwa Rechnungen, Personalakten oder Support-Tickets. Nutzt man doch einen gehosteten Parser oder eine LLM-API, gelten die Fragen aus ",{"tag":163,"to":381,"children":382},"\u002Fblog\u002Fgdpr-llm-api-eu-data-residency",[383],"DSGVO und LLM-Datenresidenz"," unverändert.",{"type":130,"level":131,"id":113,"text":114},{"type":123,"content":387},[388],"Die Idee von olmOCR-bench übernehmen und Unit-Tests für eigene Seiten schreiben. 30 bis 50 Seiten wählen, die den Korpus abbilden, auch die hässlichen: einen gescannten Lieferschein, ein zweispaltiges Datenblatt, eine seitenübergreifende Tabelle. Für jede Seite ein paar Prüfungen schreiben, die ein korrektes Ergebnis bestehen muss, und jeden Kandidaten dagegen laufen lassen.",{"type":311,"code":390},"# Illustrative page checks, scored per parser\nCHECKS = [\n  {\"page\": \"datasheet-p2\", \"present\": \"Operating temperature -20 to 60 °C\"},\n  {\"page\": \"datasheet-p2\", \"order\": [\"Dimensions\", \"Weight\", \"Material\"]},\n  {\"page\": \"pricelist-p1\", \"cell\": {\"row\": \"ART-10001\", \"col\": \"Unit price\", \"value\": \"12.40\"}},\n  {\"page\": \"delivery-note-scan\", \"present\": \"Lieferschein Nr. 48211\"},\n  {\"page\": \"manual-p7\", \"absent\": \"Page 7 of 112\"},   # footer must not leak into text\n]\n",{"type":123,"content":392},[393],"Jeden Parser nach Bestehensquote, Seiten pro Sekunde auf der eigenen Hardware und Kosten bewerten. Dann die Retrieval-Evaluation auf dem Output des Gewinners laufen lassen, denn der Parser, der die Prüfungen gewinnt, gewinnt meist, aber nicht immer, auch das Retrieval.",{"type":395,"variant":396,"title":397,"body":398},"callout","tip","Einmal parsen, Zwischenergebnis behalten",[399],[400],"Den strukturierten Output (Docling-JSON, Marker-JSON oder Markdown) mit Parser-Name, Version und Modus speichern. Chunking und Embedding ändern sich oft; OCR ist der teure Schritt, den man nur erneut bezahlen will, wenn man bewusst den Parser wechselt.",{"type":130,"level":131,"id":116,"text":117},{"type":123,"content":403},[404,405,408,409,413],"Industriedokumente stecken voller Artikelnummern, Einheiten und Tabellen, genau dort tun Textlayer-Fehler weh: ein verlorener Bindestrich in ",{"tag":311,"children":406},[407],"ART-10001",", ein Gradzeichen als Fragezeichen, eine fehlende Einheitenspalte. Exakte Kennungen mit einem Keyword-Index neben den Vektoren auffindbar halten, wie in ",{"tag":163,"to":410,"children":411},"\u002Fblog\u002Fsemantic-product-search-b2b",[412],"semantischer Produktsuche für B2B-Shops"," beschrieben, und Prüfungen für Artikelnummern in den Parser-Testsatz aufnehmen.",{"type":123,"content":415},[416],"Viele Datenblätter existieren auch als strukturierte Daten in einem PIM. Wo das so ist, die PIM-Attribute indexieren und das PDF als Quelle verlinken, statt das PDF zurückzuentwickeln, das das PIM erzeugt hat. Hat man nur PDFs, ist eine Layout-Pipeline mit selektiver OCR der vernünftige Standard, ein Vision-Modell für ganze Seiten bleibt für die Seiten reserviert, an denen sie scheitert.",{"type":130,"level":131,"id":119,"text":120},{"type":136,"ordered":288,"items":419},[420,423,426,429,432,435,438],[421],{"tag":215,"href":38,"children":422},[37],[424],{"tag":215,"href":41,"children":425},[40],[427],{"tag":215,"href":44,"children":428},[43],[430],{"tag":215,"href":47,"children":431},[46],[433],{"tag":215,"href":50,"children":434},[49],[436],{"tag":215,"href":53,"children":437},[52],[439],{"tag":215,"href":56,"children":440},[55],[442,499,553,597],{"slug":443,"published":5,"minutes":444,"category":7,"tags":445,"keywords":450,"about":461,"sources":471,"cover":493,"og":494,"expertise":59,"locales":495,"lang":62,"title":496,"description":497,"coverAlt":498},"multilingual-rag-german-hungarian",7,[9,446,447,448,449],"Multilingual","Embeddings","German","Hungarian",[451,452,453,454,455,456,457,458,459,460],"multilingual rag","german rag embeddings","hungarian nlp search","cross-lingual retrieval","multilingual embedding model","bge-m3 german","german compound words search","hungarian stemming postgres","multilingual-e5-large-instruct","qwen3 embedding multilingual",[462,465,468],{"name":463,"url":464},"Cross-language information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-language_information_retrieval",{"name":466,"url":467},"Agglutinative language","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgglutinative_language",{"name":469,"url":470},"Compound (linguistics)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCompound_(linguistics)",[472,475,478,481,484,487,490],{"title":473,"url":474},"Enevoldsen et al.: MMTEB: Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":476,"url":477},"Chen et al.: M3-Embedding (BGE-M3): Multi-Linguality, Multi-Functionality, Multi-Granularity (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":479,"url":480},"Zhang et al.: Qwen3 Embedding: Advancing Text Embedding and Reranking Through Foundation Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05176",{"title":482,"url":483},"Hugging Face: intfloat\u002Fmultilingual-e5-large-instruct model card","https:\u002F\u002Fhuggingface.co\u002Fintfloat\u002Fmultilingual-e5-large-instruct",{"title":485,"url":486},"Elasticsearch Reference: Hyphenation decompounder token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-hyp-decomp-tokenfilter",{"title":488,"url":489},"PostgreSQL 18 Documentation: Text search dictionaries","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftextsearch-dictionaries.html",{"title":491,"url":492},"Snowball: stemming algorithms by language","https:\u002F\u002Fsnowballstem.org\u002Falgorithms\u002F","\u002Fimages\u002Fblog\u002Fmultilingual-rag-german-hungarian\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmultilingual-rag-german-hungarian\u002Fog.jpg",[61,62,63],"Mehrsprachiges RAG für Deutsch und Ungarisch: Embeddings, Komposita und sprachübergreifende Suche","RAG über deutsche und ungarische Inhalte: mehrsprachige Embeddings, Komposita, Stemming, Akzente und Evaluation pro Sprache.","Eine deutsche und eine ungarische Anfrage treffen sich in einem mehrsprachigen Vektorraum neben sprachspezifischen Keyword-Indizes, danach Reranker und Antwort.",{"slug":500,"published":5,"minutes":501,"category":7,"tags":502,"keywords":508,"about":519,"sources":528,"cover":547,"og":548,"expertise":59,"locales":549,"lang":62,"title":550,"description":551,"coverAlt":552},"text-to-sql-llm-guardrails",8,[503,504,505,506,507],"Text-to-SQL","LLM security","PostgreSQL","Agents","Analytics",[509,510,511,512,513,514,515,516,517,518],"text to sql llm","text-to-sql guardrails","llm sql agent security","natural language to sql production","read only database role llm","bird benchmark text to sql","spider 2.0 benchmark","sqlglot validate sql","row level security llm","chat with your database",[520,523,526],{"name":521,"url":522},"SQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSQL",{"name":524,"url":525},"Natural language interface to databases","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNatural-language_user_interface",{"name":505,"url":527},"https:\u002F\u002Fwww.postgresql.org\u002F",[529,532,535,538,541,544],{"title":530,"url":531},"BIRD-bench: leaderboard and dataset description","https:\u002F\u002Fbird-bench.github.io\u002F",{"title":533,"url":534},"Lei et al.: Spider 2.0: Evaluating Language Models on Real-World Enterprise Text-to-SQL Workflows (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2411.07763",{"title":536,"url":537},"PostgreSQL 18 Documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":539,"url":540},"PostgreSQL 18 Documentation: Client Connection Defaults (read-only and timeouts)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fruntime-config-client.html",{"title":542,"url":543},"SQLGlot: SQL parser, transpiler and optimizer (GitHub)","https:\u002F\u002Fgithub.com\u002Ftobymao\u002Fsqlglot",{"title":545,"url":546},"OWASP Gen AI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F","\u002Fimages\u002Fblog\u002Ftext-to-sql-llm-guardrails\u002Fcover.webp","\u002Fimages\u002Fblog\u002Ftext-to-sql-llm-guardrails\u002Fog.jpg",[61,62,63],"Text-to-SQL mit LLMs: Schema-Kontext, Read-only-Rollen und Validierung, die hält","Wie genau Text-to-SQL wirklich ist, wie das Modell Schema-Kontext bekommt und welche Datenbank- und Code-Leitplanken generiertes SQL sicher machen.","Eine Frage durchläuft Schema-Kontext, SQL-Generierung, einen Validator und eine Read-only-Datenbankrolle, bevor eine Ergebnistabelle zurückkommt.",{"slug":554,"published":5,"minutes":555,"category":7,"tags":556,"keywords":560,"about":571,"sources":581,"cover":591,"og":592,"expertise":59,"locales":593,"lang":62,"title":594,"description":595,"coverAlt":596},"embedding-quantization-binary-matryoshka",5,[447,557,558,559,9],"Vector search","Quantization","pgvector",[561,562,563,564,565,566,567,568,569,570],"embedding quantization","binary quantization embeddings","int8 embeddings","matryoshka embeddings","reduce vector database memory","pgvector halfvec","pgvector binary_quantize","embedding dimensions reduction","rescoring binary embeddings","vector index memory cost",[572,575,578],{"name":573,"url":574},"Quantization (signal processing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQuantization_(signal_processing)",{"name":576,"url":577},"Nearest neighbor search","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNearest_neighbor_search",{"name":579,"url":580},"Hamming distance","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHamming_distance",[582,585,588],{"title":583,"url":584},"Hugging Face: Binary and Scalar Embedding Quantization for Significantly Faster and Cheaper Retrieval (Mar 2024)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Fembedding-quantization",{"title":586,"url":587},"Kusupati et al.: Matryoshka Representation Learning (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2205.13147",{"title":589,"url":590},"pgvector README: halfvec, bit, binary quantization and subvector indexing","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector","\u002Fimages\u002Fblog\u002Fembedding-quantization-binary-matryoshka\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fembedding-quantization-binary-matryoshka\u002Fog.jpg",[61,62,63],"Embedding-Quantisierung: Binär-, int8- und Matryoshka-Vektoren ohne Qualitätsverlust beim Retrieval","Wie Binär- und int8-Quantisierung und Matryoshka-Kürzung Vektorindizes 4- bis 32-mal verkleinern, was das an Recall kostet und wie Rescoring es zurückholt.","Ein float32-Embedding schrumpft zu halber Genauigkeit, int8 und Binärbits, mit einem Rescoring-Schritt, der die Ranking-Qualität wiederherstellt.",{"slug":598,"published":599,"minutes":600,"category":7,"tags":601,"keywords":605,"about":615,"sources":623,"cover":660,"og":661,"expertise":59,"locales":662,"lang":62,"title":663,"description":664,"coverAlt":665},"graphrag-knowledge-graph-rag","2026-10-02",13,[602,603,604,9],"GraphRAG","Knowledge graphs","LightRAG",[602,606,607,608,609,610,611,612,613,614],"knowledge graph RAG","GraphRAG vs vector RAG","Microsoft GraphRAG explained","LightRAG vs GraphRAG","GraphRAG global vs local search","GraphRAG indexing cost","when to use GraphRAG","multi-hop RAG","LazyGraphRAG",[616,619,620],{"name":617,"url":618},"Knowledge graph","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnowledge_graph",{"name":33,"url":34},{"name":621,"url":622},"Leiden algorithm","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLeiden_algorithm",[624,627,630,633,636,639,642,645,648,651,654,657],{"title":625,"url":626},"Edge et al.: From Local to Global: A Graph RAG Approach to Query-Focused Summarization (arXiv:2404.16130)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.16130",{"title":628,"url":629},"Microsoft GraphRAG documentation: overview","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002F",{"title":631,"url":632},"Microsoft GraphRAG documentation: default dataflow","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Findex\u002Fdefault_dataflow\u002F",{"title":634,"url":635},"Microsoft GraphRAG documentation: global search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fglobal_search\u002F",{"title":637,"url":638},"Microsoft GraphRAG documentation: local search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Flocal_search\u002F",{"title":640,"url":641},"Microsoft GraphRAG documentation: DRIFT search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fdrift_search\u002F",{"title":643,"url":644},"Microsoft GraphRAG documentation: getting started","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fget_started\u002F",{"title":646,"url":647},"Microsoft Research: LazyGraphRAG, setting a new standard for quality and cost (25 November 2024)","https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fblog\u002Flazygraphrag-setting-a-new-standard-for-quality-and-cost\u002F",{"title":649,"url":650},"Guo et al.: LightRAG: Simple and Fast Retrieval-Augmented Generation (arXiv:2410.05779)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779",{"title":652,"url":653},"HKUDS\u002FLightRAG on GitHub","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FLightRAG",{"title":655,"url":656},"Gutiérrez et al.: HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models (arXiv:2405.14831)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2405.14831",{"title":658,"url":659},"Xiang et al.: When to use Graphs in RAG: A Comprehensive Analysis for Graph Retrieval-Augmented Generation (arXiv:2506.05690)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05690","\u002Fimages\u002Fblog\u002Fgraphrag-knowledge-graph-rag\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fgraphrag-knowledge-graph-rag\u002Fog.jpg",[61,62,63],"GraphRAG und Knowledge-Graph-RAG: wann ein Graph die Vektorsuche schlägt","Was Microsoft GraphRAG und LightRAG wirklich tun, was die Indexierung kostet und wann ein Wissensgraph Vektor-RAG schlägt: Multi-Hop, globale Fragen, Produktkataloge.","Diagramm: ein Wissensgraph als Zentrum, verbunden mit Entitäten, Communities, lokaler Suche, globaler Suche und Produktteilen.",1792177149310]