Contextlengte en relevantie
Breng uitgebreide context, tokenlimieten en relevantie met elkaar in evenwicht.
Contextlengte en relevantie is een gratis AI-promptengineering-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-promptengineering. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-promptengineering bevat in totaal 4 lessen.
Het budget voor het contextvenster
Elk model heeft een maximaal contextvenster — het totale aantal tokens dat het in één API-aanroep kan verwerken. Dit omvat zowel de invoer (je prompt + gespreksgeschiedenis) als de uitvoer (het antwoord van het model).
Inzicht in dit budget is cruciaal: als je het overschrijdt, moet je prompt worden afgekapt of gaat er uitvoer verloren. Als je het verspilt aan irrelevante context, heeft het model minder ruimte om te redeneren over wat belangrijk is.
Grootte van contextvensters
Verschillende modellen hebben verschillende contextlimieten. In 2025:
- GPT-4o: 128.000 tokens
- Claude Opus 4.5: 200.000 tokens
- Gemini 1.5 Pro: 1.000.000 tokens
- GPT-3.5 Turbo: 16.385 tokens
Grotere vensters laten je meer context opnemen, maar kosten per aanroep meer. Voor de meeste taken zijn 8.000-16.000 tokens voldoende. Groter is niet altijd beter als dat betekent dat je irrelevante inhoud opneemt.
import tiktoken
def estimate_tokens(text, model='gpt-4o'):
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
# Quick token budget calculator
models = {
'GPT-3.5 Turbo': 16385,
'GPT-4o': 128000,
'Claude Opus 4.5': 200000,
}
prompt = 'Explain the concept of technical debt in 500 words for a non-technical CEO.'
prompt_tokens = estimate_tokens(prompt)
for model_name, limit in models.items():
reserved_for_output = 1024
available = limit - prompt_tokens - reserved_for_output
print(f'{model_name}: limit={limit:,} | prompt={prompt_tokens} | '
f'context budget={available:,} tokens')Wat neem je op: relevantie bepalen
Voordat je een stukje context opneemt, vraag je af: Verandert deze informatie het antwoord?
Een eenvoudig denkkader — geef elk contextonderdeel een score:
- Hoge relevantie (opnemen): heeft rechtstreeks invloed op de taak, bepaalt de woordenschat en beperkt de opties
- Gemiddelde relevantie (misschien): biedt nuttige nuance, maar de uitvoer zou ook zonder dit onderdeel goed zijn
- Lage relevantie (weglaten): is waar, maar heeft op geen enkele manier invloed op het antwoord
def score_context_element(element, task):
'''
Heuristic: does this context element directly constrain or shape the answer?
Returns: HIGH / MEDIUM / LOW
'''
high_signals = ['stack', 'constraint', 'deadline', 'must', 'cannot', 'budget',
'audience', 'goal', 'version', 'scale', 'limit']
low_signals = ['founded', 'headquartered', 'fun fact', 'history', 'awards',
'team building', 'company culture', 'office location']
el_lower = element.lower()
if any(s in el_lower for s in high_signals):
return 'HIGH'
if any(s in el_lower for s in low_signals):
return 'LOW'
return 'MEDIUM'
context_elements = [
'Our stack is Python FastAPI and PostgreSQL',
'We cannot use any paid third-party APIs',
'Our company was founded in Berlin in 2020',
'We need the solution to handle 1000 requests/second',
'We won a startup award last year',
]
for el in context_elements:
score = score_context_element(el, task='optimize our API')
print(f'[{score:6}] {el}')Het probleem van verloren informatie in het midden
Onderzoek heeft aangetoond dat LLM's minder aandacht besteden aan informatie die in het midden van zeer lange prompts staat. Essentiële context die in het midden van een prompt van 50.000 tokens staat, kan gedeeltelijk worden genegeerd.
Beste werkwijze: zet de belangrijkste context aan het begin of einde van je prompt — het model besteedt de meeste aandacht aan deze posities.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Structure: critical constraint at the TOP, then the body, then the task
well_structured_prompt = (
# Critical constraint FIRST
'CRITICAL CONSTRAINT: Output must be under 50 words and contain no code.\n\n'
# Background in the middle
'Background: we are explaining our API rate limiting policy to non-technical support agents. '
'They handle billing inquiries and need to explain errors to customers. '
'Our rate limit is 100 requests per minute per API key.\n\n'
# Task at the end
'Task: Write the explanation.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=[{'role': 'user', 'content': well_structured_prompt}]
)
print(response.content[0].text)Lange documenten in stukken opdelen
Wanneer je met een document moet werken dat langer is dan je tokenbudget, heb je drie opties:
- Eerst samenvatten: vraag het model het document te comprimeren en werk daarna met de samenvatting
- In stukken opdelen en verwerken: deel het document op, verwerk elk stuk en combineer daarna de resultaten
- Extraheren en invoegen: haal alleen de relevante secties op voordat je ze in de prompt opneemt
Probeer nooit een document dat het contextvenster overschrijdt toch te gebruiken — het wordt stilzwijgend afgekapt.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
def chunk_and_summarize(long_text, chunk_size=2000):
'''Split text into chunks, summarize each, combine summaries.'''
words = long_text.split()
chunks = []
for i in range(0, len(words), chunk_size):
chunk = ' '.join(words[i:i + chunk_size])
chunks.append(chunk)
summaries = []
for idx, chunk in enumerate(chunks):
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
messages=[{
'role': 'user',
'content': f'Summarize this section in 3 bullet points:\n\n{chunk}'
}]
)
summaries.append(f'Section {idx+1}:\n{response.content[0].text}')
return '\n\n'.join(summaries)
# Example usage
long_doc = 'word ' * 5000 # placeholder for a real document
print('Chunks needed:', len(long_doc.split()) // 2000 + 1)Relevantie filteren in de praktijk
Relevantie filteren betekent dat je alleen de relevante delen van een groot document extraheert voordat je ze in een prompt opneemt. Dit is vooral belangrijk voor:
- lange rapporten waarin slechts één sectie relevant is
- codebestanden waarin slechts één functie nagekeken moet worden
- e-mailgesprekken waarin alleen de laatste 3 berichten van belang zijn
- databaseschema's waarin slechts 2 van de 50 tabellen relevant zijn
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Step 1: Filter first, then ask
full_schema = (
'Table: users (id, name, email, created_at, role)\n'
'Table: products (id, name, price, stock, category_id)\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
'Table: categories (id, name, parent_id)\n'
'Table: reviews (id, product_id, user_id, rating, body)\n'
'Table: sessions (id, user_id, token, expires_at)'
)
# Only include relevant tables for the specific question
relevant_context = (
'Relevant tables for this query:\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{
'role': 'user',
'content': f'{relevant_context}\nWrite SQL to find the top 5 orders by total value this month.'
}]
)
print(response.choices[0].message.content)Gespreksgeschiedenis beheren
In gesprekken met meerdere beurten groeit de gespreksgeschiedenis bij elke beurt. Door die slim te beheren, houd je je tokenbudget gezond:
- Schuivend venster: bewaar alleen de laatste N beurten
- Samenvatting invoegen: vat oudere beurten periodiek samen in één bericht
- Belangrijke feiten extraheren: houd belangrijke beslissingen bij als opsomming en voeg die toe als systeemcontext
- Opnieuw instellen bij onderwerpwijziging: start een nieuwe sessie wanneer je naar een niet-gerelateerd onderwerp overschakelt
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def summarize_history(old_history):
'''Compress old conversation turns into a brief summary.'''
history_text = '\n'.join(
f'{m["role"].upper()}: {m["content"]}' for m in old_history
)
response = client.chat.completions.create(
model='gpt-4o',
max_tokens=200,
messages=[{
'role': 'user',
'content': (
'Summarize this conversation history in 3 bullet points. '
'Focus on decisions made and key information established.\n\n'
+ history_text
)
}]
)
return response.choices[0].message.content
# Example: compressing old history before continuing
old_turns = [
{'role': 'user', 'content': 'We are building a Kanban app.'},
{'role': 'assistant', 'content': 'Great, what is your stack?'},
{'role': 'user', 'content': 'React + FastAPI + PostgreSQL.'},
{'role': 'assistant', 'content': 'Good choice for a Kanban app.'}
]
summary = summarize_history(old_turns)
print('Summary of old history:', summary)Technieken voor contextcompressie
Wanneer je veel context moet opnemen maar je tokenbudget krap is, gebruik je compressietechnieken:
- Opsommingen in plaats van proza: opsommingen zijn 30-50% efficiënter met tokens dan zinnen
- Bekende termen afkorten: 'PostgreSQL 15' → 'PG15' na het eerste gebruik
- Opvulzinnen verwijderen: 'Het is vermeldenswaard dat...' → vermeld gewoon het feit
- Gestructureerde indelingen gebruiken: paren van het type sleutel:waarde zijn compacter dan zinnen
import tiktoken
def count_tokens(text):
enc = tiktoken.encoding_for_model('gpt-4o')
return len(enc.encode(text))
# Same information, different token counts
prose_context = (
'Our company is a startup that was founded recently and we are building '
'a data analytics platform. It is worth noting that we use Python for our backend. '
'Additionally, we have chosen PostgreSQL as our primary database. '
'Furthermore, we deploy on AWS using ECS containers.'
)
bullet_context = (
'Company: data analytics startup\n'
'Stack: Python backend, PostgreSQL, AWS ECS'
)
print('Prose context tokens: ', count_tokens(prose_context))
print('Bullet context tokens:', count_tokens(bullet_context))
print('Tokens saved:', count_tokens(prose_context) - count_tokens(bullet_context))
print('Same information? Yes — same facts, 60% fewer tokens')Dynamische contextselectie
In AI-toepassingen voor productie wordt context vaak dynamisch geselecteerd op basis van wat het meest relevant is voor de huidige vraag. Dit heet Retrieval-Augmented Generation (RAG).
In plaats van alle documenten op te nemen, haal je alleen de documenten op die semantisch het meest op de vraag van de gebruiker lijken en voeg je die aan de prompt toe. Zo blijft de context beperkt en zeer relevant.
# Simplified RAG pattern: retrieve relevant chunks, inject into prompt
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Simulated knowledge base (in production: vector database)
knowledge_base = [
{'id': 1, 'topic': 'billing', 'text': 'Refunds are processed within 5-7 business days.'},
{'id': 2, 'topic': 'shipping', 'text': 'Standard shipping takes 3-5 days.'},
{'id': 3, 'topic': 'returns', 'text': 'Returns accepted within 30 days with receipt.'},
{'id': 4, 'topic': 'warranty', 'text': 'All products come with a 1-year warranty.'},
]
def get_relevant_docs(user_query, kb, top_k=2):
'''Simplified relevance: keyword match. Production uses embeddings.'''
scored = [(doc, sum(w in user_query.lower() for w in doc['topic'].split())) for doc in kb]
scored.sort(key=lambda x: x[1], reverse=True)
return [doc['text'] for doc, _ in scored[:top_k]]
query = 'Can I return this and get my money back?'
relevant = get_relevant_docs(query, knowledge_base)
context = '\n'.join(relevant)
print('Injected context:', context)
response = client.chat.completions.create(
model='gpt-4o', max_tokens=80,
messages=[{'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {query}'}]
)
print('Answer:', response.choices[0].message.content.strip())Planning van het contextbudget
Plan voor productietoepassingen je contextbudget expliciet voordat je begint met bouwen:
- Reserveer 25% van het contextvenster voor uitvoer
- Wijs 10% toe aan het systeembericht en de persona
- Wijs 30% toe aan de meest recente gespreksgeschiedenis
- Laat 35% over voor dynamische context (opgehaalde documenten, ingevoegde gegevens)
Leg deze toewijzingen als constanten vast in je code, zodat je ze eenvoudig kunt aanpassen wanneer je gebruikssituatie verandert.
# Context budget planner
MODEL_LIMIT = 128000 # GPT-4o
BUDGET = {
'output_reserve': int(MODEL_LIMIT * 0.25), # 32,000 tokens
'system_message': int(MODEL_LIMIT * 0.05), # 6,400 tokens
'recent_history': int(MODEL_LIMIT * 0.30), # 38,400 tokens
'dynamic_context': int(MODEL_LIMIT * 0.35), # 44,800 tokens
'task_prompt': int(MODEL_LIMIT * 0.05), # 6,400 tokens
}
total_input = sum(v for k, v in BUDGET.items() if k != 'output_reserve')
print('Context budget plan:')
for key, tokens in BUDGET.items():
pct = round(tokens / MODEL_LIMIT * 100)
print(f' {key:<20}: {tokens:>7,} tokens ({pct}%)')
print(f' {"total input":<20}: {total_input:>7,} tokens')
print(f' {"+ output reserve":<20}: {BUDGET["output_reserve"]:>7,} tokens')
print(f' {"= model limit":<20}: {MODEL_LIMIT:>7,} tokens')Wanneer relevantie belangrijker is dan lengte
Een zeer relevante context van 500 tokens levert betere resultaten dan een context van 5.000 tokens die slechts losjes relevant is. Het model produceert betere uitvoer wanneer het minder informatie hoeft door te nemen.
Signalen dat je context te lang en onsamenhangend is:
- het model negeert sommige van je beperkingen
- de uitvoer voelt ondanks de lange context algemeen aan
- het model behandelt het verkeerde deel van je vraag
- de latentie en kosten zijn hoger dan verwacht
Zie je deze signalen, kort de context dan in en voer de taak opnieuw uit.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Demonstrating: lean context produces sharper output
lean_context = (
'Task: write a 50-word product tagline.\n'
'Product: CLI tool that auto-generates Git commit messages from your diff.\n'
'Audience: senior developers who hate writing commit messages.\n'
'Tone: dry, witty, technical.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': lean_context}]
)
print('Lean context output:')
print(response.content[0].text.strip())Kennistoets
Een ontwikkelaar bouwt een chatbot met een gespreksgeschiedenis van 20 beurten. Na 20 beurten raakt het contextvenster vol. Wat is de BESTE strategie om het gesprek voort te zetten zonder belangrijke context te verliezen?
Contextlengte en relevantie — samenvatting
Context effectief beheren is een essentiële vaardigheid in promptontwerp die cruciaal wordt in productietoepassingen. Belangrijke principes:
- Geef elk contextonderdeel een score: hoog / gemiddeld / laag qua relevantie — neem alleen zeer relevante onderdelen op
- Plaats kritieke beperkingen aan het begin of einde, niet in het midden
- Gebruik opsommingen in plaats van proza voor een besparing van 30-50% op tokens
- Vat samen of deel op in stukken wanneer documenten je budget overschrijden
- Comprimeer oude gespreksgeschiedenis in gesprekken met meerdere beurten in plaats van opnieuw te beginnen
- Plan je contextbudget expliciet als constanten in code
Leer AI-promptengineering met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 53
- Lessen
- 199
Veelgestelde vragen
Is de les “Contextlengte en relevantie” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad AI-promptengineering, waaronder “Contextlengte en relevantie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus AI-promptengineering bevat in totaal 4 lessen.
Wat leer ik in “Contextlengte en relevantie”?
Breng uitgebreide context, tokenlimieten en relevantie met elkaar in evenwicht. Je oefent met AI-promptengineering door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met AI-promptengineering te beginnen?
Ervaring vooraf is niet nodig. AI-promptengineering op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Contextlengte en relevantie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over AI-promptengineering?
Ja. Elke les over AI-promptengineering bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Wat context betekent bij AI-prompting
- Achtergrondinformatie verstrekken
- De context effectief schetsen
- Contextlengte en relevantie