[{"data":1,"prerenderedAt":574},["ShallowReactive",2],{"blog-text-to-sql-llm-guardrails-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":34,"cover":53,"og":54,"expertise":55,"locales":56,"lang":58,"title":60,"description":61,"coverAlt":62,"metaTitle":63,"takeaways":64,"faq":70,"toc":86,"blocks":116,"others":345},"text-to-sql-llm-guardrails","2026-10-16",8,"rag",[9,10,11,12,13],"Text-to-SQL","LLM security","PostgreSQL","Agents","Analytics",[15,16,17,18,19,20,21,22,23,24],"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",[26,29,32],{"name":27,"url":28},"SQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSQL",{"name":30,"url":31},"Natural language interface to databases","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNatural-language_user_interface",{"name":11,"url":33},"https:\u002F\u002Fwww.postgresql.org\u002F",[35,38,41,44,47,50],{"title":36,"url":37},"BIRD-bench: leaderboard and dataset description","https:\u002F\u002Fbird-bench.github.io\u002F",{"title":39,"url":40},"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":42,"url":43},"PostgreSQL 18 Documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":45,"url":46},"PostgreSQL 18 Documentation: Client Connection Defaults (read-only and timeouts)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fruntime-config-client.html",{"title":48,"url":49},"SQLGlot: SQL parser, transpiler and optimizer (GitHub)","https:\u002F\u002Fgithub.com\u002Ftobymao\u002Fsqlglot",{"title":51,"url":52},"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","ai-engineer",[57,58,59],"en","de","hu","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.","Text-to-SQL mit LLMs: Leitplanken, die halten · Balázs Csorba",[65,66,67,68,69],"Die besten BIRD-Systeme erreichen rund 83 % Ausführungsgenauigkeit gegenüber 93 % bei menschlichen Experten, agentische Unternehmensaufgaben in Spider 2.0 sind viel schwerer.","Genauigkeit kommt vor allem aus dem Schema-Kontext: kuratierte Views, Spaltenbeschreibungen, Beispielwerte, ein Glossar und geprüfte Beispielabfragen.","Sicherheit zuerst in der Datenbank erzwingen: eine Rolle mit SELECT nur auf kuratierte Views, Read-only-Transaktionen, Timeouts und Row-Level Security.","Im Code als zweite Schicht validieren: SQL parsen, genau ein SELECT erlauben, Tabellen gegen eine Allowlist prüfen und ein Zeilenlimit setzen.","Dem Nutzer das generierte SQL und die Ergebnistabelle zeigen und an eigenen Fragen durch Vergleich der ausgeführten Ergebnisse evaluieren.",[71,74,77,80,83],{"q":72,"a":73},"Wie genau ist Text-to-SQL im Jahr 2026?","Auf dem BIRD-Benchmark erreichen die besten veröffentlichten Systeme rund 83 % Ausführungsgenauigkeit im Testset, Data Engineers und Datenbankstudierende rund 93 %. Bei Spider 2.0 mit Unternehmensdatenbanken von über 1.000 Spalten löste ein Agent auf Basis von o1-preview bei Veröffentlichung nur 21,3 % der Aufgaben. Das eigene Schema liegt irgendwo dazwischen.",{"q":75,"a":76},"Ist es sicher, ein LLM SQL gegen die Produktion ausführen zu lassen?","Nur hinter Kontrollen auf Datenbankebene. Mit einer eigenen Rolle verbinden, die nur aus kuratierten Views lesen darf, Read-only-Transaktionen erzwingen, Statement-Timeouts setzen, Row-Level Security pro Nutzer oder Mandant anwenden und am besten ein Replikat abfragen. Prompt-Anweisungen allein sind keine Kontrolle.",{"q":78,"a":79},"Brauche ich SQL-Validierung, wenn die Rolle read-only ist?","Ja, als zweite Schicht. Durch Parsen lassen sich mehrere Statements, unbekannte Tabellen und Funktionen sowie teure Muster ablehnen, bevor sie die Datenbank erreichen, und das Modell bekommt eine klare Fehlermeldung zum Reparieren.",{"q":81,"a":82},"Was ist ein Semantic Layer und brauche ich einen?","Ein Semantic Layer definiert Geschäftskennzahlen wie Umsatz oder aktive Kunden einmal im Code. Fragen Nutzer vor allem nach definierten Kennzahlen, sollte das Modell Kennzahlen und Filter aus dieser Schicht wählen statt freies SQL zu schreiben; das ist genauer und konsistenter.",{"q":84,"a":85},"Können Daten in der Datenbank das Modell angreifen?","Ja. Textspalten wie Produktbeschreibungen oder Ticket-Texte können Anweisungen enthalten, die das Modell in den Ergebnissen liest. Abfrageergebnisse als nicht vertrauenswürdige Eingabe behandeln und demselben Agenten keine Tools geben, die Daten nach außen senden können.",[87,90,93,96,99,102,104,107,110,113],{"id":88,"title":89},"how-accurate-is-text-to-sql","Wie genau ist Text-to-SQL heute?",{"id":91,"title":92},"architecture","Wie sieht eine sichere Text-to-SQL-Architektur aus?",{"id":94,"title":95},"schema-context","Welchen Schema-Kontext braucht das Modell?",{"id":97,"title":98},"database-guardrails","Welche Leitplanken gehören in die Datenbank?",{"id":100,"title":101},"validate-in-code","Wie validiert man generiertes SQL im Code?",{"id":103,"title":84},"prompt-injection-through-data",{"id":105,"title":106},"show-the-sql","Warum sollten Nutzer das generierte SQL sehen?",{"id":108,"title":109},"evaluate","Wie evaluiert man ein Text-to-SQL-Feature?",{"id":111,"title":112},"when-not-to-use-free-sql","Wann sollte man gar kein freies SQL generieren?",{"id":114,"title":115},"sources","Quellen",[117,121,124,127,134,140,141,150,153,154,170,212,215,216,228,230,271,278,279,286,288,291,292,300,307,308,311,312,320,321,324,325],{"type":118,"content":119},"paragraph",[120],"Jedes Unternehmen mit einer Datenbank hat jemanden, der ihr Fragen in normaler Sprache stellen will: Wie viele Bestellungen kamen im letzten Quartal aus Österreich, welche Kunden kaufen nicht mehr, welche Artikel liegen unter dem Mindestbestand. LLMs schreiben ordentliches SQL, die Demo dauert also einen Nachmittag. Die Produktion dauert länger, denn die schweren Teile sind nicht die Generierung, sondern der richtige Schema-Kontext und die Gewissheit, dass eine falsche oder manipulierte Abfrage keinen Schaden anrichten kann.",{"type":118,"content":122},[123],"Dieser Artikel beginnt damit, was die Benchmarks zur Genauigkeit sagen, und geht dann die Architektur durch, die ich nutze: kuratierter Schema-Kontext, eine Datenbankrolle, die nur lesen darf, was sie soll, Validierung im Code und eine Prüfschleife mit dem Nutzer. Die Beispiele verwenden PostgreSQL, die Schichten gelten aber für jede SQL-Datenbank.",{"type":125,"level":126,"id":88,"text":89},"heading",2,{"type":118,"content":128},[129,133],{"tag":130,"href":37,"children":131},"a",[132],"BIRD"," ist der Standard-Benchmark für realistische Datenbanken: 12.751 Frage-SQL-Paare über 95 Datenbanken mit zusammen 33,4 GB, mit unsauberen Werten und benötigtem Zusatzwissen. Das Leaderboard nennt für Menschen (Data Engineers und Datenbankstudierende) 92,96 % Ausführungsgenauigkeit im Testset. Die besten Systeme erreichen im September 2026 rund 83 %, und sie bekommen Oracle-Wissenshinweise, die eigene Nutzer nicht mitliefern.",{"type":118,"content":135},[136,139],{"tag":130,"href":40,"children":137},[138],"Spider 2.0"," zeigt das Unternehmensende: 632 Workflow-Aufgaben auf echten Datenbanken in BigQuery, Snowflake und anderen, oft mit mehr als 1.000 Spalten und SQL über 100 Zeilen. Bei Veröffentlichung löste ein Code-Agent auf Basis von o1-preview 21,3 % davon, gegenüber 91,2 % auf dem ursprünglichen Spider und 73,0 % auf BIRD. Die Lehre ist nicht, dass Text-to-SQL scheitert, sondern dass die Genauigkeit davon abhängt, wie viel von der Bedeutung des Schemas das Modell findet.",{"type":125,"level":126,"id":91,"text":92},{"type":142,"attrs":143,"inner":147,"caption":148},"diagram",{"viewBox":144,"role":145,"aria-labelledby":146},"0 0 720 170","img","t2s1-t t2s1-d","\u003Ctitle id=\"t2s1-t\">Schichten eines Text-to-SQL-Systems\u003C\u002Ftitle>\u003Cdesc id=\"t2s1-d\">Eine Frage wird mit abgerufenem Schema-Kontext kombiniert, das Modell erzeugt SQL, ein Validator parst und prüft es, die Abfrage läuft unter einer Read-only-Rolle mit Timeouts und Row-Level Security, und der Nutzer sieht SQL und Ergebnistabelle.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"t2s1-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\">Frage\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">+ Schema-Kontext\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#t2s1-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\">Generieren\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">ein SELECT\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#t2s1-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\">Validieren\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">parsen, Allowlist\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#t2s1-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\">Ausführen\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Read-only-Rolle\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#t2s1-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\">Anzeigen\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">SQL + Tabelle\u003C\u002Ftext>",[149],"Scheitern Validierung oder Ausführung, geht der Fehler für ein oder zwei Reparaturversuche ans Modell zurück, nie mehr.",{"type":118,"content":151},[152],"Die Reihenfolge zählt. Die Datenbankschicht ist die Garantie; der Validator ist eine schnelle zweite Schicht, die dem Modell nützliche Fehler liefert; die Prüfung durch den Nutzer fängt Abfragen, die gültig und sicher sind und trotzdem die falsche Frage beantworten.",{"type":125,"level":126,"id":94,"text":95},{"type":118,"content":155},[156,157,161,162,165,166,169],"Rohe ",{"tag":158,"children":159},"code",[160],"CREATE TABLE","-Anweisungen reichen nicht. Spaltennamen wie ",{"tag":158,"children":163},[164],"kz_status"," oder ",{"tag":158,"children":167},[168],"art_typ"," sagen einem Modell nichts, und neuen Mitarbeitern auch wenig. Was hilft, grob nach Wirkung sortiert:",{"type":171,"ordered":172,"items":173},"list",true,[174,184,189,202,207],[175,179,180,183],{"tag":176,"children":177},"strong",[178],"Kuratierte Views"," mit lesbaren Namen, die die Tabellen verbinden, nach denen tatsächlich gefragt wird, etwa ",{"tag":158,"children":181},[182],"v_orders"," mit Kundenland und Nettobetrag in Euro.",[185,188],{"tag":176,"children":186},[187],"Spaltenbeschreibungen"," mit Einheiten, Codes und deren Bedeutung: Status 3 heißt versendet, Beträge sind netto, Datumswerte in Ortszeit.",[190,193,194,197,198,201],{"tag":176,"children":191},[192],"Beispielwerte"," für Spalten mit wenigen Ausprägungen, damit das Modell ",{"tag":158,"children":195},[196],"country = 'AT'"," schreibt und nicht ",{"tag":158,"children":199},[200],"country = 'Austria'",".",[203,206],{"tag":176,"children":204},[205],"Ein Geschäftsglossar:"," Was als aktiver Kunde zählt, welche Bestellungen als Umsatz zählen, wie ein Geschäftsjahr definiert ist.",[208,211],{"tag":176,"children":209},[210],"Geprüfte Beispielabfragen,"," Paare aus Frage und SQL, die jemand kontrolliert hat, nach Ähnlichkeit zur neuen Frage abgerufen.",{"type":118,"content":213},[214],"Bei großen Schemata nicht alles in den Prompt kopieren. Die relevanten Views und Beschreibungen pro Frage abrufen, genau wie Dokumente bei RAG. In Glossar und Beispiele fließt auch die meiste laufende Arbeit: Jede falsche Antwort, die ein Nutzer meldet, sollte als neues geprüftes Beispiel oder korrigierte Beschreibung enden.",{"type":125,"level":126,"id":97,"text":98},{"type":118,"content":217},[218,219,222,223,201],"OWASP führt ",{"tag":130,"href":52,"children":220},[221],"Excessive Agency"," als Top-Risiko für LLM-Anwendungen und nutzt fast genau diesen Fall als Beispiel: Ein Agent, der nur Lesezugriff auf eine Produkttabelle braucht, sollte keine anderen Tabellen anfassen oder Datensätze ändern können, und das sollte über Datenbankrechte der Identität erzwungen werden, mit der sich der Agent verbindet. Das ist dasselbe Prinzip wie in ",{"tag":224,"to":225,"children":226},"link","\u002Fblog\u002Fai-agent-identity-least-privilege",[227],"KI-Agenten sind Identitäten",{"type":158,"code":229},"-- A role for the assistant: SELECT on curated views, nothing else\nCREATE ROLE sql_assistant LOGIN PASSWORD :'pw' NOSUPERUSER NOCREATEDB NOCREATEROLE;\nREVOKE ALL ON SCHEMA public FROM sql_assistant;\nGRANT USAGE ON SCHEMA reporting TO sql_assistant;\nGRANT SELECT ON reporting.v_orders, reporting.v_customers, reporting.v_stock TO sql_assistant;\n\n-- Every transaction read-only, every statement time-limited\nALTER ROLE sql_assistant SET default_transaction_read_only = on;\nALTER ROLE sql_assistant SET statement_timeout = '5s';\nALTER ROLE sql_assistant SET transaction_timeout = '10s';\n\n-- Row-level security on the base table: each session sees only its tenant\n-- (views need security_invoker = true so the policy applies to the caller)\nALTER TABLE orders ENABLE ROW LEVEL SECURITY;\nCREATE POLICY tenant_only ON orders FOR SELECT TO sql_assistant\n  USING (tenant_id = current_setting('app.tenant_id')::int);\nALTER VIEW reporting.v_orders SET (security_invoker = true);\n",{"type":231,"head":232,"rows":237},"table",[233,235],[234],"Kontrolle",[236],"Was sie verhindert",[238,243,250,261,266],[239,241],[240],"SELECT nur auf kuratierte Views",[242],"Lesen von Gehältern, Passwort-Hashes, anderen Schemata",[244,248],[245],{"tag":158,"children":246},[247],"default_transaction_read_only",[249],"Schreibzugriffe, selbst bei zu breitem Grant",[251,259],[252,255,256],{"tag":158,"children":253},[254],"statement_timeout",", ",{"tag":158,"children":257},[258],"transaction_timeout",[260],"Kartesische Joins und ausufernde Scans",[262,264],[263],"Row-Level Security",[265],"Dass ein Kunde oder Mandant die Zeilen eines anderen sieht",[267,269],[268],"Lese-Replikat",[270],"Dass Analyse-Last Shop oder ERP bremst",{"type":118,"content":272},[273,274,277],"Zwei Details aus der ",{"tag":130,"href":43,"children":275},[276],"PostgreSQL-Dokumentation zu Row Security"," übersieht man leicht: Der Tabelleneigentümer unterliegt normalerweise keinen Row-Security-Policies, der Assistent darf sich also nie als Eigentümer verbinden, und ist RLS ohne Policy aktiviert, gilt standardmäßig Ablehnung.",{"type":125,"level":126,"id":100,"text":101},{"type":118,"content":280},[281,282,285],"Das SQL mit einem echten Parser parsen statt mit regulären Ausdrücken. ",{"tag":130,"href":49,"children":283},[284],"SQLGlot"," parst über 30 Dialekte in einen Syntaxbaum, den man prüfen kann. Die Prüfungen unten lehnen alles ab, was keine einzelne Leseabfrage auf erlaubten Views ist, und setzen ein Zeilenlimit.",{"type":158,"code":287},"# Illustrative validator with sqlglot (second layer; the database role is the guarantee)\nimport sqlglot\nfrom sqlglot import exp\n\nALLOWED = {\"v_orders\", \"v_customers\", \"v_stock\"}\nWRITE_NODES = (exp.Insert, exp.Update, exp.Delete, exp.Merge, exp.Create, exp.Drop, exp.Alter, exp.Command)\nMAX_ROWS = 1000\n\ndef validate(sql: str) -> str:\n    statements = sqlglot.parse(sql, read=\"postgres\")\n    if len(statements) != 1 or statements[0] is None:\n        raise ValueError(\"exactly one statement is allowed\")\n    tree = statements[0]\n    if not isinstance(tree, exp.Query):\n        raise ValueError(\"only SELECT queries are allowed\")\n    if any(tree.find_all(*WRITE_NODES)):\n        raise ValueError(\"data-modifying statements are not allowed\")\n    ctes = {c.alias_or_name for c in tree.find_all(exp.CTE)}\n    tables = {t.name for t in tree.find_all(exp.Table)} - ctes\n    if unknown := tables - ALLOWED:\n        raise ValueError(f\"unknown tables: {sorted(unknown)}; allowed: {sorted(ALLOWED)}\")\n    if not tree.args.get(\"limit\"):\n        tree = tree.limit(MAX_ROWS)\n    return tree.sql(dialect=\"postgres\")\n",{"type":118,"content":289},[290],"Die Fehlermeldung ans Modell zurückgeben und ein oder zwei Reparaturversuche erlauben. Die Meldungen sind fürs Modell geschrieben: Die Nennung der erlaubten Views reicht oft, damit es die Abfrage korrigiert.",{"type":125,"level":126,"id":103,"text":84},{"type":118,"content":293},[294,295,299],"Ja. Ergebnisse gehen zurück in den Kontext des Modells, und Textspalten wie Produktbeschreibungen, Kundennotizen oder Ticket-Texte können Anweisungen enthalten, die jeder schreiben konnte, der sie bearbeiten durfte. Kann derselbe Agent auch E-Mails senden oder externe APIs aufrufen, hat man alle drei Teile der ",{"tag":224,"to":296,"children":297},"\u002Fblog\u002Fprompt-injection-lethal-trifecta-patterns",[298],"tödlichen Dreifaltigkeit",": private Daten, nicht vertrauenswürdige Inhalte und einen Weg nach draußen. Die Tools des SQL-Assistenten auf Abfragen und Anzeigen beschränken und Freitextspalten nur zusammenfassen, wenn der Nutzer es ausdrücklich verlangt.",{"type":301,"variant":302,"title":303,"body":304},"callout","warn","„Nur SELECT ausführen“ im Prompt ist keine Leitplanke",[305],[306],"Eine Anweisung im Prompt ist eine Bitte, der das Modell meist folgt. Eine Rolle ohne Schreibrechte und eine Read-only-Transaktion sind Garantien. Jede Grenze, auf die man sich verlässt, gehört in die Datenbank oder in den Code.",{"type":125,"level":126,"id":105,"text":106},{"type":118,"content":309},[310],"Der gefährlichste Fehler ist eine Abfrage, die sauber läuft und eine leicht andere Frage beantwortet: netto statt brutto, Bestelldatum statt Rechnungsdatum, stornierte Bestellungen mitgezählt. Das SQL oder eine verständliche Zusammenfassung seiner Filter neben der Ergebnistabelle zeigen und Nutzern einen Klick zum Melden einer falschen Antwort geben. Diese Meldungen speisen Glossar und geprüfte Beispiele.",{"type":125,"level":126,"id":108,"text":109},{"type":118,"content":313},[314,315,319],"Ausführungsgenauigkeit nutzen, die BIRD-Metrik: generierte und Referenzabfrage ausführen und die Ergebnismengen vergleichen, nicht den SQL-Text. 50 bis 100 Fragen aus echten Anfragen bauen, jeweils mit Referenzabfrage, und sie in der CI laufen lassen, sobald sich Modell, Prompt oder Schema-Kontext ändern, wie in ",{"tag":224,"to":316,"children":317},"\u002Fblog\u002Fllm-evals-for-product-features",[318],"LLM-Evals für Produktfeatures",". Einen Anteil an Fragen behalten, die abgelehnt werden sollen, etwa nach Daten, die die Rolle nicht sehen darf, und prüfen, dass das System das sagt statt zu raten.",{"type":125,"level":126,"id":111,"text":112},{"type":118,"content":322},[323],"Drehen sich die meisten Fragen um wenige definierte Kennzahlen, Umsatz, Marge, offene Bestellungen, ist ein Semantic Layer oder ein Satz parametrisierter Abfrage-Tools genauer als freies SQL: Das Modell wählt Kennzahl, Dimensionen und Filter, Code baut die Abfrage. Freies SQL lohnt sein Risiko für explorative Fragen von Analysten, die das Ergebnis kritisch lesen können, nicht für Zahlen, die ungeprüft in einen Vorstandsbericht wandern.",{"type":125,"level":126,"id":114,"text":115},{"type":171,"ordered":172,"items":326},[327,330,333,336,339,342],[328],{"tag":130,"href":37,"children":329},[36],[331],{"tag":130,"href":40,"children":332},[39],[334],{"tag":130,"href":43,"children":335},[42],[337],{"tag":130,"href":46,"children":338},[45],[340],{"tag":130,"href":49,"children":341},[48],[343],{"tag":130,"href":52,"children":344},[51],[346,404,461,505],{"slug":347,"published":5,"minutes":348,"category":7,"tags":349,"keywords":355,"about":366,"sources":376,"cover":398,"og":399,"expertise":55,"locales":400,"lang":58,"title":401,"description":402,"coverAlt":403},"pdf-document-parsing-for-rag",9,[350,351,352,353,354],"RAG","PDF parsing","OCR","Docling","Document AI",[356,357,358,359,360,361,362,363,364,365],"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",[367,370,373],{"name":368,"url":369},"PDF","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPDF",{"name":371,"url":372},"Optical character recognition","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOptical_character_recognition",{"name":374,"url":375},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[377,380,383,386,389,392,395],{"title":378,"url":379},"Docling: README, features and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdocling-project\u002Fdocling",{"title":381,"url":382},"Auer et al.: Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.17887",{"title":384,"url":385},"Datalab: Marker README, olmOCR-bench results and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdatalab-to\u002Fmarker",{"title":387,"url":388},"OpenDataLab: MinerU README and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU",{"title":390,"url":391},"Poznanski et al.: olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.18443",{"title":393,"url":394},"Claude Platform Docs: PDF support","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fpdf-support",{"title":396,"url":397},"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",[57,58,59],"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.",{"slug":405,"published":5,"minutes":406,"category":7,"tags":407,"keywords":412,"about":423,"sources":433,"cover":455,"og":456,"expertise":55,"locales":457,"lang":58,"title":458,"description":459,"coverAlt":460},"multilingual-rag-german-hungarian",7,[350,408,409,410,411],"Multilingual","Embeddings","German","Hungarian",[413,414,415,416,417,418,419,420,421,422],"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",[424,427,430],{"name":425,"url":426},"Cross-language information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-language_information_retrieval",{"name":428,"url":429},"Agglutinative language","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgglutinative_language",{"name":431,"url":432},"Compound (linguistics)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCompound_(linguistics)",[434,437,440,443,446,449,452],{"title":435,"url":436},"Enevoldsen et al.: MMTEB: Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":438,"url":439},"Chen et al.: M3-Embedding (BGE-M3): Multi-Linguality, Multi-Functionality, Multi-Granularity (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":441,"url":442},"Zhang et al.: Qwen3 Embedding: Advancing Text Embedding and Reranking Through Foundation Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05176",{"title":444,"url":445},"Hugging Face: intfloat\u002Fmultilingual-e5-large-instruct model card","https:\u002F\u002Fhuggingface.co\u002Fintfloat\u002Fmultilingual-e5-large-instruct",{"title":447,"url":448},"Elasticsearch Reference: Hyphenation decompounder token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-hyp-decomp-tokenfilter",{"title":450,"url":451},"PostgreSQL 18 Documentation: Text search dictionaries","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftextsearch-dictionaries.html",{"title":453,"url":454},"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",[57,58,59],"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":462,"published":5,"minutes":463,"category":7,"tags":464,"keywords":468,"about":479,"sources":489,"cover":499,"og":500,"expertise":55,"locales":501,"lang":58,"title":502,"description":503,"coverAlt":504},"embedding-quantization-binary-matryoshka",5,[409,465,466,467,350],"Vector search","Quantization","pgvector",[469,470,471,472,473,474,475,476,477,478],"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",[480,483,486],{"name":481,"url":482},"Quantization (signal processing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQuantization_(signal_processing)",{"name":484,"url":485},"Nearest neighbor search","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNearest_neighbor_search",{"name":487,"url":488},"Hamming distance","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHamming_distance",[490,493,496],{"title":491,"url":492},"Hugging Face: Binary and Scalar Embedding Quantization for Significantly Faster and Cheaper Retrieval (Mar 2024)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Fembedding-quantization",{"title":494,"url":495},"Kusupati et al.: Matryoshka Representation Learning (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2205.13147",{"title":497,"url":498},"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",[57,58,59],"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":506,"published":507,"minutes":508,"category":7,"tags":509,"keywords":513,"about":523,"sources":531,"cover":568,"og":569,"expertise":55,"locales":570,"lang":58,"title":571,"description":572,"coverAlt":573},"graphrag-knowledge-graph-rag","2026-10-02",13,[510,511,512,350],"GraphRAG","Knowledge graphs","LightRAG",[510,514,515,516,517,518,519,520,521,522],"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",[524,527,528],{"name":525,"url":526},"Knowledge graph","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnowledge_graph",{"name":374,"url":375},{"name":529,"url":530},"Leiden algorithm","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLeiden_algorithm",[532,535,538,541,544,547,550,553,556,559,562,565],{"title":533,"url":534},"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":536,"url":537},"Microsoft GraphRAG documentation: overview","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002F",{"title":539,"url":540},"Microsoft GraphRAG documentation: default dataflow","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Findex\u002Fdefault_dataflow\u002F",{"title":542,"url":543},"Microsoft GraphRAG documentation: global search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fglobal_search\u002F",{"title":545,"url":546},"Microsoft GraphRAG documentation: local search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Flocal_search\u002F",{"title":548,"url":549},"Microsoft GraphRAG documentation: DRIFT search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fdrift_search\u002F",{"title":551,"url":552},"Microsoft GraphRAG documentation: getting started","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fget_started\u002F",{"title":554,"url":555},"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":557,"url":558},"Guo et al.: LightRAG: Simple and Fast Retrieval-Augmented Generation (arXiv:2410.05779)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779",{"title":560,"url":561},"HKUDS\u002FLightRAG on GitHub","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FLightRAG",{"title":563,"url":564},"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":566,"url":567},"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",[57,58,59],"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.",1792177149325]