Utoljára frissítve:
RAG chunking stratégiák 2026 — melyiket válaszd és miért?
A RAG rendszer teljesítményét nem az LLM megválasztása határozza meg elsősorban — hanem az, hogyan bontod fel a dokumentumokat az indexelés előtt. A helyes chunking stratégia 15–25%-os retrieval-pontosság-javulást eredményez; a rossz stratégia ellenben még a legjobb modellel sem mentható meg. Ez az útmutató végigveszi a négy fő megközelítést, konkrét paraméterekkel, kódrészletekkel és teljesítmény-benchmarkokkal.
Rövid, egységes dokumentumok → fix méretű 256 token. Hosszú narratív szövegek → szemantikus chunking. Hierarchikus dokumentumok (kézikönyv, jogi szöveg) → parent-child chunking. Vegyes dokumentumállomány → hibrid. A döntést mindig RAGAS Context Precision metrikával validáld, ne csak intuícióból hozd meg.
Miért kritikus a chunking a RAG minőségéhez?
A RAG pipeline három fő komponensből áll: dokumentum-indexelés, szemantikus visszakeresés és válasz-generálás. A chunking az indexelési fázis kulcslépése — és ez az egyetlen pont, ahol a legtöbb rendszer csendben elcsúszik. A rossz chunking nem dob hibát, nem jelez figyelmeztetést: egyszerűen silányabb kontextust ad a keresőnek, a kereső rosszabb dokumentumrészletet ad az LLM-nek, és az LLM egy meggyőző, de pontatlan választ generál.
A probléma lényege az egybefüggő kontextus szétszakítása. Ha egy 600 tokenes bekezdést a chunker kettévág a 512. tokennél, az egyik chunk elveszíti a konklúziót, a másik elveszíti az előzményt. A vektorkeresés mindkét chunk-ot alacsonyabb pontossággal tudja csak visszahozni, mert egyik sem teljes szemantikai egység.
A RAG rendszer teljesítménye nem az LLM minőségén múlik elsősorban — az LLM-ek 2026-ban már mind elég jók ahhoz, hogy jó kontextusból jó választ adjanak. A szűk keresztmetszet a retrieval pontossága, és a retrieval pontossága a chunking minőségén múlik. Rossz chunking → félbe vágott kontextus → irreleváns keresési eredmény → hallucináció vagy kitérő válasz.
A saját Corpus V2 rendszeremben (1,48 millió vektorizált szövegtöredék, Qdrant) pontosan ezt tanultam meg: a rendszer első verziójában fix méretű, 512 tokenes chunkolást alkalmaztam. A RAGAS Context Precision 0,61 volt. Parent-child chunking bevezetése után — azonos dokumentumállomány, azonos embedding modell — 0,84-re emelkedett. Az LLM ugyanaz maradt. A különbséget kizárólag a chunking stratégia tette.
A 4 fő chunking stratégia összehasonlítása
Mielőtt belemennénk a részletekbe, a négy stratégia gyors összehasonlítása egy helyen — döntési alapnak:
| Stratégia | Hogyan vág | Előnyök | Hátrányok | Mikor használd |
|---|---|---|---|---|
| Fix méretű | Token-számon vág (pl. 512 token), opcionális overlap-pal | Egyszerű, gyors, kiszámítható, minimális infrastruktúra-igény | Mondathatáron és bekezdéshatáron vághat, kontextus-integritás sérülhet | Rövid, egységes szerkezetű tartalmak (FAQ, termékleírás, bullet-point listák) |
| Szemantikus | NLP-modell azonosítja a természetes tartalmi határokat (témaváltás, bekezdésvég) | Kontextus-integritás megőrzése, jobb RAGAS Context Precision, természetes egységek | Lassabb feldolgozás, embedding modell szükséges az indexelési fázisban is | Narratív, hosszú szövegek: kézikönyvek, kutatási riportok, esettanulmányok |
| Parent-child | Hierarchiás: kis leaf chunk-ok (256 token) + hozzájuk rendelt nagy parent chunk-ok (1024–2048 token) | Pontos visszakeresés (leaf) + gazdag kontextus (parent) egyszerre — a legjobb kompromisszum | Összetettebb pipeline, kettős indexelés szükséges, nagyobb vektorbázis-méret | Hierarchikus dokumentumok: kézikönyv fejezetek, jogszabályok, specifikációk, policy dokumentumok |
| Hibrid / adaptív | Dokumentum-típustól függ: kód → fix kis méret, narratív → szemantikus, hierarchikus → parent-child | Rugalmas, minden dokumentumtípushoz optimalizált, a legmagasabb RAGAS-pontszám vegyes állományon | Konfigurációs overhead, dokumentumtípus-detekció szükséges, karbantartás komplexebb | Vegyes dokumentumtípusú vállalati tudásbázis, ahol az egységes stratégia kompromisszumot jelent |
Fix méretű chunking — paraméterek és implementáció
A fix méretű chunking a legegyszerűbb és leggyakrabban alkalmazott stratégia. A dokumentumot meghatározott token- vagy karakterszámonként darabolja — opcionálisan átfedéssel (overlap), hogy az egységek határán ne vágjon el összefüggő szövegegységeket.
A két kulcsparaméter: chunk_size (hány token kerüljön egy chunk-ba) és chunk_overlap (hány tokennyi átfedés legyen a szomszédos chunk-ok között). Az overlap célja, hogy egy mondat közepén ne szűnjön meg a kontextus: a következő chunk visszanéz az előző végébe.
Ajánlott chunk_size értékek tartalom-típusonként
| Tartalom típusa | Ajánlott chunk_size | Ajánlott overlap | Indoklás |
|---|---|---|---|
| Kód, SQL, JSON | 128–256 token | 20–32 token | A kódblokkok önmagukban kompakt logikai egységek; nagyobb méret irreleváns kontextust hoz be |
| FAQ, bullet-pont listák, termékleírás | 256 token | 32–51 token | Rövid, önálló egységek; az overlap megakadályozza a lista-elem szétszakadását |
| Általános vállalati dokumentum | 512 token | 51–102 token (10–20%) | Egyensúly a pontosság és a kontextus-gazdaságosság között |
| Narratív szöveg, kutatási riport | 512–1024 token | 100–200 token | A hosszabb bekezdések és érvek megőrzéséhez nagyobb egység szükséges |
| Táblázatok, strukturált adatok | 256 token | 0–32 token | A táblázat sorai önálló egységek; az overlap itt zavart okozhat a sor-összefüggésekben |
LangChain RecursiveCharacterTextSplitter — példa
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
# Dokumentum betöltése
loader = PyPDFLoader("vallalati_kezikonyv.pdf")
documents = loader.load()
# Chunker inicializálása
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # token-méret (kb. karakterben: 512 * 4 = ~2048 karakter)
chunk_overlap=51, # ~10% overlap
length_function=len,
separators=[ # hierarchikus elválasztók — előbb bekezdés, aztán mondat, aztán szó
"\n\n", # bekezdéshatár (legjobb vágási pont)
"\n", # sorvég
" ", # szóhatár
"" # karakter-szintű fallback
]
)
# Chunkolás
chunks = text_splitter.split_documents(documents)
print(f"Dokumentumok száma: {len(documents)}")
print(f"Chunk-ok száma: {len(chunks)}")
print(f"Átlagos chunk méret: {sum(len(c.page_content) for c in chunks) / len(chunks):.0f} karakter")
# Qdrant-ba töltés (feltéve: embedder már inicializálva)
from langchain.vectorstores import Qdrant
vectorstore = Qdrant.from_documents(
chunks,
embedding=embedder,
url="http://localhost:6333",
collection_name="corpus_fixed"
) A RecursiveCharacterTextSplitter a separators listán balról jobbra halad: először bekezdéshatáron próbál vágni, majd sorvégen, majd szóhatáron — és csak utoljára folyamodik karakterszintű vágáshoz. Ez sokkal jobb eredményt ad, mint az egyszerű CharacterTextSplitter, amely mindig a megadott karakternél vág, figyelmen kívül hagyva a szöveges struktúrát.
Szemantikus chunking — hogyan működik?
A szemantikus chunking nem token-számon, hanem tartalmi határokon vágja a szöveget. Az NLP-modell mondatonként vektorizálja a szöveget, majd cosine similarity-vel megméri, mennyire hasonlóak az egymást követő mondatok. Ahol az összehasonlítás eredménye egy meghatározott küszöbérték alá esik, ott a chunker éles témaboundary-t jelez — és ott vágja ketté a szöveget.
A folyamat lépései:
- Mondatokra bontás: A szöveget mondatonként szegmentálják (NLTK sent_tokenize vagy spaCy).
- Mondatvektorizálás: Minden mondathoz embedding-vektor készül az embedder modellel.
- Cosine similarity számítás: Minden egymást követő mondatpár hasonlóságát mérik.
- Küszöb meghatározása: Ahol a similarity-érték egy threshold (pl. 0.75) alá esik, ott témaváltást jelez a rendszer.
- Vágás: A témaváltás-pontoknál vágja a szöveget — természetes tartalmi határokon.
Szemantikus chunkingnál a chunk-ok mérete változó — egy rövid, önálló gondolat 80 token is lehet, egy részletes érv 900 token. Ez természetesebb egységeket eredményez, de megnehezíti a vektorbázis méretének előre becslését. Ellenben: a RAGAS Context Precision általában 15–25%-kal magasabb szemantikus chunkingnál fix méretűhöz képest azonos dokumentumállományon.
LangChain SemanticChunker — példa
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings
# vagy helyi modellhez:
# from langchain_community.embeddings import HuggingFaceEmbeddings
# Embedder inicializálása (szemantikus chunkernek is kell)
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# helyi alternatíva:
# embeddings = HuggingFaceEmbeddings(model_name="Qwen/Qwen3-Embedding-8B")
# SemanticChunker inicializálása
# breakpoint_threshold_type lehetséges értékei:
# "percentile" — az összes similarity-pont X. percentilise alatt vág
# "standard_deviation" — az átlag mínusz N szórás alatt vág
# "interquartile" — IQR-alapú outlier detekció
text_splitter = SemanticChunker(
embeddings=embeddings,
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=85 # a 85. percentilis alatti hasonlóságnál vág
)
# Szöveg betöltése és chunkolása
with open("kutatasi_riport.txt", "r", encoding="utf-8") as f:
raw_text = f.read()
chunks = text_splitter.create_documents([raw_text])
print(f"Szemantikus chunk-ok száma: {len(chunks)}")
print(f"Min chunk méret: {min(len(c.page_content) for c in chunks)} karakter")
print(f"Max chunk méret: {max(len(c.page_content) for c in chunks)} karakter")
print(f"Átlag chunk méret: {sum(len(c.page_content) for c in chunks) / len(chunks):.0f} karakter")
A breakpoint_threshold_amount hangolása a legfontosabb lépés: ha túl alacsony, sok apró chunk keletkezik (szétszabdalt kontextus); ha túl magas, kevés nagy chunk (túl tág visszakeresés). Az optimális érték dokumentumtípusonként eltér — ajánlott 30–50 dokumentumon RAGAS Context Precision mérésével kalibrálni.
Parent-child chunking — a hibrid megközelítés
A parent-child chunking a legtöbb vállalati RAG esetben a legjobban teljesítő stratégia, mert egyszerre oldja meg a visszakeresés pontosságát és a kontextus-gazdagságát — amelyek egymással versenyeznek a többi stratégiában.
Az architektúra logikája: small leaf chunk (256 token) → pontos szemantikus visszakeresés; nagy parent chunk (1024–2048 token) → gazdag kontextus az LLM-nek. A retrieval a leaf chunk vektorán keres, de a generáláshoz a teljes parent chunk szövegét adja a modellnek.
Architektúra — hogyan épül fel
"3.2 Szabadságolási folyamat — teljes HR-policy szekció (900 szó)"
→ NEM kerül a vektoradatbázisba külön vektorként (csak text store-ban él)
"A szabadság igénylése..."
"Jóváhagyási lépések..."
"Rendkívüli szabadság..."
"GYES és GYED..."
→ Az LLM a teljes folyamat kontextusában válaszol, nem csak a leaf töredékéből
A parent chunk nem kerül közvetlenül a vektoradatbázisba — csak a leaf chunk-ok vektorizálódnak. A parent szövegét egy dokumentumtárban (Document Store) tartja a pipeline, és a leaf-match metadata alapján hívja elő. LangChain-ben ez az InMemoryStore vagy RedisDocumentStore; LlamaIndex-ben a SimpleDocumentStore.
LlamaIndex HierarchicalNodeParser — példa
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.node_parser import HierarchicalNodeParser, get_leaf_nodes
from llama_index.core.storage.docstore import SimpleDocumentStore
from llama_index.core import StorageContext
# Dokumentumok betöltése
documents = SimpleDirectoryReader("./docs/").load_data()
# HierarchicalNodeParser: 3 szint
# chunk_sizes: [2048, 512, 128]
# → 2048 token = root (legfelső szint)
# → 512 token = parent
# → 128 token = leaf (legalsó szint, ez kerül a vektoradatbázisba)
node_parser = HierarchicalNodeParser.from_defaults(
chunk_sizes=[2048, 512, 128]
)
# Összes node generálása (mindhárom szint)
nodes = node_parser.get_nodes_from_documents(documents)
# Leaf node-ok kiemelése (ezek kerülnek a vektoradatbázisba)
leaf_nodes = get_leaf_nodes(nodes)
print(f"Összes node: {len(nodes)}")
print(f"Leaf node-ok: {len(leaf_nodes)}")
# Document store feltöltése (az összes node — parent + leaf — tárolása)
docstore = SimpleDocumentStore()
docstore.add_documents(nodes)
storage_context = StorageContext.from_defaults(docstore=docstore)
# Index létrehozása csak a leaf node-okból (vektorizálás)
index = VectorStoreIndex(
leaf_nodes,
storage_context=storage_context,
show_progress=True
)
# AutoMergingRetriever: leaf visszakeresés, parent kontextus visszaadás
from llama_index.core.retrievers import AutoMergingRetriever
base_retriever = index.as_retriever(similarity_top_k=6)
retriever = AutoMergingRetriever(
base_retriever,
storage_context,
verbose=True,
simple_ratio_thresh=0.3 # ha a leaf-ek >30%-a ugyanabból a parent-ből, merge-el
)
# Lekérdezés
from llama_index.core.query_engine import RetrieverQueryEngine
query_engine = RetrieverQueryEngine.from_args(retriever)
response = query_engine.query("Milyen dokumentumok szükségesek a szabadság-igényléshez?")
print(response) Chunk-méret benchmarkok és RAGAS mérés
A chunking stratégia kiválasztása nem lehet csak elméleti — mindig mérni kell a konkrét dokumentumállományon. A RAGAS keretrendszer (ragas.io) a négy legfontosabb retrieval és generálási metrikát automatizáltan méri kérdés-válasz párok alapján.
A mérés menete: (1) összeállítasz 30–50 kérdés-válasz párt a dokumentumokból, (2) lefuttatod a RAG pipeline-t mindhárom chunking stratégiával, (3) a RAGAS kiszámolja a metrikákat, (4) az eredmény alapján döntesz.
Stratégiák összehasonlítása — jellemző benchmark-értékek
| Stratégia | Context Precision | Context Recall | Latency (átlag) | RAGAS Score |
|---|---|---|---|---|
| Fix méretű (512 tok, 10% overlap) | 0.61–0.70 | 0.72–0.80 | 120–180 ms | 0.65–0.74 |
| Fix méretű (256 tok, 10% overlap) | 0.68–0.76 | 0.65–0.73 | 90–140 ms | 0.66–0.74 |
| Szemantikus | 0.78–0.87 | 0.74–0.82 | 200–350 ms | 0.76–0.84 |
| Parent-child (256 leaf / 1024 parent) | 0.82–0.91 | 0.79–0.87 | 180–280 ms | 0.80–0.89 |
| Hibrid / adaptív | 0.84–0.93 | 0.81–0.89 | 220–400 ms | 0.82–0.91 |
Ezek a számok jellemző tartományok vállalati dokumentumokon végzett mérések alapján — nem abszolút igazságok. A saját dokumentumállományodon mért RAGAS-pontszám eltérhet. Különösen: magyar nyelvű szövegeken az embedding modell megválasztása (multilingual-e5, Qwen3-Emb) nagyobb hatással lehet a végeredményre, mint a chunking stratégia. Mindig mérj a saját adatodon.
A latency-különbség szemantikus és fix méretű között jellemzően az indexelési fázisban keletkezik (az embedding a vágási döntéshez is szükséges), nem a retrieval-nél. A production query latency a legtöbb esetben azonos vagy hasonló.
Implementációs döntési fa
A következő kérdéssorozat segít kiválasztani a megfelelő chunking stratégiát a konkrét felhasználási esethez. Haladj végig sorban — az első egyező feltételnél megvan az ajánlott stratégia.
-
A dokumentumok rövidek és egységes szerkezetűek? (FAQ, termékleírás, bullet-pont listák, <500 szó)
→ Fix méretű, 256 token, 10% overlap. Gyors, egyszerű, jól teljesít homogén, rövid dokumentumoknál. LangChain RecursiveCharacterTextSplitter.
-
A dokumentumok hosszú narratív szövegek? (kézikönyv, kutatási riport, esettanulmány, >1000 szó)
→ Szemantikus chunking. A természetes tartalmi határok megőrzése kritikus hosszú szövegeknél. LangChain SemanticChunker, 85. percentilis threshold.
-
A dokumentumok hierarchikus struktúrájúak? (fejezetek, alszekciók, specifikáció, jogi dokumentum)
→ Parent-child chunking. A leaf chunk pontos visszakeresést ad, a parent chunk gazdag kontextust az LLM-nek. LlamaIndex HierarchicalNodeParser + AutoMergingRetriever.
-
A dokumentumállomány vegyes típusú? (kód, narrative, táblázat, FAQ egyszerre)
→ Hibrid / adaptív chunking. Dokumentumtípus-detekció (kód → 128 token fix; narrative → szemantikus; hierarchikus → parent-child). Magasabb konfigurációs overhead, de a legjobb RAGAS-pontszám vegyes állományon.
-
Nem tudod eldönteni, vagy PoC-fázisban vagy?
→ Kezdd fix méretűvel (512 token, 10% overlap), mérd RAGAS-szal, majd iterálj. Az első mérés megmutatja, hol a szűk keresztmetszet — Context Precision vs. Context Recall alapján döntsd el, melyik irányba kell finomítani.
A Corpus V2 rendszerben a könyvek és kutatási dokumentumok parent-child chunking-ot kapnak (256 leaf / 1024 parent), a rövid blog-bejegyzések és FAQ-tartalmak fix méretű 256 tokenes chunkolást. A RAGAS Context Precision az előbbinél 0.84, az utóbbinál 0.79 — mindkettő jobb az egységes fix stratégiánál (0.61) volt az egyetlen megközelítéssel.
Kérdések és válaszok
Mi az optimális chunk-méret RAG rendszerhez?
Általános ajánlás: 256–512 token a leaf (levél) chunk-okhoz, 1024–2048 token a parent chunk-okhoz hierarchikus rendszerben. A valóban optimális méret tartalom-függő: kód és táblázat esetén kisebb (128–256), narratív szövegnél nagyobb (512–1024) chunk javasolt. Mérés: RAGAS Context Precision metrikával validáld a kiválasztott méretet.
Mi az a parent-child chunking és mikor érdemes alkalmazni?
A parent-child chunking hierarchikus strukturát hoz létre: a kis leaf chunk-ok pontos visszakeresésre, a hozzájuk rendelt parent chunk kontextus-gazdagításra szolgál. Retrieval: a leaf chunk alapján keres, de a parent chunk szövegét adja a generatív modellnek. Akkor érdemes, ha az entitásaid hierarchikus dokumentumstruktúrájúak — pl. fejezetekbe rendezett kézikönyvek, jogszabályok, specifikációk.
Mennyi az optimális overlap a chunk-ok között?
Fix méretű chunkingnál 10–20% overlap általánosan elfogadott — 512 token chunk esetén 51–102 token overlap. A nagy overlap (>25%) növeli a redundanciát és a vektorbázis méretét; a nulla overlap mondat- és bekezdéshatárokon vághat szét értelmes egységeket. Szemantikus chunkingnál az overlap kevésbé releváns, mert a vágási pont természetes határon történik.
Mi a különbség a szemantikus chunking és a fix méretű chunking között?
Fix méretű chunking token-számon vág, függetlenül a tartalomtól — gyors és egyszerű, de félbevághat mondatokat és bekezdéseket. Szemantikus chunking NLP modelllel azonosítja a természetes tartalmi határokat (bekezdések, fejezetek, témaváltások) és ott vág — lassabb, de jobb kontextus-integritású chunk-okat eredményez. A RAGAS Context Precision általában 15–25%-kal jobb szemantikus chunkingnál.
Hogyan döntsem el, melyik chunking stratégiát válasszam?
Döntési fa: ha a dokumentumok rövid, egységes szerkezetűek (FAQ, termékleírás) → fix méretű 256 token. Ha hosszú, narratív szövegek (kézikönyv, kutatás) → szemantikus chunking. Ha hierarchikus struktúra és kontextus-megőrzés kritikus (jogi dokumentum, specifikáció) → parent-child. Ha változatos dokumentumtípusok és erőforrás rendelkezésre áll → hibrid/adaptív.
Milyen eszközökkel implementálható a különböző chunking stratégia?
Fix méretű: LangChain RecursiveCharacterTextSplitter, LlamaIndex SentenceSplitter. Szemantikus: LangChain SemanticChunker (OpenAI embeddings alapján), LlamaIndex SemanticSplitterNodeParser. Parent-child: LangChain ParentDocumentRetriever, LlamaIndex HierarchicalNodeParser. Qdrant-tal mindhárom kompatibilis — a chunk típus csak a betöltési pipeline-t érinti, a vektoradatbázis struktúráját nem.
Kapcsolódó tartalmak
RAG Chunking Audit — melyik stratégia illik a te dokumentumaidhoz?
Ha már van RAG rendszered, de a válaszminőség nem éri el az elvárt szintet — vagy ha most tervezed az implementációt és bizonytalan vagy a chunking stratégiában — áttekintem a dokumentumállományt, és konkrét paraméter-ajánlást adok RAGAS-alapú validálással.
Chunking Audit kérése Vissza a RAG hubhoz →