Blog/Retrieval és keresés
Kontextuális visszakeresés és késleltetett chunkolás: a RAG-chunkok visszakapják a kontextusukat
A chunkok elveszítik a dokumentumukat. Hogyan javít ezen a contextual retrieval, a late chunking és a kontextusos embedding, mennyibe kerül, és mikor hagyd ki.
Balázs Csorba··10 perc olvasás
- RAG
- Chunking
- Embeddings
- Contextual retrieval
- Late chunking

A lényeg röviden
- Az Anthropic kontextuális visszakeresése minden chunk elé 50–100 token LLM által írt kontextust tesz, és 35%-kal csökkentette a top 20 találat hibaarányát, kontextuális BM25-tel 49%-kal, rerankerrel 67%-kal.
- Prompt-gyorsítótárazással a kontextus előállítása egyszeri indexelési költség: 2024-ben kb. 1,02 dollár millió dokumentumtokenenként, a mai Haiku-listaárakkal saját számításom szerint nagyjából 0,38–3,84 dollár.
- A késleltetett chunkolás előbb a teljes dokumentumot embeddeli, majd chunkonként átlagolja a tokenvektorokat; nem kell hozzá LLM, de kell egy hosszú kontextusú embedding-modell, amelynek a tokenkimeneteihez hozzáférsz.
- A late chunking tanulmányban az átlagos javulás a naiv chunkoláshoz képest kb. 1,5–1,9 nDCG@10 pont volt, kis chunkoknál a legnagyobb, és nulla, ha a környező szöveg nem kapcsolódik a tartalomhoz.
- Kezdd az olcsó alapvonallal, a dokumentum címével és a szakasz útvonalával minden chunk előtt, és mérj, mielőtt a három módszer bármelyikéért fizetsz.
A chunkolás veszteséges lépés. Egy chunk, amely azt mondja, hogy „a maximális terhelés 40 kg”, a kézikönyvben teljesen egyértelmű volt, ahol a két oldallal korábbi címsor megnevezte a terméket. Kivágva és önmagában embeddelve már nem említi sem a terméket, sem a változatot, sem a forrásdokumentumot, így egy terméknévvel feltett kérdés talán soha nem találja meg.
2024 óta háromféle megoldás jelent meg: a kontextuális visszakeresés, amely minden chunkot egy LLM-mel egészít ki; a késleltetett chunkolás, amely darabolás előtt a teljes dokumentumot embeddeli; és az API-ként árult kontextusos embedding-modellek. Ez a cikk összeveti, mit változtat mindegyik, mit mondanak a közzétett számok, mennyibe kerülnek, és melyik olcsó alapvonalat próbálom ki először. A korábban leírt chunkolási és hibrid keresési pipeline-ra épít.
Miért veszítik el a chunkok a kontextusukat?
Az embedding-modellek csak azt a szöveget látják, amelyet átadsz nekik. Ha a dokumentumot előbb feldaraboljuk, és minden darabot külön embeddelünk, a chunkon kívülre mutató hivatkozások, például „ez”, „ez a változat”, „a fenti táblázat” vagy egy ki nem mondott terméknév, értelmüket vesztik. A BM25 ugyanígy szenved: az egyező kulcsszó a címsorban van, nem a chunkban.
A nagyobb chunk a kézenfekvő kerülőút, de felhígítja a vektort, és több irreleváns szöveget küld a modellnek. Az okosabb határok kevésbé segítenek, mint remélnénk: Qu, Tu és Bao 2024-es tanulmánya szerint a szemantikus chunkolás többletköltségét nem igazolja következetes javulás a fix méretű chunkokhoz képest. Az alábbi megoldások békén hagyják a határokat, és helyette kontextust adnak hozzá.
Hogyan működik a kontextuális visszakeresés?
Az Anthropic 2024. szeptember 19-én tette közzé a kontextuális visszakeresést. Minden chunknál egy kis modell megkapja a teljes dokumentumot és a chunkot, és rövid, a chunkot a kereséshez elhelyező kontextust kell írnia, csak ezzel válaszolva. Az eredményt, ami általában 50–100 token, a chunk elé fűzik. Az összefűzött szöveget embeddelik, és BM25-höz is indexelik; az Anthropic ezt kontextuális embeddingnek és kontextuális BM25-nek nevezi.
A közölt hatás jelentős. Az Anthropic a top 20 találat hibaarányát mérte, vagyis egy mínusz recall@20 értéket, kódbázisok, szépirodalom, arXiv-cikkek és tudományos cikkek átlagában:
| Konfiguráció | Hibaarány | Csökkenés |
|---|---|---|
| Alap embeddingek | 5.7% | – |
| Kontextuális embeddingek | 3.7% | 35% |
| Kontextuális embeddingek + kontextuális BM25 | 2.9% | 49% |
| Mindkettő, rerankeléssel | 1.9% | 67% |
Ugyanabból a cikkből két részlet könnyen elsikkad. A chunkok elé fűzött általános dokumentum-összefoglalók csak nagyon csekély javulást hoztak, tehát a kontextusnak chunkspecifikusnak kell lennie. A rerankelt beállítás pedig kb. 150 jelöltet kért le, újrarangsorolta őket, és a top 20-at tartotta meg, ami jobban teljesített, mint 5 vagy 10 chunk átadása.
import anthropic
client = anthropic.Anthropic()
def chunk_context(document: str, chunk: str) -> str:
"""One call per chunk; the document block is cached and reused for every chunk."""
msg = client.messages.create(
model="claude-haiku-4-5",
max_tokens=150,
messages=[{"role": "user", "content": [
{"type": "text", "text": f"<document>\n{document}\n</document>",
"cache_control": {"type": "ephemeral"}},
{"type": "text", "text": (
f"Here is a chunk from the document:\n<chunk>\n{chunk}\n</chunk>\n"
"Write a short context that situates this chunk within the document "
"to improve search retrieval. Answer only with the context.")},
]}],
)
return msg.content[0].text.strip()
# Index context and chunk together, but keep both fields for display and re-runs.
record = {"context": ctx, "chunk": chunk, "index_text": f"{ctx}\n\n{chunk}"}Mennyibe kerül a kontextus előállítása?
Az Anthropic kb. 1,02 dollárra becsülte millió dokumentumtokenenként, egyszeri költségként, 8000 tokenes dokumentumokkal, 800 tokenes chunkokkal, chunkonként 50 token utasítással és 100 token kontextussal, gyorsítótárazott dokumentummal számolva. Ez a szám a Claude 3 Haiku 2024-es árain alapult. Ugyanezekkel a feltevésekkel és az Anthropic árlistájának jelenlegi áraival újraszámoltam: millió dokumentumtokenre ez 125 dokumentum és 1250 chunk, dokumentumonként egy gyorsítótár-írás, kilenc gyorsítótár-olvasás, a chunk és az utasítás normál bemenetként, a kontextus kimenetként.
| Tétel 1 millió dokumentumtokenre | Token | Haiku 4.5 | Haiku 5.5 (100k-ig) |
|---|---|---|---|
| Gyorsítótár-írás, dokumentumok | 1.0M | $1.25 | $0.13 |
| Gyorsítótár-olvasás, dokumentumok | 9.0M | $0.90 | $0.09 |
| Bemenet, chunk és utasítás | 1.06M | $1.06 | $0.11 |
| Kimenet, kontextus | 0.125M | $0.63 | $0.06 |
| Összesen | $3.84 | $0.38 |
Így vagy úgy, indexelési költség, amelyet csak dokumentumváltozáskor kell újra megfizetni, és a fejlesztési időhöz képest kicsi. A buktató a változás: ha egy dokumentum egy bekezdése módosul, a benne lévő összes chunk kontextusa megváltozhat, ezért a teljes dokumentumot kontextualizáld újra, ne csak a szerkesztett chunkot.
Hogyan működik a késleltetett chunkolás?
A késleltetett chunkolás, amelyet Günther és kollégái javasoltak a Jina AI-nál 2024 szeptemberében, a darabolást a folyamat végére teszi. A hosszú kontextusú embedding-modell elolvassa a teljes dokumentumot, vagy amennyi belefér, és tokenenként egy vektort állít elő. Az attention révén minden tokenvektor már tükrözi a környező szöveget. Csak ezután alkalmazzuk a chunkhatárokat: az egyes chunkokon belüli tokenvektorokat átlagolással egy chunk-embeddinggé vonjuk össze. A tanulmány szavaival: chunkolás a transformer után, közvetlenül az átlagoló pooling előtt.
A Jina eredeti cikke egy Berlinről szóló Wikipédia-szöveggel mutatja be a hatást: a lakosságszámról szóló mondat koszinusz-hasonlósága a „Berlin” lekérdezéshez naiv chunkolással 0,708, késleltetett chunkolással 0,825 volt, mert a „lakossága” szó most már magában hordozta a várost. A tanulmány benchmarkjai szerényebbek. Három modell és négy BeIR-adatkészlet átlagában a késleltetett chunkolás kb. 1,8 ponttal javította az nDCG@10 értéket fix méretű chunkoknál, 1,9-cel mondatalapú és 1,5-tel szemantikus chunkoknál. A legnagyobb egyedi ugrás az NFCorpuson volt, 23,5-ről 30,0-ra a jina-embeddings-v2-small modellel.
A tanulmány a korlátokról is őszintén ír. A javulás kis chunkoknál a legnagyobb, és néhány szövegértési adatkészleten nagy chunkokkal a naiv chunkolás nyert. A szintetikus needle és passkey feladatoknál, ahol a környező szöveg összefüggéstelen töltelék, a késleltetett chunkolás nem segített. A modell ablakánál hosszabb dokumentumokat a szerzők átfedő makrochunkokra bontják, és mindegyikre külön alkalmazzák a módszert.
import torch
from transformers import AutoModel, AutoTokenizer
# Any mean-pooling, long-context embedding model whose token outputs you can read.
tok = AutoTokenizer.from_pretrained(MODEL)
model = AutoModel.from_pretrained(MODEL)
def late_chunk(text: str, spans: list[tuple[int, int]]) -> list[torch.Tensor]:
"""spans are character ranges from your normal chunker."""
enc = tok(text, return_offsets_mapping=True, truncation=True,
max_length=8192, return_tensors="pt")
offsets = enc.pop("offset_mapping")[0].tolist()
with torch.no_grad():
tokens = model(**enc).last_hidden_state[0] # one vector per token
out = []
for start, end in spans:
idx = [i for i, (s, e) in enumerate(offsets) if e > s and s >= start and e <= end]
v = tokens[idx].mean(dim=0) # pool only this chunk's tokens
out.append(v / v.norm())
return outMi a helyzet a kontextusos embedding API-kkal?
A harmadik lehetőség modellként csomagolja az ötletet. A Voyage 2025 júliusában adta ki a voyage-context-3, 2026 júniusában a voyage-context-4 modellt: egy dokumentum összes chunkját együtt küldöd el, és chunkonként egy vektort kapsz, mindegyiket a teljes dokumentumot látva kiszámítva. Az API dokumentumok listáját fogadja, mindegyik chunkok listája, kérésenként legfeljebb 1000 bemenettel, összesen 120 000 tokennel és 16 000 chunkkal. A lekérdezések ugyanazon a végponton, egyelemű listaként mennek. A voyage-context-4 millió tokenenként 0,12 dollárba kerül, maga is tud chunkolni, a 32 000 tokennél hosszabb dokumentumokat pedig feldarabolja.
import voyageai
vo = voyageai.Client()
docs = [["Chunk 1 of manual A ...", "Chunk 2 of manual A ..."],
["Chunk 1 of manual B ..."]]
res = vo.contextualized_embed(inputs=docs, model="voyage-context-4",
input_type="document")
chunk_vectors = [r.embeddings for r in res.results] # one list per document
q = vo.contextualized_embed(inputs=[["maximum load of the X200 shelf"]],
model="voyage-context-4", input_type="query")
query_vector = q.results[0].embeddings[0]A Voyage szerint a voyage-context-3 chunkszintű visszakeresésben 6,76%-kal verte az Anthropic-stílusú kontextuális visszakeresést és 23,66%-kal a Jina late chunkingot. Ezeket szolgáltatói számként kezeld, és figyelj arra, hogy a voyage-context-3 cikk az összefoglalóban és az eredmények részben két különböző százalékkészletet közöl. Az architekturális lényeg ettől függetlenül áll: dokumentumkontextust kapsz chunkonkénti LLM-hívás nélkül, cserébe szolgáltatóhoz kötöd az indexelést és a lekérdezést is.
Hogyan viszonyul egymáshoz a három megközelítés?
| Megközelítés | Mi változik | Mi kell hozzá | Segít a BM25-nek | Fő költség |
|---|---|---|---|---|
| Cím- és címsor-előtag | Chunkszöveg | Feldolgozott szerkezet | Igen | Szinte semmi |
| Kontextuális visszakeresés | Chunkszöveg | Chunkonként LLM-hívás | Igen | LLM-tokenek indexeléskor |
| Késleltetett chunkolás | Csak a vektorok | Hosszú kontextusú modell, tokenkimenet | Nem | Saját inferencia |
| Kontextusos embedding API | Csak a vektorok | Egy szolgáltató indexhez és lekérdezéshez | Nem | Tokenalapú API-ár |
Mikor nem éri meg a plusz kontextus?
- Önmagukban érthető rekordok. A termékadatok, GYIK-bejegyzések és jegyek már megnevezik a tárgyukat. A plusz kontextus csak megismétli, ami ott van.
- Kis tudásbázisok. Az Anthropic megjegyzi, hogy kb. 200 000 token, nagyjából 500 oldal alatt egyszerűbb lehet mindent a promptba tenni, mint visszakeresést építeni. Ezt a kompromisszumot a RAG 2026-ban cikkben mérlegeltem.
- Független környezet. Egy fájlban gyűjtött, egymástól független jegyzetek semmi hasznosat nem adnak át a modellnek, ahogy a late chunking tanulmány needle-eredményei is mutatják.
- Gyorsan változó dokumentumok. Ha a dokumentumok naponta változnak, a kontextuális visszakeresés azt jelenti, hogy naponta teljes dokumentumokon kell újrafuttatni az LLM-et. A late chunking vagy egy kontextusos API csak egy embedding-futásba kerül.
Mire figyelj a megvalósításnál?
- Tárold külön a kontextust és a chunkot. Az összefűzött szöveget indexeld, de mindkét mezőt őrizd meg. Az Anthropic szerint a generálás javulhat, ha a modell meg tudja különböztetni a hozzáadott kontextust az eredeti szövegtől, a hivatkozásokhoz pedig a nyers chunk kell.
- Verziózd a kontextusprompt. A prompt mostantól az index része. Ha módosítod, újra kell kontextualizálni, ezért adj neki verziót, és tárold ezt minden chunk mellett.
- Szabd a saját területedre. Az Anthropic szerint a szakterületre szabott promptok, például szójegyzékkel, felülmúlhatják az általánosat. Egy B2B-katalógusnál arra utasítanám a modellt, hogy mindig nevezze meg a termékcsaládot és a változatot.
- A visszakeresést mérd, ne a benyomásaidat. Hasonlítsd össze a recall@20 és az nDCG@10 értéket címkézett kérdéseken előtte és utána, ahogy a RAG értékelése cikkben. A közzétett javulások mások adatain számolt átlagok.
Melyiket válaszd?
Ökölszabályom: ha hibrid keresést futtatsz, a kontextuális visszakeresés az alapértelmezés, mert ez az egyetlen lehetőség, amely a kulcsszavas találatokat is javítja, és bármely embedding-modellel működik. Ha a korpusz nagy és gyakran változik, vagy a dokumentumok nem kerülhetnek LLM-szolgáltatóhoz, egy saját hosztolású, hosszú kontextusú modellel végzett késleltetett chunkolás embedding-költségen hozza a haszon egy részét. Ha már olyan szolgáltatót használsz, amely kontextusos embeddinget kínál, és elfogadod a kötöttséget, az a legkevesebb fejlesztéssel jár. Mindhárom esetben a cím- és címsor-előtaggal kezdj, és tartsd meg a rerankert, amely az Anthropic számaiban az utolsó lépést hozta 49%-ról 67%-ra.
Források
- Anthropic: Introducing Contextual Retrieval (Sep 2024)
- Günther et al.: Late Chunking, Contextual Chunk Embeddings Using Long-Context Embedding Models (2024, rev. 2025)
- Jina AI: Late Chunking in Long-Context Embedding Models (Aug 2024)
- Voyage AI: Introducing voyage-context-3 (Jul 2025)
- Voyage AI: voyage-context-4 (Jun 2026)
- Voyage AI: Contextualized chunk embeddings documentation
- Anthropic: Claude API pricing
- Qu, Tu and Bao: Is Semantic Chunking Worth the Computational Cost? (2024)
Gyakori kérdések
Mi a kontextuális visszakeresés?
Az Anthropic által 2024 szeptemberében közzétett előfeldolgozási lépés. Egy LLM elolvassa a teljes dokumentumot és minden chunkot, rövid kontextust ír, amely elhelyezi a chunkot, és ezt a kontextust a chunk elé fűzik az embeddelés és a BM25-indexelés előtt.
Mi a késleltetett chunkolás (late chunking)?
A Jina AI kutatóinak módszere: az embedding-modellt a teljes dokumentumon futtatod, aztán a tokenembeddingeket chunkokra bontod, és chunkonként átlagolod. Minden chunkvektor a dokumentum többi részét is látva készül, külön LLM-hívás nélkül.
Drága a kontextuális visszakeresés?
Indexeléskor chunkonként egy LLM-hívásba kerül, nem lekérdezésenként. A dokumentumra alkalmazott prompt-gyorsítótárazással az Anthropic 2024-ben kb. 1,02 dollárra becsülte millió dokumentumtokenenként; a jelenlegi Claude Haiku listaárakkal újraszámolva nagyjából 0,38 és 3,84 dollár közé esik.
Segít a late chunking a kulcsszavas keresésnek?
Nem. A late chunking csak a vektorokat változtatja meg. A BM25 továbbra is a nyers chunkszöveget látja. A kontextuális visszakeresés magát a szöveget módosítja, így egyszerre javítja a BM25-öt és a vektoros keresést.
Mikor hagyjam ki mindezt?
Ha a chunkok már önmagukban is érthetők, például termékrekordok vagy GYIK-bejegyzések, vagy ha a teljes tudásbázis belefér a promptba. Az Anthropic szerint kb. 200 000 token alatt egyszerűbb lehet mindent a kontextusba tenni, mint RAG-ot építeni.