# Temperature, Sampling, and Generation Parameters

**Last updated:** 2026-02
**Status:** GA
**Category:** Prompt Engineering & LLM Optimization

---

## Introduksjon

Generation parameters er de kontrollerbare verdiene som påvirker hvordan store språkmodeller (LLMs) genererer tekst. Disse parametrene styrer alt fra kreativitet og variasjon til determinisme og lengde på output. Korrekt bruk av generation parameters er kritisk for å oppnå pålitelig, konsistent og formålstjenlig output fra Azure OpenAI-modeller.

Dette dokumentet dekker de viktigste generation parameters tilgjengelig i Microsoft AI-stakken, hvordan de fungerer, og best practices for praktisk bruk.

**Viktig avgrensning:** Generation parameters gjelder primært for GPT-baserte Chat Completion-modeller. Reasoning-modeller (o-series som o1, o3, o4-mini) støtter **ikke** temperature, top_p, frequency_penalty eller presence_penalty. Model Router vil automatisk ignorere disse parametrene hvis en reasoning-modell blir valgt.

---

## Kjernekomponenter

### 1. Temperature

**Område:** 0.0 – 2.0
**Default:** 1.0
**Type:** Randomness control

Temperature kontrollerer tilfeldigheten i modellens output ved å justere sannsynlighetsfordelingen over mulige tokens.

| Temperature | Effekt | Bruksområde |
|-------------|--------|--------------|
| **0.0 – 0.2** | Deterministisk, repeterende, fokusert | Legal dokumenter, faktabaserte svar, data extraction |
| **0.3 – 0.5** | Balansert, moderat variasjon | Forretningskommunikasjon, FAQ-svar, teknisk dokumentasjon |
| **0.6 – 0.9** | Kreativ, varierende, uforutsigbar | Brainstorming, storytelling, markedsføringstekst |
| **1.0 – 2.0** | Høy randomness, eksperimentell | Kreativ skriving, idégenerering, kunstneriske formål |

**Teknisk forklaring:**
Temperature skalerer logits (modellens raw output-score) før softmax-transformasjon. Lavere temperature gjør at høyest-scorende tokens dominerer sannsynlighetsfordelingen, mens høyere temperature flater ut fordelingen og gir mindre sannsynlige tokens større sjanse.

**Best practice (fra Microsoft docs):**
- Juster **enten** temperature **eller** top_p — ikke begge samtidig
- For produksjonsscenarier: start med 0.2–0.3 og test iterativt
- For kreative use cases: start med 0.7–0.8

---

### 2. Top_p (Nucleus Sampling)

**Område:** 0.0 – 1.0
**Default:** 1.0
**Type:** Alternative randomness control

Top_p (nucleus sampling) velger tokens fra den minste mengden som summerer til probability mass `p`. Istedenfor å justere sannsynlighetsfordelingen (som temperature), filtrerer top_p bort tokens med lav sannsynlighet helt.

| Top_p | Effekt | Bruksområde |
|-------|--------|--------------|
| **0.1** | Kun topp 10% sannsynlige tokens | Deterministiske, faktabaserte svar |
| **0.5** | Topp 50% sannsynlige tokens | Balansert variasjon med kontroll |
| **0.9** | Topp 90% sannsynlige tokens | Kreativ output med noe begrensning |
| **1.0** | Alle tokens inkludert | Full randomness (kun begrenset av temperature) |

**Forskjell fra temperature:**
- **Temperature:** Justerer *sannsynlighetsvekter* for alle tokens
- **Top_p:** *Fjerner* tokens under en sannsynlighetsterskel

**Best practice:**
- Bruk top_p = 0.1–0.2 for strukturerte, pålitelige svar
- Øk til 0.7–0.9 for kreative scenarios
- Ikke kombiner med lave temperature-verdier (velg én tilnærming)

---

### 3. Frequency Penalty

**Område:** -2.0 til 2.0
**Default:** 0.0
**Type:** Repetition control

Frequency penalty reduserer sannsynligheten for tokens basert på **hvor mange ganger de allerede har blitt brukt** i genereringen. Jo flere ganger et ord har forekommet, jo mer straffes det.

| Verdi | Effekt |
|-------|--------|
| **0.0** | Ingen straff (default) |
| **0.5** | Moderat straff mot repetisjon |
| **1.0** | Betydelig reduksjon av repetisjon |
| **2.0** | Maksimal penalty (kan føre til unaturlig språk) |

**Bruksområder:**
- Redusere verbatim repetisjon i lange tekster
- Hindre modellen i å gjenta samme fraser eller setninger
- Øke vokabular-diversitet i kreativ skriving

**Advarsel:**
Høye verdier (> 1.0) kan føre til semantisk inkonsistens eller unaturlig språk.

---

### 4. Presence Penalty

**Område:** -2.0 til 2.0
**Default:** 0.0
**Type:** Novelty control

Presence penalty reduserer sannsynligheten for tokens basert på **om de allerede har forekommet** (uavhengig av frekvens). Denne parameteren oppmuntrer modellen til å introdusere nye konsepter.

| Verdi | Effekt |
|-------|--------|
| **0.0** | Ingen straff (default) |
| **0.5** | Moderat oppmuntring til nye topics |
| **1.0** | Sterk fokus på nye emner |
| **2.0** | Maksimal penalty (kan føre til topic drift) |

**Forskjell fra frequency penalty:**
- **Frequency penalty:** Straffes proporsjonalt med hvor *mange ganger* et ord er brukt
- **Presence penalty:** Straffes *binært* — brukt én gang = samme straff som brukt ti ganger

**Bruksområder:**
- Brainstorming og idégenerering
- Unngå at modellen "fester seg" på ett tema
- Øke topical diversity i lange genereringer

---

### 5. Max Tokens / Max Completion Tokens

**Type:** Output length control

| Parameter | Beskrivelse | Nyeste modeller |
|-----------|-------------|-----------------|
| **max_tokens** | Maksimalt antall tokens i completion (legacy parameter) | Alle modeller |
| **max_completion_tokens** | Total lengde inkludert visible + reasoning tokens | o-series, GPT-4o |

**Viktig:**
- Én token ≈ 4 tegn for engelsk tekst (varierer med språk og tokenizer)
- Total kontekstlengde = input tokens + output tokens
- Nyeste modeller (GPT-4o, o-series) støtter opptil **128,000 tokens** total context

**Best practice:**
- Sett max_tokens basert på bruk: 50–100 for korte svar, 500–1000 for lengre tekst
- Overvåk `finish_reason` i API-respons: `"length"` indikerer at output ble trunkert

---

### 6. Seed (Reproducible Output)

**Type:** Determinism control
**Status:** Preview (API version 2023-12-01-preview+)

Seed-parameteren lar deg be modellen om å sample deterministisk. Samme seed + samme parameters = (nesten) samme output.

**Viktig advarsel (fra Microsoft docs):**
> "Determinism is not guaranteed. Even in cases where the seed parameter and `system_fingerprint` are the same across API calls, it is currently not uncommon to still observe a degree of variability in responses."

**Best practice:**
- Bruk seed for testing og debugging
- **Ikke** stol på perfekt determinisme i produksjon
- Kombiner alltid med `system_fingerprint`-monitoring for å detektere backend-endringer

**Eksempel:**
```python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Tell me a story"}],
    seed=42,
    temperature=0.2
)
```

---

### 7. Stop Sequences

**Type:** Output termination control
**Maksimum:** 4 sekvenser

Stop sequences instruerer modellen til å avslutte generering når en spesifikk tekstsekvens oppstår (sekvensen inkluderes ikke i output).

**Bruksområder:**
- Strukturert output (stoppe ved delimiter som `---` eller `###`)
- Unngå at modellen genererer uønsket follow-up content
- Kontrollere format i multi-step generations

**Eksempel:**
```python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "List three colors"}],
    stop=["4.", "\n\n"]  # Stopp ved punkt 4 eller dobbel newline
)
```

---

## Arkitekturmønstre

### Mønster 1: Deterministisk faktabasert output

**Use case:** Legal dokumenter, data extraction, compliance rapporter

```python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "system", "content": "Extract key dates from the text."}],
    temperature=0.0,      # Deterministisk
    max_tokens=200,       # Kort, strukturert output
    frequency_penalty=0.0 # Ingen straff (vi vil ha nøyaktig gjentakelse)
)
```

**Rationale:** Lav temperature sikrer konsistens, ingen penalties for å unngå endring av faktiske data.

---

### Mønster 2: Kreativ content generation

**Use case:** Markedsføringstekst, storytelling, brainstorming

```python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Write a creative ad for a new coffee brand"}],
    temperature=0.8,       # Høy kreativitet
    top_p=0.9,             # IKKE anbefalt: bruk kun én av disse
    presence_penalty=0.6,  # Oppmuntre nye konsepter
    frequency_penalty=0.3, # Reduser verbatim repetisjon
    max_tokens=500
)
```

**Advarsel:** Bruk **enten** temperature=0.8 **eller** top_p=0.9, ikke begge.

---

### Mønster 3: Azure OpenAI On Your Data

**Use case:** RAG-basert Q&A, grounded responses

Azure OpenAI On Your Data legger til egne system-parametere:
- `topNDocuments`: Antall dokumenter hentet fra search (default: 5)
- `strictness`: Filtreringsterskel for relevans (1–5, default: 3)

**Anbefaling:**
- Kombiner med **lav temperature** (0.2–0.3) for faktabaserte svar
- Bruk `inScope=true` for å begrense svar til hentet data
- Overvåk token-forbruk (meta-prompt, retrieved chunks, conversation history)

---

### Mønster 4: Model Router med reasoning models

Azure AI Foundry Model Router kan automatisk velge mellom GPT-modeller og o-series reasoning models.

**Viktig:**
Hvis Model Router velger en o-series model, ignoreres følgende parametere:
- temperature
- top_p
- frequency_penalty
- presence_penalty
- stop sequences

**Alternativt støttet:**
- `reasoning_effort` (low, medium, high) — kun for o-series

**Best practice:**
Unngå å sette parameters som ikke støttes av alle modeller i router-pool, eller implementer fallback-logikk.

---

## Beslutningsveiledning

### Decision Tree: Hvilke parametere skal jeg bruke?

```
Start: Hva er use case?
│
├─ Faktabasert / Deterministisk output?
│  └─ JA → temperature=0.0–0.2, max_tokens=< 500, ingen penalties
│
├─ Kreativ / Varierende output?
│  └─ JA → temperature=0.7–0.9 ELLER top_p=0.8–0.9
│           + presence_penalty=0.3–0.6 (hvis novelty ønskes)
│
├─ Unngå repetisjon?
│  └─ JA → frequency_penalty=0.3–0.7
│
├─ Testing / Debugging?
│  └─ JA → seed=<integer>, temperature=0.0
│
└─ Reasoning-oppgave?
   └─ JA → Bruk o-series model, ignorer sampling parameters
```

---

## Integrasjon med Microsoft-stakken

### Azure OpenAI Service

**API Versions:**
- Reproducible output (seed): `2023-12-01-preview` eller nyere
- Latest stable: `2024-10-21`
- Preview (o-series support): `2025-04-01-preview`

**Tilgjengelige parametere:**
- Alle GPT-modeller: temperature, top_p, max_tokens, frequency_penalty, presence_penalty, stop, seed
- o-series (o1, o3, o4-mini): max_completion_tokens, reasoning_effort (IKKE temperature/top_p)

---

### Copilot Studio

Copilot Studio eksponerer generation parameters via "Generative answers"-node:

| Parameter | Tilgjengelig? | Konfigurasjon |
|-----------|--------------|---------------|
| Temperature | ❌ Nei | Ikke konfigurerbar (settes automatisk av Copilot) |
| Max tokens | ✅ Ja | Via "Response length" slider |
| Top_p | ❌ Nei | Ikke tilgjengelig |

**Konsekvens:**
Copilot Studio er optimalisert for default-verdier. For avansert parameter-kontroll, bruk Azure OpenAI direkte via Power Automate eller custom connectors.

---

### Microsoft Agent Framework

Agent Framework (i Teams AI Library, Semantic Kernel) støtter generation parameters via `CompletionConfiguration`:

**C# (Semantic Kernel):**
```csharp
var settings = new OpenAIPromptExecutionSettings
{
    Temperature = 0.3,
    TopP = 0.9,
    FrequencyPenalty = 0.5,
    PresencePenalty = 0.2,
    MaxTokens = 500
};

var response = await kernel.InvokePromptAsync(prompt, new(settings));
```

**Python (Semantic Kernel):**
```python
settings = AzureChatRequestSettings(
    temperature=0.3,
    top_p=0.9,
    frequency_penalty=0.5,
    presence_penalty=0.2,
    max_tokens=500
)
```

---

### Power Platform AI Builder

AI Builder eksponerer **begrenset parameter-kontroll**:
- Predefined prompts: Ingen konfigurasjon
- Custom prompts (GPT-modeller): Kun "Creativity" slider (mappes til temperature internt)

**Anbefaling:** For avansert kontroll, bruk Azure OpenAI custom connector i Power Automate.

---

## Offentlig sektor (Norge)

### Compliance-hensyn

**Reproducible output (seed-parameter):**
- ⚠️ **Ikke garantert deterministisk** — dokumenter dette i compliance-rapporter
- For juridisk/regulatorisk output: implementer menneske-i-loop validation uavhengig av seed

**Data residency:**
- Azure OpenAI i Norge: Alle API-parametere støttes (inkludert seed)
- Verifiser at seed-parameter ikke logger sensitive verdier (seed-verdien selv er ikke sensitiv, men kontekst kan være det)

---

### Anbefalinger for offentlig sektor

| Scenario | Anbefaling |
|----------|------------|
| **Saksbehandling** | temperature=0.0–0.1, seed for testing, ingen penalties |
| **Borgerservice chatbots** | temperature=0.2–0.3, frequency_penalty=0.3 (unngå repetitive svar) |
| **Dokumentgenerering** | temperature=0.0, max_tokens basert på template, stop sequences for struktur |
| **Internkommunikasjon** | temperature=0.5–0.7, presence_penalty=0.3 (variasjon uten tap av kontroll) |

**Prompt engineering-tips:**
Kombiner generation parameters med:
- Tydelige instruksjoner i system message
- Few-shot examples for konsistens
- Output format specification (JSON, markdown, etc.)

---

## Kostnad og lisensiering

### Token-forbruk

Generation parameters påvirker **ikke direkte token-kostnad**, men kan påvirke **output-lengde**:

| Parameter | Påvirkning på kostnad |
|-----------|----------------------|
| **max_tokens** | Direkte tak på kostnad (setter hard grense) |
| **temperature** | Indirekte: høy temperature kan føre til lengre, mer varierte svar |
| **penalties** | Kan redusere repetisjon → kortere output → lavere kostnad |

**Cost optimization:**
- Sett alltid `max_tokens` for å unngå uventet lange svar
- Bruk `max_completion_tokens` på o-series for å begrense reasoning + visible tokens

---

### Modellpriser (Azue OpenAI, per 1000 tokens, ca. 2026-priser)

| Modell | Input | Output | Generation parameters support |
|--------|-------|--------|------------------------------|
| GPT-4o | $5 | $15 | Full support |
| GPT-4o mini | $0.15 | $0.60 | Full support |
| GPT-3.5 Turbo | $0.50 | $1.50 | Full support |
| o1 | $15 | $60 | max_completion_tokens, reasoning_effort only |
| o3-mini | $1 | $4 | max_completion_tokens, reasoning_effort only |

*(Priser er estimat i USD, verifiser offisielle Azure-priser)*

**NOK-estimat (1 USD ≈ 10 NOK):**
- GPT-4o: 50 kr input / 150 kr output per 1M tokens
- GPT-4o mini: 1.5 kr input / 6 kr output per 1M tokens

---

### Lisensiering

Generation parameters er **tilgjengelige på alle Azure OpenAI-lisenser** (ingen premium-funksjon).

**M365 Copilot:**
- Bruker Azure OpenAI under panseret, men parameters er **ikke konfigurerbare** av sluttbrukere
- Copilot for M365 settes automatisk av Microsoft (typisk temperature ≈ 0.3–0.5)

**Power Platform:**
- AI Builder: Begrenset kontroll (Creativity slider)
- Premium-lisens kreves for GPT-based AI Builder prompts

---

## For arkitekten (Cosmo)

### Når bruke hvilke parametere

**Jeg bruker temperature for:**
- ✅ Å kontrollere kreativitet vs. determinisme
- ✅ Testing av output-variasjon
- ✅ Når jeg vil ha én samlet "randomness"-kontroll

**Jeg bruker top_p for:**
- ✅ Når jeg vil filtrere ut low-probability tokens helt
- ✅ Finere kontroll over "long tail" i output-distribusjon
- ❌ Ikke sammen med temperature (velg én!)

**Jeg bruker frequency_penalty for:**
- ✅ Lange tekster hvor verbatim repetisjon er et problem
- ✅ Kreative scenarios hvor jeg vil øke vokabular-diversitet

**Jeg bruker presence_penalty for:**
- ✅ Brainstorming og idégenerering
- ✅ Når jeg vil at modellen skal utforske flere topics
- ⚠️ Forsiktig i strukturerte oppgaver (kan føre til topic drift)

**Jeg bruker seed for:**
- ✅ Testing og debugging
- ✅ Demonstrasjoner hvor jeg vil ha konsistent output
- ❌ Ikke som garanti for determinisme i produksjon

---

### Troubleshooting

**Problem:** Modellen genererer samme svar hver gang
**Løsning:** Øk temperature til 0.3–0.5, eller sett top_p=0.8–0.9

**Problem:** Output er for tilfeldig / inkonsistent
**Løsning:** Senk temperature til 0.0–0.2, kombiner med seed

**Problem:** Modellen repeterer samme fraser
**Løsning:** Øk frequency_penalty til 0.3–0.7

**Problem:** Modellen "fester seg" på ett tema
**Løsning:** Øk presence_penalty til 0.3–0.5

**Problem:** Output kuttes av midt i setning
**Løsning:** Øk max_tokens, sjekk `finish_reason` i respons

**Problem:** Parameters fungerer ikke (o-series)
**Løsning:** o-series ignorerer temperature/top_p/penalties — bruk reasoning_effort i stedet

---

### Kombinasjoner å unngå

| Kombinasjon | Problem |
|-------------|---------|
| temperature=0.8 + top_p=0.9 | Dobbel randomness-kontroll — bruk kun én! |
| temperature=0.0 + presence_penalty=1.0 | Motstridende: deterministisk vs. novelty-søkende |
| max_tokens=50 + temperature=0.9 | Kort output + høy randomness = inkonsistente resultater |
| seed=42 + temperature=1.5 | Seed fungerer best med lav temperature |

---

### Testing og validering

**Testmatrise for generation parameters:**

```python
test_configs = [
    {"temperature": 0.0, "description": "Deterministisk baseline"},
    {"temperature": 0.3, "description": "Produksjon (balansert)"},
    {"temperature": 0.7, "description": "Kreativ variant"},
    {"temperature": 0.0, "seed": 42, "description": "Reproducible test"}
]

for config in test_configs:
    response = test_prompt(config)
    print(f"{config['description']}: {response}")
```

**Metrikkere å overvåke:**
- Output-lengde (tokens)
- Variasjon mellom kjøringer (cosine similarity)
- Repetisjon-rate (n-gram overlap)
- Finish reason (`stop` vs. `length`)

---

### Arkitekturbeslutninger (ADR-integrasjon)

**Når dokumentere parameter-valg i ADR:**

- [ ] Produksjonssystemer med høye konsistenskrav → temperature < 0.3
- [ ] Kreative use cases → temperature > 0.6 eller top_p < 0.9
- [ ] Compliance-krav til reproducibility → seed-bruk (med disclaimer om ikke-garantert determinisme)
- [ ] Integrasjon med reasoning models → dokumenter at sampling parameters ignoreres

**Eksempel ADR-snippet:**
```markdown
## Decision: Use temperature=0.2 for legal document generation

**Context:** Legal documents require high consistency and factual accuracy.

**Decision:** Set temperature=0.2, frequency_penalty=0.0, presence_penalty=0.0.

**Consequences:**
- ✅ Consistent output across runs
- ✅ Minimal creative variation
- ⚠️ Requires prompt engineering for output diversity (if needed)
```

---

## Kilder og verifisering

### Microsoft Learn dokumentasjon
1. [Prompt engineering techniques — Temperature and Top_p parameters](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/prompt-engineering#temperature-and-top_p-parameters)
2. [Azure OpenAI REST API reference — Completions](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/reference#completions)
3. [Reproducible output with seed parameter](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/reproducible-output)
4. [Model Router limitations (o-series)](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/model-router#use-model-router-in-chats)

### Code samples
5. [Azure OpenAI Python SDK — Chat Completions](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/supported-languages?pivots=programming-language-python#chat)
6. [Semantic Kernel — OpenAIPromptExecutionSettings](https://learn.microsoft.com/en-us/dotnet/api/microsoft.semantickernel.connectors.openai.openaipromptexecutionsettings)

### Validert dato
Alle kilder verifisert: **2026-02-04**

**Confidence markers:**
- Temperature/top_p/max_tokens: ✅ **Høy confidence** (GA, veldokumentert)
- Frequency/presence penalties: ✅ **Høy confidence** (GA, veldokumentert)
- Seed (reproducible output): ⚠️ **Moderat confidence** (Preview, determinisme ikke garantert)
- o-series parameter-støtte: ✅ **Høy confidence** (dokumentert i Model Router guide)

---

**For Cosmo:**
Dette dokumentet gir deg komplett oversikt over generation parameters. Bruk tabellene og decision trees aktivt i arkitekturrådgivning. Husk at **temperature og top_p ikke skal brukes samtidig** — dette er den vanligste feilen jeg ser i kundeimplementasjoner.

Når du rådgir om offentlig sektor, vekt konsistens og reproducibility (men vær ærlig om at seed ikke garanterer 100% determinisme). Kombiner alltid parameter-tuning med solid prompt engineering — parametere alene løser ikke dårlige prompts.
