Blog/Retrieval és keresés

RAG kódon: AST-darabolás, repótérképek és kódbeágyazások ágensekhez

Hogyan találják meg a kódot a kódoló ágensek: AST-darabolás tree-sitterrel, repótérképek, Merkle-fás szinkron, kódbeágyazók 2026-ban, és mikor jobb a grep.

··8 perc olvasás

  • RAG
  • Code search
  • Tree-sitter
  • Embeddings
  • Coding agents
Borítódiagram egy kódindex-folyamatról a repótól a tree-sitter-darabokon és beágyazásokon át a keresésig.

A lényeg röviden

  • A soralapú darabolás kettévágja a függvényeket, és elválasztja az importokat az őket használó kódtól; a cAST-tanulmány AST-alapú darabolással +4,3 Recall@5-öt mért a RepoEvalon és +2,67 Pass@1-et a SWE-benchen.
  • A tree-sitter a közös elemző: darabolja a kódot függvény, osztály vagy metódus szerint, vonja össze a kis testvércsomópontokat, ossza fel a túl nagyokat, és minden darabhoz tárolja az útvonalat, a sortartományt, a szimbólumnevet és a szignatúrát.
  • Egy repótérképhez nem kell beágyazás: az Aider egy fájlfüggőségi gráfon rangsorolja a tree-sitter szimbólumokat, és alapértelmezésben 1k tokenes keretbe illeszti a szignatúrákat.
  • A frissesség a nehéz rész: a Cursor csak a Merkle-fa megváltozott ágait szinkronizálja, a Kilo Code fájlfigyelőt és hash-gyorsítótárat használ, a CocoIndex pedig csak a megváltozott fájlokat ágyazza be újra.
  • A grep és a glob sosem avul el, de keresésenként tokenbe kerül; az index tárhelyet, beágyazási költséget és karbantartást igényel. Sok csapatnak mindkettő kell: grep a pontos nevekhez, index a jelentéshez.

Cikk meghallgatása

0:000:00

A RAG kódon olyan visszakereséssel kiegészített generálás, ahol a korpusz egy repó, és másképp hibázik, mint a dokumentumokon futó RAG. A kódnak éles határai vannak (függvények, osztályok, importok), pontos azonosítói, amelyek többet számítanak a parafrázisnál, és hívási gráfja, amely összeköti a fájlokat. Ha prózaként daraboljuk, a modell fél függvényt kap importok nélkül; ha egyszer indexeljük és elfelejtjük, az ágens magabiztosan olvas olyan kódot, amelyet tegnap töröltek.

Ez a cikk a tree-sitterrel végzett szerkezeti darabolással, a beágyazás nélküli repótérképekkel, azzal, hogyan tartja frissen az indexet a Cursor és a Kilo Code, a 2026 októberében elérhető kódbeágyazó modellekkel, a saját repón végzett mérés módjával, és azzal foglalkozik, mikor jobb a grep bármilyen indexnél. Hogy mi kerüljön egyáltalán egy ágens kontextusába, azt az AGENTS.md, skillek, MCP és CLI döntési mátrix írja le; ez a cikk arról szól, hogyan találjuk meg a kódot.

Miért bukik el a soralapú darabolás kódon

A soralapú darabolás azért bukik el, mert a kód határai nem fix sorszámokra esnek. Egy 40 soros ablak középen vág el egy függvényt, egy dekorátort az egyik darabban, az osztályát a következőben hagyja, és elválasztja az importokat az őket használó kódtól. A visszakereső ezután olyan töredékeket rangsorol, amelyek önmagukban már nem jelentenek semmit.

A cAST-tanulmány megmérte a hatást. A soralapú heurisztikákról azt írja, hogy „gyakran szétvágják a szemantikai szerkezeteket, kettéosztják a függvényeket vagy összevonják az össze nem tartozó kódot”, és az absztrakt szintaxisfa mentén végzett rekurzív darabolással váltja ki őket, a kis testvércsomópontokat egy méretkorlátig összevonva. Ez 4,3 ponttal javította a Recall@5-öt a RepoEval visszakeresésen és 2,67 ponttal a Pass@1-et a SWE-bench generáláson (cAST). A javulás abszolút értékben szerény, de egy elemzőből jön, nem egy nagyobb modellből.

Sorablakok és AST-darabokKét oszlop ugyanarról a forrásfájlról. Az A oszlop, fix sorablakok: az 1. ablak az importokat és a parse() első felét tartalmazza; a 2. ablak a parse() maradékát és egy osztályától levágott dekorátort; a 3. ablak az osztálytörzset a dekorátora nélkül. A B oszlop, AST-csomópontok: egy modul-darab az importokkal és a fájlszintű konstansokkal; egy függvény-darab a teljes parse() törzzsel, útvonallal, sortartománnyal és szignatúrával; egy osztály-darab az Order osztályhoz, a dekorátorral együtt. Lábléc jelzi a cAST eredményeit: +4,3 Recall@5 a RepoEvalon és +2,67 Pass@1 a SWE-benchen.A · fix sorablakokB · AST-csomópontok1. ablak: 1–40. sorimportok + a parse() első felemodul-darabimportok és fájlszintű konstansok2. ablak: 41–80. sora parse() maradéka, levágott dekorátorfüggvény-darab: parse()teljes törzs, útvonal, sorok, szignatúra3. ablak: 81–120. sorosztálytörzs a dekorátora nélkülosztály-darab: Ordera dekorátor az osztállyal maradcAST: +4,3 Recall@5 (RepoEval), +2,67 Pass@1 (SWE-bench)
A fix sorablakok szétvágják a definíciókat; az AST-darabok egyben tartják a függvényeket és osztályokat, és magukkal viszik a helyüket és szignatúrájukat.

A kódkeresés egy második ok miatt sem szövegkeresés: a lekérdezések keverik a természetes nyelvet a pontos azonosítókkal. Egy olyan kérdéshez, mint „hol próbáljuk újra az ERP-hívást”, szemantikus egyezés kell, a „ki hívja a createSalesOrder-t” kérdéshez viszont pontos szimbólumkeresés. Egy jó rendszer mindkettőt kiszolgálja, ezért kombinálja a lenti rendszerek többsége a szerkezetet a kereséssel.

AST-darabolás tree-sitterrel

A tree-sitter a közös elemző ezekben a rendszerekben: konkrét szintaxisfává elemzi a fájlt, a tags.scm-hez hasonló lekérdezőfájlok pedig nyelvenként meghatározzák, mi számít definíciónak vagy hivatkozásnak (Aider). A daraboló végigmegy a legfelső szintű csomópontokon, a függvényeket, osztályokat és metódusokat darabként adja ki, összevonja a kis szomszédokat, hogy egy rövid segédfüggvényekből álló fájlból ne legyen ötven apró darab, a túl nagy csomópontokat pedig a gyerekeikbe lépve osztja fel.

# Sketch: AST chunks with sibling merging, the idea behind cAST
from tree_sitter import Language, Parser
import tree_sitter_python as tspython

parser = Parser(Language(tspython.language()))
MAX_CHARS = 1000  # Kilo Code documents 100 to 1,000 characters per block

def chunks(src: bytes, path: str):
    buf = []
    for node in parser.parse(src).root_node.children:
        text = src[node.start_byte:node.end_byte].decode()
        if len(text) > MAX_CHARS and node.child_count:
            yield from split_children(node, src, path)   # oversized: recurse
        elif sum(len(t) for t, _ in buf) + len(text) <= MAX_CHARS:
            buf.append((text, node))                     # merge small siblings
        else:
            yield emit(buf, path)                        # path, lines, symbol, signature
            buf = [(text, node)]
    if buf:
        yield emit(buf, path)

A Cline és Roo vonalból származó Kilo Code konkrét beállításokat dokumentál ehhez: tree-sitter-elemzés 100 és 1000 karakter közötti szemantikai blokkokra, a nagy függvények felosztása, és soralapú tartalék azokhoz a fájlokhoz, amelyeket az elemző nem ért (Kilo Code). A méretkorlátoktól függetlenül minden darabhoz tároljon metaadatot: a fájl útvonalát, a sortartományt, a szimbólum nevét és a szignatúrát. Az ágensnek az útvonal és a sorok kellenek a valódi fájl megnyitásához, a szignatúra pedig a törzs nélkül is olvashatóvá teszi a darabot egy találati listában.

Repótérképek: szimbólumkontextus beágyazás nélkül

Egy repótérkép vektorindex nélkül adja meg a modellnek a repó alakját. Az Aider tree-sitterrel építi: a legfontosabb osztályok és függvények típusokkal és hívási szignatúrákkal. Hogy mi fér bele a tokenkeretbe, egy gráfrangsoroló algoritmus dönti el egy olyan gráfon, ahol minden fájl egy csomópont, a függőségek pedig élek. A --map-tokens beállítás alapértéke 1k token, és a térkép bővül, amíg még nincs fájl hozzáadva a csevegéshez (Aider dokumentáció).

A térkép szignatúrákat tartalmaz, nem törzseket, ezért olcsó. Az Aider 2023-as tervezési jegyzete elmagyarázza, hogy a tree-sitter azért váltotta le a ctagset, mert közvetlenül a forrásból mutat teljes szignatúrákat, és telepíthető csomagként szállítja a nyelvi támogatást (Aider blog). A visszakeresési minta: előbb a jelölők. A modell elolvassa a térképet, kiválasztja a szükséges fájlokat, és csak azután olvassa el őket teljesen. Egy ismert repóban sok feladathoz ez elég, és semmit sem kell újra beágyazni.

A nyelvi szerverek egy lépéssel tovább mennek. A Serena egy MCP-eszközkészlet szimbólumszintű visszakereséshez és szerkesztéshez, amelynek alapértelmezett háttere a Language Server Protocol, több mint 40 nyelvvel (Serena). Az ágens szövegkeresés helyett egy szimbólum definícióját vagy hivatkozásait kéri, és pontos választ kap. Hogy ez a gyakorlatban mennyit spórol, azt a kódoló ágensek tokenspóroló eszközeiről szóló cikk mutatja be.

Hogyan indexelik a kódot a kereskedelmi ágensek

A Cursor Merkle-fával indexel. Minden fájl SHA-256 hasht kap, minden mappa pedig a gyerekei hashét, így egy módosítás után csak a megváltozott ágak térnek el, és csak azokat kell szinkronizálni. Egy 50 000 fájlos munkaterületen pusztán a fájlnevek és hashek nagyjából 3,2 MB-ot tesznek ki. A megváltozott fájlokat szintaktikai darabokra bontja, a beágyazásokat a darab tartalma szerint gyorsítótárazza, egy hasonlósági hash pedig újrahasznosítható meglévő indexet keres, tartalmi bizonyítékokkal, hogy egy kliens csak olyan fájlokra kapjon találatot, amelyeket ténylegesen olvashat (Cursor).

A mögötte álló vektorréteg a turbopuffer, amely szerint a Cursor visszakeresése több mint egybillió vektort kezel, kódbázis-példányonként külön névtérrel, a Cursor saját modelljével beágyazva. Egy meglévő névtér másolása egy új checkouthoz az első lekérdezésig eltelt medián időt 7,87 másodpercről 525 milliszekundumra, a p99-et pedig 4,03 óráról 21 másodpercre csökkentette (turbopuffer). Ez minden kódindex beüzemelési gondja: egy nagy repó első indexelése a lassú rész.

A Kilo Code ugyanezt a mintát adja helyi telepítéshez: alapból LanceDB, külső tárként Qdrant, beágyazási szolgáltatók, köztük az Ollama a teljesen helyi felépítéshez, fájlfigyelés és hash-alapú gyorsítótárazás a növekményes frissítéshez, valamint az ágváltások kezelése. Alapértékei között szerepel a 0,4-es minimális keresési pontszám és legfeljebb 50 találat (Kilo Code). Maga a Cline ezzel szemben jelenleg beépített eszközöket dokumentál, például read_files és search_codebase, beágyazási indexet nem (Cline dokumentáció).

Indexelt visszakeresési út kódhozÖt lépés balról jobbra: a repó, amelyet Merkle-hashek követnek; a tree-sitter a megváltozott fájlokból AST-darabokat készít; a darabok beágyazást kapnak, tartalom-hash szerinti gyorsítótárral; a vektorok kódbázisonként külön névtérbe kerülnek egy tárban; a keresés darabokat ad vissza, majd az ágens elolvassa a fájlokat.repóMerkle-hashektree-sitterAST-darabokbeágyazáshash-cachevektortárkódbázisonkéntkeresésmajd olvasás
Az indexelt út egyszer fizet a szerkezetért és a beágyazásokért; az ágensalapú út (grep, glob, olvasás, ismétlés) minden dobozt kihagy, és helyette keresésenként tokenben fizet.
RendszerDarabolásVisszakeresési primitívTárolásFrissesség
Aider repótérképtree-sitter címkék, csak szignatúrákgráfrangsor a fájlfüggőségekennincs; a térkép a promptba kerülkérésenként újraépül, 1k token alapból
Cursorszintaktikai darabokszemantikus keresés beágyazásokonturbopuffer, névtér kódbázisonkéntMerkle-fa, csak a változott ágak
Kilo Codetree-sitter blokkok, 100–1000 karaktervektorkeresés, min. pontszám 0,4LanceDB vagy Qdrantfájlfigyelő és hash-gyorsítótár
Serenanincs; szimbólumok nyelvi szerverekbőlLSP definíció- és hivatkozáskeresésa nyelvi szerver állapotaélő
Claude Codenincsgrep (ripgrep) és glob, igény szerintnincssosem avul el; keresésenként token

Kódbeágyazó modellek 2026-ban

2026 októberében három gyakorlati út van. Hosztolt és kódra hangolt: a Voyage a voyage-code-4-et jelöli aktuális kódmodelljeként millió tokenenként 0,12 dollárért, 200 millió ingyenes tokennel, míg a voyage-code-3 0,18 dolláros áron a régebbi modellek közé került (Voyage). Saját üzemeltetésű: a Qwen3-Embedding 0.6B, 4B és 8B méretben érhető el 32k kontextussal, Matryoshka-dimenziókkal, és több mint 100 nyelvet támogat, a programozási nyelveket is beleértve (Qwen).

A harmadik út egy általános multimodális vagy hosszú kontextusú modell. A jina-embeddings-v4 egyetlen 2048 dimenziós vektort vagy késői interakcióhoz tokenszintű vektorokat tud kiadni, 71,59-et jelent a CoIR kódbenchmarkon, és a Qwen Research License alatt érhető el, ami kereskedelmi felhasználásnál számít (Jina). A Cohere Embed v4 128k kontextust és 256-tól 1536 dimenzióig terjedő Matryoshka-kimenetet kínál millió tokenenként 0,12 dollárért (Cohere). A modellválasztás általános kérdés, ezt a beágyazó modell kiválasztásáról szóló cikk tárgyalja; kódnál a hosszú kontextus azért számít, mert egész fájlok és hosszú függvények is beleférnek.

Néhány százezer soros repónál ezeken az árakon kicsi a beágyazási számla; a valódi költség a változások utáni újrabeágyazás és az a fejlesztési munka, amely helyesen tartja az indexet. A kódra hangolás ott térül meg leginkább, ahol a lekérdezések természetes nyelvűek, a kód pedig olyan szakmai neveket használ, amelyeket az általános modell sosem látott.

A kódkeresés mérése és frissen tartása

A saját repóján mérjen, a nyilvános benchmarkokat csak józansági ellenőrzésnek használja. Az ACL 2025-ön megjelent CoIR tíz adathalmazt fog össze nyolc visszakeresési feladaton és hét területen, és a szerzők szerint még a legkorszerűbb modelleknek is jelentős nehézségeik voltak a kódkereséssel (CoIR). Az Ön lekérdezései, azonosítói és konvenciói nincsenek benne, ezért építsen saját kis készletet.

  1. Gyűjtsön 30–50 valódi kérdést jegyekből és kódellenőrzésekből, mindegyikhez a választ adó fájllal és szimbólummal.
  2. Keverje a természetes nyelvű kérdéseket a pontos névkeresésekkel, mert ezek más-más visszakeresőt terhelnek.
  3. Mérje a recallt 5-nél és 10-nél minden darabolási és modellváltozatra, és tartsa a készletet a repóban.
  4. Futtassa újra modellváltás és nagyobb refaktorálás után, ne csak egyszer.

A frissesség ugyanannyi tervezést igényel, mint a minőség. A bevált minták: fájlfigyelők tartalom-hash gyorsítótárral (Kilo Code), csak a megváltozott ágakat szinkronizáló Merkle-fák (Cursor) és memoizált folyamatok. A CocoIndex fájlonként és feldolgozási lépésenként kulcsolja a gyorsítótárát, így egy néhány fájlt érintő commit csak azokat ágyazza be újra, a törölt fájlok sorai eltűnnek, az index pedig vagy felzárkóztató futásként a CI-ban, vagy élő módban, a munkakönyvtárat körülbelül egy másodperces késéssel figyelve fut (CocoIndex). A törlések azok az esetek, amelyeket a legtöbb rendszer elront, így jut el egy ágens oda, hogy már eltávolított kódra hivatkozik. A késői darabolás és a kontextuális visszakeresés ezen felül kontextussal egészíti ki a darabokat, lásd kontextuális visszakeresés és késői darabolás.

Mikor jobb az ágensalapú grep egy indexnél, és egy ellenőrzőlista

A grep akkor jobb egy indexnél, ha a repó elég kicsi a gyors kereséshez, folyamatosan változik, vagy nem hagyhatja el a gépet. Az Anthropic hibridként írja le a Claude Code-ot: a CLAUDE.md előre betöltődik, és „az olyan primitívek, mint a glob és a grep, lehetővé teszik, hogy bejárja a környezetét és igény szerint töltsön be fájlokat, gyakorlatilag megkerülve az elavult indexek és a bonyolult szintaxisfák problémáit”. Ugyanez az írás megjegyzi, hogy a futásidejű felfedezés lassabb, mint az előre kiszámolt visszakeresés (Anthropic). A Claude Code Grep eszköze ripgrepre épül, mellette ott a Glob (Claude Code dokumentáció).

A Claude Code-ot, az opencode-ot és a Codexet párhuzamosan használom, és a kompromisszum a mindennapokban is látszik: a grepet előnyben részesítő ágensek egy ismeretlen területen több keresési és olvasási körre költenek tokent, de sosem adnak vissza olyan kódot, amely már nem létezik. Az index költsége ennek a fordítottja: tárhely, beágyazási költség és a fenti frissességi gépezet, cserébe kevesebb kör a jelentés szerint megfogalmazott kérdéseknél.

  • Repóméret: amíg a ripgrep azonnal válaszol, kezdjen greppel és repótérképpel.
  • Változási ütem: gyakori változásnál a grep vagy az LSP előnyös; egy indexnek törléseket is kezelő növekményes frissítés kell.
  • Monorepó: sok csapat és ismeretlen terület az index mellett szól, lehetőleg megosztva és checkoutok között újrahasznosítva.
  • Megfelelőség: ha a kód nem hagyhatja el a gépet, használjon helyi beágyazót és helyi tárat, vagy hagyja ki az indexet.
  • Alapból hibrid: grep a pontos nevekhez, LSP a definíciókhoz és hivatkozásokhoz, index a jelentéshez.

Ha visszakeresést épít egy kódoló ágenshez vagy belső kódasszisztenshez, a MI-mérnöki munkám az ilyen rendszereket fedi le a darabolástól a kiértékelésig.

Források

  1. cAST: AST-based chunking for code RAG (arXiv 2506.15655)
  2. Aider docs: repository map
  3. Aider blog: building a better repository map with tree-sitter (2023)
  4. Anthropic Engineering: effective context engineering for AI agents (Sep 2025)
  5. Cursor blog: securely indexing large codebases (Jan 2026)
  6. turbopuffer: Cursor customer story
  7. Kilo Code docs: codebase indexing
  8. Serena on GitHub
  9. Voyage AI docs: pricing
  10. Qwen blog: Qwen3-Embedding (Jun 2025)
  11. CoIR: a benchmark for code information retrieval (arXiv 2407.02883)
  12. CocoIndex blog: indexing a codebase

Gyakori kérdések

Mi az a RAG kódon?

Visszakereséssel kiegészített generálás, ahol a korpusz egy kódrepó. A rendszer nem bekezdésekre bontja a szöveget, hanem a szintaxis mentén darabolja a kódot, többnyire függvényekre és osztályokra, ezeket beágyazásokkal vagy szimbólumtérképekkel indexeli, és egy feladathoz a legrelevánsabb részeket adja a modellnek.

Miért AST-darabolás fix sorablakok helyett?

A fix ablakok kettévágják a függvényeket, és elválasztják a dekorátorokat és importokat a hozzájuk tartozó kódtól. Az absztrakt szintaxisfa mentén való darabolás egyben tartja a teljes definíciókat. A cAST-tanulmány testvércsomópont-összevonással végzett rekurzív AST-darabolással +4,3 pont Recall@5-öt mért a RepoEvalon és +2,67 pont Pass@1-et a SWE-benchen.

Mi az a repótérkép?

Egy repó osztályainak és függvényeinek tömör, szignatúrákat tartalmazó összefoglalója, amelyet tree-sitter készít. Az Aider a fájlfüggőségek gráfján rangsorolja a szimbólumokat, és csak azt veszi bele, ami belefér a tokenkeretbe, alapértelmezésben 1k tokenbe, így a modell fájltartalmak nélkül látja a szerkezetet.

Melyik beágyazó modellt használjam kódhoz 2026-ban?

2026 októberében kódra hangolt lehetőség például a voyage-code-4 millió tokenenként 0,12 dollárért, és a saját üzemeltetésre a Qwen3-Embedding 0.6B, 4B és 8B méretben; a jina-embeddings-v4 kutatási licenc alatt 71,59-et jelent a CoIR-on. Választás előtt értékeljen két-három jelöltet a saját repójából vett lekérdezésekkel.

Kell egyáltalán vektorindex a kódoló ágenseknek?

Nem mindig. A Claude Code grep és glob segítségével, igény szerint navigál, ami elkerüli az elavult indexeket és a bonyolult szintaxisfákat, de lassabb, mint az előre kiszámolt visszakeresés. Az index nagy vagy ismeretlen repóknál és a név helyett jelentés szerint megfogalmazott kérdéseknél térül meg.

Pont erre van szükséged?

Írj a projektedről vagy a pozícióról – szívesen hallok felőled.