[{"data":1,"prerenderedAt":667},["ShallowReactive",2],{"blog-multilingual-rag-german-hungarian-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":118,"others":442},"multilingual-rag-german-hungarian","2026-10-16",7,"rag",[9,10,11,12,13],"RAG","Multilingual","Embeddings","German","Hungarian",[15,16,17,18,19,20,21,22,23,24],"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",[26,29,32],{"name":27,"url":28},"Cross-language information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-language_information_retrieval",{"name":30,"url":31},"Agglutinative language","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgglutinative_language",{"name":33,"url":34},"Compound (linguistics)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCompound_(linguistics)",[36,39,42,45,48,51,54],{"title":37,"url":38},"Enevoldsen et al.: MMTEB: Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":40,"url":41},"Chen et al.: M3-Embedding (BGE-M3): Multi-Linguality, Multi-Functionality, Multi-Granularity (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":43,"url":44},"Zhang et al.: Qwen3 Embedding: Advancing Text Embedding and Reranking Through Foundation Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05176",{"title":46,"url":47},"Hugging Face: intfloat\u002Fmultilingual-e5-large-instruct model card","https:\u002F\u002Fhuggingface.co\u002Fintfloat\u002Fmultilingual-e5-large-instruct",{"title":49,"url":50},"Elasticsearch Reference: Hyphenation decompounder token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-hyp-decomp-tokenfilter",{"title":52,"url":53},"PostgreSQL 18 Documentation: Text search dictionaries","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftextsearch-dictionaries.html",{"title":55,"url":56},"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","ai-engineer",[61,62,63],"en","de","hu","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.","Mehrsprachiges RAG für Deutsch und Ungarisch · Balázs Csorba",[69,70,71,72,73],"Ein mehrsprachiges Embedding-Modell lässt eine deutsche Frage einen ungarischen oder englischen Abschnitt finden, die Keyword-Suche braucht aber weiterhin Analyse pro Sprache.","Deutsche Komposita und ungarische Suffixe brechen naives BM25: Zerlegung von Komposita fürs Deutsche, ein Snowball-Stemmer fürs Ungarische.","Nutzer tippen Ungarisch und Deutsch ohne Akzente und Umlaute; im Keyword-Index Diakritika falten und zusätzlich den Originaltext speichern.","Die Sprache jedes Chunks speichern und bewusst entscheiden, ob man bei der Abfrage nach Sprache filtert, gewichtet oder mischt.","Leaderboards mitteln über viele Sprachen; vor der Modellwahl ein kleines Eval-Set pro Sprache und ein sprachübergreifendes bauen.",[75,78,81,84,87],{"q":76,"a":77},"Welches Embedding-Modell ist das beste für Deutsch und Ungarisch?","An eigenen Daten testen. Die MMTEB-Autoren fanden das 560M-Parameter-Modell multilingual-e5-large-instruct als bestes öffentlich verfügbares Modell auf ihren mehrsprachigen Benchmarks, BGE-M3 und die Qwen3-Embedding-Reihe sind starke neuere Optionen mit längeren Eingaben. Werte pro Sprache können stark vom Durchschnitt abweichen.",{"q":79,"a":80},"Sollte ich vor dem Indexieren alles ins Englische übersetzen?","Meist nicht. Übersetzung kostet Geld, bringt Fehler, verliert exakte Begriffe und macht Zitate umständlich. Ein mehrsprachiges Embedding-Modell plus Keyword-Suche pro Sprache behält den Originaltext. Für einen kleinen, wertvollen Korpus in einer Sprache, die die Modelle schlecht beherrschen, kann Übersetzung trotzdem helfen.",{"q":82,"a":83},"Wie gehe ich in der Suche mit deutschen Komposita um?","Komposita beim Indexieren mit einem Decompounding-Filter in ihre Teile zerlegen, etwa mit dem Hyphenation Decompounder von Elasticsearch und einer deutschen Wortliste, und das ganze Wort zusätzlich behalten. Dichte Embeddings kommen mit Komposita besser zurecht, ein weiterer Grund für hybride Suche.",{"q":85,"a":86},"Unterstützt PostgreSQL ungarische Volltextsuche?","Ja. PostgreSQL liefert Snowball-Stemmer mit, und Snowball hat Stemmer für Ungarisch und Deutsch, also kann man mit to_tsvector und einer Konfiguration hungarian oder german indexieren und für akzentunabhängige Treffer die Erweiterung unaccent ergänzen.",{"q":88,"a":89},"In welcher Sprache soll der Assistent antworten?","In der Sprache der Frage, außer der Nutzer wünscht etwas anderes. Die Quelle in der Originalsprache zitieren, denn ein übersetztes Zitat lässt sich nicht mehr am Dokument prüfen.",[91,94,97,100,103,106,109,112,115],{"id":92,"title":93},"why-multilingual-rag-is-harder","Warum ist mehrsprachiges RAG schwieriger als englisches?",{"id":95,"title":96},"index-strategies","Welche Indexstrategie sollte man wählen?",{"id":98,"title":99},"multilingual-embedding-models","Welche mehrsprachigen Embedding-Modelle lohnen einen Test?",{"id":101,"title":102},"german-compounds","Wie brechen deutsche Komposita die Keyword-Suche?",{"id":104,"title":105},"hungarian-suffixes-and-accents","Was brauchen ungarische Suffixe und Akzente?",{"id":107,"title":108},"language-metadata","Wie nutzt man Sprach-Metadaten bei der Abfrage?",{"id":110,"title":111},"answer-language","In welcher Sprache soll das Modell antworten?",{"id":113,"title":114},"evaluate-per-language","Wie evaluiert man mehrsprachiges Retrieval?",{"id":116,"title":117},"sources","Quellen",[119,123,126,129,151,152,200,209,218,219,256,271,284,285,310,313,314,352,354,375,376,379,398,399,407,408,415,417,418],{"type":120,"content":121},"paragraph",[122],"Die meisten RAG-Tutorials setzen englische Dokumente und englische Fragen voraus. Projekte in Österreich, Deutschland und Ungarn sehen selten so aus: Produktdaten auf Deutsch, Support-Tickets auf Ungarisch, Handbücher auf Englisch, und Nutzer, die in der Sprache fragen, in der sie gerade denken, oft ohne Umlaute oder Akzente. Ein Retrieval, das in der Demo funktioniert, verliert still die Hälfte der relevanten Abschnitte.",{"type":120,"content":124},[125],"Dieser Artikel behandelt die Entscheidungen, die bei deutschen und ungarischen Inhalten zählen: Indexstrategie, mehrsprachige Embedding-Modelle, was deutsche Komposita und ungarische Suffixe mit der Keyword-Suche machen, Akzentfaltung, Sprach-Metadaten, die Antwortsprache und die Evaluation pro Sprache. Dieselben Muster gelten für andere morphologisch reiche Sprachen.",{"type":127,"level":128,"id":92,"text":93},"heading",2,{"type":120,"content":130},[131,132,136,137,140,141,136,144,136,147,150],"Drei Probleme stapeln sich. Erstens die Morphologie: Das Deutsche klebt Substantive zu Komposita zusammen (",{"tag":133,"children":134},"em",[135],"Kaffeetasse",", ",{"tag":133,"children":138},[139],"Druckluftschlauch","), das Ungarische ist agglutinierend, ein Stamm erscheint also mit vielen Suffixen (",{"tag":133,"children":142},[143],"ház",{"tag":133,"children":145},[146],"házban",{"tag":133,"children":148},[149],"házainkban",": Haus, im Haus, in unseren Häusern). Exakte Suche verfehlt die meisten dieser Formen. Zweitens sprachübergreifende Fragen: Eine deutsche Frage, deren Antwort in einem englischen Handbuch steht, findet per Keyword-Suche nichts. Drittens gemischte Korpora: Dasselbe Dokument in drei Sprachen kann die Top-Ergebnisse mit Beinahe-Duplikaten füllen.",{"type":127,"level":128,"id":95,"text":96},{"type":153,"head":154,"rows":163},"table",[155,157,159,161],[156],"Strategie",[158],"Funktionsweise",[160],"Geeignet für",[162],"Achtung",[164,173,182,191],[165,167,169,171],[166],"Ein mehrsprachiger Index",[168],"Ein Embedding-Modell für alle Sprachen, Sprache als Metadatum",[170],"Sprachübergreifende Fragen, gemischte Korpora",[172],"Keyword-Seite braucht weiter Analyse pro Sprache",[174,176,178,180],[175],"Index pro Sprache",[177],"Getrennte Indizes, Anfrage nach erkannter Sprache geroutet",[179],"Vollständig lokalisierte Seiten mit parallelen Inhalten",[181],"Verfehlt Antworten, die es nur in einer anderen Sprache gibt",[183,185,187,189],[184],"Beim Indexieren übersetzen",[186],"Alles in eine Pivotsprache übersetzt",[188],"Kleine, wertvolle Korpora in schwach unterstützten Sprachen",[190],"Kosten, Übersetzungsfehler, verlorene exakte Begriffe",[192,194,196,198],[193],"Anfrage übersetzen",[195],"Anfrage vor der Suche in jede Korpussprache übertragen",[197],"Keyword-lastige Suche über Sprachen",[199],"Ein zusätzlicher LLM-Aufruf pro Anfrage",{"type":120,"content":201},[202,203,208],"Bei den meisten Projekten beginne ich mit einem mehrsprachigen dichten Index plus einem pro Sprache analysierten Keyword-Index, kombiniert per hybrider Suche wie in ",{"tag":204,"to":205,"children":206},"link","\u002Fblog\u002Frag-pipeline-chunking-hybrid-search-reranking",[207],"Eine produktive RAG-Pipeline, Schritt für Schritt",". Das behält den Originaltext, beantwortet sprachübergreifende Fragen über die dichte Seite und gibt jeder Sprache die passende Keyword-Analyse.",{"type":210,"attrs":211,"inner":215,"caption":216},"diagram",{"viewBox":212,"role":213,"aria-labelledby":214},"0 0 720 170","img","mlr1-t mlr1-d","\u003Ctitle id=\"mlr1-t\">Hybrides mehrsprachiges Retrieval\u003C\u002Ftitle>\u003Cdesc id=\"mlr1-d\">Die Sprache der Anfrage wird erkannt. Die Anfrage geht an einen mehrsprachigen dichten Index und an pro Sprache analysierte Keyword-Indizes. Die Ergebnisse werden fusioniert, von einem mehrsprachigen Reranker sortiert, und die Antwort entsteht in der Sprache der Frage mit Zitaten in der Originalsprache.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"mlr1-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\">Anfrage\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Sprache erkennen\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#mlr1-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\">Dicht\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">mehrsprachig\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#mlr1-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\">Keyword\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">pro Sprache\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#mlr1-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\">Rerank\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">mehrsprachig\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#mlr1-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\">Antwort\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Nutzersprache\u003C\u002Ftext>",[217],"Die dichte Seite überbrückt Sprachen; die Keyword-Seite fängt exakte Begriffe wie Artikelnummern und Namen.",{"type":127,"level":128,"id":98,"text":99},{"type":153,"head":220,"rows":229},[221,223,225,227],[222],"Modell",[224],"Größe",[226],"Max. Eingabe",[228],"Hinweise",[230,238,247],[231,232,234,236],[23],[233],"560M",[235],"512 Tokens",[237],"Bestes öffentliches Modell im MMTEB-Paper; 100 Sprachen aus XLM-R",[239,241,243,245],[240],"BGE-M3",[242],"auf XLM-R-Basis",[244],"8.192 Tokens",[246],"100+ Sprachen; dichte, sparse und Multi-Vektor-Ausgabe aus einem Modell",[248,250,252,254],[249],"Qwen3 Embedding",[251],"0.6B \u002F 4B \u002F 8B",[253],"Lang",[255],"Stark bei mehrsprachigem und sprachübergreifendem Retrieval; passende Reranker",{"type":120,"content":257},[258,259,263,264,266,267,270],"Das ",{"tag":260,"href":38,"children":261},"a",[262],"MMTEB-Paper"," umfasst über 500 Aufgaben in mehr als 250 Sprachen und kam zu dem Ergebnis, dass LLM-basierte Modelle mit Milliarden Parametern zwar bei einzelnen Teilmengen führen, das insgesamt beste öffentlich verfügbare Modell aber multilingual-e5-large-instruct mit 560 Millionen Parametern war. Dessen 512-Token-Grenze ist allerdings wichtig: Längere Chunks werden still abgeschnitten. ",{"tag":260,"href":41,"children":265},[240]," verarbeitet bis zu 8.192 Tokens und liefert neben dem dichten auch einen sparse Vektor, also ein gelerntes Keyword-Signal ohne eigenen Analyzer. Die ",{"tag":260,"href":44,"children":268},[269],"Qwen3-Embedding","-Reihe gibt es in drei Größen mit passenden Rerankern.",{"type":120,"content":272},[273,274,278,279,283],"Durchschnitte verbergen die Sprachen, um die es geht. Ein Modell, das ein mehrsprachiges Leaderboard anführt, kann bei ungarischem Fachtext trotzdem mittelmäßig sein. Auch die gehosteten APIs der großen Anbieter sind mehrsprachig; müssen Daten im Haus bleiben, siehe ",{"tag":204,"to":275,"children":276},"\u002Fblog\u002Fself-hosted-llm-gdpr-cost",[277],"LLMs für die DSGVO selbst hosten",", und zur Speicherung ",{"tag":204,"to":280,"children":281},"\u002Fblog\u002Fpgvector-vs-vector-databases",[282],"pgvector oder eine Vektordatenbank",".",{"type":127,"level":128,"id":101,"text":102},{"type":120,"content":286},[287,288,291,292,294,295,298,299,301,302,305,306,309],"Wer nach ",{"tag":133,"children":289},[290],"Schlauch"," sucht, erwartet ",{"tag":133,"children":293},[139]," zu finden. Ein Standard-Tokenizer sieht ein Token und keinen Treffer. Die Lösung ist Decompounding beim Indexieren: Komposita in bekannte Teile zerlegen und Teile wie Gesamtwort indexieren. Der ",{"tag":260,"href":50,"children":296},[297],"Hyphenation Decompounder"," von Elasticsearch schlägt über Silbentrennmuster Teilwörter vor und behält nur die aus einer Wortliste; das Beispiel der Dokumentation zerlegt ",{"tag":133,"children":300},[135]," in ",{"tag":133,"children":303},[304],"Kaffee"," und ",{"tag":133,"children":307},[308],"tasse",". Der Filter baut auf Lucenes Compound-Word-Filter auf, der für germanische Sprachen entwickelt wurde.",{"type":120,"content":311},[312],"Dichte Embeddings gehen mit Komposita eleganter um, weil der Subword-Tokenizer seltene Wörter ohnehin zerlegt. Ein Grund mehr, beides zu betreiben: BM25 mit Decompounding für exakte Teile, Embeddings für die Bedeutung.",{"type":127,"level":128,"id":104,"text":105},{"type":120,"content":315},[316,317,136,320,305,323,326,327,330,331,335,336,339,340,305,343,346,347,339,350,283],"Fürs Ungarische braucht die Keyword-Seite einen Stemmer, der Kasusendungen und Possessivsuffixe abtrennt, damit ",{"tag":133,"children":318},[319],"számlán",{"tag":133,"children":321},[322],"számlák",{"tag":133,"children":324},[325],"számláimat"," auf einen Stamm treffen. ",{"tag":260,"href":56,"children":328},[329],"Snowball"," hat Stemmer für Ungarisch und Deutsch, und PostgreSQL liefert Snowball-Wörterbücher mit, also kann schon die Volltextsuche von Postgres das. Dazu die Erweiterung ",{"tag":332,"children":333},"code",[334],"unaccent",", denn Nutzer tippen ",{"tag":133,"children":337},[338],"szamla"," statt ",{"tag":133,"children":341},[342],"számla",{"tag":133,"children":344},[345],"Groesse"," oder ",{"tag":133,"children":348},[349],"Grosse",{"tag":133,"children":351},[224],{"type":332,"code":353},"-- PostgreSQL: one tsvector per chunk, analyzed in the chunk's own language\nCREATE EXTENSION IF NOT EXISTS unaccent;\n\n-- unaccent() is not IMMUTABLE, so wrap it for use in a generated column\nCREATE FUNCTION unaccent_immutable(t text) RETURNS text\n  LANGUAGE sql IMMUTABLE PARALLEL SAFE\n  AS $$ SELECT public.unaccent('public.unaccent', t) $$;\n\nALTER TABLE chunks ADD COLUMN lang regconfig NOT NULL DEFAULT 'simple';\nALTER TABLE chunks ADD COLUMN tsv tsvector\n  GENERATED ALWAYS AS (to_tsvector(lang, unaccent_immutable(text))) STORED;\nCREATE INDEX chunks_tsv ON chunks USING gin (tsv);\n\n-- Query in the user's language: 'hungarian', 'german' or 'english'\nSELECT id, ts_rank(tsv, q) AS score\nFROM chunks, websearch_to_tsquery('hungarian', unaccent('számláim')) AS q\nWHERE tsv @@ q ORDER BY score DESC LIMIT 20;\n",{"type":355,"variant":356,"title":357,"body":358},"callout","warn","Auf kaputte ungarische Zeichen achten",[359],[360,361,305,364,367,368,305,371,374],"Ältere ungarische Dokumente enthalten oft ",{"tag":133,"children":362},[363],"õ",{"tag":133,"children":365},[366],"û"," (Tilde) statt ",{"tag":133,"children":369},[370],"ő",{"tag":133,"children":372},[373],"ű"," (Doppelakut), ein Überbleibsel von Latin-1-Kodierungen. Vor dem Indexieren normalisieren, sonst behandeln Stemming, Embeddings und exakte Suche sie als verschiedene Wörter.",{"type":127,"level":128,"id":107,"text":108},{"type":120,"content":377},[378],"Die Sprache jedes Chunks beim Indexieren erkennen und speichern, nicht nur die jedes Dokuments; Handbücher und Tickets mischen oft Sprachen. Bei der Abfrage gibt es drei Möglichkeiten, und es lohnt sich, bewusst zu wählen:",{"type":380,"items":381},"list",[382,388,393],[383,387],{"tag":384,"children":385},"strong",[386],"Filtern"," auf die Sprache des Nutzers, wenn jedes Dokument in jeder Sprache existiert, wie in einem vollständig übersetzten Shop. Das entfernt Beinahe-Duplikate.",[389,392],{"tag":384,"children":390},[391],"Gewichten"," zugunsten der Nutzersprache, andere aber zulassen, wenn manche Inhalte nur in einer Sprache existieren, etwa rein englische Handbücher.",[394,397],{"tag":384,"children":395},[396],"Deduplizieren"," von Übersetzungen derselben Quelle über eine gemeinsame Dokument-ID nach dem Retrieval, wobei die Version in der Nutzersprache bleibt.",{"type":127,"level":128,"id":110,"text":111},{"type":120,"content":400},[401,402,406],"Das Modell ausdrücklich anweisen, in der Sprache der Frage zu antworten, denn ein Kontext voller englischer Chunks zieht Antworten ins Englische. Zitate und Quellen in der Originalsprache belassen und den Originalabschnitt verlinken, damit Leser die Aussage prüfen können, wie bei ",{"tag":204,"to":403,"children":404},"\u002Fblog\u002Fllm-hallucination-grounding-citations",[405],"Grounding und Zitaten",". Produktnamen, Artikelnummern und Rechtsbegriffe gar nicht übersetzen.",{"type":127,"level":128,"id":113,"text":114},{"type":120,"content":409},[410,411,283],"Das Eval-Set von Anfang an mit dem erwarteten Sprachmix bauen: deutsche Fragen gegen deutsche Dokumente, ungarische gegen ungarische und ein sprachübergreifender Anteil, bei dem die Antwort nur in einer anderen Sprache steht. Fragen ohne Akzente und mit Tippfehlern aufnehmen, denn so tippen Menschen. Recall pro Anteil berichten, nicht als eine Zahl; der Durchschnitt ist genau das, was eine versagende Sprache versteckt. Die Metriken selbst sind dieselben wie in ",{"tag":204,"to":412,"children":413},"\u002Fblog\u002Frag-evaluation-metrics",[414],"RAG evaluieren",{"type":332,"code":416},"# Illustrative eval slices; report recall@10 per slice, never only the average\nEVAL = [\n  {\"q\": \"Wie lang ist die Garantie auf Druckluftschläuche?\", \"lang\": \"de\", \"gold\": [\"warranty-de#3\"]},\n  {\"q\": \"mennyi a garancia a tomlokre\",                  \"lang\": \"hu\", \"gold\": [\"garancia-hu#2\"]},   # no accents\n  {\"q\": \"Betriebstemperatur Kompressor K40\",              \"lang\": \"de\", \"gold\": [\"k40-manual-en#7\"]}, # answer only in English\n]\n",{"type":127,"level":128,"id":116,"text":117},{"type":380,"ordered":419,"items":420},true,[421,424,427,430,433,436,439],[422],{"tag":260,"href":38,"children":423},[37],[425],{"tag":260,"href":41,"children":426},[40],[428],{"tag":260,"href":44,"children":429},[43],[431],{"tag":260,"href":47,"children":432},[46],[434],{"tag":260,"href":50,"children":435},[49],[437],{"tag":260,"href":53,"children":438},[52],[440],{"tag":260,"href":56,"children":441},[55],[443,500,554,598],{"slug":444,"published":5,"minutes":445,"category":7,"tags":446,"keywords":451,"about":462,"sources":472,"cover":494,"og":495,"expertise":59,"locales":496,"lang":62,"title":497,"description":498,"coverAlt":499},"pdf-document-parsing-for-rag",9,[9,447,448,449,450],"PDF parsing","OCR","Docling","Document AI",[452,453,454,455,456,457,458,459,460,461],"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",[463,466,469],{"name":464,"url":465},"PDF","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPDF",{"name":467,"url":468},"Optical character recognition","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOptical_character_recognition",{"name":470,"url":471},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[473,476,479,482,485,488,491],{"title":474,"url":475},"Docling: README, features and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdocling-project\u002Fdocling",{"title":477,"url":478},"Auer et al.: Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.17887",{"title":480,"url":481},"Datalab: Marker README, olmOCR-bench results and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdatalab-to\u002Fmarker",{"title":483,"url":484},"OpenDataLab: MinerU README and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU",{"title":486,"url":487},"Poznanski et al.: olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.18443",{"title":489,"url":490},"Claude Platform Docs: PDF support","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fpdf-support",{"title":492,"url":493},"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",[61,62,63],"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":501,"published":5,"minutes":502,"category":7,"tags":503,"keywords":509,"about":520,"sources":529,"cover":548,"og":549,"expertise":59,"locales":550,"lang":62,"title":551,"description":552,"coverAlt":553},"text-to-sql-llm-guardrails",8,[504,505,506,507,508],"Text-to-SQL","LLM security","PostgreSQL","Agents","Analytics",[510,511,512,513,514,515,516,517,518,519],"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",[521,524,527],{"name":522,"url":523},"SQL","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSQL",{"name":525,"url":526},"Natural language interface to databases","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNatural-language_user_interface",{"name":506,"url":528},"https:\u002F\u002Fwww.postgresql.org\u002F",[530,533,536,539,542,545],{"title":531,"url":532},"BIRD-bench: leaderboard and dataset description","https:\u002F\u002Fbird-bench.github.io\u002F",{"title":534,"url":535},"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":537,"url":538},"PostgreSQL 18 Documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":540,"url":541},"PostgreSQL 18 Documentation: Client Connection Defaults (read-only and timeouts)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fruntime-config-client.html",{"title":543,"url":544},"SQLGlot: SQL parser, transpiler and optimizer (GitHub)","https:\u002F\u002Fgithub.com\u002Ftobymao\u002Fsqlglot",{"title":546,"url":547},"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":555,"published":5,"minutes":556,"category":7,"tags":557,"keywords":561,"about":572,"sources":582,"cover":592,"og":593,"expertise":59,"locales":594,"lang":62,"title":595,"description":596,"coverAlt":597},"embedding-quantization-binary-matryoshka",5,[11,558,559,560,9],"Vector search","Quantization","pgvector",[562,563,564,565,566,567,568,569,570,571],"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",[573,576,579],{"name":574,"url":575},"Quantization (signal processing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQuantization_(signal_processing)",{"name":577,"url":578},"Nearest neighbor search","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FNearest_neighbor_search",{"name":580,"url":581},"Hamming distance","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHamming_distance",[583,586,589],{"title":584,"url":585},"Hugging Face: Binary and Scalar Embedding Quantization for Significantly Faster and Cheaper Retrieval (Mar 2024)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Fembedding-quantization",{"title":587,"url":588},"Kusupati et al.: Matryoshka Representation Learning (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2205.13147",{"title":590,"url":591},"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":599,"published":600,"minutes":601,"category":7,"tags":602,"keywords":606,"about":616,"sources":624,"cover":661,"og":662,"expertise":59,"locales":663,"lang":62,"title":664,"description":665,"coverAlt":666},"graphrag-knowledge-graph-rag","2026-10-02",13,[603,604,605,9],"GraphRAG","Knowledge graphs","LightRAG",[603,607,608,609,610,611,612,613,614,615],"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",[617,620,621],{"name":618,"url":619},"Knowledge graph","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnowledge_graph",{"name":470,"url":471},{"name":622,"url":623},"Leiden algorithm","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLeiden_algorithm",[625,628,631,634,637,640,643,646,649,652,655,658],{"title":626,"url":627},"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":629,"url":630},"Microsoft GraphRAG documentation: overview","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002F",{"title":632,"url":633},"Microsoft GraphRAG documentation: default dataflow","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Findex\u002Fdefault_dataflow\u002F",{"title":635,"url":636},"Microsoft GraphRAG documentation: global search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fglobal_search\u002F",{"title":638,"url":639},"Microsoft GraphRAG documentation: local search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Flocal_search\u002F",{"title":641,"url":642},"Microsoft GraphRAG documentation: DRIFT search","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fquery\u002Fdrift_search\u002F",{"title":644,"url":645},"Microsoft GraphRAG documentation: getting started","https:\u002F\u002Fmicrosoft.github.io\u002Fgraphrag\u002Fget_started\u002F",{"title":647,"url":648},"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":650,"url":651},"Guo et al.: LightRAG: Simple and Fast Retrieval-Augmented Generation (arXiv:2410.05779)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779",{"title":653,"url":654},"HKUDS\u002FLightRAG on GitHub","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FLightRAG",{"title":656,"url":657},"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":659,"url":660},"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.",1792177149320]