[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"blog-contextual-retrieval-late-chunking-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":26,"sources":36,"cover":61,"og":62,"expertise":63,"locales":64,"lang":66,"title":68,"description":69,"coverAlt":70,"metaTitle":71,"takeaways":72,"faq":78,"toc":94,"blocks":125,"others":460},"contextual-retrieval-late-chunking","2026-10-17",10,"rag",[9,10,11,12,13],"RAG","Chunking","Embeddings","Contextual retrieval","Late chunking",[15,16,17,18,19,20,21,22,23,24,25],"contextual retrieval","anthropic contextual retrieval","late chunking","contextual chunk embeddings","contextual embeddings rag","contextual bm25","chunk context rag","voyage-context-3","voyage-context-4","late chunking vs contextual retrieval","rag chunking context loss",[27,30,33],{"name":28,"url":29},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":31,"url":32},"Okapi BM25","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOkapi_BM25",{"name":34,"url":35},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",[37,40,43,46,49,52,55,58],{"title":38,"url":39},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",{"title":41,"url":42},"Günther et al.: Late Chunking, Contextual Chunk Embeddings Using Long-Context Embedding Models (2024, rev. 2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2409.04701",{"title":44,"url":45},"Jina AI: Late Chunking in Long-Context Embedding Models (Aug 2024)","https:\u002F\u002Fjina.ai\u002Fnews\u002Flate-chunking-in-long-context-embedding-models\u002F",{"title":47,"url":48},"Voyage AI: Introducing voyage-context-3 (Jul 2025)","https:\u002F\u002Fblog.voyageai.com\u002F2025\u002F07\u002F23\u002Fvoyage-context-3\u002F",{"title":50,"url":51},"Voyage AI: voyage-context-4 (Jun 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F06\u002F29\u002Fvoyage-context-4\u002F",{"title":53,"url":54},"Voyage AI: Contextualized chunk embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fcontextualized-chunk-embeddings",{"title":56,"url":57},"Anthropic: Claude API pricing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fpricing",{"title":59,"url":60},"Qu, Tu and Bao: Is Semantic Chunking Worth the Computational Cost? (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.13070","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fog.jpg","ai-engineer",[65,66,67],"en","de","hu","Contextual Retrieval und Late Chunking: RAG-Chunks ihren Kontext zurückgeben","Chunks verlieren ihr Dokument. Wie Contextual Retrieval, Late Chunking und kontextuelle Embeddings das beheben, was sie kosten, wann man verzichtet.","Vier lose Quadrate, unten von einer breiten Klammer gebündelt und je nach oben mit einer großen Fläche verbunden.","Contextual Retrieval und Late Chunking · Balázs Csorba",[73,74,75,76,77],"Anthropics Contextual Retrieval stellt jedem Chunk 50 bis 100 Tokens LLM-geschriebenen Kontext voran und senkte die Fehlerrate bei den Top-20-Treffern um 35 %, mit kontextuellem BM25 um 49 % und mit Reranker um 67 %.","Mit Prompt-Caching ist die Kontexterzeugung ein einmaliger Indexierungsaufwand: rund 1,02 $ pro Million Dokument-Tokens im Jahr 2024, nach meiner Rechnung mit heutigen Haiku-Listenpreisen etwa 0,38 bis 3,84 $.","Late Chunking bettet zuerst das ganze Dokument ein und poolt die Token-Vektoren pro Chunk; es braucht kein LLM, aber ein Embedding-Modell mit langem Kontext, dessen Token-Ausgaben zugänglich sind.","Im Late-Chunking-Paper lag der durchschnittliche Gewinn gegenüber naivem Chunking bei etwa 1,5 bis 1,9 nDCG@10-Punkten, am größten bei kleinen Chunks und null, wenn der umgebende Text nichts mit dem Inhalt zu tun hat.","Mit der günstigen Basislinie beginnen, Dokumenttitel und Abschnittspfad vor jedem Chunk, und messen, bevor man für eine der drei Methoden bezahlt.",[79,82,85,88,91],{"q":80,"a":81},"Was ist Contextual Retrieval?","Ein Vorverarbeitungsschritt, den Anthropic im September 2024 veröffentlicht hat. Ein LLM liest das ganze Dokument und jeden Chunk, schreibt einen kurzen Kontext, der den Chunk einordnet, und dieser Kontext wird dem Chunk vor dem Einbetten und der BM25-Indexierung vorangestellt.",{"q":83,"a":84},"Was ist Late Chunking?","Eine Methode von Forschern bei Jina AI: das Embedding-Modell über das ganze Dokument laufen lassen, dann die Token-Embeddings in Chunks teilen und jeden Chunk per Mittelwert poolen. Jeder Chunk-Vektor entsteht mit dem Rest des Dokuments im Blick, ohne zusätzlichen LLM-Aufruf.",{"q":86,"a":87},"Ist Contextual Retrieval teuer?","Es kostet einen LLM-Aufruf pro Chunk bei der Indexierung, nicht pro Anfrage. Mit Prompt-Caching auf dem Dokument schätzte Anthropic 2024 rund 1,02 $ pro Million Dokument-Tokens; mit aktuellen Claude-Haiku-Listenpreisen nachgerechnet landet es etwa zwischen 0,38 und 3,84 $.",{"q":89,"a":90},"Hilft Late Chunking der Stichwortsuche?","Nein. Late Chunking ändert nur die Vektoren. BM25 sieht weiterhin den rohen Chunk-Text. Contextual Retrieval ändert den Text selbst und verbessert damit BM25 und Vektorsuche zugleich.",{"q":92,"a":93},"Wann sollte ich auf all das verzichten?","Wenn Chunks schon für sich verständlich sind, etwa Produktdatensätze oder FAQ-Einträge, oder wenn die ganze Wissensbasis in den Prompt passt. Anthropic meint, unter rund 200.000 Tokens kann alles in den Kontext zu legen einfacher sein als RAG.",[95,98,101,104,107,110,113,116,119,122],{"id":96,"title":97},"context-loss","Warum verlieren Chunks ihren Kontext?",{"id":99,"title":100},"contextual-retrieval","Wie funktioniert Contextual Retrieval?",{"id":102,"title":103},"cost","Was kostet die Kontextualisierung?",{"id":105,"title":106},"late-chunking","Wie funktioniert Late Chunking?",{"id":108,"title":109},"contextual-models","Und kontextualisierte Embedding-APIs?",{"id":111,"title":112},"comparison","Wie schneiden die drei Ansätze im Vergleich ab?",{"id":114,"title":115},"when-to-skip","Wann lohnt sich zusätzlicher Kontext nicht?",{"id":117,"title":118},"implementation","Worauf muss die Implementierung achten?",{"id":120,"title":121},"which-to-pick","Welchen Ansatz sollte man wählen?",{"id":123,"title":124},"sources","Quellen",[126,130,139,142,145,148,149,152,161,164,202,205,208,209,212,274,277,278,281,287,290,293,295,296,299,301,304,305,358,370,371,399,400,428,429,432,433],{"type":127,"content":128},"paragraph",[129],"Chunking ist ein verlustbehafteter Schritt. Ein Chunk mit dem Satz „die maximale Last beträgt 40 kg“ war in seinem Handbuch völlig klar, wo die Überschrift zwei Seiten vorher das Produkt nannte. Herausgeschnitten und allein eingebettet nennt er weder Produkt noch Variante noch Quelldokument, und eine Anfrage mit dem Produktnamen findet ihn womöglich nie.",{"type":127,"content":131},[132,133,138],"Seit 2024 sind drei Familien von Lösungen entstanden: Contextual Retrieval, das jeden Chunk mit einem LLM ergänzt; Late Chunking, das das ganze Dokument vor dem Teilen einbettet; und kontextualisierte Embedding-Modelle als API. Dieser Beitrag vergleicht, was jede ändert, was die veröffentlichten Zahlen sagen, was sie kosten, und welche günstige Basislinie ich zuerst probiere. Er baut auf der früher beschriebenen ",{"tag":134,"to":135,"children":136},"link","\u002Fblog\u002Frag-pipeline-chunking-hybrid-search-reranking",[137],"Pipeline mit Chunking und hybrider Suche"," auf.",{"type":140,"level":141,"id":96,"text":97},"heading",2,{"type":127,"content":143},[144],"Embedding-Modelle sehen nur den Text, den man ihnen gibt. Wird ein Dokument zuerst geteilt und jedes Stück einzeln eingebettet, tragen Verweise nach außen, etwa „es“, „diese Variante“, „die obige Tabelle“ oder ein impliziter Produktname, keine Bedeutung. BM25 leidet genauso: Das passende Stichwort steht in der Überschrift, nicht im Chunk.",{"type":127,"content":146},[147],"Größere Chunks sind der naheliegende Ausweg, verwässern aber den Vektor und schicken mehr irrelevanten Text ans Modell. Klügere Grenzen helfen weniger als erhofft: Eine Studie von Qu, Tu und Bao aus 2024 kam zum Schluss, dass die Mehrkosten semantischen Chunkings nicht durch konsistente Gewinne gegenüber Chunks fester Größe gerechtfertigt sind. Die folgenden Lösungen lassen die Grenzen in Ruhe und fügen stattdessen Kontext hinzu.",{"type":140,"level":141,"id":99,"text":100},{"type":127,"content":150},[151],"Anthropic hat Contextual Retrieval am 19. September 2024 veröffentlicht. Für jeden Chunk erhält ein kleines Modell das ganze Dokument und den Chunk und soll einen kurzen Kontext liefern, der den Chunk für die Suche einordnet, und nur diesen Kontext antworten. Das Ergebnis, meist 50 bis 100 Tokens, wird dem Chunk vorangestellt. Der kombinierte Text wird eingebettet und zusätzlich für BM25 indexiert; Anthropic nennt das kontextuelle Embeddings und kontextuelles BM25.",{"type":153,"attrs":154,"inner":158,"caption":159},"diagram",{"viewBox":155,"role":156,"aria-labelledby":157},"0 0 720 170","img","crl1-t crl1-d","\u003Ctitle id=\"crl1-t\">Contextual Retrieval bei der Indexierung\u003C\u002Ftitle>\u003Cdesc id=\"crl1-d\">Das ganze Dokument wird einmal gecacht. Für jeden Chunk schreibt ein kleines LLM einen kurzen Kontext, der dem Chunk vorangestellt wird. Der kombinierte Text geht in den Embedding-Index und in den BM25-Index; Anfragen nutzen dann hybride Suche und einen Reranker.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"crl1-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\">Dokument\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">gecachter Prompt\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#crl1-ah)\" \u002F>\u003Crect x=\"160\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"220\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Chunk\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">einer pro Aufruf\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#crl1-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Kleines LLM\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">50–100 Tokens\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#crl1-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Kontext + Chunk\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">ein Text\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#crl1-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Zwei Indizes\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Vektoren + BM25\u003C\u002Ftext>",[160],"Das LLM läuft einmal pro Chunk bei der Indexierung; am Anfragepfad ändert sich nichts.",{"type":127,"content":162},[163],"Der berichtete Effekt ist groß. Anthropic maß die Fehlerrate bei den Top-20-Treffern, eins minus Recall@20, gemittelt über Codebasen, Belletristik, arXiv-Papers und wissenschaftliche Artikel:",{"type":165,"head":166,"rows":173},"table",[167,169,171],[168],"Konfiguration",[170],"Fehlerrate",[172],"Reduktion",[174,181,188,195],[175,177,179],[176],"Basis-Embeddings",[178],"5.7%",[180],"–",[182,184,186],[183],"Kontextuelle Embeddings",[185],"3.7%",[187],"35%",[189,191,193],[190],"Kontextuelle Embeddings + kontextuelles BM25",[192],"2.9%",[194],"49%",[196,198,200],[197],"Beides, plus Reranking",[199],"1.9%",[201],"67%",{"type":127,"content":203},[204],"Zwei Details aus demselben Beitrag übersieht man leicht. Allgemeine Dokumentzusammenfassungen vor den Chunks brachten nur sehr begrenzte Gewinne; der Kontext muss also chunkspezifisch sein. Und das Setup mit Reranking holte rund 150 Kandidaten, sortierte sie neu und behielt die Top 20, was besser abschnitt als 5 oder 10 Chunks.",{"type":206,"code":207},"code","import anthropic\n\nclient = anthropic.Anthropic()\n\ndef chunk_context(document: str, chunk: str) -> str:\n    \"\"\"One call per chunk; the document block is cached and reused for every chunk.\"\"\"\n    msg = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=150,\n        messages=[{\"role\": \"user\", \"content\": [\n            {\"type\": \"text\", \"text\": f\"\u003Cdocument>\\n{document}\\n\u003C\u002Fdocument>\",\n             \"cache_control\": {\"type\": \"ephemeral\"}},\n            {\"type\": \"text\", \"text\": (\n                f\"Here is a chunk from the document:\\n\u003Cchunk>\\n{chunk}\\n\u003C\u002Fchunk>\\n\"\n                \"Write a short context that situates this chunk within the document \"\n                \"to improve search retrieval. Answer only with the context.\")},\n        ]}],\n    )\n    return msg.content[0].text.strip()\n\n# Index context and chunk together, but keep both fields for display and re-runs.\nrecord = {\"context\": ctx, \"chunk\": chunk, \"index_text\": f\"{ctx}\\n\\n{chunk}\"}",{"type":140,"level":141,"id":102,"text":103},{"type":127,"content":210},[211],"Anthropic schätzte rund 1,02 $ pro Million Dokument-Tokens, einmalig, bei Dokumenten mit 8.000 Tokens, Chunks mit 800 Tokens, 50 Tokens Anweisungen und 100 Tokens Kontext pro Chunk, mit gecachtem Dokument. Diese Zahl beruhte auf Preisen von Claude 3 Haiku aus 2024. Ich habe sie mit denselben Annahmen und den aktuellen Listenpreisen von Anthropics Preisseite nachgerechnet: Pro Million Dokument-Tokens sind das 125 Dokumente und 1.250 Chunks, ein Cache-Schreibvorgang pro Dokument, neun Cache-Lesevorgänge, Chunk und Anweisungen als normale Eingabe und der Kontext als Ausgabe.",{"type":165,"head":213,"rows":222},[214,216,218,220],[215],"Posten pro 1 Mio. Dokument-Tokens",[217],"Tokens",[219],"Haiku 4.5",[221],"Haiku 5.5 (Prompts bis 100k)",[223,232,241,250,259],[224,226,228,230],[225],"Cache-Schreiben, Dokumente",[227],"1.0M",[229],"$1.25",[231],"$0.13",[233,235,237,239],[234],"Cache-Lesen, Dokumente",[236],"9.0M",[238],"$0.90",[240],"$0.09",[242,244,246,248],[243],"Eingabe, Chunk und Anweisungen",[245],"1.06M",[247],"$1.06",[249],"$0.11",[251,253,255,257],[252],"Ausgabe, Kontext",[254],"0.125M",[256],"$0.63",[258],"$0.06",[260,265,266,270],[261],{"tag":262,"children":263},"strong",[264],"Summe",[],[267],{"tag":262,"children":268},[269],"$3.84",[271],{"tag":262,"children":272},[273],"$0.38",{"type":127,"content":275},[276],"So oder so ist es ein Indexierungsaufwand, der nur bei Dokumentänderungen erneut anfällt, und klein neben der Entwicklungszeit. Der Haken sind Änderungen: Ändert sich ein Absatz, kann sich der Kontext jedes Chunks im Dokument ändern. Also das ganze Dokument neu kontextualisieren, nicht nur den bearbeiteten Chunk.",{"type":140,"level":141,"id":105,"text":106},{"type":127,"content":279},[280],"Late Chunking, im September 2024 von Günther und Kollegen bei Jina AI vorgeschlagen, verschiebt das Teilen ans Ende. Das Embedding-Modell mit langem Kontext liest das ganze Dokument, oder so viel davon passt, und erzeugt einen Vektor pro Token. Jeder Token-Vektor spiegelt über Attention bereits den umgebenden Text. Erst dann werden die Chunk-Grenzen angewendet: Die Token-Vektoren innerhalb jedes Chunks werden per Mittelwert zu einem Chunk-Embedding gepoolt. Das Paper formuliert es als Chunking nach dem Transformer und direkt vor dem Mean Pooling.",{"type":153,"attrs":282,"inner":284,"caption":285},{"viewBox":155,"role":156,"aria-labelledby":283},"crl2-t crl2-d","\u003Ctitle id=\"crl2-t\">Naives Chunking gegenüber Late Chunking\u003C\u002Ftitle>\u003Cdesc id=\"crl2-d\">Beim Late Chunking läuft das ganze Dokument einmal durch den Transformer. Die Token-Embeddings werden dann an den Chunk-Grenzen geteilt und gemittelt, sodass jeder Chunk-Vektor Kontext aus dem Rest des Dokuments trägt.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"crl2-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\">Ganzes Dokument\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">bis 8k Tokens\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#crl2-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\">Transformer\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">ein Durchlauf\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#crl2-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Token-Vektoren\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">kontextuell\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#crl2-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Spannen teilen\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">Chunk-Grenzen\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#crl2-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Mittelwert\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">1 Vektor\u002FChunk\u003C\u002Ftext>",[286],"Naives Chunking würde den Transformer für jeden Chunk separat laufen lassen, sodass kein Chunk seine Nachbarn sieht.",{"type":127,"content":288},[289],"Jinas ursprünglicher Beitrag zeigt den Effekt an einem Wikipedia-Text über Berlin: Der Satz zur Einwohnerzahl erreichte bei naivem Chunking 0,708 Kosinus-Ähnlichkeit zur Anfrage „Berlin“ und mit Late Chunking 0,825, weil „ihre“ nun die Stadt mittrug. Die Benchmarks des Papers sind bescheidener. Gemittelt über drei Modelle und vier BeIR-Datensätze verbesserte Late Chunking nDCG@10 um etwa 1,8 Punkte bei Chunks fester Größe, 1,9 bei Satz-Chunks und 1,5 bei semantischen Chunks. Der größte Einzelsprung war NFCorpus, von 23,5 auf 30,0 mit jina-embeddings-v2-small.",{"type":127,"content":291},[292],"Das Paper ist auch bei den Grenzen ehrlich. Die Gewinne sind bei kleinen Chunks am größten, und bei einigen Leseverständnis-Datensätzen gewann naives Chunking mit großen Chunks. Bei synthetischen Needle- und Passkey-Aufgaben, wo der umgebende Text unzusammenhängendes Füllmaterial ist, half Late Chunking nicht. Dokumente, die länger als das Modellfenster sind, teilen die Autoren in überlappende Makro-Chunks und wenden Late Chunking auf jeden an.",{"type":206,"code":294},"import torch\nfrom transformers import AutoModel, AutoTokenizer\n\n# Any mean-pooling, long-context embedding model whose token outputs you can read.\ntok = AutoTokenizer.from_pretrained(MODEL)\nmodel = AutoModel.from_pretrained(MODEL)\n\ndef late_chunk(text: str, spans: list[tuple[int, int]]) -> list[torch.Tensor]:\n    \"\"\"spans are character ranges from your normal chunker.\"\"\"\n    enc = tok(text, return_offsets_mapping=True, truncation=True,\n              max_length=8192, return_tensors=\"pt\")\n    offsets = enc.pop(\"offset_mapping\")[0].tolist()\n    with torch.no_grad():\n        tokens = model(**enc).last_hidden_state[0]      # one vector per token\n    out = []\n    for start, end in spans:\n        idx = [i for i, (s, e) in enumerate(offsets) if e > s and s >= start and e \u003C= end]\n        v = tokens[idx].mean(dim=0)                     # pool only this chunk's tokens\n        out.append(v \u002F v.norm())\n    return out",{"type":140,"level":141,"id":108,"text":109},{"type":127,"content":297},[298],"Die dritte Option verpackt die Idee als Modell. Voyage veröffentlichte voyage-context-3 im Juli 2025 und voyage-context-4 im Juni 2026: Man schickt alle Chunks eines Dokuments zusammen und erhält einen Vektor pro Chunk, jeder mit dem ganzen Dokument im Blick berechnet. Die API nimmt eine Liste von Dokumenten, jedes eine Liste von Chunks, mit Limits von 1.000 Eingaben, 120.000 Tokens insgesamt und 16.000 Chunks pro Anfrage. Anfragen laufen über denselben Endpunkt als Listen mit einem Element. voyage-context-4 kostet 0,12 $ pro Million Tokens, kann selbst chunken und teilt Dokumente über 32.000 Tokens automatisch.",{"type":206,"code":300},"import voyageai\n\nvo = voyageai.Client()\n\ndocs = [[\"Chunk 1 of manual A ...\", \"Chunk 2 of manual A ...\"],\n        [\"Chunk 1 of manual B ...\"]]\nres = vo.contextualized_embed(inputs=docs, model=\"voyage-context-4\",\n                              input_type=\"document\")\nchunk_vectors = [r.embeddings for r in res.results]   # one list per document\n\nq = vo.contextualized_embed(inputs=[[\"maximum load of the X200 shelf\"]],\n                            model=\"voyage-context-4\", input_type=\"query\")\nquery_vector = q.results[0].embeddings[0]",{"type":127,"content":302},[303],"Voyage berichtet, dass voyage-context-3 Contextual Retrieval im Stil von Anthropic um 6,76 % und Jina Late Chunking um 23,66 % beim Retrieval auf Chunk-Ebene schlug. Das sind Anbieterzahlen, und der Beitrag zu voyage-context-3 nennt in Zusammenfassung und Ergebnisteil selbst zwei verschiedene Prozentsätze. Der architektonische Punkt steht trotzdem: Man bekommt Dokumentkontext ohne LLM-Aufruf pro Chunk, um den Preis einer Anbieterbindung bei Indexierung und Anfragen.",{"type":140,"level":141,"id":111,"text":112},{"type":165,"head":306,"rows":317},[307,309,311,313,315],[308],"Ansatz",[310],"Was sich ändert",[312],"Braucht",[314],"Hilft BM25",[316],"Hauptkosten",[318,329,338,349],[319,321,323,325,327],[320],"Titel- und Überschriftenpräfix",[322],"Chunk-Text",[324],"Geparste Struktur",[326],"Ja",[328],"Fast keine",[330,332,333,335,336],[331],"Contextual Retrieval",[322],[334],"LLM-Aufruf pro Chunk",[326],[337],"LLM-Tokens bei Indexierung",[339,341,343,345,347],[340],"Late Chunking",[342],"Nur Vektoren",[344],"Modell mit langem Kontext, Token-Ausgaben",[346],"Nein",[348],"Eigene Inferenz",[350,352,353,355,356],[351],"Kontextualisierte Embedding-API",[342],[354],"Ein Anbieter für Index und Anfragen",[346],[357],"API-Preis pro Token",{"type":359,"variant":360,"title":361,"body":362},"callout","tip","Zuerst die günstige Basislinie probieren",[363],[364,365,369],"Vor allen drei Methoden jedem Chunk den Dokumenttitel und den Überschriftenpfad voranstellen, etwa „Handbuch Regal X200 > Technische Daten > Belastung“. Das kostet bei Anfragen nichts, hilft BM25 und Vektoren gleichermaßen und ist, wenn der Parser Überschriften erhält wie in ",{"tag":134,"to":366,"children":367},"\u002Fblog\u002Fpdf-document-parsing-for-rag",[368],"PDF-Parsing für RAG"," besprochen, ein paar Zeilen Code. Das messen und dann Contextual Retrieval dagegen messen, nicht gegen nackte Chunks.",{"type":140,"level":141,"id":114,"text":115},{"type":372,"items":373},"list",[374,379,389,394],[375,378],{"tag":262,"children":376},[377],"Für sich verständliche Datensätze."," Produktdaten, FAQ-Einträge und Tickets nennen ihr Thema bereits. Zusätzlicher Kontext wiederholt nur, was schon da ist.",[380,383,384,388],{"tag":262,"children":381},[382],"Kleine Wissensbasen."," Anthropic merkt an, dass unter rund 200.000 Tokens, etwa 500 Seiten, alles in den Prompt zu legen einfacher sein kann als Retrieval. Diesen Zielkonflikt habe ich in ",{"tag":134,"to":385,"children":386},"\u002Fblog\u002Frag-2026-hybrid-agentic-long-context",[387],"RAG im Jahr 2026"," abgewogen.",[390,393],{"tag":262,"children":391},[392],"Unzusammenhängende Umgebung."," Sammlungen unabhängiger Notizen in einer Datei geben dem Modell nichts Nützliches weiterzutragen, wie die Needle-Ergebnisse im Late-Chunking-Paper zeigen.",[395,398],{"tag":262,"children":396},[397],"Sich schnell ändernde Dokumente."," Ändern sich Dokumente täglich, bedeutet Contextual Retrieval, das LLM täglich über ganze Dokumente laufen zu lassen. Late Chunking oder eine kontextualisierte API kosten nur einen Embedding-Durchlauf.",{"type":140,"level":141,"id":117,"text":118},{"type":372,"ordered":401,"items":402},true,[403,408,413,418],[404,407],{"tag":262,"children":405},[406],"Kontext und Chunk getrennt speichern."," Den kombinierten Text indexieren, aber beide Felder behalten. Anthropic merkt an, dass die Generierung besser werden kann, wenn das Modell den hinzugefügten Kontext vom Originaltext unterscheiden kann, und für Zitate braucht man den rohen Chunk.",[409,412],{"tag":262,"children":410},[411],"Den Kontext-Prompt versionieren."," Der Prompt ist jetzt Teil des Index. Eine Änderung bedeutet Neu-Kontextualisierung, also eine Version vergeben und sie mit jedem Chunk speichern.",[414,417],{"tag":262,"children":415},[416],"Auf die eigene Domäne zuschneiden."," Anthropic meint, domänenspezifische Prompts, etwa mit Glossar, können den generischen schlagen. Für einen B2B-Katalog würde ich das Modell anweisen, immer Produktfamilie und Variante zu nennen.",[419,422,423,427],{"tag":262,"children":420},[421],"Retrieval messen, nicht das Bauchgefühl."," Recall@20 und nDCG@10 auf markierten Anfragen vorher und nachher vergleichen, wie in ",{"tag":134,"to":424,"children":425},"\u002Fblog\u002Frag-evaluation-metrics",[426],"RAG evaluieren",". Die veröffentlichten Gewinne sind Durchschnitte über die Daten anderer.",{"type":140,"level":141,"id":120,"text":121},{"type":127,"content":430},[431],"Meine Faustregel: Wer hybride Suche betreibt, nimmt Contextual Retrieval als Standard, weil es als einzige Option auch Stichworttreffer verbessert und mit jedem Embedding-Modell funktioniert. Ist der Korpus groß und ändert sich oft, oder dürfen Dokumente nicht zu einem LLM-Anbieter, liefert Late Chunking mit einem selbst gehosteten Modell mit langem Kontext einen Teil des Nutzens zu Embedding-Kosten. Wer schon bei einem Anbieter mit kontextualisierten Embeddings ist und die Bindung akzeptiert, hat den geringsten Entwicklungsaufwand. In allen drei Fällen mit dem Präfix aus Titel und Überschriften beginnen und den Reranker behalten, der in Anthropics Zahlen den letzten Schritt von 49 % auf 67 % beitrug.",{"type":140,"level":141,"id":123,"text":124},{"type":372,"ordered":401,"items":434},[435,439,442,445,448,451,454,457],[436],{"tag":437,"href":39,"children":438},"a",[38],[440],{"tag":437,"href":42,"children":441},[41],[443],{"tag":437,"href":45,"children":444},[44],[446],{"tag":437,"href":48,"children":447},[47],[449],{"tag":437,"href":51,"children":450},[50],[452],{"tag":437,"href":54,"children":453},[53],[455],{"tag":437,"href":57,"children":456},[56],[458],{"tag":437,"href":60,"children":459},[59],[461,534,592,645],{"slug":462,"published":5,"minutes":463,"category":7,"tags":464,"keywords":468,"about":481,"sources":491,"cover":528,"og":529,"expertise":63,"locales":530,"lang":66,"title":531,"description":532,"coverAlt":533},"embedding-model-selection-2026",9,[11,9,465,466,467],"MTEB","Vector search","Model selection",[469,470,471,472,473,474,475,476,477,478,479,480],"best embedding model 2026","how to choose an embedding model","embedding model comparison","MTEB leaderboard explained","RTEB benchmark","open source embedding model","multilingual embedding model","voyage-4 vs openai embeddings","Qwen3-Embedding","EmbeddingGemma","embedding model for RAG","switching embedding models re-embed",[482,485,488],{"name":483,"url":484},"Word embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding",{"name":486,"url":487},"Information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_retrieval",{"name":489,"url":490},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",[492,495,498,501,504,507,510,513,516,519,522,525],{"title":493,"url":494},"Enevoldsen et al.: MMTEB, Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":496,"url":497},"Hugging Face: Introducing RTEB, a new standard for retrieval evaluation (Oct 2025)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Frteb",{"title":499,"url":500},"OpenAI: Vector embeddings guide","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fembeddings",{"title":502,"url":503},"OpenAI: API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":505,"url":506},"Voyage AI: The Voyage 4 model family, shared embedding space with MoE architecture (Jan 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F01\u002F15\u002Fvoyage-4\u002F",{"title":508,"url":509},"Voyage AI: Text embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fembeddings",{"title":511,"url":512},"Voyage AI: Pricing","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fpricing",{"title":514,"url":515},"Google: Gemini API embeddings documentation","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fembeddings",{"title":517,"url":518},"Google: Gemini API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":520,"url":521},"Cohere: Embed models documentation","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fcohere-embed",{"title":523,"url":524},"Qwen: Qwen3-Embedding-8B model card","https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-Embedding-8B",{"title":526,"url":527},"Google Developers Blog: Introducing EmbeddingGemma (Sep 2025)","https:\u002F\u002Fdevelopers.googleblog.com\u002Fen\u002Fintroducing-embeddinggemma\u002F","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fog.jpg",[65,66,67],"Embedding-Modell wählen 2026: Leaderboards, Kosten und ein Vergleichstest mit eigenen Daten","Wie man 2026 ein Embedding-Modell für RAG wählt: was MTEB und RTEB aussagen, API oder offene Gewichte, Preise, Dimensionen und ein einwöchiger Vergleichstest.","Drei Säulen aus gestapelten Blöcken, die mittlere am höchsten, jede mit kurzem Balken und weiter Klammer.",{"slug":535,"published":5,"minutes":463,"category":7,"tags":536,"keywords":540,"about":553,"sources":561,"cover":586,"og":587,"expertise":63,"locales":588,"lang":66,"title":589,"description":590,"coverAlt":591},"rag-access-control-permissions",[9,537,538,539,466],"Access control","Security","Multi-tenancy",[541,542,543,544,545,546,547,548,549,550,551,552],"rag access control","permission aware rag","document level security rag","rag multi tenancy","vector database access control","pgvector row level security","security trimming azure ai search","openfga rag authorization","qdrant multitenancy","pinecone namespaces multitenancy","owasp llm08 vector and embedding weaknesses","rag data leakage",[554,557,560],{"name":555,"url":556},"Access-control list","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAccess-control_list",{"name":558,"url":559},"Multitenancy","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",{"name":28,"url":29},[562,565,568,571,574,577,580,583],{"title":563,"url":564},"OWASP GenAI Security Project: LLM08:2025 Vector and Embedding Weaknesses","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm082025-vector-and-embedding-weaknesses\u002F",{"title":566,"url":567},"PostgreSQL documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":569,"url":570},"pgvector README: filtering and iterative index scans","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"title":572,"url":573},"Qdrant: Multitenancy and partitions guide","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fguides\u002Fmultiple-partitions\u002F",{"title":575,"url":576},"Pinecone: Implement multitenancy using namespaces","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fimplement-multitenancy",{"title":578,"url":579},"Microsoft Learn: Document-level access control in Azure AI Search","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsearch-document-level-access-overview",{"title":581,"url":582},"OpenFGA: RAG authorization use case","https:\u002F\u002Fopenfga.dev\u002Fdocs\u002Fuse-cases\u002Frag-authorization",{"title":584,"url":585},"Morris et al.: Text Embeddings Reveal (Almost) As Much As Text (EMNLP 2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2310.06816","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fog.jpg",[65,66,67],"Zugriffskontrolle für RAG: berechtigungsbewusstes Retrieval ohne Datenlecks","Wie RAG-Assistenten Dokumente preisgeben und wie man das stoppt: ACLs an jedem Chunk, Vorfilter, Row-Level Security in pgvector, Rechte-Sync und Lecktests.","Sieben Karten in einer Reihe, sechs mit Schloss, eine leere Karte schickt einen Pfeil nach außen.",{"slug":593,"published":594,"minutes":463,"category":7,"tags":595,"keywords":600,"about":611,"sources":619,"cover":639,"og":640,"expertise":63,"locales":641,"lang":66,"title":642,"description":643,"coverAlt":644},"pdf-document-parsing-for-rag","2026-10-16",[9,596,597,598,599],"PDF parsing","OCR","Docling","Document AI",[601,602,603,604,605,606,607,608,609,610],"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",[612,615,618],{"name":613,"url":614},"PDF","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPDF",{"name":616,"url":617},"Optical character recognition","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOptical_character_recognition",{"name":28,"url":29},[620,623,626,629,632,635,638],{"title":621,"url":622},"Docling: README, features and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdocling-project\u002Fdocling",{"title":624,"url":625},"Auer et al.: Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.17887",{"title":627,"url":628},"Datalab: Marker README, olmOCR-bench results and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdatalab-to\u002Fmarker",{"title":630,"url":631},"OpenDataLab: MinerU README and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU",{"title":633,"url":634},"Poznanski et al.: olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.18443",{"title":636,"url":637},"Claude Platform Docs: PDF support","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fpdf-support",{"title":38,"url":39},"\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fog.jpg",[65,66,67],"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.","Unregelmäßige Blöcke auf einem Blatt werden zu einer gleichmäßigen Reihe auf einem zweiten Blatt.",{"slug":646,"published":594,"minutes":647,"category":7,"tags":648,"keywords":652,"about":662,"sources":672,"cover":693,"og":694,"expertise":63,"locales":695,"lang":66,"title":696,"description":697,"coverAlt":698},"multilingual-rag-german-hungarian",7,[9,649,11,650,651],"Multilingual","German","Hungarian",[653,654,655,656,475,657,658,659,660,661],"multilingual rag","german rag embeddings","hungarian nlp search","cross-lingual retrieval","bge-m3 german","german compound words search","hungarian stemming postgres","multilingual-e5-large-instruct","qwen3 embedding multilingual",[663,666,669],{"name":664,"url":665},"Cross-language information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-language_information_retrieval",{"name":667,"url":668},"Agglutinative language","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgglutinative_language",{"name":670,"url":671},"Compound (linguistics)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCompound_(linguistics)",[673,675,678,681,684,687,690],{"title":674,"url":494},"Enevoldsen et al.: MMTEB: Massive Multilingual Text Embedding Benchmark (2025)",{"title":676,"url":677},"Chen et al.: M3-Embedding (BGE-M3): Multi-Linguality, Multi-Functionality, Multi-Granularity (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":679,"url":680},"Zhang et al.: Qwen3 Embedding: Advancing Text Embedding and Reranking Through Foundation Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05176",{"title":682,"url":683},"Hugging Face: intfloat\u002Fmultilingual-e5-large-instruct model card","https:\u002F\u002Fhuggingface.co\u002Fintfloat\u002Fmultilingual-e5-large-instruct",{"title":685,"url":686},"Elasticsearch Reference: Hyphenation decompounder token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-hyp-decomp-tokenfilter",{"title":688,"url":689},"PostgreSQL 18 Documentation: Text search dictionaries","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftextsearch-dictionaries.html",{"title":691,"url":692},"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",[65,66,67],"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.","Zwei Reihen kleiner Quadrate, jedes mit einem Punkt darüber, fließen in ein hohes Rechteck.",1792222777443]