[{"data":1,"prerenderedAt":749},["ShallowReactive",2],{"blog-code-rag-repository-indexing-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":37,"cover":74,"og":75,"expertise":76,"locales":77,"lang":79,"title":81,"description":82,"coverAlt":83,"metaTitle":84,"takeaways":85,"faq":91,"toc":107,"blocks":132,"others":499},"code-rag-repository-indexing","2026-10-01",8,"rag",[9,10,11,12,13],"RAG","Code search","Tree-sitter","Embeddings","Coding agents",[15,16,17,18,19,20,21,22,23,24],"RAG over code","AST chunking","tree-sitter code chunking","repository map","code embeddings","semantic code search","codebase indexing","repo map tokens","incremental code index","CoIR benchmark",[26,29,32,34],{"name":27,"url":28},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",{"name":30,"url":31},"Abstract syntax tree","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAbstract_syntax_tree",{"name":11,"url":33},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTree-sitter_%28parser_generator%29",{"name":35,"url":36},"Merkle tree","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMerkle_tree",[38,41,44,47,50,53,56,59,62,65,68,71],{"title":39,"url":40},"cAST: AST-based chunking for code RAG (arXiv 2506.15655)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.15655",{"title":42,"url":43},"Aider docs: repository map","https:\u002F\u002Faider.chat\u002Fdocs\u002Frepomap.html",{"title":45,"url":46},"Aider blog: building a better repository map with tree-sitter (2023)","https:\u002F\u002Faider.chat\u002F2023\u002F10\u002F22\u002Frepomap.html",{"title":48,"url":49},"Anthropic Engineering: effective context engineering for AI agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-context-engineering-for-ai-agents",{"title":51,"url":52},"Cursor blog: securely indexing large codebases (Jan 2026)","https:\u002F\u002Fcursor.com\u002Fblog\u002Fsecure-codebase-indexing",{"title":54,"url":55},"turbopuffer: Cursor customer story","https:\u002F\u002Fturbopuffer.com\u002Fcustomers\u002Fcursor",{"title":57,"url":58},"Kilo Code docs: codebase indexing","https:\u002F\u002Fkilo.ai\u002Fdocs\u002Fcustomize\u002Fcontext\u002Fcodebase-indexing",{"title":60,"url":61},"Serena on GitHub","https:\u002F\u002Fgithub.com\u002Foraios\u002Fserena",{"title":63,"url":64},"Voyage AI docs: pricing","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fpricing",{"title":66,"url":67},"Qwen blog: Qwen3-Embedding (Jun 2025)","https:\u002F\u002Fqwenlm.github.io\u002Fblog\u002Fqwen3-embedding\u002F",{"title":69,"url":70},"CoIR: a benchmark for code information retrieval (arXiv 2407.02883)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2407.02883",{"title":72,"url":73},"CocoIndex blog: indexing a codebase","https:\u002F\u002Fcocoindex.io\u002Fblogs\u002Findex-codebase-v1","\u002Fimages\u002Fblog\u002Fcode-rag-repository-indexing\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcode-rag-repository-indexing\u002Fog.jpg","ai-engineer",[78,79,80],"en","de","hu","RAG über Code: AST-Chunking, Repo-Maps und Code-Embeddings für Agenten","Wie Coding-Agenten Code finden: AST-Chunking mit tree-sitter, Repo-Maps, Merkle-Tree-Sync, Code-Embedding-Modelle 2026 und wann grep einen Index schlägt.","Ein verzweigter Codebaum speist eine Reihe von Karteikarten.","RAG über Code: AST-Chunks, Repo-Maps · Balázs Csorba",[86,87,88,89,90],"Zeilenbasiertes Chunking zerteilt Funktionen und trennt Importe vom Code, der sie braucht; das cAST-Paper maß durch AST-basiertes Chunking +4,3 Recall@5 auf RepoEval und +2,67 Pass@1 auf SWE-bench.","Tree-sitter ist der gemeinsame Parser: nach Funktion, Klasse oder Methode chunken, kleine Geschwister zusammenführen, übergroße Knoten teilen und zu jedem Chunk Pfad, Zeilenbereich, Symbolname und Signatur speichern.","Eine Repo-Map braucht keine Embeddings: Aider rankt tree-sitter-Symbole über einen Datei-Abhängigkeitsgraphen und passt Signaturen in ein Standardbudget von 1k Tokens ein.","Aktualität ist der schwierige Teil: Cursor synchronisiert nur geänderte Zweige eines Merkle-Baums, Kilo Code nutzt Datei-Watcher und Hash-Caches, und CocoIndex bettet nur geänderte Dateien neu ein.","Grep und Glob veralten nie und kosten Tokens pro Suche; ein Index kostet Speicher, Embedding-Ausgaben und Pflege. Viele Teams brauchen beides: grep für exakte Namen, einen Index für Bedeutung.",[92,95,98,101,104],{"q":93,"a":94},"Was ist RAG über Code?","Retrieval-augmented Generation, bei der der Korpus ein Code-Repository ist. Statt Text in Absätze zu teilen, zerlegt das System Code entlang der Syntax, meist in Funktionen und Klassen, indexiert diese Chunks mit Embeddings oder Symbolkarten und gibt dem Modell die relevantesten Teile für eine Aufgabe.",{"q":96,"a":97},"Warum AST-Chunking statt fester Zeilenfenster?","Feste Fenster schneiden Funktionen in der Mitte durch und trennen Decorators und Importe vom zugehörigen Code. Chunking entlang des abstrakten Syntaxbaums hält ganze Definitionen zusammen. Das cAST-Paper berichtet +4,3 Punkte Recall@5 auf RepoEval und +2,67 Punkte Pass@1 auf SWE-bench durch rekursives AST-Chunking mit Zusammenführen von Geschwisterknoten.",{"q":99,"a":100},"Was ist eine Repo-Map?","Eine kompakte Zusammenfassung der Klassen und Funktionen eines Repositorys mit ihren Signaturen, erstellt mit tree-sitter. Aider rankt Symbole über einen Graphen der Dateiabhängigkeiten und nimmt nur auf, was in ein Token-Budget passt, standardmäßig 1k Tokens, sodass das Modell die Struktur ohne Dateiinhalte sieht.",{"q":102,"a":103},"Welches Embedding-Modell eignet sich 2026 für Code?","Stand Oktober 2026 gibt es codeoptimierte Optionen wie voyage-code-4 für $0,12 pro Million Tokens und Qwen3-Embedding in 0.6B, 4B und 8B zum Selbsthosten; jina-embeddings-v4 meldet 71,59 auf CoIR unter einer Forschungslizenz. Bewerten Sie zwei oder drei Kandidaten mit Anfragen aus Ihrem eigenen Repository, bevor Sie wählen.",{"q":105,"a":106},"Brauchen Coding-Agenten überhaupt einen Vektorindex?","Nicht immer. Claude Code navigiert just in time mit grep und glob, was veraltete Indizes und komplexe Syntaxbäume vermeidet, aber langsamer ist als vorberechnete Suche. Ein Index lohnt sich bei großen oder unbekannten Repositorys und bei Fragen, die nach Bedeutung statt nach Namen gestellt werden.",[108,111,114,117,120,123,126,129],{"id":109,"title":110},"why-line-based-chunking-fails-on-code","Warum zeilenbasiertes Chunking bei Code scheitert",{"id":112,"title":113},"ast-chunking-with-tree-sitter","AST-Chunking mit tree-sitter",{"id":115,"title":116},"repo-maps-symbol-context-without-embeddings","Repo-Maps: Symbolkontext ohne Embeddings",{"id":118,"title":119},"how-commercial-agents-index-code","Wie kommerzielle Agenten Code indexieren",{"id":121,"title":122},"code-embedding-models-in-2026","Code-Embedding-Modelle 2026",{"id":124,"title":125},"measuring-code-retrieval-and-keeping-it-fresh","Code-Suche messen und aktuell halten",{"id":127,"title":128},"when-agentic-grep-beats-an-index","Wann agentisches grep einen Index schlägt, und eine Checkliste",{"id":130,"title":131},"sources","Quellen",[133,141,150,153,156,164,170,178,179,190,192,199,200,211,218,230,231,237,244,262,266,332,333,351,369,372,373,380,391,402,409,410,421,424,452,460,461],{"type":134,"content":135},"paragraph",[136,140],{"tag":137,"children":138},"strong",[139],"RAG über Code"," ist Retrieval-augmented Generation mit einem Repository als Korpus, und sie scheitert anders als RAG über Dokumente. Code hat harte Grenzen (Funktionen, Klassen, Importe), exakte Bezeichner, die mehr zählen als Umschreibungen, und einen Aufrufgraphen, der Dateien verbindet. Zerlegt man ihn wie Fließtext, bekommt das Modell eine halbe Funktion ohne Importe; indexiert man ihn einmal und vergisst ihn, liest der Agent selbstbewusst Code, der gestern gelöscht wurde.",{"type":134,"content":142},[143,144,149],"Dieser Artikel behandelt strukturelles Chunking mit tree-sitter, Repo-Maps ohne Embeddings, wie Cursor und Kilo Code einen Index aktuell halten, die Code-Embedding-Modelle Stand Oktober 2026, wie man die Suche am eigenen Repository misst und wann grep jeden Index schlägt. Was überhaupt in den Kontext eines Agenten gehört, beschreibt ",{"tag":145,"to":146,"children":147},"link","\u002Fblog\u002Fagents-md-skills-mcp-cli-decision-matrix",[148],"die Entscheidungsmatrix zu AGENTS.md, Skills, MCP und CLI","; hier geht es darum, wie der Code gefunden wird.",{"type":151,"level":152,"id":109,"text":110},"heading",2,{"type":134,"content":154},[155],"Zeilenbasiertes Chunking scheitert, weil Codegrenzen nicht auf feste Zeilenzahlen fallen. Ein 40-Zeilen-Fenster teilt eine Funktion in der Mitte, lässt einen Decorator in einem Chunk und seine Klasse im nächsten und trennt Importe vom Code, der sie nutzt. Der Retriever rankt dann Fragmente, die allein nichts mehr bedeuten.",{"type":134,"content":157},[158,159,163],"Das cAST-Paper hat den Effekt gemessen. Es beschreibt zeilenbasierte Heuristiken als solche, die „oft semantische Strukturen zerbrechen, Funktionen teilen oder Unzusammenhängendes zusammenführen“, und ersetzt sie durch rekursives Chunking entlang des abstrakten Syntaxbaums, wobei kleine Geschwisterknoten bis zu einer Größengrenze zusammengeführt werden. Das verbesserte Recall@5 auf RepoEval um 4,3 Punkte und Pass@1 auf SWE-bench um 2,67 Punkte (",{"tag":160,"href":40,"children":161},"a",[162],"cAST","). Der Gewinn ist absolut bescheiden, kommt aber von einem Parser, nicht von einem größeren Modell.",{"type":165,"src":166,"alt":167,"wide":168,"caption":169},"image","\u002Fimages\u002Fblog\u002Fcode-rag-repository-indexing\u002Fdiagram-5.webp","Zeilenfenster gegen AST-Chunks Zwei Spalten für dieselbe Quelldatei. Spalte A, feste Zeilenfenster: Fenster 1 enthält die Importe und die erste Hälfte von parse(); Fenster 2 den Rest von parse() und einen von seiner Klasse getrennten Decorator; Fenster 3 den Klassenrumpf ohne seinen Decorator. Spalte B, AST-Knoten: ein Modul-Chunk mit Importen und Konstanten der Datei; ein Funktions-Chunk mit dem ganzen Rumpf von parse() sowie Pfad, Zeilenbereich und Signatur; ein Klassen-Chunk für Order, bei dem der Decorator bleibt. Eine Fußzeile nennt die cAST-Ergebnisse: +4,3 Recall@5 auf RepoEval und +2,67 Pass@1 auf SWE-bench.",true,"Feste Zeilenfenster zerschneiden Definitionen; AST-Chunks halten jede Funktion und Klasse ganz und tragen Ort und Signatur mit.",{"type":134,"content":171},[172,173,177],"Code-Suche ist noch aus einem zweiten Grund keine Textsuche: Anfragen mischen natürliche Sprache mit exakten Bezeichnern. Eine Frage wie „wo wiederholen wir den ERP-Aufruf“ braucht semantischen Abgleich, „wer ruft ",{"tag":174,"children":175},"code",[176],"createSalesOrder"," auf“ dagegen eine exakte Symbolsuche. Ein gutes Setup bedient beides, deshalb kombinieren die meisten Systeme unten Struktur mit Suche.",{"type":151,"level":152,"id":112,"text":113},{"type":134,"content":180},[181,182,185,186,189],"Tree-sitter ist der gemeinsame Parser dieser Systeme: Er parst eine Datei in einen konkreten Syntaxbaum, und Abfragedateien wie ",{"tag":174,"children":183},[184],"tags.scm"," legen pro Sprache fest, was als Definition oder Referenz zählt (",{"tag":160,"href":46,"children":187},[188],"Aider","). Ein Chunker läuft über die Knoten der obersten Ebene, gibt Funktionen, Klassen und Methoden als Chunks aus, führt kleine Nachbarn zusammen, damit eine Datei mit kurzen Hilfsfunktionen nicht zu fünfzig winzigen Chunks wird, und teilt übergroße Knoten, indem er in ihre Kinder absteigt.",{"type":174,"code":191},"# Sketch: AST chunks with sibling merging, the idea behind cAST\nfrom tree_sitter import Language, Parser\nimport tree_sitter_python as tspython\n\nparser = Parser(Language(tspython.language()))\nMAX_CHARS = 1000  # Kilo Code documents 100 to 1,000 characters per block\n\ndef chunks(src: bytes, path: str):\n    buf = []\n    for node in parser.parse(src).root_node.children:\n        text = src[node.start_byte:node.end_byte].decode()\n        if len(text) > MAX_CHARS and node.child_count:\n            yield from split_children(node, src, path)   # oversized: recurse\n        elif sum(len(t) for t, _ in buf) + len(text) \u003C= MAX_CHARS:\n            buf.append((text, node))                     # merge small siblings\n        else:\n            yield emit(buf, path)                        # path, lines, symbol, signature\n            buf = [(text, node)]\n    if buf:\n        yield emit(buf, path)",{"type":134,"content":193},[194,195,198],"Kilo Code aus der Linie von Cline und Roo dokumentiert konkrete Einstellungen dafür: tree-sitter-Parsing in semantische Blöcke von 100 bis 1.000 Zeichen, geteilte große Funktionen und ein zeilenbasierter Fallback für Dateien, die der Parser nicht versteht (",{"tag":160,"href":58,"children":196},[197],"Kilo Code","). Unabhängig von den Größengrenzen sollten Sie zu jedem Chunk Metadaten speichern: Dateipfad, Zeilenbereich, Symbolname und Signatur. Der Agent braucht Pfad und Zeilen, um die echte Datei zu öffnen, und die Signatur macht den Chunk in einer Ergebnisliste auch ohne Rumpf lesbar.",{"type":151,"level":152,"id":115,"text":116},{"type":134,"content":201},[202,203,206,207,210],"Eine Repo-Map gibt dem Modell die Gestalt eines Repositorys ganz ohne Vektorindex. Aider baut sie mit tree-sitter: die wichtigsten Klassen und Funktionen mit Typen und Aufrufsignaturen. Was in ein Token-Budget passt, wählt ein Graph-Ranking-Algorithmus über einen Graphen, in dem jede Datei ein Knoten ist und Abhängigkeiten Kanten sind. Die Einstellung ",{"tag":174,"children":204},[205],"--map-tokens"," steht standardmäßig auf 1k Tokens, und die Map wächst, solange noch keine Dateien im Chat sind (",{"tag":160,"href":43,"children":208},[209],"Aider-Doku",").",{"type":134,"content":212},[213,214,217],"Die Map enthält Signaturen, keine Rümpfe, deshalb ist sie günstig. Aiders Designnotiz von 2023 erklärt, dass tree-sitter ctags ersetzt hat, weil es vollständige Signaturen direkt aus dem Quelltext zeigt und Sprachunterstützung als installierbare Pakete mitbringt (",{"tag":160,"href":46,"children":215},[216],"Aider-Blog","). Das Suchmuster heißt „erst die Marken“: Das Modell liest die Map, wählt die nötigen Dateien und liest erst dann diese vollständig. Für viele Aufgaben in einem bekannten Repository reicht das, und nichts muss je neu eingebettet werden.",{"type":134,"content":219},[220,221,224,225,229],"Language Server gehen noch einen Schritt weiter. Serena ist ein MCP-Toolkit für Suche und Bearbeitung auf Symbolebene, dessen Standard-Backend das Language Server Protocol ist und mehr als 40 Sprachen abdeckt (",{"tag":160,"href":61,"children":222},[223],"Serena","). Statt Text zu durchsuchen, fragt der Agent nach Definition oder Referenzen eines Symbols und bekommt exakte Antworten. Wie viel das in der Praxis spart, steht in ",{"tag":145,"to":226,"children":227},"\u002Fblog\u002Ftoken-saving-tools-coding-agents-top-20",[228],"den Token-Spar-Werkzeugen für Coding-Agenten",".",{"type":151,"level":152,"id":118,"text":119},{"type":134,"content":232},[233,234,210],"Cursor indexiert mit einem Merkle-Baum. Jede Datei bekommt einen SHA-256-Hash und jeder Ordner einen Hash seiner Kinder, sodass nach einer Änderung nur die geänderten Zweige abweichen und synchronisiert werden müssen. In einem Workspace mit 50.000 Dateien ergeben allein Dateinamen und Hashes rund 3,2 MB. Geänderte Dateien werden in syntaktische Chunks zerlegt, Embeddings nach Chunk-Inhalt gecacht, und ein Ähnlichkeits-Hash findet einen vorhandenen Index zur Wiederverwendung, mit Inhaltsnachweisen, damit ein Client nur Ergebnisse für Dateien bekommt, die er tatsächlich lesen kann (",{"tag":160,"href":52,"children":235},[236],"Cursor",{"type":134,"content":238},[239,240,243],"Die Vektorschicht dahinter ist turbopuffer, das Cursors Suche mit mehr als einer Billion Vektoren beschreibt, mit einem Namespace pro Codebasis-Instanz und eingebettet mit Cursors eigenem Modell. Das Kopieren eines vorhandenen Namespace für einen neuen Checkout senkte die mediane Zeit bis zur ersten Abfrage von 7,87 Sekunden auf 525 Millisekunden und das p99 von 4,03 Stunden auf 21 Sekunden (",{"tag":160,"href":55,"children":241},[242],"turbopuffer","). Das ist das Onboarding-Problem jedes Code-Index: Der erste Index eines großen Repositorys ist der langsame Teil.",{"type":134,"content":245},[246,247,249,250,253,254,257,258,210],"Kilo Code liefert dasselbe Muster für ein lokales Setup: standardmäßig LanceDB oder Qdrant als externen Store, Embedding-Anbieter einschließlich Ollama für einen vollständig lokalen Stack, Datei-Watcher plus Hash-Caching für inkrementelle Updates und Behandlung von Branch-Wechseln. Zu den Standardwerten gehören ein minimaler Such-Score von 0,4 und bis zu 50 Ergebnisse (",{"tag":160,"href":58,"children":248},[197],"). Cline selbst dokumentiert dagegen derzeit eingebaute Werkzeuge wie ",{"tag":174,"children":251},[252],"read_files"," und ",{"tag":174,"children":255},[256],"search_codebase"," und keinen Embedding-Index (",{"tag":160,"href":259,"children":260},"https:\u002F\u002Fdocs.cline.bot\u002Ftools-reference\u002Fall-cline-tools.md",[261],"Cline-Doku",{"type":165,"src":263,"alt":264,"wide":168,"caption":265},"\u002Fimages\u002Fblog\u002Fcode-rag-repository-indexing\u002Fdiagram-19.webp","Indexierter Suchpfad für Code Fünf Schritte von links nach rechts: das Repository, verfolgt über Merkle-Hashes; tree-sitter macht aus geänderten Dateien AST-Chunks; die Chunks werden eingebettet, mit Cache nach Inhalts-Hash; die Vektoren landen in einem Store mit einem Namespace pro Codebasis; die Suche liefert Chunks, und der Agent liest danach die Dateien.","Der indexierte Pfad zahlt einmal für Struktur und Embeddings; der agentische Pfad (grep, glob, lesen, wiederholen) überspringt jeden Kasten hier und zahlt stattdessen pro Suche in Tokens.",{"type":267,"head":268,"rows":279},"table",[269,271,273,275,277],[270],"System",[272],"Chunking",[274],"Such-Primitive",[276],"Speicher",[278],"Aktualität",[280,291,301,311,321],[281,283,285,287,289],[282],"Aider-Repo-Map",[284],"tree-sitter-Tags, nur Signaturen",[286],"Graph-Ranking über Dateiabhängigkeiten",[288],"keiner; Map geht in den Prompt",[290],"pro Anfrage neu, 1k Tokens Standard",[292,293,295,297,299],[236],[294],"syntaktische Chunks",[296],"semantische Suche über Embeddings",[298],"turbopuffer, Namespace pro Codebasis",[300],"Merkle-Baum, nur geänderte Zweige",[302,303,305,307,309],[197],[304],"tree-sitter-Blöcke, 100–1.000 Zeichen",[306],"Vektorsuche, Mindestscore 0,4",[308],"LanceDB oder Qdrant",[310],"Datei-Watcher plus Hash-Cache",[312,313,315,317,319],[223],[314],"keins; Symbole aus Language Servern",[316],"LSP-Definitionen und -Referenzen",[318],"Zustand des Language Servers",[320],"live",[322,324,326,328,330],[323],"Claude Code",[325],"keins",[327],"grep (ripgrep) und glob, just in time",[329],"keiner",[331],"nie veraltet; Tokens pro Suche",{"type":151,"level":152,"id":121,"text":122},{"type":134,"content":334},[335,336,339,340,343,344,347,348,210],"Stand Oktober 2026 gibt es drei praktische Wege. Gehostet und codeoptimiert: Voyage führt ",{"tag":174,"children":337},[338],"voyage-code-4"," als aktuelles Code-Modell für $0,12 pro Million Tokens mit 200 Millionen freien Tokens, während ",{"tag":174,"children":341},[342],"voyage-code-3"," für $0,18 zu den älteren Modellen gewandert ist (",{"tag":160,"href":64,"children":345},[346],"Voyage","). Selbst gehostet: Qwen3-Embedding gibt es in 0.6B, 4B und 8B mit 32k Kontext, Matryoshka-Dimensionen und Unterstützung für mehr als 100 Sprachen einschließlich Programmiersprachen (",{"tag":160,"href":67,"children":349},[350],"Qwen",{"type":134,"content":352},[353,354,358,359,363,364,368],"Der dritte Weg ist ein allgemeines multimodales oder Langkontext-Modell. jina-embeddings-v4 kann entweder einen einzelnen 2048-dimensionalen Vektor oder Token-Vektoren für Late Interaction ausgeben, meldet 71,59 auf dem Code-Benchmark CoIR und steht unter der Qwen Research License, was für kommerzielle Nutzung zählt (",{"tag":160,"href":355,"children":356},"https:\u002F\u002Fjina.ai\u002Fmodels\u002Fjina-embeddings-v4\u002F",[357],"Jina","). Cohere Embed v4 bietet 128k Kontext und Matryoshka-Ausgabe von 256 bis 1536 Dimensionen für $0,12 pro Million Tokens (",{"tag":160,"href":360,"children":361},"https:\u002F\u002Fdocs.cohere.com\u002Fchangelog\u002Fembed-multimodal-v4",[362],"Cohere","). Welches Modell man wählt, ist eine allgemeine Frage, behandelt in ",{"tag":145,"to":365,"children":366},"\u002Fblog\u002Fembedding-model-selection-2026",[367],"der Auswahl von Embedding-Modellen","; bei Code zählt der lange Kontext, weil ganze Dateien und lange Funktionen hineinpassen.",{"type":134,"content":370},[371],"Für ein Repository mit einigen hunderttausend Zeilen ist die Embedding-Rechnung bei diesen Preisen klein; die echten Kosten sind das Neueinbetten nach Änderungen und der Aufwand, den Index korrekt zu halten. Codeoptimierung lohnt sich am meisten, wenn Anfragen in natürlicher Sprache kommen und der Code Fachbegriffe nutzt, die ein allgemeines Modell nie gesehen hat.",{"type":151,"level":152,"id":124,"text":125},{"type":134,"content":374},[375,376,379],"Messen Sie am eigenen Repository und nutzen Sie öffentliche Benchmarks als Plausibilitätsprüfung. CoIR, veröffentlicht auf der ACL 2025, kombiniert zehn Datensätze über acht Suchaufgaben und sieben Domänen, und die Autoren stellten fest, dass selbst aktuelle Spitzenmodelle bei der Code-Suche erhebliche Schwierigkeiten hatten (",{"tag":160,"href":70,"children":377},[378],"CoIR","). Ihre Anfragen, Bezeichner und Konventionen sind dort nicht enthalten, also bauen Sie ein kleines eigenes Set.",{"type":381,"ordered":168,"items":382},"list",[383,385,387,389],[384],"30 bis 50 echte Fragen aus Tickets und Code-Reviews sammeln, jeweils mit der Datei und dem Symbol, das sie beantwortet.",[386],"Fragen in natürlicher Sprache mit exakten Namenssuchen mischen, weil sie unterschiedliche Retriever fordern.",[388],"Recall bei 5 und 10 je Chunking- und Modellvariante messen und das Set im Repository ablegen.",[390],"Nach Modellwechseln und großen Refactorings erneut ausführen, nicht nur einmal.",{"type":134,"content":392},[393,394,397,398,229],"Aktualität braucht so viel Design wie Qualität. Die bewährten Muster sind Datei-Watcher mit Inhalts-Hash-Caches (Kilo Code), Merkle-Bäume, die nur geänderte Zweige synchronisieren (Cursor), und memoisierte Pipelines: CocoIndex schlüsselt seinen Cache pro Datei und pro Verarbeitungsschritt, sodass ein Commit, der wenige Dateien berührt, nur diese neu einbettet, gelöschte Dateien ihre Zeilen entfernen und der Index entweder als Nachhollauf in der CI oder im Live-Modus mit etwa einer Sekunde Latenz auf dem Arbeitsverzeichnis läuft (",{"tag":160,"href":73,"children":395},[396],"CocoIndex","). Löschungen sind der Fall, den die meisten Setups falsch machen, und so zitiert ein Agent entfernten Code. Late Chunking und Contextual Retrieval ergänzen Chunks zusätzlich um Kontext, siehe ",{"tag":145,"to":399,"children":400},"\u002Fblog\u002Fcontextual-retrieval-late-chunking",[401],"Contextual Retrieval und Late Chunking",{"type":403,"variant":404,"title":405,"body":406},"callout","warn","Ranglisten sind nicht Ihr Repository",[407],[408],"Benchmark-Werte für Code-Embeddings ändern sich von Monat zu Monat, und keiner enthält Ihre Namenskonventionen. Nutzen Sie einen CoIR-Wert als Filter für die Shortlist und lassen Sie Ihr eigenes Frageset entscheiden.",{"type":151,"level":152,"id":127,"text":128},{"type":134,"content":411},[412,413,416,417,210],"Grep schlägt einen Index, wenn das Repository klein genug für eine schnelle Suche ist, sich ständig ändert oder die Maschine nicht verlassen darf. Anthropic beschreibt Claude Code als Hybrid: CLAUDE.md wird vorab geladen, und „Primitive wie glob und grep erlauben es, die Umgebung zu navigieren und Dateien just in time abzurufen, wodurch die Probleme veralteter Indizes und komplexer Syntaxbäume umgangen werden“. Derselbe Beitrag hält fest, dass Erkundung zur Laufzeit langsamer ist als vorberechnete Suche (",{"tag":160,"href":49,"children":414},[415],"Anthropic","). Das Grep-Werkzeug von Claude Code basiert auf ripgrep, ergänzt um Glob (",{"tag":160,"href":418,"children":419},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference",[420],"Claude-Code-Doku",{"type":134,"content":422},[423],"Ich nutze Claude Code, opencode und Codex nebeneinander, und der Zielkonflikt ist im Alltag sichtbar: Grep-zuerst-Agenten geben in einem unbekannten Bereich Tokens für mehrere Such- und Leserunden aus und liefern nie Code, den es nicht mehr gibt. Die Kosten eines Index sind das Gegenteil: Speicher, Embedding-Ausgaben und die Aktualitätsmechanik von oben, dafür weniger Runden bei Fragen, die nach Bedeutung gestellt werden.",{"type":381,"ordered":425,"items":426},false,[427,432,437,442,447],[428,431],{"tag":137,"children":429},[430],"Repository-Größe",": Unterhalb einer Größe, bei der ripgrep sofort antwortet, mit grep und einer Repo-Map beginnen.",[433,436],{"tag":137,"children":434},[435],"Änderungsrate",": Hohe Änderungsraten sprechen für grep oder LSP; ein Index braucht inkrementelle Updates, die Löschungen beherrschen.",[438,441],{"tag":137,"children":439},[440],"Monorepo",": Viele Teams und unbekannte Bereiche sprechen für einen Index, idealerweise geteilt und über Checkouts wiederverwendet.",[443,446],{"tag":137,"children":444},[445],"Compliance",": Darf Code die Maschine nicht verlassen, lokale Embedder und einen lokalen Store nutzen oder auf den Index verzichten.",[448,451],{"tag":137,"children":449},[450],"Hybrid als Standard",": grep für exakte Namen, LSP für Definitionen und Referenzen, ein Index für Bedeutung.",{"type":134,"content":453},[454,455,459],"Wenn Sie eine Suche für einen Coding-Agenten oder einen internen Code-Assistenten bauen, deckt meine ",{"tag":145,"to":456,"children":457},"\u002Fexpertise\u002Fai-engineer",[458],"KI-Engineering-Arbeit"," solche Setups ab, vom Chunking bis zur Evaluierung.",{"type":151,"level":152,"id":130,"text":131},{"type":381,"ordered":168,"items":462},[463,466,469,472,475,478,481,484,487,490,493,496],[464],{"tag":160,"href":40,"children":465},[39],[467],{"tag":160,"href":43,"children":468},[42],[470],{"tag":160,"href":46,"children":471},[45],[473],{"tag":160,"href":49,"children":474},[48],[476],{"tag":160,"href":52,"children":477},[51],[479],{"tag":160,"href":55,"children":480},[54],[482],{"tag":160,"href":58,"children":483},[57],[485],{"tag":160,"href":61,"children":486},[60],[488],{"tag":160,"href":64,"children":489},[63],[491],{"tag":160,"href":67,"children":492},[66],[494],{"tag":160,"href":70,"children":495},[69],[497],{"tag":160,"href":73,"children":498},[72],[500,573,630,688],{"slug":501,"published":502,"minutes":503,"category":7,"tags":504,"keywords":508,"about":521,"sources":531,"cover":567,"og":568,"expertise":76,"locales":569,"lang":79,"title":570,"description":571,"coverAlt":572},"embedding-model-selection-2026","2026-10-17",9,[12,9,505,506,507],"MTEB","Vector search","Model selection",[509,510,511,512,513,514,515,516,517,518,519,520],"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",[522,525,528],{"name":523,"url":524},"Word embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding",{"name":526,"url":527},"Information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_retrieval",{"name":529,"url":530},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",[532,535,538,541,544,547,550,552,555,558,561,564],{"title":533,"url":534},"Enevoldsen et al.: MMTEB, Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":536,"url":537},"Hugging Face: Introducing RTEB, a new standard for retrieval evaluation (Oct 2025)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Frteb",{"title":539,"url":540},"OpenAI: Vector embeddings guide","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fembeddings",{"title":542,"url":543},"OpenAI: API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":545,"url":546},"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":548,"url":549},"Voyage AI: Text embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fembeddings",{"title":551,"url":64},"Voyage AI: Pricing",{"title":553,"url":554},"Google: Gemini API embeddings documentation","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fembeddings",{"title":556,"url":557},"Google: Gemini API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":559,"url":560},"Cohere: Embed models documentation","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fcohere-embed",{"title":562,"url":563},"Qwen: Qwen3-Embedding-8B model card","https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-Embedding-8B",{"title":565,"url":566},"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",[78,79,80],"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":574,"published":502,"minutes":575,"category":7,"tags":576,"keywords":579,"about":591,"sources":599,"cover":624,"og":625,"expertise":76,"locales":626,"lang":79,"title":627,"description":628,"coverAlt":629},"contextual-retrieval-late-chunking",10,[9,272,12,577,578],"Contextual retrieval","Late chunking",[580,581,582,583,584,585,586,587,588,589,590],"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",[592,593,596],{"name":27,"url":28},{"name":594,"url":595},"Okapi BM25","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOkapi_BM25",{"name":597,"url":598},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",[600,603,606,609,612,615,618,621],{"title":601,"url":602},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",{"title":604,"url":605},"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":607,"url":608},"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":610,"url":611},"Voyage AI: Introducing voyage-context-3 (Jul 2025)","https:\u002F\u002Fblog.voyageai.com\u002F2025\u002F07\u002F23\u002Fvoyage-context-3\u002F",{"title":613,"url":614},"Voyage AI: voyage-context-4 (Jun 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F06\u002F29\u002Fvoyage-context-4\u002F",{"title":616,"url":617},"Voyage AI: Contextualized chunk embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fcontextualized-chunk-embeddings",{"title":619,"url":620},"Anthropic: Claude API pricing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fpricing",{"title":622,"url":623},"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",[78,79,80],"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.",{"slug":631,"published":502,"minutes":503,"category":7,"tags":632,"keywords":636,"about":649,"sources":657,"cover":682,"og":683,"expertise":76,"locales":684,"lang":79,"title":685,"description":686,"coverAlt":687},"rag-access-control-permissions",[9,633,634,635,506],"Access control","Security","Multi-tenancy",[637,638,639,640,641,642,643,644,645,646,647,648],"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",[650,653,656],{"name":651,"url":652},"Access-control list","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAccess-control_list",{"name":654,"url":655},"Multitenancy","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",{"name":27,"url":28},[658,661,664,667,670,673,676,679],{"title":659,"url":660},"OWASP GenAI Security Project: LLM08:2025 Vector and Embedding Weaknesses","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm082025-vector-and-embedding-weaknesses\u002F",{"title":662,"url":663},"PostgreSQL documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":665,"url":666},"pgvector README: filtering and iterative index scans","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"title":668,"url":669},"Qdrant: Multitenancy and partitions guide","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fguides\u002Fmultiple-partitions\u002F",{"title":671,"url":672},"Pinecone: Implement multitenancy using namespaces","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fimplement-multitenancy",{"title":674,"url":675},"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":677,"url":678},"OpenFGA: RAG authorization use case","https:\u002F\u002Fopenfga.dev\u002Fdocs\u002Fuse-cases\u002Frag-authorization",{"title":680,"url":681},"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",[78,79,80],"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":689,"published":502,"minutes":575,"category":7,"tags":690,"keywords":695,"about":707,"sources":715,"cover":742,"og":743,"expertise":744,"locales":745,"lang":79,"title":746,"description":747,"coverAlt":748},"rag-product-catalog-pim-data",[9,691,692,693,694],"PIM","Product data","B2B e-commerce","Metadata filtering",[696,697,698,699,700,701,702,703,704,705,706],"rag product catalog","rag pim data","llm product data","product catalog chatbot","akeneo rag","pimcore ai search","rag structured data","metadata filtering rag","product attributes embeddings","b2b product assistant","etim classification ai",[708,711,712],{"name":709,"url":710},"Product information management","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct_information_management",{"name":27,"url":28},{"name":713,"url":714},"ETIM (standard)","https:\u002F\u002Fwww.etim-international.com\u002Fclassification\u002F",[716,719,722,725,727,730,733,736,739],{"title":717,"url":718},"Akeneo API: Products, product values, metric values and product models","https:\u002F\u002Fapi.akeneo.com\u002Fconcepts\u002Fproducts.html",{"title":720,"url":721},"Akeneo Help Center: What about products with variants?","https:\u002F\u002Fhelp.akeneo.com\u002Fserenity-take-the-power-over-your-products\u002Fserenity-what-about-products-with-variants",{"title":723,"url":724},"Pimcore documentation: Classification Store","https:\u002F\u002Fdocs.pimcore.com\u002Fplatform\u002FPimcore\u002FObjects\u002FObject_Classes\u002FData_Types\u002FClassification_Store\u002F",{"title":726,"url":714},"ETIM International: Classification",{"title":728,"url":729},"ETIM International: ETIM releases and the IXF format","https:\u002F\u002Fetim-international.com\u002F?p=754",{"title":731,"url":732},"Reddy et al.: Shopping Queries Dataset, a large-scale ESCI benchmark for improving product search (2022)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2206.06588",{"title":734,"url":735},"Amazon Science: esci-data repository","https:\u002F\u002Fgithub.com\u002Famazon-science\u002Fesci-data",{"title":737,"url":738},"Qdrant documentation: Filtering","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fconcepts\u002Ffiltering\u002F",{"title":740,"url":741},"Sui et al.: Table Meets LLM, can large language models understand structured table data? (WSDM 2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.13062","\u002Fimages\u002Fblog\u002Frag-product-catalog-pim-data\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-product-catalog-pim-data\u002Fog.jpg","b2b-ecommerce-developer",[78,79,80],"RAG über Produktkataloge: aus PIM-Daten Antworten machen, die halten","Produktdaten sind strukturiert, Chunking wie bei PDFs scheitert. So serialisiert man PIM-Attribute, leitet Spezifikationsfragen an Filter und bleibt exakt.","Ein Rahmen aus neun Feldern mit kleinen Symbolen, darunter ein Trichter zu einer einzelnen Karte.",1792337023799]