Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

Context window optimaliseren in RAG

Hoe je de beschikbare context-ruimte optimaal benut: context-assemblage, documentvolgorde, instructie-inpakking en context-compressie.

Het lost in the middle-effect

Onderzoek (Liu et al., 2023) toont aan dat grote taalmodellen informatie in het midden van een lange context minder goed gebruiken dan informatie aan het begin en het einde. Dit staat bekend als het lost in the middle-effect en is een U-vormige aandachtscurve: het begin en het einde wegen het zwaarst.

Voor RAG betekent dit dat je de meest relevante chunks niet alleen aan het begin plaatst, maar ook aan het einde van de context. Minder relevante chunks gaan in het midden.

Nieuwere modellen met een venster van 1 miljoen tokens (zoals Claude Opus 4.8, Opus 4.7 en Sonnet 4.6 in juni 2026) hebben hier minder last van dan oudere modellen, maar het effect verdwijnt niet volledig. Een doordachte volgorde blijft dus lonen, zeker bij veel chunks.

info

Praktische vuistregel

Verdeel de context in drie zones: begin (meest relevant), midden (minder relevant) en einde (op een na meest relevant). Zo maximaliseer je de kans dat het model de beste informatie daadwerkelijk gebruikt.

Optimale context-assemblage

De volgende functie sorteert documenten op relevantiescore en plaatst ze vervolgens afwisselend vooraan en achteraan, zodat de minst relevante in het midden belanden.

function assembleContext(
  docs: { content: string; score: number }[],
  maxTokens: number
): string {
  const sorted = [...docs].sort((a, b) => b.score - a.score);
  const n = sorted.length;

  const ordered: typeof sorted = [];
  for (let i = 0; i < n; i++) {
    if (i % 2 === 0) {
      ordered.push(sorted[i / 2]);
    } else {
      ordered.push(sorted[n - Math.floor(i / 2) - 1]);
    }
  }

  const parts: string[] = [];
  let usedTokens = 0;

  for (const doc of ordered) {
    const docTokens = estimateTokens(doc.content);
    if (usedTokens + docTokens > maxTokens) {
      const remaining = maxTokens - usedTokens;
      if (remaining > 100) {
        parts.push(truncateToTokens(doc.content, remaining));
      }
      break;
    }
    parts.push(doc.content);
    usedTokens += docTokens;
  }

  return parts.join("

---

");
}

Context-budget plannen

Verwar de fysieke vensterlimiet niet met de hoeveelheid context die je wilt vullen. Een groter venster betekent niet dat je het hele venster moet volstoppen: irrelevante tekst verlaagt de kwaliteit en verhoogt de kosten. Reserveer altijd ruimte voor de system prompt, de vraag en het antwoord, en pas daarbinnen een verstandig plafond toe voor opgehaalde context.

Onderstaande modellimieten gelden voor juni 2026. Modelnamen en limieten veranderen regelmatig, dus controleer ze tegen de actuele documentatie van je provider.

const MODEL_LIMITS = {
  "claude-opus-4-8": 1_000_000,
  "claude-opus-4-7": 1_000_000,
  "claude-sonnet-4-6": 1_000_000,
  "claude-haiku-4-5": 200_000,
};

function planContextBudget(
  model: keyof typeof MODEL_LIMITS,
  systemPromptTokens: number,
  questionTokens: number,
  maxResponseTokens: number,
  maxContextTokens = 50_000
): number {
  const totalLimit = MODEL_LIMITS[model];
  const reservedForResponse = maxResponseTokens;
  const reservedForInstructions = systemPromptTokens + questionTokens + 500;
  const availableForContext =
    totalLimit - reservedForResponse - reservedForInstructions;
  return Math.min(availableForContext, maxContextTokens);
}
warning

Groot venster is geen vrijbrief

Ook met een venster van 1 miljoen tokens loont het om je opgehaalde context te beperken tot wat echt relevant is. Meer tekst betekent meer ruis, meer latency en meer kosten per call. Stel maxContextTokens bewust in op basis van je use-case en meet of extra context de antwoordkwaliteit echt verbetert.

Contextual compression in de context-laag

Past de opgehaalde context niet binnen je budget, dan kun je elk document extractief comprimeren met een goedkoop, snel model. Haiku is hiervoor geschikt: lage kosten en lage latency.

async function compressContextForWindow(
  query: string,
  docs: string[],
  targetTokens: number
): Promise<string> {
  const totalTokens = docs.reduce((sum, doc) => sum + estimateTokens(doc), 0);

  if (totalTokens <= targetTokens) {
    return docs.join("

");
  }

  const compressionRatio = targetTokens / totalTokens;

  const compressed = await Promise.all(
    docs.map(async (doc) => {
      const targetDocTokens = Math.floor(estimateTokens(doc) * compressionRatio);
      if (targetDocTokens < 50) return "";

      const response = await anthropic.messages.create({
        model: "claude-haiku-4-5",
        max_tokens: targetDocTokens,
        messages: [{
          role: "user",
          content: `Comprimeer dit document tot maximaal ${targetDocTokens} tokens, behoud alleen de informatie relevant voor: "${query}"

Document: ${doc}`,
        }],
      });
      return response.content[0].type === "text" ? response.content[0].text : "";
    })
  );

  return compressed.filter(Boolean).join("

");
}

Citaties toevoegen

Door elk fragment te nummeren en de bron mee te geven, kan het model controleerbaar naar bronnen verwijzen.

interface CitedChunk {
  id: string;
  content: string;
  source: string;
  score: number;
}

function assembleWithCitations(chunks: CitedChunk[], maxTokens: number): string {
  const lines: string[] = [];
  let usedTokens = 0;

  for (let i = 0; i < chunks.length; i++) {
    const header = `[${i + 1}] Bron: ${chunks[i].source}`;
    const entry = `${header}
${chunks[i].content}`;
    const entryTokens = estimateTokens(entry);

    if (usedTokens + entryTokens > maxTokens) break;
    lines.push(entry);
    usedTokens += entryTokens;
  }

  return lines.join("

");
}

Prompt-engineering voor context-gebruik

De system prompt stuurt hoe streng het model bij de bronnen blijft. Vraag expliciet om bronverwijzingen en om eerlijkheid wanneer de bronnen geen antwoord bieden.

const CONTEXT_SYSTEM_PROMPT = `Je bent een nauwkeurige assistent die vragen beantwoordt op basis van de verstrekte bronnen.

Regels:
1. Baseer je antwoord uitsluitend op de informatie in de bronnen
2. Verwijs naar bronnummers [1], [2] etc. voor elke claim
3. Als de bronnen de vraag niet volledig beantwoorden, vermeld dit expliciet
4. Speculeer niet over informatie die niet in de bronnen staat
5. Als bronnen tegenstrijdig zijn, benoem beide perspectieven

Formaat: geef een helder, gestructureerd antwoord met bronverwijzingen.`;
lightbulb

Meet het effect, gok niet

Bouw een kleine evaluatieset met representatieve vragen en de juiste antwoorden. Vergelijk daarop systematisch verschillende chunk-volgordes, compressieniveaus en budgetten. Een wijziging die op papier logisch lijkt, kan in de praktijk de kwaliteit verlagen.

Wat is het optimale aantal chunks in de context?

3 tot 7 chunks voor enkelvoudige vragen. 10 tot 15 voor analytische vragen waar meerdere bronnen nodig zijn. Boven de 15 chunks neemt de kwaliteit meestal af.

Moet ik lege ruimte in het context-venster vullen?

Nee. Voeg alleen relevante chunks toe. Irrelevante tekst vergroot de kans dat het model afgeleid raakt en kost extra tokens.

Werkt context-assemblage anders bij Claude dan bij andere modellen?

Moderne modellen met een groot venster lezen de volledige context goed en hebben minder last van het lost in the middle-effect dan oudere modellen. De geoptimaliseerde volgorde helpt nog steeds, vooral bij veel chunks of zeer lange context.

Helpt een venster van 1 miljoen tokens tegen lost in the middle?

Het verlicht het probleem maar lost het niet volledig op. De U-vormige aandachtscurve blijft bestaan, dus blijf je belangrijkste chunks aan begin en einde plaatsen in plaats van het hele venster te vullen.

Hoe ga ik om met meertalige context?

Meng geen talen in dezelfde context tenzij dat nodig is. Stel je Nederlandstalige vragen over Engelstalige documenten, overweeg dan om documenten te vertalen bij indexering of te vertrouwen op de meertalige capaciteiten van het model.

Welk model gebruik ik voor compressie?

Een snel en goedkoop model zoals Haiku volstaat voor extractieve compressie. Bewaar je krachtigste model voor het uiteindelijke antwoord, want compressie is een relatief eenvoudige samenvattingstaak.