692 lines
24 KiB
Markdown
692 lines
24 KiB
Markdown
# Multi-Turn Conversation and Context Management
|
||
|
||
**Last updated:** 2026-06-24
|
||
**Status:** GA
|
||
**Category:** Prompt Engineering & LLM Optimization
|
||
|
||
---
|
||
|
||
## Introduksjon
|
||
|
||
Multi-turn conversation management er evnen til å vedlikeholde kontekst og samtaleflyt over flere interaksjoner med en LLM. Dette er fundamentalt for å bygge naturlige, kontekstbevisste AI-applikasjoner som chatboter, assistenter og agenter.
|
||
|
||
Azure OpenAI Chat Completion API er designet spesifikt for samtaleformater hvor modellen mottar en komplett samtalehistorikk og genererer neste respons. Modellen har ingen intern hukommelse – all kontekst må eksplisitt sendes med hver request.
|
||
|
||
**Kritiske konsepter:**
|
||
- Modellen er **stateless** – ingen persistent hukommelse mellom requests
|
||
- **Samtalehistorikk** må inkluderes eksplisitt i hver API-call
|
||
- **Token limits** setter grenser for hvor lang samtalehistorikk kan være
|
||
- **Context window management** er essensielt for langvarige samtaler
|
||
|
||
**Arkitektmessig betydning:** Multi-turn management påvirker både brukeropplevelse, kostnad, latency og modellkvalitet. Feil strategi kan føre til konteksttap, høye kostnader eller dårlige responser.
|
||
|
||
---
|
||
|
||
## Kjernekomponenter
|
||
|
||
### 1. Message Roles
|
||
|
||
Chat Completion API bruker tre primære roller:
|
||
|
||
| Rolle | Formål | Plassering |
|
||
|-------|--------|------------|
|
||
| `system` | Instruksjoner, kontekst, persona-definisjon | Første melding (anbefalt) |
|
||
| `user` | Brukerinput, spørsmål, kommandoer | Brukerens meldinger |
|
||
| `assistant` | Modellens svar, tidligere AI-responser | AI-genererte meldinger |
|
||
|
||
**System message:** Definerer modellens oppførsel og rammeverk. Bevares typisk gjennom hele samtalen.
|
||
|
||
**Eksempel:**
|
||
```json
|
||
[
|
||
{"role": "system", "content": "Du er en hjelpsom assistent for teknisk support."},
|
||
{"role": "user", "content": "Hvordan resetter jeg passordet mitt?"},
|
||
{"role": "assistant", "content": "For å resette passordet ditt..."},
|
||
{"role": "user", "content": "Hva hvis jeg ikke får e-posten?"}
|
||
]
|
||
```
|
||
|
||
### 2. Conversation History Management
|
||
|
||
**Client-side storage:** For Chat Completion services (GPT-4, GPT-4o, etc.) lagres samtalehistorikk på klientsiden og sendes med hver request.
|
||
|
||
**Server-side storage:** For Azure AI Agent service lagres historikk serversiden – kun en referanse sendes.
|
||
|
||
**Viktige metrikker:**
|
||
- **Token count per message** = prompt tokens + completion tokens
|
||
- **Total token count** = sum av alle meldinger + estimert respons
|
||
- **Context window** = maksimal token limit per modell (8K-128K avhengig av modell)
|
||
|
||
### 3. Token Counting
|
||
|
||
Token-telling er kritisk for å unngå context window overflow. Microsoft anbefaler `tiktoken`-biblioteket:
|
||
|
||
```python
|
||
import tiktoken
|
||
|
||
def num_tokens_from_messages(messages, model="gpt-4o"):
|
||
encoding = tiktoken.encoding_for_model(model)
|
||
tokens_per_message = 3 # For GPT-4o, GPT-4.1, o-series
|
||
tokens_per_name = 1
|
||
|
||
num_tokens = 0
|
||
for message in messages:
|
||
num_tokens += tokens_per_message
|
||
for key, value in message.items():
|
||
num_tokens += len(encoding.encode(value))
|
||
if key == "name":
|
||
num_tokens += tokens_per_name
|
||
num_tokens += 3 # Overhead for completion priming
|
||
return num_tokens
|
||
```
|
||
|
||
**Viktig:** Token count for rate limiting (TPM) er et **estimat** basert på `max_tokens`-parameteren, ikke eksakt billing token count.
|
||
|
||
### 4. Session Management
|
||
|
||
**Microsoft Agent Framework** tilbyr strukturert session management:
|
||
|
||
**C# (.NET):**
|
||
```csharp
|
||
AgentSession session = await agent.CreateSessionAsync();
|
||
await agent.RunAsync("First question", session);
|
||
await agent.RunAsync("Follow-up question", session);
|
||
```
|
||
|
||
**Python:**
|
||
```python
|
||
thread = agent.get_new_thread()
|
||
result1 = await agent.run("First question", thread=thread)
|
||
result2 = await agent.run("Follow-up question", thread=thread)
|
||
```
|
||
|
||
**Multiple conversations:** Én agent kan håndtere flere uavhengige samtaler via separate session/thread-objekter.
|
||
|
||
---
|
||
|
||
## Arkitekturmønstre
|
||
|
||
### Mønster 1: Sliding Window (Anbefalt for lange samtaler)
|
||
|
||
**Prinsipp:** Behold system message + siste N meldinger. Fjern eldste meldinger når token limit nærmes.
|
||
|
||
**Fordeler:**
|
||
- Forhindrer context overflow
|
||
- Lavere kostnader ved lange samtaler
|
||
- Konsistent latency
|
||
|
||
**Ulemper:**
|
||
- Tap av tidlig kontekst
|
||
- Modellen "glemmer" tidligere i samtalen
|
||
|
||
**Implementering:**
|
||
```python
|
||
max_response_tokens = 250
|
||
token_limit = 4096
|
||
conversation = [{"role": "system", "content": "..."}]
|
||
|
||
while True:
|
||
user_input = input("Q: ")
|
||
conversation.append({"role": "user", "content": user_input})
|
||
|
||
conv_tokens = num_tokens_from_messages(conversation)
|
||
while conv_tokens + max_response_tokens >= token_limit:
|
||
del conversation[1] # Bevarer system message (index 0)
|
||
conv_tokens = num_tokens_from_messages(conversation)
|
||
|
||
response = client.chat.completions.create(
|
||
model="gpt-4o",
|
||
messages=conversation,
|
||
max_tokens=max_response_tokens
|
||
)
|
||
conversation.append({"role": "assistant", "content": response.choices[0].message.content})
|
||
```
|
||
|
||
**Når bruke:** Customer support chatbots, assistenter med uendelige samtaler.
|
||
|
||
### Mønster 2: Summarization-Based Context
|
||
|
||
**Prinsipp:** Oppsummer eldre deler av samtalen, behold kun sammendrag + siste N meldinger.
|
||
|
||
**Fordeler:**
|
||
- Bevarer viktig kontekst fra hele samtalen
|
||
- Reduserer token count betydelig
|
||
- Bedre kontekstforståelse enn sliding window
|
||
|
||
**Ulemper:**
|
||
- Ekstra LLM-call for oppsummering (kostnad + latency)
|
||
- Potensielt informasjonstap i oppsummeringen
|
||
|
||
**Implementering (konseptuell):**
|
||
```python
|
||
def summarize_conversation(messages):
|
||
summary_prompt = {
|
||
"role": "system",
|
||
"content": "Oppsummer følgende samtale kort og presist."
|
||
}
|
||
summary_response = client.chat.completions.create(
|
||
model="gpt-4o-mini", # Billigere modell for oppsummering
|
||
messages=[summary_prompt] + messages
|
||
)
|
||
return summary_response.choices[0].message.content
|
||
|
||
# Når token limit nærmes:
|
||
if token_count > threshold:
|
||
old_messages = conversation[1:10] # Skip system message
|
||
summary = summarize_conversation(old_messages)
|
||
conversation = [
|
||
conversation[0], # System message
|
||
{"role": "assistant", "content": f"[Sammendrag av tidligere samtale: {summary}]"},
|
||
*conversation[10:] # Siste N meldinger
|
||
]
|
||
```
|
||
|
||
**Når bruke:** Komplekse problemløsningssesjoner, teknisk support med flere trinn.
|
||
|
||
### Mønster 3: Responses API (Managed History)
|
||
|
||
**Prinsipp:** Bruk Azure OpenAI Responses API som automatisk håndterer kontekst-truncation.
|
||
|
||
**Fordeler:**
|
||
- Ingen manuell token management
|
||
- Microsoft håndterer best practices
|
||
- Enklere implementering
|
||
|
||
**Ulemper:**
|
||
- Mindre kontroll over hva som fjernes
|
||
- Kun tilgjengelig i nyere API-versjoner
|
||
|
||
**Implementering:**
|
||
```python
|
||
# Responses API håndterer automatisk truncation
|
||
response = client.responses.create(
|
||
model="gpt-4o",
|
||
messages=conversation
|
||
)
|
||
```
|
||
|
||
**Når bruke:** Prototyper, enkle chatbots, applikasjoner uten spesialkrav til kontekstbevaring.
|
||
|
||
### Mønster 4: Stored Completions (Audit & Fine-tuning)
|
||
|
||
**Prinsipp:** Lagre samtalehistorikk for senere evaluering eller fine-tuning.
|
||
|
||
**Fordeler:**
|
||
- Full audit trail
|
||
- Data for modell-forbedring
|
||
- Compliance-vennlig
|
||
|
||
**Ulemper:**
|
||
- Ekstra storage-kostnad
|
||
- Privacy-implikasjoner
|
||
|
||
**Implementering:**
|
||
```python
|
||
response = client.chat.completions.create(
|
||
model="gpt-4o",
|
||
messages=conversation,
|
||
store=True, # Aktiver stored completions
|
||
metadata={"user_id": "123", "session_id": "abc"}
|
||
)
|
||
```
|
||
|
||
**Når bruke:** Enterprise-applikasjoner med compliance-krav, continuous learning-scenarier.
|
||
|
||
### Mønster 5: Vector Store Chat History
|
||
|
||
**Prinsipp:** Lagre samtalehistorikk i vector store (Azure AI Search, Cosmos DB) for persistent sessions.
|
||
|
||
**Fordeler:**
|
||
- Persistent på tvers av sesjoner
|
||
- Skalerbart for mange brukere
|
||
- Semantic search i historikk mulig
|
||
|
||
**Ulemper:**
|
||
- Ekstra infrastruktur
|
||
- Mer kompleks implementering
|
||
|
||
**Implementering (Agent Framework):**
|
||
```csharp
|
||
VectorStore vectorStore = new InMemoryVectorStore();
|
||
|
||
AIAgent agent = new AzureOpenAIClient(new Uri("..."), new AzureCliCredential())
|
||
.GetChatClient("gpt-4o-mini")
|
||
.AsAIAgent(new ChatClientAgentOptions
|
||
{
|
||
ChatHistoryProviderFactory = (ctx, ct) => new ValueTask<ChatHistoryProvider>(
|
||
new VectorChatHistoryProvider(
|
||
vectorStore,
|
||
ctx.SerializedState,
|
||
ctx.JsonSerializerOptions))
|
||
});
|
||
|
||
AgentSession session = await agent.CreateSessionAsync();
|
||
JsonElement serializedSession = session.Serialize(); // Lagres i database
|
||
AgentSession resumedSession = await agent.DeserializeSessionAsync(serializedSession);
|
||
```
|
||
|
||
**Når bruke:** Multi-device applikasjoner, enterprise chatbots med persistent history.
|
||
|
||
---
|
||
|
||
## Beslutningsveiledning
|
||
|
||
### Velg strategi basert på scenario
|
||
|
||
| Scenario | Anbefalt mønster | Begrunnelse |
|
||
|----------|------------------|-------------|
|
||
| Customer support chatbot (kort varighet) | Sliding Window | Enkel, kostnadseffektiv |
|
||
| Teknisk problemløsning (kompleks) | Summarization-Based | Bevarer viktig kontekst |
|
||
| Enkel FAQ-bot | Responses API | Minimal kompleksitet |
|
||
| Enterprise compliance | Stored Completions | Audit trail nødvendig |
|
||
| Multi-device applikasjon | Vector Store | Persistent på tvers av devices |
|
||
| Prototype/MVP | Responses API eller Sliding Window | Rask implementering |
|
||
|
||
### Token limit per modell (Azure OpenAI)
|
||
|
||
| Modell | Context Window | Anbefalt max conversation tokens |
|
||
|--------|----------------|----------------------------------|
|
||
| gpt-4o | 128K tokens | 120K (buffer for respons) |
|
||
| gpt-4o-mini | 128K tokens | 120K |
|
||
| gpt-4.1 | 128K tokens | 120K |
|
||
| gpt-4.1-mini | 128K tokens | 120K |
|
||
| gpt-4 Turbo | 128K tokens | 120K |
|
||
| gpt-35-turbo | 16K tokens | 14K |
|
||
| o1, o3-mini, o4-mini | 128K-200K | Varierer per modell |
|
||
|
||
**Viktig:** Sjekk alltid [models page](https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure) for oppdaterte limits.
|
||
|
||
### Truncation-strategi
|
||
|
||
| Strategi | Kompleksitet | Kontekstbevaring | Kostnad | Brukscase |
|
||
|----------|--------------|------------------|---------|-----------|
|
||
| FIFO (First In, First Out) | Lav | Lav | Lav | Enkle chatbots |
|
||
| Sliding Window | Lav | Medium | Lav | Generell bruk |
|
||
| Summarization | Medium | Høy | Medium | Komplekse samtaler |
|
||
| Semantic Pruning | Høy | Høy | Medium | Spesialiserte use cases |
|
||
| Responses API | Minimal | Medium | Lav | Prototyper |
|
||
|
||
### Rate Limiting og TPM
|
||
|
||
**TPM (Tokens-Per-Minute)** er basert på **estimert** token count:
|
||
- Prompt tokens + `max_tokens` parameter + `best_of` parameter
|
||
- **Ikke** identisk med billing token count
|
||
|
||
**RPM (Requests-Per-Minute)** er koblet til TPM, men **forholdet varierer per modell**. For eldre chat-modeller (gpt-4o-klassen) er det **6 RPM per 1K TPM**; reasoning-modeller bruker andre forhold (f.eks. o3 og o4-mini: 1 RPM/1K TPM; o3-mini, o1-mini og o3-pro: 1 RPM/10K TPM; o1: 1 RPM/6K TPM).
|
||
|
||
**Best practices:**
|
||
- Implementer exponential backoff ved 429-errors
|
||
- Fordel requests jevnt over tid (unngå bursts)
|
||
- Sett `max_tokens` konservativt for å unngå false rate limits
|
||
- Bruk batch-prosessering for store volumes
|
||
|
||
---
|
||
|
||
## Integrasjon med Microsoft-stakken
|
||
|
||
### Azure OpenAI Chat Completion API
|
||
|
||
**Standard integrasjon:**
|
||
```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://<resource>.openai.azure.com/openai/v1/",
|
||
api_key=token_provider
|
||
)
|
||
|
||
conversation = [{"role": "system", "content": "You are a helpful assistant."}]
|
||
response = client.chat.completions.create(
|
||
model="gpt-4o",
|
||
messages=conversation
|
||
)
|
||
```
|
||
|
||
**Streaming support:** Bruk `stream=True` for real-time responser.
|
||
|
||
### Microsoft Agent Framework
|
||
|
||
**Fordeler:**
|
||
- Abstraherer conversation management
|
||
- Støtter både client-side og server-side history
|
||
- Innebygd session serialization
|
||
- Multi-conversation support out-of-the-box
|
||
|
||
**Når bruke:** Enterprise-applikasjoner med kompleks agent-logikk.
|
||
|
||
### Copilot Studio
|
||
|
||
**Innebygd conversation management:**
|
||
- Automatisk context tracking
|
||
- Slot filling for multi-turn information gathering
|
||
- State management via Topics
|
||
|
||
**Relevant for:** Low-code/no-code scenarios, Power Platform-integrasjoner.
|
||
|
||
### Semantic Kernel
|
||
|
||
**Chat History i SK:**
|
||
```csharp
|
||
using Microsoft.SemanticKernel;
|
||
using Microsoft.SemanticKernel.ChatCompletion;
|
||
|
||
var chatHistory = new ChatHistory();
|
||
chatHistory.AddSystemMessage("You are a helpful assistant.");
|
||
chatHistory.AddUserMessage("What is Azure AI?");
|
||
|
||
var response = await chatCompletionService.GetChatMessageContentAsync(
|
||
chatHistory,
|
||
executionSettings,
|
||
kernel
|
||
);
|
||
|
||
chatHistory.AddAssistantMessage(response.Content);
|
||
```
|
||
|
||
**Fordeler:** Plugin-integrasjon, function calling, planlegging.
|
||
|
||
### Microsoft Foundry (tidligere Azure AI Studio)
|
||
|
||
**Stored Completions:** Synliggjøres automatisk i AI Foundry portal under "Stored Completions" pane.
|
||
|
||
**Playground:** Interaktiv testing av multi-turn samtaler med visuell chat interface.
|
||
|
||
### Power Automate + Azure OpenAI
|
||
|
||
**Pattern:** Lagre conversation state i Dataverse eller SharePoint:
|
||
1. Hent tidligere meldinger fra storage
|
||
2. Legg til ny brukermelding
|
||
3. Call Azure OpenAI
|
||
4. Lagre assistant-respons tilbake til storage
|
||
5. Truncate hvis token limit nærmes
|
||
|
||
**Utfordring:** Ingen innebygd token counting – bruk custom connector med Azure Function.
|
||
|
||
---
|
||
|
||
## Offentlig sektor (Norge)
|
||
|
||
### Personvern og GDPR
|
||
|
||
**Samtalehistorikk inneholder potensielt persondata:**
|
||
- Navn, personnummer, adresser i brukerinput
|
||
- Sensitive samtaler (helse, økonomi, juridiske spørsmål)
|
||
|
||
**Krav:**
|
||
- **Sletting:** Implementer mekanisme for å slette samtalehistorikk på forespørsel
|
||
- **Lagringstid:** Definer og håndhev maksimal lagringstid
|
||
- **Anonymisering:** Vurder å anonymisere historikk før langtidslagring
|
||
- **Stored Completions:** Vær obs på at `store=True` lagrer data i Microsoft-infrastruktur
|
||
|
||
**Anbefaling:**
|
||
- Unngå `store=True` for sensitive use cases
|
||
- Implementer client-side history med egen storage-løsning
|
||
- Bruk Azure Private Link for data i transit
|
||
|
||
### Schrems II og dataoverføring
|
||
|
||
**Azure OpenAI data residency:**
|
||
- Regional deployment mulig (Norway East, West Europe)
|
||
- **Datazone Standard:** Garanterer data forblir i EU/EØS
|
||
- **Global Standard:** Data kan traversere regioner (unngå for sensitive data)
|
||
|
||
**Multi-turn impact:** Samtalehistorikk sendes ved hver request – velg regional deployment for compliance.
|
||
|
||
### Tilgjengelighetskrav (WCAG)
|
||
|
||
**Multi-turn conversation påvirker UU:**
|
||
- **Context awareness:** Brukere med kognitive utfordringer trenger klar referanse til tidligere i samtalen
|
||
- **Timeout:** Lange pauser i samtale skal ikke føre til konteksttap
|
||
- **Recap-funksjon:** Tilby oppsummering av samtale så langt
|
||
|
||
**Anbefaling:** Implementer visuell samtalehistorikk i UI + "Hva har vi snakket om?"-funksjon.
|
||
|
||
### Sikkerhet og autorisasjon
|
||
|
||
**Per-bruker conversation isolation:**
|
||
- Implementer streng autorisasjon på session/thread-objekter
|
||
- Aldri la én bruker få tilgang til en annens samtalehistorikk
|
||
- Vurder Entra ID-integrasjon for autentisering
|
||
|
||
**Agent Framework pattern:**
|
||
```csharp
|
||
// Lagre session med user-knytning
|
||
var userId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
|
||
var sessionId = $"{userId}_{Guid.NewGuid()}";
|
||
// Valider at bruker har tilgang ved gjenopptak
|
||
```
|
||
|
||
---
|
||
|
||
## Kostnad og lisensiering
|
||
|
||
### Kostnadsmodell for multi-turn
|
||
|
||
**Token-basert prising:** Du betaler for **alle tokens** sendt i hver request, inkludert full samtalehistorikk.
|
||
|
||
**Eksempel (gpt-4o i Norway East):**
|
||
- Input: $0.005 per 1K tokens
|
||
- Output: $0.015 per 1K tokens
|
||
|
||
**Scenario:** 10-turn samtale hvor hver turn inkluderer hele historikken:
|
||
- Turn 1: 100 tokens (system) + 50 (user) + 100 (response) = 250 tokens
|
||
- Turn 2: 100 + 50 + 100 + 50 + 100 = 400 tokens
|
||
- Turn 3: 100 + 50 + 100 + 50 + 100 + 50 + 100 = 550 tokens
|
||
- ...
|
||
- **Total over 10 turns:** ~15 000 tokens (voksende lineært)
|
||
|
||
**Kostnad:** ~$0.10-0.15 per 10-turn samtale (avhengig av input/output ratio)
|
||
|
||
### Optimeringsstrategier
|
||
|
||
| Teknikk | Kostnadsbesparing | Trade-off |
|
||
|---------|-------------------|-----------|
|
||
| Sliding Window (behold 5 siste meldinger) | 40-60% | Konteksttap |
|
||
| Summarization | 30-50% | Ekstra LLM-call |
|
||
| Bruk gpt-4o-mini for oppsummering | 80% på summary-calls | Marginalt kvalitetstap |
|
||
| Aggressive truncation (3 siste meldinger) | 60-70% | Betydelig konteksttap |
|
||
| Responses API | 20-40% (Microsoft-managed) | Mindre kontroll |
|
||
|
||
**Anbefalt strategi for offentlig sektor:**
|
||
1. **Start med Sliding Window** (5-7 siste meldinger)
|
||
2. **Implementer summarization** for samtaler >10 turns
|
||
3. **Bruk gpt-4o-mini** for summarization og enkle spørsmål
|
||
4. **Monitor token usage** via Azure Monitor + custom metrics
|
||
|
||
### Lisensiering
|
||
|
||
**Azure OpenAI:** Ingen spesifikk lisens for multi-turn – samme TPM quota gjelder.
|
||
|
||
**Quota management:**
|
||
- **Default tier:** 450K TPM (gpt-4o Global Standard)
|
||
- **Enterprise tier:** 30M TPM (gpt-4o Global Standard)
|
||
|
||
**Multi-turn påvirkning på quota:**
|
||
- Lange samtaler kan raskt fylle TPM-quota hvis mange brukere samtaler samtidig
|
||
- Vurder **Provisioned Throughput** for høy concurrency
|
||
|
||
**Copilot Studio:**
|
||
- Multi-turn inkludert i standard message quota (ikke ekstra kostnad per turn)
|
||
- Relevant for offentlig sektor: Copilot for M365 krever E3/E5-lisens
|
||
|
||
---
|
||
|
||
## For arkitekten (Cosmo)
|
||
|
||
### Confidence markers
|
||
|
||
| Aspekt | Confidence | Kommentar |
|
||
|--------|-----------|-----------|
|
||
| Token counting metoder | **Høy** | Verifisert mot offisiell Microsoft docs |
|
||
| Sliding Window pattern | **Høy** | Standard best practice |
|
||
| Responses API | **Medium** | Nyere feature, mindre dokumentert |
|
||
| Stored Completions privacy | **Medium** | Begrenset docs på data residency |
|
||
| TPM/RPM relationship | **Høy** | Offisiell Microsoft spec |
|
||
| Cost estimates | **Medium** | Basert på jan 2026 priser (kan endre) |
|
||
|
||
### Når anbefale hva
|
||
|
||
**Enkel chatbot (FAQ, customer support):**
|
||
→ Sliding Window + gpt-4o-mini → NOK 500-2000/mnd for 1000 samtaler
|
||
|
||
**Kompleks assistent (teknisk support, legal advice):**
|
||
→ Summarization + gpt-4o + Vector Store → NOK 5000-15000/mnd for 1000 samtaler
|
||
|
||
**Enterprise multi-device app:**
|
||
→ Agent Framework + Azure AI Search (vector store) + Datazone Standard → NOK 20000-50000/mnd
|
||
|
||
**Prototype/POC:**
|
||
→ Responses API + minimal logging → NOK 200-1000/mnd for testing
|
||
|
||
### Arkitektur decision points
|
||
|
||
**Spørsmål å stille kunde:**
|
||
|
||
1. **Hvor lange er typiske samtaler?** (5 turns vs 50 turns)
|
||
- <10 turns → Sliding Window
|
||
- 10-30 turns → Sliding Window med summarization fallback
|
||
- >30 turns → Summarization eller managed history
|
||
|
||
2. **Hvor viktig er tidlig kontekst?** (kan modellen "glemme"?)
|
||
- Ikke kritisk → FIFO truncation
|
||
- Moderat viktig → Sliding Window
|
||
- Svært viktig → Summarization eller semantic pruning
|
||
|
||
3. **Trenger dere audit trail?** (compliance, training data)
|
||
- Ja → Stored Completions eller egen logging
|
||
- Nei → In-memory history
|
||
|
||
4. **Multi-device support?** (fortsett samtale på annen enhet)
|
||
- Ja → Vector Store eller Dataverse storage
|
||
- Nei → In-memory med session serialization
|
||
|
||
5. **Volum og concurrency?** (hvor mange samtidige brukere?)
|
||
- <100 concurrent → Standard TPM quota
|
||
- 100-1000 concurrent → Provisioned Throughput
|
||
- >1000 concurrent → Multi-region deployment
|
||
|
||
### Integration patterns
|
||
|
||
**Pattern A: Serverless (Azure Functions + Cosmos DB)**
|
||
```
|
||
User → API Management → Function App → Azure OpenAI
|
||
↓
|
||
Cosmos DB (conversation history)
|
||
```
|
||
- **Fordel:** Auto-scaling, lav vedlikeholdskostnad
|
||
- **Ulempe:** Cold start latency
|
||
|
||
**Pattern B: Container-based (AKS + Redis)**
|
||
```
|
||
User → Application Gateway → AKS Pods → Azure OpenAI
|
||
↓
|
||
Redis Cache (history)
|
||
```
|
||
- **Fordel:** Lav latency, høy throughput
|
||
- **Ulempe:** Høyere vedlikeholdskostnad
|
||
|
||
**Pattern C: Power Platform (Copilot Studio + Dataverse)**
|
||
```
|
||
User → Copilot Studio → Azure OpenAI
|
||
↓
|
||
Dataverse (managed history)
|
||
```
|
||
- **Fordel:** No-code/low-code, innebygd compliance
|
||
- **Ulempe:** Mindre fleksibilitet
|
||
|
||
### Red flags å se etter
|
||
|
||
❌ **Ingen token management** → System vil feile ved lange samtaler
|
||
❌ **Hardkodet max_tokens=4096** → Kan spise opp context window
|
||
❌ **Ingen retry logic** → 429-errors vil ødelegge brukeropplevelse
|
||
❌ **Samtalehistorikk i local storage** → Privacy-risiko, ingen server-side validering
|
||
❌ **Manglende session isolation** → Sikkerhetsrisiko (bruker A ser bruker B's samtale)
|
||
❌ **Global Standard for sensitive data** → Schrems II-problemstikk
|
||
|
||
### Anbefalte metrics å tracke
|
||
|
||
```
|
||
- Gjennomsnittlig tokens per request (input + output)
|
||
- Gjennomsnittlig samtale-lengde (antall turns)
|
||
- 95th percentile conversation token count
|
||
- Andel samtaler som treffer token limit
|
||
- Token count distribution (histogram)
|
||
- Cost per conversation
|
||
- Rate limit errors (429) per time window
|
||
- Latency per turn (påvirkes av conversation length)
|
||
```
|
||
|
||
**Implementering:** Bruk Azure Monitor + Application Insights custom metrics.
|
||
|
||
### Teknisk gjeld å unngå
|
||
|
||
1. **Hardkoding av modellnavn i token counting** → Bruk dynamic model detection
|
||
2. **Ingen versjonering av samtaleformat** → Umulig å migrere senere
|
||
3. **Manglende conversation timeout** → Infinite growth av history
|
||
4. **Ingen graceful degradation** → System crasher ved token limit
|
||
|
||
---
|
||
|
||
## Kilder og verifisering
|
||
|
||
### Microsoft Learn (offisiell dokumentasjon)
|
||
|
||
1. **Work with chat completions models**
|
||
https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/chatgpt
|
||
*Kjernereferanse for Chat Completion API, conversation loop patterns, token management*
|
||
|
||
2. **Multi-turn conversations with an agent**
|
||
https://learn.microsoft.com/en-us/agent-framework/tutorials/agents/multi-turn-conversation
|
||
*Agent Framework session management, stateless architecture*
|
||
|
||
3. **Azure OpenAI stored completions & distillation**
|
||
https://learn.microsoft.com/en-us/azure/foundry-classic/openai/how-to/stored-completions
|
||
*Stored completions feature, metadata enrichment*
|
||
|
||
4. **Azure OpenAI quotas and limits**
|
||
https://learn.microsoft.com/en-us/azure/foundry/openai/quotas-limits
|
||
*Token limits per modell, TPM/RPM relationship, rate limiting*
|
||
|
||
5. **Manage Azure OpenAI quota**
|
||
https://learn.microsoft.com/en-us/azure/foundry-classic/openai/how-to/quota
|
||
*Rate limit mechanics, best practices, token counting for rate limits*
|
||
|
||
6. **Azure OpenAI Assistants API context window management**
|
||
https://learn.microsoft.com/en-us/azure/foundry-classic/openai/concepts/assistants
|
||
*Truncation strategies, max_prompt_tokens, max_completion_tokens*
|
||
|
||
7. **CLU multi-turn conversations**
|
||
https://learn.microsoft.com/en-us/azure/ai-services/language-service/conversational-language-understanding/concepts/multi-turn-conversations
|
||
*Entity slot filling, conversational continuity patterns*
|
||
|
||
8. **Semantic Kernel chat completion**
|
||
https://learn.microsoft.com/en-us/semantic-kernel/concepts/ai-services/chat-completion
|
||
*ChatHistory API, connector-specific patterns*
|
||
|
||
### Code samples
|
||
|
||
- **OpenAI Cookbook:** Token counting reference implementation
|
||
https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb
|
||
|
||
- **Azure AI samples:** Multi-turn conversation patterns
|
||
Microsoft Learn code snippets (embedded i dokumentasjon)
|
||
|
||
### Confidence assessment
|
||
|
||
**Kilder brukt:** 8 offisielle Microsoft Learn-artikler + 17 code samples
|
||
**MCP calls:** 5 (search + fetch)
|
||
**Siste oppdatert:** Dokumentasjon datert 2025-2026
|
||
**Confidence på innhold:** 90% (høy – basert på førstepartskilde)
|
||
|
||
**Gaps identifisert:**
|
||
- Begrenset dokumentasjon på Responses API-internals (nyere feature)
|
||
- Sparse info på Stored Completions data residency ved multi-region
|
||
- Mangler offisiell cost calculator for multi-turn scenarios
|
||
|
||
**Anbefaling:** Verifiser Responses API-oppførsel i pilot før produksjon. Kontakt Microsoft for detaljert Stored Completions compliance-dokumentasjon.
|