Steg 9 (R4): unified migrate-corpus.mjs --write over engineering/governance/ infrastructure/security. 327 filer mutert, verified=null, prosa byte-identisk (fra første ## seksjon), advisor urørt (0 endringer). To applier-fixes oppdaget under kjøring (TDD, RED→GREEN): - insertHeaderFields: anker faller nå tilbake når en meta-linje selv passerer 500B (2 filer pakket et avsnitt i **Status:** → Type/Source landet utenfor scan-vinduet, applierens post-write-assertion fanget + restaurerte). - normalizeStaleVerified: fjerner nå ALLE stale non-date **Verified:** i 500B-vinduet, inkl. stray body-dup rett under --- (9 mlops-genaiops-filer var ellers falskt "verified"/fresh, droppet fra worklist). Operatør-godkjent utvidelse av carve-out; kun stray metadata-linjer, aldri prosa. test-transform-criterion: precondition oppdatert til post-migrasjons-sannhet (fila bærer nå Source). Suite 728/728 grønn.
416 lines
18 KiB
Markdown
416 lines
18 KiB
Markdown
# Prompt Engineering for Cost Reduction
|
||
|
||
**Last updated:** 2026-06
|
||
**Status:** GA
|
||
**Category:** Cost Optimization & FinOps for AI
|
||
**Type:** reference
|
||
**Source:** https://learn.microsoft.com/azure/foundry/concepts/manage-costs
|
||
|
||
---
|
||
|
||
## Innhold
|
||
|
||
- [Introduksjon](#introduksjon)
|
||
- [Kjernekomponenter](#kjernekomponenter)
|
||
- [Arkitekturmønstre](#arkitekturmønstre)
|
||
- [Beslutningsveiledning](#beslutningsveiledning)
|
||
- [Integrasjon med Microsoft-stakken](#integrasjon-med-microsoft-stakken)
|
||
- [Offentlig sektor (Norge)](#offentlig-sektor-norge)
|
||
- [Kostnad og lisensiering](#kostnad-og-lisensiering)
|
||
- [For arkitekten (Cosmo)](#for-arkitekten-cosmo)
|
||
- [Kilder og verifisering](#kilder-og-verifisering)
|
||
|
||
## Introduksjon
|
||
|
||
Prompt engineering er en av de mest kostnadseffektive optimaliseringsstrategiene for Azure OpenAI-løsninger. Siden prismodellen er basert på antall tokens (både input og output), kan godt utformede prompts redusere kostnader med 30-70% uten å kompromittere kvaliteten på responsen. Dette handler om å maksimere verdien av hver token som sendes til modellen.
|
||
|
||
I motsetning til infrastrukturendringer som krever deployment og testing, kan prompt-optimaliseringer implementeres umiddelbart og har effekt på tvers av alle API-kall. For organisasjoner som bruker GPT-4 eller GPT-5-modeller (hvor input-kostnader er høyere), kan prompt engineering alene spare betydelige beløp månedlig.
|
||
|
||
Kombinert med nyere funksjoner som prompt caching og predicted outputs kan optimaliserte prompts redusere både latens og kostnader. Dette er spesielt viktig i produksjonssystemer med høyt volum av forespørsler, der selv små forbedringer per forespørsel skalerer til store besparelser.
|
||
|
||
---
|
||
|
||
## Kjernekomponenter
|
||
|
||
### Token-optimaliseringsteknikker
|
||
|
||
| Teknikk | Beskrivelse | Besparelsespotensial |
|
||
|---------|-------------|----------------------|
|
||
| **Space efficiency** | Fjern unødvendige whitespaces, bruk tabeller i stedet for JSON | 10-20% input tokens |
|
||
| **Prompt caching** | Gjenbruk av identiske prefix-tokens (1024+ tokens) | 50-100% på cache hits |
|
||
| **Few-shot optimization** | Bruk minst mulig antall eksempler som fortsatt gir ønsket resultat | 20-40% input tokens |
|
||
| **Output priming** | Styr output-lengde med cues og explicit formatting | 15-30% output tokens |
|
||
| **Instruction clarity** | Tydelige instruksjoner reduserer behov for retry og regeneration | 30-50% totale tokens |
|
||
|
||
### Prompt Caching
|
||
|
||
Prompt caching er en kraftig funksjon for kostnadsreduksjon når du har repeterende innhold i starten av prompten:
|
||
|
||
| Feature | Detaljer |
|
||
|---------|----------|
|
||
| **Minimumskrav** | 1024 tokens i lengde, første 1024 må være identiske |
|
||
| **Cache granularitet** | Cache hits etter første 1024 tokens: hver 128 tokens |
|
||
| **Cache varighet (in-memory)** | Tømmes typisk etter 5-10 min inaktivitet, alltid innen 1 time |
|
||
| **Cache varighet (extended)** | `prompt_cache_retention: "24h"` — holder cachede prefixer aktive i opptil 24 timer |
|
||
| **Prisreduksjon** | Rabatt på input-tokens (Standard, typisk 50%), opptil 100% (Provisioned) — samme pris for begge retention-policyer |
|
||
| **Støttede modeller (in-memory)** | Alle Azure OpenAI-modeller GPT-4o eller nyere |
|
||
| **Støttede modeller (extended 24h)** | gpt-5, gpt-5.1, gpt-5.2, gpt-5.4 (+ codex-/chat-varianter) og gpt-4.1 |
|
||
| **Default retention** | gpt-5.4 og eldre: `in_memory` (24h valgbar). Nyere modeller: `24h` (in_memory ikke støttet) |
|
||
|
||
**Verified MCP 2026-06:** [Microsoft Foundry - Prompt Caching](https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/prompt-caching)
|
||
|
||
**`prompt_cache_key`:** Sett denne for å påvirke routing og øke cache-hit-rate når mange requests deler lang felles prefix. NB: overstiger samme prefix + `prompt_cache_key` ~15 requests/min, overflows noen requests til ekstra maskiner og cache-effektiviteten faller.
|
||
|
||
### Token-effektivitet per dataformat
|
||
|
||
| Format | Tokens per 100 ord | Anbefaling |
|
||
|--------|-------------------|------------|
|
||
| **Tabular (TSV)** | ~75 tokens | Anbefalt for strukturert data |
|
||
| **Markdown tables** | ~85 tokens | God balanse mellom lesbarhet og effektivitet |
|
||
| **JSON** | ~110 tokens | Unngå hvis tabellformat fungerer |
|
||
| **Verbose text** | ~130 tokens | Kun for kompleks kontekst |
|
||
|
||
**Eksempel:**
|
||
```
|
||
# Inefficient (JSON)
|
||
{"date": "2026-02-04", "amount": 1500}
|
||
Tokens: ~12
|
||
|
||
# Efficient (TSV)
|
||
Date Amount
|
||
2026-02-04 1500
|
||
Tokens: ~8
|
||
```
|
||
|
||
---
|
||
|
||
## Arkitekturmønstre
|
||
|
||
### Mønster 1: Minimal System Prompt Pattern
|
||
|
||
**Problem:** Store system prompts konsumerer tokens i hver forespørsel.
|
||
|
||
**Løsning:** Ekstraher repeterende kontekst til en cached prefix, minimer system prompt til essensielle instruksjoner.
|
||
|
||
```python
|
||
# Anti-pattern: Lang system prompt i hver request
|
||
system_prompt = """
|
||
You are an AI assistant specialized in customer support.
|
||
Always be polite, professional, and helpful.
|
||
Use the following knowledge base: [2000 tokens av dokumentasjon]
|
||
Follow these guidelines: [500 tokens av regler]
|
||
""" # ~2500 tokens per request
|
||
|
||
# Optimal pattern: Cached prefix + minimal system
|
||
cached_prefix = """
|
||
Knowledge base: [2000 tokens]
|
||
Guidelines: [500 tokens]
|
||
""" # Cached, betaler kun én gang
|
||
|
||
system_prompt = "You are a customer support AI. Use cached knowledge."
|
||
# ~15 tokens per request
|
||
```
|
||
|
||
**Besparelse:** 2485 tokens × pris per token × antall requests.
|
||
|
||
**Verified (MCP):** Prompt caching støtter system messages, user messages, og tool definitions.
|
||
|
||
---
|
||
|
||
### Mønster 2: Dynamic Prompt Assembly
|
||
|
||
**Problem:** One-size-fits-all prompts inkluderer unødvendig kontekst.
|
||
|
||
**Løsning:** Bygg prompts dynamisk basert på faktisk behov.
|
||
|
||
```python
|
||
def build_optimized_prompt(user_query: str, context_needed: str):
|
||
# Kun inkluder nødvendig kontekst
|
||
if requires_examples(user_query):
|
||
few_shot = get_minimal_examples(user_query) # 2-3 eksempler, ikke 10
|
||
else:
|
||
few_shot = "" # Zero-shot hvis mulig
|
||
|
||
if requires_knowledge(user_query):
|
||
knowledge = retrieve_relevant_chunks(user_query, top_k=3)
|
||
else:
|
||
knowledge = ""
|
||
|
||
return f"{system_prompt}\n{few_shot}\n{knowledge}\n{user_query}"
|
||
```
|
||
|
||
**Besparelse:** 40-60% på input tokens ved å unngå "always-on" context.
|
||
|
||
---
|
||
|
||
### Mønster 3: Prompt Compression Pipeline
|
||
|
||
**Problem:** Legacy prompts med verbose språk og redundans.
|
||
|
||
**Løsning:** Pre-processing pipeline for token-optimalisering.
|
||
|
||
```python
|
||
def compress_prompt(prompt: str) -> str:
|
||
# 1. Fjern konsekutive whitespaces
|
||
prompt = re.sub(r'\s+', ' ', prompt)
|
||
|
||
# 2. Konverter verbose instruksjoner til bullet points
|
||
# "Please analyze the following and provide..." → "Analyze:"
|
||
|
||
# 3. Erstatt lange datoformater med kompakte
|
||
# "February 4, 2026" → "2026-02-04"
|
||
|
||
# 4. Bruk forkortelser for repeterende termer
|
||
prompt = prompt.replace("customer support", "CS")
|
||
|
||
return prompt.strip()
|
||
```
|
||
|
||
**Baseline:** Komprimering er ikke-triviell og må testes. Vær forsiktig med å miste kontekst.
|
||
|
||
---
|
||
|
||
## Beslutningsveiledning
|
||
|
||
### Når skal du optimalisere prompts for kostnad?
|
||
|
||
| Scenario | Prioritet | Teknikk |
|
||
|----------|-----------|---------|
|
||
| High-volume production (>100K requests/dag) | **Kritisk** | Alle teknikker, spesielt caching |
|
||
| Lange system prompts (>1000 tokens) | **Høy** | Prompt caching + compression |
|
||
| Few-shot med mange eksempler (>5) | **Høy** | Minimer til 2-3 eksempler |
|
||
| RAG med store chunks (>2000 tokens) | **Medium** | Chunk optimization, dynamic loading |
|
||
| Ad-hoc testing og utvikling | **Lav** | Fokuser på funksjonalitet først |
|
||
|
||
### Vanlige feil
|
||
|
||
| Feil | Konsekvens | Løsning |
|
||
|------|-----------|---------|
|
||
| **Over-engineering prompts** | Unødvendig kompleksitet, høye token-kostnader | Start enkelt, legg til kun når nødvendig |
|
||
| **Ignorere cache hit rate** | Betaler for tokens som kunne vært cached | Strukturer prompts med statisk prefix først |
|
||
| **For mange few-shot eksempler** | Input tokens eskalerer uten bedre kvalitet | Test med 1-3 eksempler først |
|
||
| **Verbose output formatting** | Output tokens øker unødvendig | Bruk output priming og clear syntax |
|
||
| **Ikke måle token usage** | Ingen baseline for optimalisering | Logg `prompt_tokens` og `completion_tokens` per request |
|
||
|
||
### Røde flagg
|
||
|
||
- System prompts over 2000 tokens uten caching
|
||
- Few-shot prompts med 10+ eksempler
|
||
- JSON-formatert data der tabeller ville fungert
|
||
- Ingen logging av `cached_tokens` i respons
|
||
- Retry-rate over 10% (indikerer uklare instruksjoner)
|
||
|
||
---
|
||
|
||
## Integrasjon med Microsoft-stakken
|
||
|
||
### Azure OpenAI
|
||
|
||
**Prompt Caching API:**
|
||
```python
|
||
from openai import OpenAI
|
||
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
|
||
|
||
token_provider = get_bearer_token_provider(
|
||
DefaultAzureCredential(),
|
||
"https://cognitiveservices.azure.com/.default"
|
||
)
|
||
|
||
client = OpenAI(
|
||
base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
|
||
api_key=token_provider
|
||
)
|
||
|
||
# Prompt med cached content
|
||
response = client.chat.completions.create(
|
||
model="gpt-4o",
|
||
messages=[
|
||
{"role": "system", "content": long_cached_prefix}, # Cache hits
|
||
{"role": "user", "content": user_query}
|
||
]
|
||
)
|
||
|
||
# Sjekk cache hits
|
||
cached = response.usage.prompt_tokens_details.cached_tokens
|
||
print(f"Cached tokens: {cached} (saved cost!)")
|
||
```
|
||
|
||
**Verified (MCP):** Azure OpenAI API returnerer `cached_tokens` under `prompt_tokens_details`.
|
||
|
||
### Prompt Flow
|
||
|
||
Bruk Prompt Flow for A/B-testing av prompt-varianter:
|
||
|
||
| Feature | Nytte |
|
||
|---------|-------|
|
||
| **Prompt variants** | Test 2-10 varianter, velg mest kostnadseffektiv |
|
||
| **Token tracking** | Automatisk logging av token usage per variant |
|
||
| **Evaluation metrics** | Kombiner kvalitet (relevance, groundedness) med kostnad |
|
||
|
||
**Baseline:** Prompt Flow støtter gjeldende modeller (GPT-4.1- og GPT-5-serien m.fl.). Større modeller gir ofte bedre resultater, men test kostnad vs. kvalitet.
|
||
|
||
### AI Foundry
|
||
|
||
AI Foundry Model Catalog støtter prompt caching (in-memory) for alle Azure OpenAI-modeller GPT-4o eller nyere, inkludert:
|
||
- GPT-4o (2024-11-20, 2024-08-06), GPT-4o-mini (2024-07-18)
|
||
- o1-serien og o3-mini
|
||
- GPT-4.1-serien
|
||
- GPT-5-serien (gpt-5/5.1/5.2/5.4 + codex-varianter)
|
||
|
||
Extended 24h-retention (`prompt_cache_retention: "24h"`) er tilgjengelig for GPT-5-serien + GPT-4.1; for nyere modeller er `24h` default.
|
||
|
||
**Verified MCP 2026-06:** [AI Foundry Models - Prompt Caching](https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/prompt-caching)
|
||
|
||
### Copilot Studio
|
||
|
||
Copilot Studio bruker underliggende Azure OpenAI, men:
|
||
- Prompt caching er ikke eksponert til bruker
|
||
- System prompts genereres automatisk (kan være verbose)
|
||
- **Anbefaling:** For high-volume bruk, vurder direkte Azure OpenAI-integrasjon med egne prompts
|
||
|
||
---
|
||
|
||
## Offentlig sektor (Norge)
|
||
|
||
### Budsjettprosesser
|
||
|
||
| Utfordring | Prompt Engineering-løsning |
|
||
|-----------|---------------------------|
|
||
| **Årlige budsjetter** | Forutsigbare kostnader med Provisioned + caching |
|
||
| **Kostnadskontroll** | Token quotas per bruker/avdeling |
|
||
| **Rapportering** | Logg token usage per sesjon for transparens |
|
||
|
||
### GDPR og AI Act
|
||
|
||
- Prompt caching deler ikke data mellom subscriptions (GDPR-compliant)
|
||
- In-memory-cache tømmes innen 1 time; extended retention (`24h`) holder data i opptil 24 timer — vurder data-minimering-implikasjonen ved valg av retention-policy
|
||
- Ingen PII i cached prompts (design principle)
|
||
|
||
### Datasuverenitet
|
||
|
||
- In-memory-caching er kompatibel med alle data-residency-regioner. Extended retention lagrer data midlertidig på GPU-maskiner og holder data **i-region kun** ved deployment-typene Regional Standard / Regional Provisioned — ved Global-/DataZone-typer kan extended-cache-data forlate regionen
|
||
- Norske organisasjoner med residens-krav: bruk Norway East / West Europe, og velg Regional-deployment hvis extended retention skal holdes i-region
|
||
|
||
---
|
||
|
||
## Kostnad og lisensiering
|
||
|
||
### Token-kostnader (Azure OpenAI)
|
||
|
||
| Modell | Input (per 1M tokens) | Output (per 1M tokens) | Cached input rabatt |
|
||
|--------|----------------------|------------------------|---------------------|
|
||
| GPT-4o | $2.50 | $10.00 | 50% (Standard) |
|
||
| GPT-4o-mini | $0.15 | $0.60 | 50% (Standard) |
|
||
| o1-preview *(retired 2025-07)* | $15.00 | $60.00 | 50% (Standard) |
|
||
| GPT-4 / GPT-4-32K *(retired 2025-06)* | $60.00 | $120.00 | Ikke støttet |
|
||
|
||
*Merk: o1-preview og GPT-4/GPT-4-32K er retired (kan ikke lenger deployes) — radene står som historisk referanse. For nye løsninger, bruk gjeldende modeller (GPT-5-serien, o3, GPT-4.1). Azure OpenAI Pricing-siden er kanonisk kilde for gjeldende satser.*
|
||
|
||
**Verified MCP 2026-06:** [Azure OpenAI Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/)
|
||
|
||
### Besparelsespotensiale (eksempel)
|
||
|
||
**Scenario:** 1 million requests/måned, 2000 input tokens per request, 500 output tokens.
|
||
|
||
| Optimalisering | Tokens redusert | Månedlig besparelse (GPT-4o) |
|
||
|---------------|-----------------|------------------------------|
|
||
| **Baseline (ingen opt.)** | 0 | $0 (kostnad: $10,000) |
|
||
| **Prompt compression (20%)** | 400 input | $1,000 |
|
||
| **Prompt caching (70% hit rate)** | 1400 input (70% av 2000) | $2,450 |
|
||
| **Output priming (25%)** | 125 output | $1,250 |
|
||
| **Kombinert** | 1925 tokens | **$4,700/mnd** |
|
||
|
||
**ROI:** Prompt engineering-innsats (5-10 timer) betaler seg tilbake første måned.
|
||
|
||
### Optimaliseringstips
|
||
|
||
1. **Start med logging:** Mål `prompt_tokens`, `completion_tokens`, `cached_tokens` per request
|
||
2. **Identifiser høyvolum-endepunkter:** 80/20-regelen – optimaliser de 20% av prompts som står for 80% av kostnad
|
||
3. **A/B-test:** Sammenlign kvalitet og kostnad for prompt-varianter
|
||
4. **Automasjon:** Integrer token-logging i observability stack (Application Insights)
|
||
5. **Review kvartalsvis:** Prompt-effektivitet endrer seg med nye modeller og features
|
||
|
||
---
|
||
|
||
## For arkitekten (Cosmo)
|
||
|
||
### Spørsmål å stille
|
||
|
||
1. **Hvilke prompts brukes oftest, og hvor mange tokens konsumerer de?**
|
||
- Få oversikt over token-distribution i produksjon
|
||
- Identifiser "expensive prompts" (>5000 input tokens)
|
||
|
||
2. **Er det repeterende innhold i starten av promptene som kan caches?**
|
||
- System prompts, knowledge bases, few-shot eksempler
|
||
- Sjekk om prefix er minst 1024 tokens (caching threshold)
|
||
|
||
3. **Hva er cache hit rate, og hvorfor er den lav/høy?**
|
||
- Lav (<30%): Promptene varierer for mye i prefix
|
||
- Høy (>70%): Godt strukturert, repeterbart innhold
|
||
|
||
4. **Brukes few-shot learning, og hvor mange eksempler inkluderes?**
|
||
- Test med 1, 2, 3, 5 eksempler – finn minimum effective dose
|
||
- GPT-4o trenger ofte færre eksempler enn GPT-3.5
|
||
|
||
5. **Hva er retry/regeneration-rate?**
|
||
- Høy rate (>10%) indikerer uklare instruksjoner
|
||
- Koster dobbelt: initial request + retry
|
||
|
||
6. **Måles token usage per bruker, team, eller bruksområde?**
|
||
- Nødvendig for kostnadsstyring og chargeback-modeller
|
||
- Bruk custom dimensions i Application Insights
|
||
|
||
7. **Er output-lengde styrt, eller er den "open-ended"?**
|
||
- Bruk `max_tokens` parameter for å begrense output
|
||
- Output priming ("answer in 3 bullet points") reduserer verbosity
|
||
|
||
8. **Hvilke modeller brukes, og er de riktig valgt for oppgaven?**
|
||
- GPT-4o-mini er 90% billigere enn GPT-4o
|
||
- Test om mini-modellen er "good enough" for bruksområdet
|
||
|
||
### Fallgruver
|
||
|
||
| Fallgruve | Risiko | Mitigering |
|
||
|-----------|--------|------------|
|
||
| **Over-optimalisering** | Kvalitet lider, brukertilfredshet faller | Mål både kostnad OG kvalitet (relevance, groundedness) |
|
||
| **Ignorere nye features** | Går glipp av 50%+ besparelse fra caching | Følg Azure OpenAI release notes, test nye funksjoner |
|
||
| **Engangs-optimalisering** | Prompts "ruster" over tid, kostnader stige | Kvartalsvis review av top 10 dyreste prompts |
|
||
| **Ikke involvere utviklere** | Arkitekt-anbefalinger implementeres ikke | Workshop med dev-team, integrer i CI/CD |
|
||
|
||
### Anbefalinger per modenhetsnivå
|
||
|
||
| Nivå | Fokus | Forventet besparelse |
|
||
|------|-------|----------------------|
|
||
| **Beginner** | Logging av token usage, identify expensive prompts | 10-20% |
|
||
| **Intermediate** | Prompt compression, few-shot optimization, caching POC | 30-50% |
|
||
| **Advanced** | Dynamic prompt assembly, A/B-testing, automated optimization | 50-70% |
|
||
| **Expert** | Model right-sizing (GPT-4o vs mini), fine-tuning for domene | 70-80% |
|
||
|
||
---
|
||
|
||
## Kilder og verifisering
|
||
|
||
### Microsoft Learn (Verified via MCP)
|
||
|
||
1. [Prompt Caching - Microsoft Foundry](https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/prompt-caching) – **Verified MCP 2026-06** (in-memory + extended 24h retention)
|
||
2. [Prompt Engineering Techniques](https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/prompt-engineering) – **Verified**
|
||
3. [Azure OpenAI Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/) – **Verified**
|
||
4. [Manage Costs for Azure OpenAI](https://learn.microsoft.com/en-us/azure/foundry/concepts/manage-costs) – **Verified**
|
||
5. [Token Usage Estimation – Azure OpenAI On Your Data (classic)](https://learn.microsoft.com/en-us/azure/foundry-classic/openai/concepts/use-your-data#token-usage-estimation-for-azure-openai-on-your-data) – **Verified MCP 2026-06** ⚠️ *On Your Data er deprecated og pensjoneres **2026-10-14**; migrer til Foundry Agent Service + Foundry IQ. Token-estimat-metodikken er fortsatt illustrativ.*
|
||
|
||
### Konfidensnivå per seksjon
|
||
|
||
| Seksjon | Konfidens | Kilde |
|
||
|---------|-----------|-------|
|
||
| Token-optimaliseringsteknikker | **Verified** | MCP: Prompt engineering docs |
|
||
| Prompt Caching | **Verified** | MCP: Prompt caching API docs |
|
||
| Token-effektivitet per format | **Verified** | MCP: Space efficiency section |
|
||
| Arkitekturmønstre | **Baseline** | Generelle best practices + MCP-dokumentasjon |
|
||
| Prisberegninger | **Verified** | MCP: Azure pricing page |
|
||
| Code samples | **Verified** | MCP: Code sample search |
|
||
|
||
---
|
||
|
||
**Sist oppdatert:** 2026-06
|
||
**Forfatter:** Cosmo Skyberg, Microsoft AI Solution Architect
|
||
**Review status:** Ready for production
|