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.

··10 perc olvasás

  • RAG
  • Chunking
  • Embeddings
  • Contextual retrieval
  • Late chunking
Chunkokra bontott dokumentum, ahol minden chunk embeddelés előtt egy rövid kontextussort kap a teljes dokumentumból.

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.

Cikk meghallgatása

0:000:00

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.

Kontextuális visszakeresés indexeléskorA teljes dokumentumot egyszer gyorsítótárazzuk. Minden chunkhoz egy kis LLM rövid kontextust ír, amelyet a chunk elé fűzünk. Az összefűzött szöveg a beágyazási és a BM25-indexbe is bekerül; a lekérdezések ezután hibrid keresést és rerankert használnak.DokumentumgyorsítótárazvaChunkhívásonként egyKis LLM50–100 tokenKontextus + chunkegy szövegKét indexvektor + BM25
Az LLM indexeléskor chunkonként egyszer fut; a lekérdezési útvonalon semmi sem változik.

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ányCsökkenés
Alap embeddingek5.7%–
Kontextuális embeddingek3.7%35%
Kontextuális embeddingek + kontextuális BM252.9%49%
Mindkettő, rerankeléssel1.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ó dokumentumtokenreTokenHaiku 4.5Haiku 5.5 (100k-ig)
Gyorsítótár-írás, dokumentumok1.0M$1.25$0.13
Gyorsítótár-olvasás, dokumentumok9.0M$0.90$0.09
Bemenet, chunk és utasítás1.06M$1.06$0.11
Kimenet, kontextus0.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.

Naiv és késleltetett chunkolásKésleltetett chunkolásnál a teljes dokumentum egyszer halad át a transformeren. A tokenembeddingeket ezután a chunkhatároknál szétválasztjuk és átlagoljuk, így minden chunkvektor hordoz kontextust a dokumentum többi részéből.Teljes dokumentum8k tokenigTransformeregy futásTokenvektorokkontextusosSzakaszoláschunkhatárokÁtlagolás1 vektor/chunk
A naiv chunkolás minden chunkon külön futtatná a transformert, így egyik chunk sem látná a szomszédait.

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 out

Mi 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ésMi változikMi kell hozzáSegít a BM25-nekFő költség
Cím- és címsor-előtagChunkszövegFeldolgozott szerkezetIgenSzinte semmi
Kontextuális visszakeresésChunkszövegChunkonként LLM-hívásIgenLLM-tokenek indexeléskor
Késleltetett chunkolásCsak a vektorokHosszú kontextusú modell, tokenkimenetNemSaját inferencia
Kontextusos embedding APICsak a vektorokEgy szolgáltató indexhez és lekérdezéshezNemTokenalapú 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?

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. Anthropic: Introducing Contextual Retrieval (Sep 2024)
  2. Günther et al.: Late Chunking, Contextual Chunk Embeddings Using Long-Context Embedding Models (2024, rev. 2025)
  3. Jina AI: Late Chunking in Long-Context Embedding Models (Aug 2024)
  4. Voyage AI: Introducing voyage-context-3 (Jul 2025)
  5. Voyage AI: voyage-context-4 (Jun 2026)
  6. Voyage AI: Contextualized chunk embeddings documentation
  7. Anthropic: Claude API pricing
  8. 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.

Pont erre van szükséged?

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