Waarom Caching in LLM-infrastructuur?
Large Language Models (LLMs) zijn computationeel intensief en leveren inherent te maken met hoge Time-to-First-Token (TTFT) en substantiële API-kosten per duizend tokens. In enterprise-omgevingen of high-traffic toepassingen resulteert het herhaaldelijk verwerken van identieke of sterk vergelijkbare gebruikersvragen in onnodige verspilling van compute en kapitaal.
Door een intelligente caching-laag toe te voegen voor de LLM-aggregatieproxy vangen we redundante verzoeken direct af. Dit levert twee directe voordelen op:
- Extreme latency-reductie: Van seconden wachten op inferentie naar milliseconden directe cache-hits.
- Kostenbesparing: Geen tokenkosten voor herhaalde queries, wat de operationele marge van je SaaS-applicatie beschermt.
Prompt-Caching vs. Response-Caching
Binnen LLM-architecturen onderscheiden we twee fundamentele caching-mechanismen die elkaar perfect aanvullen:
1. Prompt-Caching (Context Caching)
Richt zich op het hergebruiken van grote, statische systeemprompts, documenten of codebase-injecties (RAG) in het geheugen van de provider of gateway.
- Werking: Slaat de Key-Value (KV) states van de prompt op.
- Voordeel: Supersnelle verwerking van lange contexten zonder dubbele rekenkracht.
- Ideaal voor: Grote system prompts en documentanalyserende agents.
2. Response-Caching (Semantic & Exact)
Slaat de volledige output van het model op basis van de invoer-hash of semantische gelijkenis op in een externe store (zoals Redis).
- Werking: Map van
Hash(Prompt + Parameters)naar gegenereerde string. - Voordeel: Volledige omzeiling van de LLM-API bij identieke of vergelijkbare vragen.
- Ideaal voor: Veelgestelde vragen, productbeschrijvingen en standaard code-generatie.
Architectuur & Pseudocode
Een robuuste API-gateway implementeert een gelaagde strategie. Eerst wordt gekeken of er een exacte match is in de response-cache. Zo niet, dan wordt gecontroleerd of prompt-caching kan worden toegepast op de context voordat de upstream LLM wordt aangeroepen.
// Pseudocode voor API Gateway Cache Flow
function handleLLMRequest(incomingRequest) {
// Stap 1: Genereer deterministische hash van prompt en modelconfiguratie
const cacheKey = generateSHA256(incomingRequest.prompt + incomingRequest.model);
// Stap 2: Controleer Response Cache (bijv. Redis)
const cachedResponse = RedisCache.get(cacheKey);
if (cachedResponse && !isExpired(cachedResponse)) {
return {
source: "response_cache",
latency_ms: 12,
data: cachedResponse.output
};
}
// Stap 3: Check of Prompt Caching mogelijk is (KV-cache bij provider)
let optimizedPayload = incomingRequest.payload;
if (hasStaticSystemPrompt(incomingRequest)) {
optimizedPayload = attachPromptCacheHeaders(incomingRequest);
}
// Stap 4: Upstream LLM Aanroep (Aggregator)
const startTime = getCurrentTimestamp();
const llmResponse = UpstreamLLM.complete(optimizedPayload);
const latency = getCurrentTimestamp() - startTime;
// Stap 5: Sla resultaat op in cache voor toekomstige queries
RedisCache.set(cacheKey, {
output: llmResponse.text,
timestamp: getCurrentTimestamp()
}, TTL_SECONDS);
return {
source: "llm_upstream",
latency_ms: latency,
data: llmResponse.text
};
}
Cache-Invalidatie en Semantische Caching
Het grootste gevaar van caching bij LLMs is verouderde of incorrecte informatie. Omdat gebruikers zelden exact dezelfde formulering gebruiken, schiet traditionele string-matching vaak te kort.
- TTL (Time-To-Live): Stel strenge verloopdata in voor dynamische onderwerpen (bijv. 1 uur voor nieuwsgerelateerde queries, 7 dagen voor statische documentatie).
- Semantische Caching: In plaats van exacte string-matching, gebruik je embeddings en vector-similarity (cosine distance > 0.95) om te herkennen dat een nieuwe vraag feitelijk identiek is aan een eerdere vraag.
- Event-driven invalidatie: Wis automatisch cache-records zodra onderliggende bronnen (zoals RAG-vectordatabases of productcatalogi) worden geupdate.
Wanneer Wel en Niet Cachen?
Niet elke LLM-interactie leent zich voor caching. Een afweging van use-cases:
✅ Wel Cachen
- FAQ's en klantenservice bots met vaste kennisbank.
- Standaard code-syntaxis en boilerplate generatie.
- Repetitieve data-extractie en classificatietaken.
- Lange system prompts die bij elke sessie identiek zijn.
❌ Niet Cachen
- Real-time data queries (voorraadstatus, live koersen).
- Sterk gepersonaliseerde contexten en unieke gebruikersdata.
- Kreatieve brainstorming waarbij variatie in output gewenst is (hoge
temperature). - Gevoelige PII-data waar privacy-risico's kleven aan persistente opslag.