# Semantic Caching for AI Workloads **Last updated:** 2026-02 **Status:** GA **Category:** Cost Optimization & FinOps for AI --- ## Introduksjon Semantic caching er en teknikk som reduserer kostnader og latens for LLM-baserte applikasjoner ved å cache og gjenbruke svar basert på semantisk likhet mellom prompts — ikke kun eksakte tekstmatch. Dette er spesielt verdifullt i AI-workloads der samme eller lignende spørsmål stilles flere ganger. **Nøkkelverdi:** - **Kostnadsreduksjon:** 40-70% reduksjon i token-forbruk for typiske applikasjoner (HIGH confidence) - **Latensreduksjon:** 80-95% raskere responstider for cached requests (HIGH confidence) - **Skalerbarhet:** Reduserer backend-belastning og muliggjør høyere throughput **Når bruke semantic caching:** - Chatbots med repeterende spørsmål - RAG-applikasjoner med overlappende queries - Dokumentanalyse med lignende forespørsler - Customer support med standard svar **Når IKKE bruke semantic caching:** - Real-time data som må være oppdatert (aksjekurser, vær) - Personaliserte svar basert på brukerhistorikk - Sikkerhetsavgjørelser som krever ny evaluering - Applikasjoner med ekstremt lave cache hit rates (<10%) --- ## Kjernekomponenter Semantic caching består av fire hovedkomponenter: | Komponent | Rolle | Azure-implementering | |-----------|-------|---------------------| | **Embeddings Model** | Konverterer prompts til vektorer | Azure OpenAI Embeddings API (text-embedding-3-large, text-embedding-ada-002) | | **Vector Database** | Lagrer embeddings og utfører similarity search | Azure Managed Redis (RediSearch), Azure Cache for Redis Enterprise, Azure AI Search | | **Gateway/Proxy** | Orkestrerer cache lookup og LLM calls | Azure API Management, custom application logic | | **LLM Backend** | Genererer completions ved cache miss | Azure OpenAI, Azure AI Foundry models | ### Slik fungerer semantic caching ``` 1. User prompt → Embedding Model → Vector [0.23, -0.45, 0.67, ...] 2. Vector → Vector Database → Similarity Search (cosine/euclidean) 3. IF similarity score > threshold: RETURN cached completion ELSE: Call LLM → Generate completion → Store in cache ``` ### Similarity metrics | Metric | Når bruke | Azure Redis støtte | |--------|-----------|-------------------| | **Cosine similarity** | Standard for tekstlikhet, uavhengig av vektor-magnitude | ✅ COSINE | | **Euclidean distance** | Når absolutt avstand mellom punkter er viktig | ✅ L2 | | **Inner product** | Rask beregning, forutsetter normaliserte vektorer | ✅ IP | **Score threshold best practices:** - `0.95+` (cosine): Svært streng matching, nesten identiske prompts - `0.85-0.94`: Balanced — standard anbefaling for de fleste use cases - `0.70-0.84`: Liberal matching, høyere cache hit rate men lavere presisjon - **Start med 0.85 og juster basert på cache hit rate og user feedback** (MEDIUM confidence) --- ## Arkitekturmønstre ### Mønster 1: API Management + Managed Redis (anbefalt for enterprise) **Arkitektur:** ``` Client → APIM (semantic cache policies) → Azure Managed Redis (RediSearch) → Azure OpenAI ↓ (on cache miss) Azure OpenAI Embeddings API ``` **Komponenter:** - **Azure API Management** (alle tiers støttet) - **Azure Managed Redis** med RediSearch-modul (REQUIRED) - **Azure OpenAI** med Chat Completion + Embeddings deployments **Implementering:** ```xml @(context.Subscription.Id) ``` **Fordeler:** - ✅ Zero-code løsning med APIM policies - ✅ Managed identity auth til Azure OpenAI - ✅ Built-in rate limiting og monitoring - ✅ Multi-tenant support via `vary-by` (subscription, header, claim) **Ulemper:** - ❌ APIM koster ekstra (fra ~4 000 NOK/måned for Basic v2) - ❌ RediSearch må enablees ved opprettelse av Redis cache (kan ikke legges til senere) **Kostnadsestimat (SMB scenario, 100K requests/måned):** - APIM Basic v2: ~4 000 NOK/måned - Azure Managed Redis (Memory Optimized 1GB): ~2 800 NOK/måned - Azure OpenAI Embeddings (text-embedding-3-small, 20M tokens): ~160 NOK - **Total: ~7 000 NOK/måned** (MEDIUM confidence) --- ### Mønster 2: Application-level caching (Python/C#/.NET) **Arkitektur:** ``` Application Code ↓ [Semantic Kernel / LangChain / Custom Logic] ↓ Azure Cache for Redis Enterprise (vector store) ↓ (on cache miss) Azure OpenAI (Embeddings + Chat) ``` **Implementering (Python med Redis OM):** ```python from redis_om import get_redis_connection, EmbeddedJsonModel from openai import AzureOpenAI import numpy as np # Redis connection med RediSearch redis = get_redis_connection( host="your-redis.redis.cache.windows.net", port=6380, password="key", ssl=True ) # Semantic cache lookup def get_cached_completion(prompt: str, threshold: float = 0.85): # 1. Generate embedding for prompt embedding = client.embeddings.create( model="text-embedding-3-large", input=prompt ).data[0].embedding # 2. Vector similarity search in Redis results = redis.ft("cache_idx").search( Query(f"*=>[KNN 1 @embedding $vec AS score]") .return_fields("completion", "score") .sort_by("score") .paging(0, 1) .dialect(2), query_params={"vec": np.array(embedding, dtype=np.float32).tobytes()} ) # 3. Return cached if similarity > threshold if results.docs and float(results.docs[0].score) >= threshold: return results.docs[0].completion # 4. Call LLM and cache result completion = call_llm(prompt) cache_completion(prompt, embedding, completion) return completion ``` **Fordeler:** - ✅ Full kontroll over caching-logikk - ✅ Kan bruke i eksisterende applikasjoner - ✅ Støtte for hybrid search (metadata filtering) - ✅ Framework-integrasjoner (Semantic Kernel, LangChain, LlamaIndex) **Ulemper:** - ❌ Krever custom kode og testing - ❌ Må håndtere cache invalidation selv - ❌ Mindre out-of-the-box observability --- ### Mønster 3: Azure AI Search som vector database **Arkitektur:** ``` Application → Azure AI Search (vector index) → Azure OpenAI ``` **Når bruke:** - Hybrid search er kritisk (combining vector + keyword + filters) - Eksisterende Azure AI Search deployment - Behov for advanced query capabilities (facets, synonyms, scoring profiles) **Fordeler:** - ✅ Kraftige hybrid search-kapabiliteter - ✅ Built-in semantic ranker - ✅ Integrert med Azure AI Studio **Ulemper:** - ❌ Dyrere enn Redis for kun vector search (fra ~2 500 NOK/måned for Basic) - ❌ Høyere latens enn in-memory Redis (~50-100ms vs ~5-10ms) --- ### Mønster 4: Multi-tier caching (advanced) **Arkitektur:** ``` L1: In-memory cache (exact match) → 1-2ms latency ↓ (miss) L2: Redis semantic cache → 5-10ms latency ↓ (miss) L3: Azure OpenAI → 500-2000ms latency ``` **Implementering:** - **L1:** .NET `IMemoryCache` / Python `functools.lru_cache` (exact string match) - **L2:** Redis semantic cache (vector similarity) - **L3:** Azure OpenAI **Når bruke:** - Ultra-high throughput scenarios (>10K RPS) - Microsecond-level latency requirements - Samme exakte prompts repeteres ofte --- ## Beslutningsveiledning ### Velge vector database | Krav | Anbefaling | Begrunnelse | |------|------------|-------------| | Lavest mulig latens (<10ms) | **Azure Managed Redis** | In-memory, optimalisert for speed | | Hybrid search (vector + keyword + filters) | **Azure AI Search** | Best-in-class hybrid search | | Eksisterende Redis-infrastruktur | **Azure Cache for Redis Enterprise** | Leverage existing investment | | Multi-purpose (cache + vector + session) | **Azure Managed Redis** | Consolidate på én tjeneste | | Budget-constraints | **Azure Managed Redis** | Laveste kostnad for vector search | ### Velge embeddings model | Model | Dimensioner | Kostnad (per 1M tokens) | Når bruke | |-------|-------------|------------------------|-----------| | `text-embedding-3-small` | 1536 | ~16 NOK | Cost-optimized, god nok for de fleste use cases | | `text-embedding-3-large` | 3072 | ~104 NOK | Highest accuracy, kritiske applikasjoner | | `text-embedding-ada-002` | 1536 | ~80 NOK | Legacy, unngå for nye prosjekter | **Anbefaling:** Start med `text-embedding-3-small`. Oppgrader til `large` kun hvis A/B-testing viser signifikant forbedring i cache hit rate eller user satisfaction. (HIGH confidence) ### Cache invalidation strategies | Strategi | Implementering | Når bruke | |----------|----------------|-----------| | **Time-based (TTL)** | `duration="3600"` (1 time) i APIM policy | Standard for de fleste use cases | | **Event-driven** | Purge cache on data updates (webhook/Event Grid) | Real-time data sources | | **Version-based** | Include data version in cache key | Document versioning, A/B testing | | **Manual purge** | Admin endpoint for cache clear | Incident response, data corrections | **Best practice TTL values:** - **Chatbot FAQ:** 24 timer (data endres sjelden) - **RAG over documents:** 1-6 timer (balanse mellom freshness og cache hits) - **Product recommendations:** 30 minutter (inventory changes) - **Real-time analytics:** IKKE bruk caching --- ## Integrasjon med Microsoft-stakken ### Azure API Management integrasjon **Setup-prosess:** 1. **Opprett Azure Managed Redis med RediSearch:** ```bash az redis create \ --name myredis \ --resource-group myrg \ --location norwayeast \ --sku Enterprise_E10 \ --redis-module RediSearch ``` ⚠️ **KRITISK:** RediSearch kan KUN enablees ved opprettelse. Kan ikke legges til senere. 2. **Konfigurer Redis som external cache i APIM:** - Portal: APIM → External cache → Add - Connection string: Redis primary connection string - Test connection 3. **Opprett backend for embeddings API:** ```xml embeddings-backend https://myopenai.openai.azure.com/openai/deployments/embeddings/embeddings ``` 4. **Apply semantic cache policies** (se XML eksempel i Mønster 1) **Policy parameters explained:** | Parameter | Verdi | Forklaring | |-----------|-------|------------| | `score-threshold` | 0.85 (anbefalt) | Minimum similarity for cache hit (0-1) | | `embeddings-backend-id` | "embeddings-backend" | Backend ID for embeddings deployment | | `embeddings-backend-auth` | "system-assigned" | Bruker APIM managed identity | | `ignore-system-messages` | true | Ignorer system messages i similarity-beregning | | `max-message-count` | 10 | Max conversation history messages å inkludere | | `vary-by` | `@(context.Subscription.Id)` | Partition cache per subscription (multi-tenancy) | | `duration` | 3600 (sekunder) | Cache TTL | --- ### Semantic Kernel integrasjon ```csharp using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; using StackExchange.Redis; // Redis vector store var redis = ConnectionMultiplexer.Connect("myredis.redis.cache.windows.net:6380,ssl=true"); var memoryStore = new RedisMemoryStore(redis, vectorSize: 1536); // Semantic Kernel with memory var kernel = Kernel.CreateBuilder() .AddAzureOpenAIChatCompletion("gpt-4", endpoint, apiKey) .AddAzureOpenAITextEmbeddingGeneration("text-embedding-3-small", endpoint, apiKey) .Build(); var memory = new SemanticTextMemory(memoryStore, kernel.GetService()); // Semantic cache pattern var query = "What is Azure Functions?"; var cachedResults = await memory.SearchAsync("cache", query, limit: 1, minRelevanceScore: 0.85); if (cachedResults.Any()) { return cachedResults.First().Metadata.Text; // Cache hit } else { var response = await kernel.InvokePromptAsync(query); // Cache miss await memory.SaveInformationAsync("cache", response.ToString(), query); return response.ToString(); } ``` --- ### LangChain integrasjon (Python) ```python from langchain.cache import RedisSemanticCache from langchain.embeddings import AzureOpenAIEmbeddings from langchain.chat_models import AzureChatOpenAI from langchain.globals import set_llm_cache # Setup semantic cache embeddings = AzureOpenAIEmbeddings( model="text-embedding-3-small", azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"), api_key=os.getenv("AZURE_OPENAI_API_KEY") ) set_llm_cache( RedisSemanticCache( redis_url="redis://myredis.redis.cache.windows.net:6380?ssl=true", embeddings=embeddings, score_threshold=0.85 ) ) # Use LLM — caching happens automatically llm = AzureChatOpenAI(model="gpt-4", temperature=0) response = llm.predict("What is Azure Functions?") # Cache miss → LLM call response2 = llm.predict("Tell me about Azure Functions") # Cache hit (semantic match) ``` --- ### Azure AI Foundry integrasjon Azure AI Foundry models (via Model Inference API) støttes med generic LLM policies i APIM: ```xml @(context.Subscription.Id) ``` --- ## Offentlig sektor (Norge) ### Datahåndtering og personvern | Vurdering | Anbefaling | |-----------|------------| | **PII i prompts** | Anonymiser/pseudonymiser FØR caching. Cache keys må ikke inneholde PII. | | **GDPR "right to be forgotten"** | Implementer purge-mekanisme for brukerdata. Tag cache entries med user ID for targeted deletion. | | **Data residency** | Bruk Norway East/West for Redis og OpenAI for å sikre data forblir i Norge/EU. | | **Audit logging** | Enable APIM diagnostics og Redis slow log for compliance. | ### Sikkerhetsoverveielser | Område | Implementering | |--------|----------------| | **Encryption at rest** | ✅ Azure Managed Redis har default encryption | | **Encryption in transit** | ✅ Krev TLS 1.2+ (APIM policy + Redis SSL) | | **Access control** | ✅ APIM subscription keys + Azure RBAC på Redis | | **Network isolation** | ⚠️ Vurder Private Endpoints for Redis og OpenAI (klassifisert data) | | **Cache poisoning** | ✅ Validate LLM responses før caching (content safety checks) | ### Compliance checkliste - [ ] **Schrems II:** Azure OpenAI i EU-region (Norway East) - [ ] **NIS2:** Incident response plan for cache failures - [ ] **eForvaltningsforskriften:** Tilgjengelighetskrav (caching må ikke blokkere a11y) - [ ] **Arkivloven:** Cached data er IKKE arkivverdig kopi --- ## Kostnad og lisensiering ### Kostnadsmodell **Semantic caching påvirker disse kostnadene:** | Kostnadselement | Uten caching | Med caching (70% hit rate) | Besparelse | |-----------------|--------------|---------------------------|------------| | Azure OpenAI tokens (100M/måned) | ~80 000 NOK | ~24 000 NOK | **~56 000 NOK/måned** | | Azure Managed Redis (Memory Optimized 10GB) | 0 NOK | ~14 000 NOK/måned | -14 000 NOK | | Embeddings API (20M tokens) | 0 NOK | ~160 NOK/måned | -160 NOK | | **Netto besparelse** | - | - | **~41 840 NOK/måned** | *Estimater basert på GPT-4 ($30/1M tokens input) og text-embedding-3-small ($0.02/1M tokens). MEDIUM confidence.* ### ROI break-even analyse **Når lønner semantic caching seg?** ``` Monthly LLM cost > (Redis cost + Embeddings cost) / Cache hit rate Eksempel: 80 000 NOK > (14 000 + 160) / 0.70 80 000 NOK > 20 229 NOK ✅ Lønner seg ``` **Tommelfingerregel:** - Semantic caching lønner seg når LLM-kostnad > 25 000 NOK/måned OG forventet cache hit rate > 40% (MEDIUM confidence) ### Azure Managed Redis pricing (Norway East, jan 2026) | Tier | Memory | Pris/måned (ca.) | Når bruke | |------|--------|-----------------|-----------| | Memory Optimized 1GB | 1 GB | ~2 800 NOK | POC, small apps (<50K cached prompts) | | Memory Optimized 10GB | 10 GB | ~14 000 NOK | Production, medium apps (<500K cached prompts) | | Memory Optimized 50GB | 50 GB | ~56 000 NOK | Enterprise, large apps (>1M cached prompts) | | Compute Optimized (alternative) | Varies | ~20% billigere | Mindre memory, mer CPU (hybrid search) | *Priser er estimater og varierer. Sjekk Azure Pricing Calculator for nøyaktige priser. LOW confidence.* ### Lisensering | Komponent | Lisensiering | Merknad | |-----------|--------------|---------| | **Azure OpenAI** | Pay-per-token (PTU eller Consumption) | Ingen ekstra lisenser for caching | | **Azure API Management** | Per tier (Basic v2+) | Inkluderer semantic cache policies | | **Azure Managed Redis** | Pay-per-hour per tier | RediSearch inkludert (Enterprise tier) | | **Semantic Kernel / LangChain** | Open source (MIT) | Gratis å bruke | --- ## For arkitekten (Cosmo) ### Når anbefale semantic caching ✅ **ANBEFAL når:** - LLM-kostnader > 25 000 NOK/månd og forventet cache hit rate > 40% - Repeterende spørsmål (chatbot, FAQ, support) - Latenskrav < 200ms (semantic cache gir 5-10ms, LLM 500-2000ms) - RAG-applikasjoner med overlappende queries - Budget constraints kombinert med høyt volum ⚠️ **ADVARER når:** - Real-time data som endrer seg hyppig - PII-sensitive prompts uten anonymisering - Svært lave forventede cache hit rates (<20%) - Kritiske beslutninger som ALLTID må reevalueres (safety, security) ❌ **IKKE ANBEFAL når:** - LLM-kostnader < 10 000 NOK/månd (overhead ikke verdt det) - Ekstremt personaliserte svar (hver prompt er unik) - Latens ikke er bekymring (batch processing) - Team mangler kompetanse på vector databases ### Diskusjonsspørsmål til kunden 1. **"Hvor mange LLM-requests får dere per dag/uke? Hvor mange av disse er semantisk like?"** - Estimerer cache hit rate og ROI 2. **"Hva er den typiske responsetiden fra LLM i dag? Hva er målsetningen?"** - Kvantifiserer latensgevinst 3. **"Inneholder prompts personopplysninger? Hvordan håndteres disse i dag?"** - Identifiserer GDPR-risiko 4. **"Har dere eksisterende Redis-infrastruktur? Hvilken tier?"** - Vurderer om upgrade til Enterprise eller ny Managed Redis 5. **"Hvor kritisk er data freshness? Hvor gammel data er akseptabel?"** - Definerer TTL-strategi 6. **"Bruker dere allerede APIM eller planlegger det?"** - Velger mellom APIM-mønster vs application-level ### Implementeringsrekkefølge (anbefalt) **Fase 1: POC (1-2 uker)** 1. Deploy Azure Managed Redis Memory Optimized 1GB med RediSearch 2. Setup APIM semantic cache policies (eller Python/C# prototype) 3. Test med representative prompts 4. Måle cache hit rate og latens 5. **Go/No-go beslutning basert på metrics** **Fase 2: Pilot (2-4 uker)** 1. Deploy production-size Redis (10GB+) 2. Implementere logging og monitoring (Application Insights) 3. Tune score threshold basert på user feedback 4. Setup cache invalidation strategy 5. Load testing **Fase 3: Production (2-3 uker)** 1. Enable for 10% av trafikk (canary) 2. Monitor cost savings og latens 3. Gradvis scale til 100% 4. Document runbook for cache management ### Monitoring og KPIer **Kritiske metrics å tracke:** | Metric | Target | Verktøy | |--------|--------|---------| | **Cache hit rate** | >60% | APIM Analytics / custom logging | | **P50 latency (cache hit)** | <10ms | Application Insights | | **P50 latency (cache miss)** | <2000ms | Application Insights | | **Cost savings** | >30% | Azure Cost Management + custom calc | | **Redis memory usage** | <80% | Azure Monitor | | **Embeddings API throttling** | 0 errors | APIM / OpenAI metrics | **Alert rules:** - Cache hit rate drop >20% (indicates data drift or threshold misconfiguration) - Redis memory >90% (risk of eviction) - Embeddings API 429 errors (need rate limit increase) ### Trade-offs og risiko | Trade-off | Beskrivelse | Mitigering | |-----------|-------------|------------| | **Staleness risk** | Cached svar kan være utdatert | Tune TTL, event-driven invalidation | | **Cache poisoning** | Malicious/incorrect completions cached | Validate responses, content safety checks | | **Cold start** | Første requests etter deploy er cache misses | Pre-warm cache med common queries | | **Over-caching** | Caching too liberally (high threshold) → wrong answers | Start conservative (0.85), A/B test | | **Complexity** | Ekstra moving parts (Redis, embeddings) | Good monitoring, runbooks | ### Alternative approaches (når semantic caching ikke passer) | Scenario | Alternativ | Hvorfor | |----------|-----------|---------| | **Lav repetisjon** | Prompt optimization + cheaper model | Reduser token count, bruk GPT-3.5 vs GPT-4 | | **Real-time data** | RAG med live data sources | Cache documents, ikke LLM responses | | **Batch processing** | Async batch API (50% discount) | Latens ikke kritisk | | **Personalisert** | User-specific fine-tuning | Hver bruker har unique behavior | --- ## Kilder og verifisering **Microsoft dokumentasjon (HIGH confidence):** - [Enable semantic caching for LLM APIs in Azure API Management](https://learn.microsoft.com/en-us/azure/api-management/azure-openai-enable-semantic-caching) (2026-02 verified) - [Tutorial: Use Azure Managed Redis as a semantic cache](https://learn.microsoft.com/en-us/azure/redis/tutorial-semantic-cache) (2026-02 verified) - [AI gateway in Azure API Management](https://learn.microsoft.com/en-us/azure/api-management/genai-gateway-capabilities) (2026-02 verified) - [Vector similarity search with Azure Cache for Redis](https://learn.microsoft.com/en-us/azure/redis/cache-overview-vector-similarity) (2026-02 verified) **Code samples (HIGH confidence):** - [.NET Redis OutputCache with Azure OpenAI semantic caching sample](https://github.com/CawaMS/OutputCacheOpenAI) (Microsoft community sample) - [Semantic cache policy XML examples](https://learn.microsoft.com/en-us/azure/api-management/azure-openai-enable-semantic-caching#configure-semantic-caching-policies) **Pricing references (MEDIUM confidence):** - [Azure OpenAI Pricing](https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/) (verify current rates) - [Azure Managed Redis Pricing](https://azure.microsoft.com/en-us/pricing/details/cache/) (verify Norway East region) - [Azure API Management Pricing](https://azure.microsoft.com/en-us/pricing/details/api-management/) (verify tier selection) **Framework integrations:** - [LangChain Redis Semantic Cache](https://python.langchain.com/docs/integrations/llm_caching/#redis-cache) - [Semantic Kernel Memory with Redis](https://github.com/microsoft/semantic-kernel) **Confidence levels:** - HIGH: Direkte verifisert i Microsoft Learn (feb 2026) - MEDIUM: Estimater basert på gjeldende priser (kan endre seg) - LOW: Generelle anbefalinger basert på best practices (ikke Microsoft-spesifikke) --- **Generert av:** Cosmo Skyberg, Microsoft AI Solution Architect **MCP research dato:** 2026-02-04 **Neste review:** 2026-05 (ved nye Redis-features eller OpenAI pricing changes)