Naar de inhoud
NLEN
Illustratie: Dynamische payload routing op basis van prompt-omvang

Dynamische payload routing op basis van prompt-omvang

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

In moderne AI-architecturen varieert de omvang van inkomende API-payloads enorm. Een enkele integratie kan het ene moment een korte gebruikersopdracht van vijftig tokens verwerken, en het volgende moment een samenvattingsverzoek van veertigduizend tokens met meerdere documentbijlagen binnenkrijgen. Wanneer een applicatie al deze verzoeken blindelings naar hetzelfde homogene backend-model stuurt, ontstaan er aanzienlijke inefficiënties. Korte prompts betalen onnodig veel overhead op zware modellen met trage time-to-first-token, terwijl volumineuze payloads de contextvensters van compacte, goedkopere modellen laten crashen.

Dynamische payload routing lost dit op door de omvang van de inkomende prompt vóór dispatching te inspecteren en het verzoek door te sturen naar het meest geschikte model of endpoint. Dit artikel valt binnen pijler A2 (Gateway, routing & doorvoerbeheer). Voor een overzicht van de onderliggende infrastructuur en proxy-architectuur kun je het ankerartikel over het zelf hosten van een LLM-gateway raadplegen om te zien hoe proxy-lagen inkomend verkeer onderscheppen en distribueren.

De architectuur van context-gedreven routering

Bij context-gedreven routering fungeert een API-gateway als een intelligente inspectielaag tussen de client-applicatie en de upstream modelproviders. In plaats van een statische koppeling tussen een endpoint en een specifieke modelnaam, decodeert de gateway de inkomende HTTP-body en voert een deterministische analyse uit op de token-voetafdruk van de payload.

Het routeringsproces verloopt in vier opeenvolgende stappen binnen de proxy-pipeline:

Voor een diepere analyse van dispatch-algoritmes en fallback-mechanismen kun je de gids over meerdere modellen orkestreren en routeren bestuderen om te begrijpen hoe failover-regels samenwerken met payload-inspectie.

Token-drempels en modelprofielen definiëren

Om een effectieve routeringsmatrix op te zetten, categoriseren we inkomende verzoeken doorgaans in drie duidelijke tiers op basis van prompt-omvang. Elke tier bedient een specifieke klasse van modellen met een eigen balans tussen kosten, latentie en contextcapaciteit.

Tier Token-omvang Typische use-case Modelprofiel
Tier 1: Micro/Standaard 0 – 2.048 tokens Classificatie, korte Q&A, entiteitextractie Kleine, snelle modellen (lage latency, lage kosten per token)
Tier 2: Medium 2.049 – 16.384 tokens Meertalige chatsessies, documentanalyse tot 10 pagina's Middenklasse modellen met gebalanceerde redeneerkracht
Tier 3: Macro/Extended 16.385 – 128.000+ tokens Complexe RAG-synthese, volledige codebases, boeken Frontier-modellen met zeer groot contextvenster en caching

Door deze segmentatie strikt toe te passen via regels op de gateway, vermijden we dat eenvoudige prompts van 150 tokens worden verwerkt door dure frontier-modellen die ontworpen zijn voor enorme contexten. Omgekeerd voorkomt het dat verzoeken met tienduizenden tokens stranden op modellen met een beperkte contextlimiet van 8k of 16k tokens.

Meetmethodes voor token-telling bij de gateway

Een kritieke technische afweging bij payload routing is de meetmethode voor het bepalen van de prompt-omvang. De gateway moet de berekening uitvoeren vóórdat de HTTP-verbinding naar de upstream provider wordt geopend. Hierbij bestaan twee dominante benaderingen:

1. Exacte tokenisatie via lokale BPE-parsers: Hierbij draait een lokale tokenizer (zoals Tiktoken of HuggingFace Tokenizers) direct binnen het gateway-proces. Dit levert een exacte telling op, maar introduceert CPU-overhead en geheugenbeslag, zeker wanneer verzoeken verschillende tokenizers vereisen (bijvoorbeeld OpenAI cl100k vs. Anthropic vs. Google Gemma tokenizers).

2. Heuristische byte- en karaktertelling: Voor veel scenario's volstaat een snelle benadering gebaseerd op stringlengte of byte-omvang (bijvoorbeeld 1 token ≈ 4 karakters voor westerse talen). Dit kost vrijwel nul CPU-tijd, maar vereist een veiligheidsmarge van minimaal vijftien tot twintig procent om te voorkomen dat randgevallen de contextlimiet overschrijden.

Omdat token-definities en encodings per provider sterk afwijken, is het raadzaam om het artikel over tokenverbruik normaliseren over providers te lezen om te zien hoe verschillende tokenizers zich tot elkaar verhouden in een multi-provider setup.

Faalmodi en risico's bij volume-gebaseerde routering

Geen enkele architectuur is zonder risico's. Bij dynamische payload routing op basis van prompt-omvang treden in productie specifieke faalmodi op die proactief moeten worden opgevangen.

Faalmodus 1: Misclassificatie bij grensgevallen (Boundary Thrashing). Een prompt van 2.045 tokens wordt geclassificeerd als Tier 1. Als de tokenizer-heuristiek er 10 tokens naast zit, of als het model tijdens runtime extra instructies toevoegt via templating, kan het verzoek de harde contextgrens van het Tier 1 model overschrijden en een 400 ContextWindowExceeded fout veroorzaken.

Mitigatie: Hanteer altijd een veiligheidsbuffer van 10% onder de maximale contextlimiet van elk modelprofiel.

Faalmodus 2: Onbedoelde model-kwaliteitsdegradatie. Een gebruiker stuurt een prompt van slechts 40 tokens, maar vraagt om een wiskundig bewijs of complexe logica. Omdat het volume laag is, routeert het systeem de vraag naar een klein model dat faalt op de redeneertaak.

Mitigatie: Combineer prompt-omvang altijd met metadata-hints (zoals tags voor intentie of gevraagde reasoning tiers) die door de client meegegeven kunnen worden.

Faalmodus 3: Latency-accumulatie door tokenizer-overhead. Wanneer een gateway gigantische payloads (bijvoorbeeld 500 KB aan JSON) binnenkrijgt en synchroon BPE-tokenisatie uitvoert op een single-threaded Node.js event loop, blokkeert dit alle overige inkomende requests.

Mitigatie: Voer tokenisatie asynchroon uit in een worker thread of gebruik geoptimaliseerde native C/Rust bindings.

Implementatie: Routeringslogica in de gateway

Hieronder staat een implementatievoorbeeld van een payload routeringsmiddleware. Deze code berekent de omvang van de inkomende payload, past een veiligheidsmarge toe, selecteert het juiste upstream endpoint en handelt fouten netjes af met een fallback-mechanisme.

/**
 * Dynamische payload router middleware voor LLM-gateways
 */
import { countTokensFast } from './token-utils.js';
import { forwardRequest } from './http-transport.js';

interface ModelRoute {
  provider: string;
  model: string;
  maxTokens: number;
  timeoutMs: number;
}

const ROUTING_TIERS: Record<string, ModelRoute> = {
  tier1_small: {
    provider: 'fast-inference-engine',
    model: 'small-instruct-v2',
    maxTokens: 2048,
    timeoutMs: 5000
  },
  tier2_medium: {
    provider: 'standard-cloud',
    model: 'general-chat-8b',
    maxTokens: 16384,
    timeoutMs: 15000
  },
  tier3_large: {
    provider: 'frontier-cloud',
    model: 'frontier-large-context',
    maxTokens: 128000,
    timeoutMs: 45000
  }
};

export async function routePayloadByVolume(req: any, res: any) {
  const startTime = Date.now();
  const messages = req.body.messages || [];
  
  // 1. Snelle berekening van totale prompt-tekst
  const fullPromptText = messages.map((m: any) => m.content || '').join('\n');
  const estimatedTokens = countTokensFast(fullPromptText);
  
  // 2. Selecteer tier met 10% veiligheidsbuffer
  let selectedTier = 'tier3_large';
  if (estimatedTokens < (ROUTING_TIERS.tier1_small.maxTokens * 0.9)) {
    selectedTier = 'tier1_small';
  } else if (estimatedTokens < (ROUTING_TIERS.tier2_medium.maxTokens * 0.9)) {
    selectedTier = 'tier2_medium';
  }
  
  const targetConfig = ROUTING_TIERS[selectedTier];
  
  try {
    // 3. Dispatch verzoek met strikt timeout-budget
    const upstreamResponse = await forwardRequest({
      target: targetConfig,
      payload: {
        ...req.body,
        model: targetConfig.model
      },
      timeoutMs: targetConfig.timeoutMs
    });
    
    res.setHeader('X-Routed-Tier', selectedTier);
    res.setHeader('X-Estimated-Tokens', estimatedTokens);
    return res.status(200).json(upstreamResponse);
  } catch (err: any) {
    // 4. Fallback-pad: escaleer naar Tier 3 als kleine tier faalt
    if (selectedTier !== 'tier3_large') {
      try {
        const fallbackTarget = ROUTING_TIERS.tier3_large;
        const fallbackResponse = await forwardRequest({
          target: fallbackTarget,
          payload: { ...req.body, model: fallbackTarget.model },
          timeoutMs: fallbackTarget.timeoutMs
        });
        res.setHeader('X-Routed-Tier', 'tier3_large_fallback');
        return res.status(200).json(fallbackResponse);
      } catch (fallbackErr: any) {
        return res.status(502).json({
          error: 'Gateway routing en fallback mislukt',
          details: fallbackErr.message
        });
      }
    }
    
    return res.status(504).json({
      error: 'Upstream model timeout op gekozen tier',
      tier: selectedTier
    });
  }
}

Dynamische compressie vóór routering

In plaats van een volumineus verzoek direct door te sturen naar een duur frontier-model, kan een gateway ervoor kiezen om de payload eerst te comprimeren. Dit proces wordt ook wel context compaction genoemd. Hierbij verwijdert de gateway redundante witruimtes, snoeit hij niet-essentiële systeeminformatie weg, of condenseert hij tussenliggende chatberichten.

Wanneer een payload van 3.200 tokens door compressie wordt teruggebracht tot 1.800 tokens, valt deze opeens binnen het bereik van een Tier 1 model. Dit levert een directe verlaging van de operationele kosten op en voorkomt onnodig routeren naar tragere backend-infrastructuren. Voor praktische technieken rondom payload-optimalisatie biedt het artikel over prompt-compressie in je API-pipeline concrete algoritmes voor het verwijderen van ruis.

Daarnaast zijn er diverse community-inzichten over context-reductie te vinden; bekijk bijvoorbeeld de technieken in het overzicht over token-besparing en bewezen trucs voor methoden om prompts compact te houden zonder semantisch verlies.

Wachtrijbeheer en doorvoer: scheiden van zware en lichte taken

Een vaak over het hoofd gezien neveneffect van variabele payload-omvang is Head-of-Line Blocking (HoL-blocking). Wanneer zware payloads van 80.000 tokens dezelfde workers en verbindingen delen als lichte interactieve chatberichten van 100 tokens, slibben de netwerkbuffers dicht. De lichte verzoeken moeten wachten tot de zware verzoeken volledig zijn gestreamd en verwerkt.

De oplossing ligt in het scheiden van verzoekstromen op basis van de berekende payload-omvang. Door de gateway te koppelen aan gescheiden wachtrijen, krijgen lichte taken voorrang op lage-latentie verbindingen, terwijl zware batch-achtige payloads worden verwerkt via specifieke werkers met ruimere timeouts. Meer over deze opzet is te vinden in het overzicht over prioriteitswachtrijen voor kritieke LLM-taken, waarin wordt beschreven hoe capaciteit eerlijk verdeeld wordt.

Kosten, latency en trade-offs in productie

Het implementeren van dynamische payload routing brengt duidelijke operationele trade-offs met zich mee. Het is belangrijk om de kostenbesparing af te wegen tegen de complexiteit van de gateway.

Aspect Zonder Payload Routing (Statisch) Met Dynamische Payload Routing
Gemiddelde kosten per call Hoog (alle verkeer geconfigureerd op het grootste verwachte model) Laag (60-80% van het volume draait op goedkopere tiers)
Time-to-First-Token (TTFT) Trager voor kleine prompts op grote modellen Optimaal (kleine prompts direct naar snelle modellen)
Gateway Latency Overhead 0 ms (directe passthrough proxy) 2 – 15 ms (tijd voor tokenisatie en beleidsevaluatie)
Systeeminfrastructuur Eenvoudig, statische configuratie Complexer, vereist actieve health-checks en tier-fallbacks
Foutgevoeligheid Vaste foutprofielen Kans op grensgevallen en misroutering bij edge-cases

De operationele winst is het grootst bij applicaties met een sterk heterogeen gebruikersbestand, waarbij eenvoudige assistent-vragen worden afgewisseld met diepgaande documentanalyses. Bij uniforme workloads (waarbij elke call nagenoeg dezelfde omvang heeft) weegt de extra complexiteit van een routinglaag vaak niet op tegen de baten.

Productie-checklist voor dynamische routering

Voor een stabiele uitrol van dynamische payload routing in een productieomgeving moeten de volgende technische maatregelen genomen zijn: