Lång kontext kontra retrieval
Kunna avgöra när lång kontext respektive retrieval är rätt verktyg.
Förkunskaper
Intuition
Modeller med 128 k–1 M tokens kontext väcker frågan: behövs RAG längre? Svaret är «ja, oftast» — av fyra skäl.
| Lång kontext | Retrieval | |
|---|---|---|
| Kostnad | betalar för allt, varje anrop | betalar för de 5 k relevanta |
| Latens | prefill växer kvadratiskt | nästan konstant |
| Kvalitet | sjunker i mitten av långa kontexter | fokuserad kontext |
| Uppdatering | måste skickas om varje gång | byt dokument i indexet |
| Spårbarhet | svårt att veta vad som användes | källhänvisning per passage |
Lost in the middle (Liu m.fl. 2023): modeller hittar information tillförlitligt i början och slutet av kontexten men klart sämre i mitten. Att ha 200 000 tokens tillgängliga betyder inte att modellen använder dem jämnt.
Formellt
Kostnadsjämförelse för 1 000 frågor mot ett 500 k-tokens dokumentmaterial:
| Ansats | Tokens in per fråga | Totalt | Relativt |
|---|---|---|---|
| Allt i kontexten (om det rymdes) | 500 000 | 500 M | 100× |
| Lång kontext med urval, 50 k | 50 000 | 50 M | 10× |
| RAG, topp-8 chunkar à 400 | ~5 000 | 5 M | 1× |
Med prompt-caching krymper skillnaden om samma långa kontext återanvänds, men inte när materialet varierar per fråga.
När lång kontext ändå vinner:
- Uppgiften kräver hela dokumentet (sammanfatta en rapport, hitta motsägelser mellan avsnitt).
- Materialet är litet nog (< 20 k tokens) att retrieval bara tillför komplexitet.
- Frågorna är aggregerande («hur många gånger nämns X?») där retrieval systematiskt missar.
Den vanligaste rätta lösningen är hybrid: retrieval väljer ut 20–50 k relevanta tokens ur ett stort material, och den långa kontexten låter modellen resonera över dem tillsammans. Man behöver inte välja.
Kod
def kostnad_per_fraga(ansats, dokument_tokens, k_chunkar=8, chunk=400, kontext_tak=128_000):
if ansats == "allt":
if dokument_tokens > kontext_tak:
return None # ryms inte
return dokument_tokens
if ansats == "rag":
return k_chunkar * chunk + 500 # + systemprompt och fråga
if ansats == "hybrid":
return min(50_000, dokument_tokens) # retrieval väljer ut ett stort men fokuserat urval
for dok in (20_000, 200_000, 2_000_000):
rad = {a: kostnad_per_fraga(a, dok) for a in ("allt", "rag", "hybrid")}
print(f"{dok:>9,} tokens: {rad}")
# 20,000 tokens: {'allt': 20000, 'rag': 3700, 'hybrid': 20000}
# 200,000 tokens: {'allt': None, 'rag': 3700, 'hybrid': 50000}
# 2,000,000 tokens: {'allt': None, 'rag': 3700, 'hybrid': 50000}
# Mät lost-in-the-middle på din egen modell: placera samma faktum på
# position 10 %, 50 % och 90 % i en lång kontext och mät återkallandet.
Behärskning innebär
- Jämför lång kontext och retrieval på kostnad och kvalitet
- Känner till lost-in-the-middle
- Väljer och kombinerar rätt för uppgiften
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — Lost in the Middle: How Language Models Use Long Contexts — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Retrieval meets Long Context Large Language Models — arXiv (öppen åtkomst; licens per artikel)