# RAG Context Windows and Long-Context Models **Last updated:** 2026-02 **Status:** GA **Category:** RAG Architecture & Semantic Search --- ## Introduksjon Context window-størrelse er en av de mest kritiske faktorene som bestemmer kvaliteten og kostnaden for en RAG-løsning. En language model har en begrenset kapasitet for tokens den kan prosessere i en enkelt request — dette omtales som modellens context window. For RAG-implementasjoner må man balansere mellom å gi modellen nok kontekst til å generere gode svar, uten å overbelaste context window eller sløse med tokens (som koster penger). Med innføringen av long-context models som GPT-4 Turbo (128k tokens) og GPT-4.1 (context windows opp til 200k+ tokens), har arkitekter fått nye muligheter: skal man fortsatt bruke klassisk RAG med retrieval av små, relevante chunks, eller kan man nå sende hele dokumenter direkte til modellen? Svaret avhenger av use case, kostnad, latency-krav og modellens faktiske evne til å utnytte store context windows — kjent som "lost-in-the-middle"-problemet. I denne kunnskapsreferansen dekkes token budgeting, context window management, og når man skal velge RAG-basert chunking versus long-context direct prompting, med fokus på Azure OpenAI-modeller og integrasjon i Microsoft-stakken. --- ## Kjernekomponenter ### Context Window vs. Token Limit | Begrep | Definisjon | |--------|-----------| | **Context Window** | Totalt antall tokens modellen kan prosessere (input + output) i én request | | **Max Prompt Tokens** | Maksimalt antall input tokens (brukermelding + system prompt + retrieved documents + conversation history) | | **Max Completion Tokens** | Maksimalt antall output tokens modellen kan generere som svar | | **Token Budget** | Planlagt fordeling av tokens mellom ulike komponenter (system prompt, history, grounding data, buffer) | **Verified (Azure OpenAI):** - GPT-4 Turbo: 128k tokens context window - GPT-4.1 series: Opp til 200k+ tokens context window - GPT-4o: 128k tokens - o1-series: Varierende (o1: 200k, o3-mini: 128k) ### Token Budget Allocation En RAG-prompt består typisk av: 1. **System message** (50–500 tokens): Instruksjoner om oppførsel og svarformat 2. **Conversation history** (0–2000 tokens): Tidligere brukerforespørsler og svar 3. **Retrieved context** (500–10,000 tokens): Dokumenter/chunks hentet fra vektordatabase 4. **User query** (10–200 tokens): Brukerens nåværende spørsmål 5. **Response buffer** (200–4000 tokens): Reservert plass til modellens genererte svar **Best practice:** For GPT-4 Turbo (128k context): - Reserved for system/history/query: ~5-10k tokens - Retrieved context: Max 30-50k tokens (ikke hele window) - Response buffer: 2-4k tokens For GPT-4.1 (200k context): - Retrieved context: Kan økes til 100k tokens, men kvalitet avtar (lost-in-the-middle) - Reserved: 10-15k tokens ### Prompt Compression Techniques Når man nærmer seg token limit, kan man bruke: | Teknikk | Beskrivelse | Trade-off | |---------|-------------|-----------| | **Semantic truncation** | Fjern minst relevante chunks fra retrieved context | Risiko for tap av relevant informasjon | | **History summarization** | Komprimer tidligere conversation history til sammendrag | Reduserer kontekstuell forståelse | | **Token-aware chunking** | Del dokumenter i chunks som passer innenfor token budget | Økt kompleksitet i indexing pipeline | | **Retrieval limiting** | Reduser antall chunks hentet (top-k parameter) | Lavere recall, kan misse relevante kilder | **Baseline (generell kunnskap):** Azure OpenAI Assistants API støtter automatisk truncation via `max_prompt_tokens` og `truncation_strategy` parameters. ### Lost-in-the-Middle Effect **Verified (Research):** Studier viser at LLMs har svakere performance når relevant informasjon er plassert midt i en lang context — de presterer best når viktig info er i starten eller slutten av prompten. **RAG-implikasjoner:** - Ikke anta at større context window = bedre svar - Bruk semantic ranking for å sikre at de mest relevante chunks plasseres først - For long-context models: overvei map-reduce eller sliding window pattern ### Long-Context LLMs | Modell | Context Window | Anbefalt RAG-strategi | |--------|---------------|----------------------| | GPT-4 Turbo | 128k | Klassisk RAG (top-10 til top-50 chunks) | | GPT-4.1 | 200k+ | Hybrid: RAG for precision queries, long-context for exploratory | | GPT-4o | 128k | Klassisk RAG med hybrid search | | o1-series | 200k | Long-context for reasoning tasks, RAG for factual grounding | **Baseline:** Long-context models reduserer behovet for aggressive chunking, men øker token cost og latency. --- ## Arkitekturmønstre ### Mønster 1: Klassisk RAG med Token-Aware Retrieval **Beskrivelse:** Hent et begrenset antall høyt relevante chunks (f.eks. top-10), og pass dem inn i en prompt som holder seg godt under context window limit. **Fordeler:** - Lavere token cost (kun relevante chunks sendes) - Raskere inference (mindre input å prosessere) - Bedre kontroll over token budget - Fungerer godt med modeller som har mindre context windows (32k–128k) **Ulemper:** - Avhenger av retrieval-kvalitet (dårlig ranking = dårlige svar) - Kan misse informasjon som ligger spredt i flere dokumenter **Når bruke:** Standard for de fleste RAG-implementasjoner, spesielt når kostnad og latency er prioritert. **Verified (Azure AI Search):** Azure AI Search støtter hybrid queries (keyword + vector) med semantic ranking for å finne de mest relevante chunks innenfor et token budget. --- ### Mønster 2: Long-Context Direct Prompting **Beskrivelse:** Send hele dokumenter (eller store seksjoner) direkte til en long-context model uten chunking eller retrieval-prosess. **Fordeler:** - Ingen tap av informasjon fra aggressive chunking - Enklere arkitektur (ikke behov for vektor-database eller embeddings) - Fungerer godt for summarization, analyse av hele dokumenter **Ulemper:** - Høyere token cost (sender alt, ikke bare relevant) - Tregere inference (modellen må prosessere hele dokumentet) - Lost-in-the-middle effekt kan redusere accuracy - Ikke skalerbart for store dokumentsamlinger (100+ dokumenter) **Når bruke:** - Dokumentsamlinger er små (<10 dokumenter) - Brukerforespørsler krever bred kontekst (f.eks. "sammenlign alle seksjonene i denne policyen") - Budget tillater høyere token cost **Baseline:** Passende for ad-hoc analyser, men ikke for produksjons-RAG-løsninger med mange brukere. --- ### Mønster 3: Sliding Window (Incremental Context) **Beskrivelse:** Del et stort dokument i overlappende vinduer (chunks med 10–20% overlap), og kjør modellen på hvert vindu sekvensielt. Aggreger svarene. **Fordeler:** - Håndterer ekstremt store dokumenter (over 200k tokens) - Unngår lost-in-the-middle problemet - Kan paralleliseres for raskere prosessering **Ulemper:** - Kompleks aggregeringslogikk (hvordan kombinere delsvar?) - Ikke egnet for spørsmål som krever sammenheng på tvers av hele dokumentet **Når bruke:** - Legal document analysis (lange kontrakter, lover) - Scientific papers med streng struktur - Når brukerspørsmål kan besvares fra én seksjon om gangen **Baseline:** Sjeldnere brukt, men effektiv for spesialiserte domener. --- ## Beslutningsveiledning ### Når bruke RAG vs. Long-Context | Kriterium | Bruk RAG (chunked retrieval) | Bruk Long-Context (hele dokumenter) | |-----------|------------------------------|--------------------------------------| | **Dokumentsamling** | Store (100+ dokumenter) | Små (<10 dokumenter) | | **Query type** | Faktaspørsmål, lookup | Analyse, sammenligning, summarization | | **Kostnad** | Lav til medium (kun relevante tokens) | Høy (sender alt) | | **Latency** | Lav (mindre tokens å prosessere) | Høyere (modellen må lese alt) | | **Retrieval kvalitet** | Avhenger av embeddings og ranking | Ikke relevant (sender alt) | | **Modenhetsnivå** | Alle nivåer | Medium til høy (krever token-kostnadskontroll) | ### Vanlige Feil | Feil | Konsekvens | Rettelse | |------|-----------|----------| | **Sender for mye context** | Høy token cost, lost-in-the-middle effekt | Bruk semantic ranking, reduser top-k | | **Ignorerer token budget** | Requests feiler med 400 (exceeded context limit) | Implementer token counting (tiktoken) før API call | | **Glemmer response buffer** | Modellen trunkerer svar midt i setning | Reserver 15–20% av context window for output | | **Bruker long-context for alle queries** | Unødvendig høy kostnad | Implementer query classification (enkel query → RAG, kompleks → long-context) | ### Røde Flagg - **Token cost øker plutselig**: Sjekk om conversation history ikke blir trunked - **Svarkvalitet synker**: Lost-in-the-middle — flytt viktigste chunks til start av prompt - **Rate limit errors (429)**: Du overskrider Tokens-Per-Minute (TPM) quota --- ## Integrasjon med Microsoft-stakken ### Azure OpenAI Context Limits (Verified) | Modell | Context Window | TPM (Default tier) | TPM (Enterprise tier) | |--------|---------------|-------------------|----------------------| | gpt-4 (turbo-2024-04-09) | 128k | 450k | 2M | | gpt-4.1 | 200k+ | 1M | 5M | | gpt-4o | 128k | 450k | 30M | | gpt-4o-mini | 128k | 2M | 150M | | o1 | 200k | 3M | 30M | | o3-mini | 128k | 5M | 50M | **Viktig:** TPM (Tokens Per Minute) = Max tokens som kan prosesseres per minutt på deployment-nivå. Hvis du sender én request med 50k input tokens + 2k output tokens = 52k tokens → teller mot TPM. ### Azure OpenAI Assistants API (Verified) **Max Prompt/Completion Tokens:** Når du oppretter en Run i Assistants API, kan du sette: ```python # Python example (Verified from Microsoft Learn) run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id, max_prompt_tokens=20000, # Recommended minimum for File Search max_completion_tokens=4000 ) ``` **Truncation Strategy:** - `auto`: Standard (OpenAI bestemmer hva som trunkeres) - `last_messages`: Beholder kun N siste meldinger i conversation history **Best practice (Verified):** For File Search tool: Sett `max_prompt_tokens` til minimum 20,000. For lengre samtaler: 50,000 eller fjern limit helt. ### Semantic Kernel **Token Management:** Semantic Kernel (C#/.NET) har innebygd token counting via `PromptSection.Tokens`: ```csharp // C# (Baseline — generell Semantic Kernel pattern) var section = new PromptSection { Content = retrievedContext, Tokens = maxTokens, // Request token budget for this section Required = true }; ``` Semantic Kernel vil automatisk trunkere seksjoner hvis total token count overskrider modellens context window. ### Prompt Flow (Azure AI Foundry) **Token Estimation:** Prompt Flow viser estimert token count per node i flyten. Bruk dette for å debugge context window issues før deployment. **Baseline (generell kjennskap):** Du kan også bruke `tiktoken` Python library direkte i Prompt Flow nodes for mer presis token counting. --- ## Offentlig sektor (Norge) ### Token-Kostnader i Offentlige Budsjetter **Context:** Offentlige virksomheter må ofte forsvare AI-kostnader i budsjettprosesser. Token-forbruk er en operasjonell kostnad som skalerer med bruk. **Anbefaling:** - Implementer token logging per bruker/avdeling for å spore kostnad - Bruk `max_prompt_tokens` og `max_completion_tokens` for å hindre "runaway cost" (f.eks. hvis en bruker sender ekstremt lange dokumenter) - Vurder GPT-4o-mini eller GPT-4.1-mini for ikke-kritiske use cases (10x billigere enn GPT-4) **Verified (Azure OpenAI Pricing):** - GPT-4 Turbo input: ~$0.01 per 1k tokens - GPT-4o input: ~$0.005 per 1k tokens - GPT-4.1-mini input: ~$0.0001 per 1k tokens (Husk å konvertere til NOK og inkluder output token cost, som ofte er 2-3x input cost.) ### Dataminimering (GDPR) **Relevant for:** Personvern-forskriften krever dataminimering — ikke send mer data til modellen enn nødvendig. **RAG-fordel:** Ved å bruke retrieval (ikke long-context direct prompting) sender du kun relevante chunks, som reduserer risikoen for å eksponere sensitiv informasjon utilsiktet i context. **Best practice:** Kombiner RAG med security trimming (Azure AI Search + Entra ID permissions) for å sikre at kun autoriserte dokumenter blir retrievet. --- ## Kostnad og lisensiering ### Prismodell per Token (Verified fra Azure OpenAI Pricing) | Modell | Input (per 1k tokens) | Output (per 1k tokens) | Optimal RAG context size | |--------|----------------------|------------------------|--------------------------| | gpt-4-turbo | $0.01 | $0.03 | 10k–30k tokens | | gpt-4.1 | $0.015 | $0.045 | 10k–50k tokens | | gpt-4o | $0.005 | $0.015 | 10k–30k tokens | | gpt-4o-mini | $0.0005 | $0.0015 | 5k–20k tokens | **Eksempel (NOK, kurs 10.5):** En query med 20k input tokens (retrieved context) + 500 output tokens på GPT-4o: - Input: (20 × $0.005) × 10.5 = 1.05 NOK - Output: (0.5 × $0.015) × 10.5 = 0.08 NOK - **Total per query: ~1.13 NOK** Hvis du har 10,000 queries per måned: **11,300 NOK/måned** (kun LLM-kostnad, ikke vektor-database eller search). ### Optimaliseringstips 1. **Bruk GPT-4o-mini for enkel retrieval** (f.eks. FAQ-lookup): 10x billigere 2. **Implementer caching** av frequently asked queries (reduserer token cost med 50–80%) 3. **Batch processing** for ikke-interaktive workloads (Azure OpenAI Batch API: 50% rabatt) 4. **Monitorering**: Bruk Azure Monitor for å spore token usage per deployment **Verified (Azure OpenAI Batch Quota):** - gpt-4.1: 500M tokens per month (Enterprise tier), 30M (Default tier) - gpt-4o: 500M (Enterprise), 30M (Default) --- ## For arkitekten (Cosmo) ### 5–8 Spørsmål å Stille Kunden 1. **Hvor store er dokumentene dere skal søke i?** → Hvis <10 dokumenter à <50k tokens: vurder long-context. Hvis 100+ dokumenter: bruk RAG. 2. **Hva er typiske brukerforespørsler?** → Faktaspørsmål (RAG) eller analyse/sammenligning (long-context)? 3. **Hva er akseptabel latency?** → <2 sekunder → RAG med små chunks. <5 sekunder → kan bruke long-context. 4. **Hva er token-budsjettet per query?** → Hvis stramt: Bruk GPT-4o-mini + classical RAG. Hvis romslig: GPT-4.1 + long-context. 5. **Hvor ofte oppdateres dokumentene?** → Dynamisk → RAG (indexer kan inkrementelt oppdateres). Statisk → long-context kan være OK. 6. **Er conversation history viktig?** → Ja → reserver 2–5k tokens for history. Implementer auto-truncation (tiktoken). 7. **Har dere eksisterende vektor-database?** → Ja → bruk RAG. Nei → vurder om long-context er enklere (men dyrere). 8. **Er dette en proof-of-concept eller produksjon?** → POC: Long-context er raskere å sette opp. Produksjon: RAG er mer kostnadseffektivt. ### Fallgruver | Fallgruve | Hvorfor det skjer | Hvordan unngå | |-----------|-------------------|---------------| | **Oversender context** | Arkitekt antar "mer context = bedre svar" | Bruk semantic ranking, test med ulike top-k verdier | | **Glemmer token counting** | Utvikler sender raw text uten å sjekke lengde | Implementer tiktoken pre-request validation | | **Ignorerer lost-in-the-middle** | Stoler blindt på long-context models | Kjør ablation test: plasser svar i start vs. midt vs. slutt av prompt | | **Manglende response buffer** | Regner kun input tokens, ikke output | Alltid reserver 15–20% av context window for completion | ### Anbefalinger per Modenhetsnivå **Nivå 1 (Starter med RAG):** - Bruk GPT-4o-mini + classical RAG (top-10 chunks, hybrid search) - Implementer token counting med tiktoken før hver request - Sett `max_prompt_tokens=10000`, `max_completion_tokens=2000` **Nivå 2 (Optimaliserer for produksjon):** - Oppgrader til GPT-4o eller GPT-4.1 for bedre quality - Implementer adaptive top-k (flere chunks for komplekse queries) - Bruk Azure AI Search semantic ranking (re-rank top-50 til top-10) - Monitorering: Track average tokens per query, cost per user **Nivå 3 (Advanced RAG arkitektur):** - Hybrid: Klassisk RAG for presise queries, long-context for exploratory - Implementer query classification (LLM bestemmer om RAG eller long-context) - Bruk Assistants API med custom truncation strategy - A/B-testing av ulike context window sizes for å optimalisere cost/quality trade-off --- ## Kilder og verifisering ### Microsoft Learn (Verified via MCP) 1. **Azure OpenAI Assistants API — Context Window Management** https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/assistants#context-window-management *Dekning: max_prompt_tokens, max_completion_tokens, truncation strategy, File Search recommendations* **Confidence: Verified** 2. **Retrieval-augmented Generation (RAG) in Azure AI Search** https://learn.microsoft.com/en-us/azure/search/retrieval-augmented-generation-overview *Dekning: Token constraint challenges, agentic vs. classic RAG, lost-in-the-middle effects* **Confidence: Verified** 3. **Azure OpenAI in Microsoft Foundry Models — Quotas and Limits** https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits *Dekning: TPM limits per model, context window sizes, rate limits* **Confidence: Verified** 4. **Azure OpenAI On Your Data — Token Usage Estimation** https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/use-your-data#token-usage-estimation-for-azure-openai-on-your-data *Dekning: Intent prompt vs. generation prompt token breakdown, RAG pipeline token costs* **Confidence: Verified** 5. **Improve RAG Chain Quality (Azure Databricks)** https://learn.microsoft.com/en-us/azure/databricks/generative-ai/tutorials/ai-cookbook/quality-rag-chain#llm *Dekning: LLM parameter optimization, model selection for RAG, token constraints* **Confidence: Verified** 6. **Chat Markup Language ChatML — Managing Conversations** https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/chat-markup-language#preventing-unsafe-user-inputs *Dekning: Token counting med tiktoken, conversation history truncation* **Confidence: Verified** 7. **Code Sample: Token Counting with tiktoken (Python)** https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/chatgpt *Dekning: Praktisk implementasjon av token management i conversation loops* **Confidence: Verified** ### Konfidensnivå per Seksjon | Seksjon | Konfidens | Kilde | |---------|-----------|-------| | Azure OpenAI Context Limits | **Verified** | Microsoft Learn (quotas-limits) | | Assistants API Token Management | **Verified** | Microsoft Learn (assistants API docs) | | Token Usage Estimation | **Verified** | Microsoft Learn (use-your-data) | | Lost-in-the-Middle Effect | **Baseline** | Generell forskning (ikke Microsoft-spesifikk) | | Sliding Window Pattern | **Baseline** | Arkitekturmønster (ikke GA i Azure) | | Token Pricing | **Verified** | Azure OpenAI Pricing (per februar 2026) | | Semantic Kernel Token Management | **Baseline** | API-dokumentasjon, ikke testet i MCP | --- **Oppsummering:** Context window management er kritisk for RAG-suksess. Velg riktig strategi basert på dokumentstørrelse, query type, kostnad og latency-krav. Bruk token counting (tiktoken) for å unngå context limit errors, og vurder hybrid approach (RAG for presise queries, long-context for analyse) for avanserte use cases. Husk: Større context window betyr ikke alltid bedre svar — lost-in-the-middle effekten er reell.