Naar de inhoud
NLEN
Illustratie: Lost in the Middle Voorkomen met Contextvolgorde

Lost in the Middle voorkomen met slimme contextvolgorde

Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini)

Contextvensters van moderne taalmodellen overspannen inmiddels honderdduizenden tot zelfs miljoenen tokens. Op papier betekent dit dat complete documentverzamelingen, codebases of conversatiegeschiedenissen in één enkele prompt passen. In de praktijk blijkt echter dat de theoretische capaciteit van een model weinig zegt over het vermogen om specifieke feiten accuraat terug te vinden. Wanneer relevante informatie diep in het midden van een omvangrijke prompt verborgen zit, keldert de accuratesse van de respons drastisch. Dit verschijnsel staat bekend als het Lost in the Middle-effect.

De oorzaak ligt niet in toevallige ruis, maar in de fundamentele wiskundige architectuur van transformer-modellen en de manier waarop positiecoderingen werken. In dit artikel analyseren we waarom taalmodellen lijden aan positionele voorkeuren, hoe dit retrieval-augmented generation (RAG) ondermijnt, en welke deterministische sorteringsstrategieën nodig zijn om de extractiekwaliteit van prompts te optimaliseren.

De anatomie van aandachtsverlies: Primacy en Recency Bias

Taalmodellen vertonen een sterke U-vormige prestatiecurve wanneer we meten hoe goed zij feiten reproduceren op basis van hun positie in de prompt. Informatie aan het absolute begin van de prompt profiteert van de zogenaamde primacy bias. Informatie direct voor de instructie of vraag aan het einde profiteert van de recency bias. Alles wat zich in het middelste segment bevindt — grofweg tussen de 20% en 80% van de totale tokenlengte — loopt een aanzienlijk groter risico om genegeerd of overschreven te worden door concurrerende tokens.

Dit gedrag hangt nauw samen met de distributie van de self-attention-gewichten. Tijdens de autoregressieve verwerking aggregeren de eerste tokens (zoals systeemprompts en metadata) onevenredig veel globale contextuele aandacht, vaak aangeduid als attention sinks. Tegelijkertijd hebben de meest recente tokens een directe invloed op de generatiestap omdat het model hier de volgende tokenvoorspelling direct aan koppelt. Het midden van de context fungeert daardoor als een diffuus overgangsgebied waar de residuele activaties uitdoven.

Voor wie dieper wil ingaan op hoe het contextvenster binnen applicaties structureel georganiseerd moet worden, biedt het fundament over context window management in de praktijk gedetailleerde handvatten om geheugenlekken en overbelasting te beheersen.

Waarom grotere contextvensters het probleem niet automatisch oplossen

Een veelvoorkomende misvatting is dat recentere modelarchitecturen met technieken zoals Rotary Position Embedding (RoPE) of sparse attention mechanismen immuun zijn voor positioneel verlies. Hoewel de zogeheten Needle In A Haystack (NIAH) synthetische tests vaak 99% extractiepercentages rapporteren over 128k tokens, vertekent deze testopstelling de werkelijkheid. Een synthetische test plaatst doorgaans één triviale zin ("Het geheime wachtwoord is blauw") tussen uniforme, niet-gerelateerde herhalingstekst.

In realistische scenario's bestaat de context echter uit semantisch overlappende documenten, inconsistente brondata en complexe syntaxis. Zodra er interferentie ontstaat tussen verschillende alinea's, treedt het Lost in the Middle-effect opnieuw op volle kracht op. Het model moet dan concurreren om aandachtsvectoren tussen tientallen documenten die vergelijkbare termen bevatten. Zonder actieve positionele optimalisatie zakt de opvraagnauwkeurigheid van semantisch dichte fragmenten in het midden van het venster met 20% tot zelfs 50% ten opzichte van de flanken.

Contextpositie Aandachtsprofiel Typische Foutmodus Aanbevolen Inhoudstype
Eerste 0–15% Zeer hoog (Attention Sink / Primacy) Overmatige sturing op restricties Systeemeisen, schema's, top-1 document
Midden 15–85% Laag tot diffuus (Aandachtsval) Weglating, hallucinatie, synthesefouten Ondersteunende context, lage relevantie
Laatste 85–100% Hoog (Recency Bias) Kortzichtigheid t.o.v. eerdere regels Top-2 document, directe taakinstructie

Impact op RAG: Waarom standaard semantische sortering faalt

Klassieke RAG-architecturen halen documenten op via vector-similarity (cosine distance of dot product) en voegen de top-K fragmenten lineair in de prompt in, gesorteerd van hoogste naar laagste relevantie. Dit betekent dat het meest relevante document (`rank 1`) bovenaan staat, direct gevolgd door `rank 2`, `rank 3`, tot `rank K` onderaan.

Bij deze lineaire opzet belanden de documenten met matige relevantie (`rank K/2` tot `rank K-1`) exact in de buurt van de afsluitende vraag, terwijl documenten met een net iets lagere score dan de absolute top in het 'dode' middengebied terechtkomen. Wanneer de vraag een synthese vereist tussen het primaire document en een secundair bewijsstuk dat toevallig op positie 4 van de 8 staat, mist het model vrijwel altijd het verband.

Om te begrijpen hoe contextuele vervuiling en hallucinaties in retrieval-ketens optreden, lees je het artikel over prompts voor RAG zonder hallucinaties, waarin de relatie tussen documentrelevantie en foutieve gevolgtrekkingen centraal staat.

Strategie 1: De U-vormige contextindeling (Alternating Reordering)

De meest effectieve heuristiek om Lost in the Middle bij meervoudige documentinvoer tegen te gaan, is het herschikken van de context volgens een U-vormige verdeling (vaak de Sandwich-methode of Alternating Ranking genoemd). Hierbij worden de documenten met de hoogste similarity scores verdeeld over de twee uiterste uiteinden van het contextblok.

In plaats van een monotoon aflopende lijst `[D1, D2, D3, D4, D5, D6]`, structureert het algoritme de fragmenten zodanig dat de topdocumenten op de posities met de hoogste aandachtsretentie belanden. De verdeling verloopt als volgt:

Door deze indeling liggen de twee meest kritieke documenten (`D1` en `D2`) exact op de pieken van respectievelijk de primacy- en recency-curve. De minst relevante documenten worden naar het centrum geduwd, waar ze dienen als achtergrondkennis zonder de primaire logica te verstoren.

Strategie 2: Query-herhaling en Context Grounding

Naast het herschikken van documenten speelt de plaatsing van de daadwerkelijke gebruikersvraag een doorslaggevende rol. In veel prompt-sjablonen staat de gebruikersinstructie uitsluitend bovenaan, waarna een documentblok van duizenden tokens volgt. Tegen de tijd dat het model begint met het genereren van tokens, is de signaalsterkte van de initiële instructie afgezwakt.

De oplossing bestaat uit een dubbele positionering:

Door de vraag onderaan expliciet te formuleren, dwingen we het model om de aandachtsfocus van de meest recente tokens direct terug te projecteren over de zojuist gelezen context, in plaats van te vertrouwen op vage representaties uit eerdere lagen.

Strategie 3: Chunk-compressie en selectieve reductie

Het herordenen van context lost het probleem van aandachtsverwatering slechts gedeeltelijk op wanneer de totale prompt onnodig lang blijft. Hoe groter het aantal irrelevante tokens in het midden, hoe zwaarder de noemer in de softmax-berekening van de attention-heads weegt. Daarom is selectieve compressie van documentfragmenten een essentiële aanvullende maatregel.

In plaats van volledige paragrafen of onbewerkte documenten door te sturen, filteren compressiemodellen of extractive summarizers de ruis weg voordat de prompt wordt samengesteld. Wie deze techniek operationeel wil maken, kan de richtlijnen raadplegen over prompt-compressie voor lange contexten om te bepalen wanneer samenvatten effectiever is dan botweg snoeien.

De wisselwerking tussen contextordening en prefix-caching

Bij het ontwerpen van een geoptimaliseerde contextpijplijn ontstaat er een directe architectonische spanning tussen aandachtsoptimalisatie en prefix-caching (zoals geïmplementeerd in moderne LLM-infrastructuur). Prefix-caching vereist dat de begindelen van een prompt statisch en identiek blijven tussen opeenvolgende API-aanroepen om de Key-Value (KV) cache op de GPU te kunnen hergebruiken.

Wanneer we dynamische U-vormige herschikking toepassen op een gedeelde documentenset, verandert de volgorde van de tokens bij elke unieke zoekopdracht zodra de similarity-scores verschuiven. Dit vernietigt de cache-hitratio volledig. We moeten hier een duidelijke architecturale afweging maken:

Ontwerpkeuze Voordeel Nadeel Toepassingsgebied
Statische prefix + dynamisch staartblok Hoge cache-hitratio, lage latency en kosten Matige bescherming tegen Lost in the Middle in de basis Grote statische handboeken, API-documentatie
Volledige U-vormige documentherordening Maximale extractienauwkeurigheid per individuele query Geen KV-cache hergebruik op documentniveau Complexe juridische analyses, medische extracties
Gelaagde sandwich (Statische kern + Dynamische top) Gedeeltelijke caching met gerichte grounding Complexere prompt-assemblagelogica Multi-tenant SaaS met gedeelde kennisbanken

Meetbaarheid: Positionele regressietests opzetten

Het optimaliseren van contextvolgorde mag geen kwestie van intuïtie zijn. Omdat taalmodellen niet-deterministisch reageren op subtiele verschuivingen in tokenposities, is een gestructureerde evaluatietest noodzakelijk. Door een set feiten systematisch te roteren over 10 discrete posities binnen een vaste contextlengte (bijvoorbeeld 8k, 32k en 64k tokens), kan de werkelijke prestatievallei van een specifiek model in kaart worden gebracht.

Om te verifiëren of promptwijzigingen of modelupgrades geen sluipende regressie in de positionele verwerking veroorzaken, is het verstandig om het raamwerk voor regressietesten voor prompts te implementeren in de continuous integration-pijplijn.

Implementatie: Een deterministische ContextReorderer in Python

Hieronder staat een productieklare implementatie van een U-vormige context-herschikker. Deze module accepteert een lijst van opgehaalde documenten met bijbehorende relevantiescores en ordent ze volgens het alternerende sandwich-patroon, inclusief brontracking.

from typing import List, Dict, Any

class ContextReorderer:
    """
    Herstructureert documentfragmenten om het 'Lost in the Middle'-effect
    te minimaliseren door topdocumenten naar de uitersten te verplaatsen.
    """
    
    @staticmethod
    def reorder_u_shape(documents: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
        """
        Sorteert documenten volgens U-shape: [1, 3, 5, ..., 6, 4, 2]
        Verwacht een lijst met dicts die minimaal een 'score' of vooraf
        gesorteerde volgorde bevatten.
        """
        if len(documents) <= 2:
            return documents

        # Zorg voor een strikte sortering op basis van score (aflopend)
        sorted_docs = sorted(
            documents, 
            key=lambda doc: doc.get('score', 0.0), 
            reverse=True
        )
        
        reordered: List[Dict[str, Any]] = [None] * len(sorted_docs)
        left = 0
        right = len(sorted_docs) - 1
        
        for idx, doc in enumerate(sorted_docs):
            if idx % 2 == 0:
                reordered[left] = doc
                left += 1
            else:
                reordered[right] = doc
                right -= 1
                
        return reordered

    @classmethod
    def format_prompt_payload(
        cls, 
        system_instruction: str, 
        query: str, 
        retrieved_docs: List[Dict[str, Any]]
    ) -> str:
        """
        Bouwt het definitieve prompt-skelet op met U-vormige context
        en dubbele taakverankering.
        """
        reordered_docs = cls.reorder_u_shape(retrieved_docs)
        
        context_parts = []
        for i, doc in enumerate(reordered_docs, start=1):
            context_parts.append(
                f"<document index=\"{i}\" id=\"{doc.get('id', 'unknown')}\">\n"
                f"{doc.get('content', '').strip()}\n"
                f"</document>"
            )
            
        context_block = "\n\n".join(context_parts)
        
        prompt = (
            f"{system_instruction}\n\n"
            f"<context_verzameling>\n"
            f"{context_block}\n"
            f"</context_verzameling>\n\n"
            f"Gebruik uitsluitend bovenstaande documenten om de onderstaande vraag te beantwoorden.\n"
            f"Vraag: {query}\n"
            f"Antwoord:"
        )
        return prompt

Deze implementatie garandeert dat de documenten deterministisch worden verdeeld over de beschikbare posities zonder dat er extra latency ontstaat tijdens de query-uitvoering.

Checklist voor contextbeheer in productie

Om te waarborgen dat applicaties bestand zijn tegen positioneel aandachtsverlies, kan de volgende architecturale checklist worden gehanteerd:

Door deze maatregelen structureel in te bouwen in de prompt- en RAG-infrastructuur blijft de extractiebetrouwbaarheid constant, ongeacht de totale omvang van het contextvenster.