ms-ai-architect/skills/ms-ai-advisor/references/prompt-engineering/domain-specific-prompt-optimization.md

602 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Domain-Specific Prompt Optimization
**Last updated:** 2026-06-24
**Status:** GA
**Category:** Prompt Engineering & LLM Optimization
---
## Introduksjon
Domain-specific prompt optimization handler om å tilpasse prompts for spesialiserte fagområder som medisin, juss, finans, teknisk support eller offentlig sektor. Generelle promptingteknikker fungerer ofte dårlig når domenet krever presisjon, terminologi, compliance-krav eller kontekstforståelse som LLM-en ikke har i sin generelle treningsdata.
Ved å optimalisere prompts for et spesifikt domene kan man:
- **Øke presisjonen** — Få svar som respekterer fagterminologi og kontekst
- **Redusere hallusinasjoner** — Hindre modellen i å fabricere "fakta" fra generell kunnskap
- **Sikre compliance** — Følge regulatoriske krav (GDPR, helsepersonelloven, arkivloven)
- **Forbedre brukeropplevelse** — Gi svar som matcher brukerens forventninger til faglig nivå
**Viktighet for offentlig sektor:** Norske offentlige virksomheter opererer med strenge krav til presisjon, etterrettelighet og personvern. Domain-specific prompting er ikke valgfritt — det er en forutsetning for ansvarlig bruk av AI.
---
## Kjernekomponenter
### 1. Domain Context Declaration
Definer domenet eksplisitt i system message for å "prime" modellen:
| Domene | Eksempel system message |
|--------|-------------------------|
| **Medisin** | *"You are an AI assistant designed to help users extract information from retrieved medical documents. Please scrutinize the documents carefully before formulating a response. Always include medical disclaimers and never provide diagnostic advice."* |
| **Juss** | *"You are a legal document assistant. Answer using legal terminology accurately. Always cite sources. If legal interpretation is required, state 'consult a qualified attorney'."* |
| **Offentlig sektor (Norge)** | *"Du er en AI-assistent for offentlig sektor i Norge. Følg arkivloven, offentlighetsloven og GDPR. Svar på norsk med presise referanser til regelverk."* |
| **Teknisk support** | *"You are an expert incident support assistant that helps users solve technical issues. Base answers on similar incidents in the retrieved documents. Provide step-by-step troubleshooting."* |
*(Confidence: HIGH — basert på Microsoft Learn dokumentasjon om system messages)*
### 2. Output Structure Specification
Struktur i output reduserer feil og øker grunnlag for verifisering:
```json
{
"CLAIM": "Påstand fra modellen",
"CITATION": "Kildehenvisning",
"CONFIDENCE": "HIGH/MEDIUM/LOW",
"DISCLAIMER": "Relevant advarsel eller forbehold"
}
```
**Hvorfor dette virker:** Ved å kreve strukturert output må modellen:
1. Gjøre påstanden (første feil hvis feil)
2. Finne sitatet (andre feil hvis feil)
3. Gradere tillit (tredje feil hvis feil)
Dette gjør at hallusinasjoner krever *flere feil i sekvens*, noe som reduserer sannsynligheten for dem.
*(Confidence: HIGH — prompt engineering best practice fra Azure OpenAI dokumentasjon)*
### 3. Domain-Specific Few-Shot Examples
Few-shot learning er særlig effektivt for domener med:
- Spesialisert terminologi
- Standardiserte svarmønstre
- Compliance-krav
**Eksempel — Medisinsk assistent:**
```yaml
System: "You are a medical information assistant. Always include safety disclaimers."
User: "What is the recommended dosage for aspirin?"
Assistant: "According to medical guidelines, adult aspirin dosage for pain relief is typically 325-650mg every 4-6 hours, not exceeding 4g/24h. **Disclaimer:** This is general information only. Consult your doctor or pharmacist for personalized medical advice."
User: "Can I take aspirin with ibuprofen?"
Assistant: "Concurrent use of aspirin and ibuprofen may reduce aspirin's cardioprotective effects and increase gastrointestinal bleeding risk. **Disclaimer:** This is not medical advice. Consult your healthcare provider before combining medications."
```
*(Confidence: MEDIUM — basert på prompt engineering best practices, men krever domenespesifikk validering)*
### 4. Retrieval Augmented Generation (RAG) med domenfiltrering
For domener med store dokumentmengder (f.eks. lovverk, helsedokumentasjon, teknisk support):
| RAG-konfigurasjon | Anbefaling for domene |
|-------------------|----------------------|
| **Chunk size** | Juss: 1536 tokens (kontekst viktig), Medisin: 512 tokens (presisjon viktig) |
| **Strictness** | Høy (4-5) for compliance-domener, moderat (3) for general knowledge |
| **Search type** | Hybrid (vector + keyword) + semantic for flerspråklige domener |
| **Field mapping** | Map `content`, `title`, `citation`, `legal_tag` eller `classification` |
**Eksempel — Norwegian public sector:**
```json
{
"data_sources": [{
"type": "AzureCognitiveSearch",
"parameters": {
"indexName": "offentlig-regelverk-index",
"fieldsMapping": {
"contentFields": ["paragraph_text", "section_title"],
"titleField": "law_name",
"urlField": "lovdata_url",
"filepathField": "document_id"
},
"inScope": true,
"strictness": 4,
"topNDocuments": 5
}
}]
}
```
*(Confidence: HIGH — Azure OpenAI On Your Data dokumentasjon)*
### 5. Multi-Lingual Domain Handling
For domener som opererer på flere språk (f.eks. norsk lovverk vs. EU-direktiver):
**Best practice:**
- Separat indeks per språk hvis mulig
- Eksplisitt språkinstruksjon i system message
- Semantic search for cross-lingual retrieval
```yaml
System: "You are an AI assistant designed to help users extract information from retrieved Norwegian legal documents. Please scrutinize the Norwegian documents carefully before formulating a response. The user's query will be in Norwegian, and you must respond in Norwegian with references to Norwegian law."
```
*(Confidence: HIGH — Microsoft Learn anbefaler dette for multi-lingual scenarios)*
---
## Arkitekturmønstre
### Pattern 1: Chain-of-Thought for Domain Reasoning
For komplekse domener (medisin, juss, ingeniørfag) hvor resonnering er kritisk:
```yaml
System: "You are a legal assistant. For each query, think step-by-step:
1. Identify the legal question
2. Find relevant statutes in retrieved documents
3. Apply legal reasoning
4. State conclusion with citations
Format: QUESTION → RELEVANT LAW → REASONING → CONCLUSION"
User: "Can an employer terminate without notice?"
Assistant:
"QUESTION: Employment termination without notice legality
RELEVANT LAW: Arbeidsmiljøloven § 15-14 states that termination without notice requires 'særlig grunner' (special grounds)
REASONING: Special grounds typically include serious breach of duty or criminal activity by employee
CONCLUSION: No, employer cannot terminate without notice unless special grounds exist per AML § 15-14. [Citation: Arbeidsmiljøloven § 15-14]"
```
*(Confidence: MEDIUM-HIGH — Chain-of-thought er dokumentert effektivt, men krever testing per domene)*
### Pattern 2: Role-Based Prompting with Domain Expertise
```yaml
System: "You are a senior incident response analyst with 10 years experience in Microsoft Azure infrastructure. You:
- Prioritize security over convenience
- Always check for related incidents in the knowledge base
- Escalate if unsure rather than guess
- Document all troubleshooting steps"
```
Dette mønsteret virker ved å:
1. Definere en "persona" med domeneekspertise
2. Liste opp atferdsprinsipper som er kritiske for domenet
3. Gi modellen en "mental model" for hvordan eksperter tenker
*(Confidence: MEDIUM — Ikke direkte dokumentert i Microsoft sources, men widely recognized pattern)*
### Pattern 3: Conditional Domain Routing
For systemer som håndterer flere domener:
```python
# Pseudo-code for domain routing
user_query = "What are the symptoms of diabetes?"
if classify_domain(user_query) == "medical":
system_message = MEDICAL_SYSTEM_PROMPT
add_disclaimer = True
strictness = 5
elif classify_domain(user_query) == "technical":
system_message = TECHNICAL_SYSTEM_PROMPT
add_disclaimer = False
strictness = 3
response = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": system_message},
{"role": "user", "content": user_query}
]
)
```
*(Confidence: MEDIUM — Pattern basert på generell arkitekturpraksis)*
### Pattern 4: Grounding with Domain-Specific Metadata
For Azure AI Search indexer med domeneinformasjon:
| Metadata-felt | Eksempel verdi | Formål |
|---------------|----------------|--------|
| `classification` | "Helsepersonelloven", "GDPR-relevant" | Compliance-filtrering |
| `confidence_level` | "peer_reviewed", "draft", "official" | Kildevurdering |
| `effective_date` | "2024-01-01" | Tidsrelevans (viktig for juss, regelverk) |
| `domain_tags` | ["diabetes", "type2", "symptoms"] | Presisjonssøk |
```json
{
"fieldsMapping": {
"contentFields": ["content"],
"titleField": "title",
"urlField": "url",
"vectorFields": ["content_vector"],
"metadataFields": ["classification", "effective_date", "confidence_level"]
}
}
```
*(Confidence: HIGH — Azure AI Search field mapping er GA-funksjonalitet)*
---
## Beslutningsveiledning
### Når velge domain-specific prompting?
| Kriterium | Vurdering |
|-----------|-----------|
| **Høy presisjonskrav** | JA → Domain prompting kritisk |
| **Regulatoriske krav** | JA → Må ha (compliance, personvern) |
| **Spesialisert terminologi** | JA → Few-shot examples nødvendig |
| **Lav toleranse for feil** | JA → Strictness = 5, grounding required |
| **Generisk FAQ** | NEI → Standard prompting holder |
### Decision Tree: Hvilken prompting-strategi?
```
START
├─ Har du eksisterende dokumentasjon (RAG)?
│ ├─ JA → Bruk Azure OpenAI On Your Data
│ │ ├─ Compliance-kritisk? → Strictness 4-5, inScope=true
│ │ └─ General knowledge? → Strictness 3, hybrid search
│ └─ NEI → Fine-tuning eller GPT-4 med few-shot
│ ├─ <50 eksempler? → Few-shot learning
│ └─ >500 eksempler? → Vurder fine-tuning
└─ Krever domenet multi-turn reasoning?
├─ JA → Chain-of-thought + conversation history
└─ NEI → Single-turn med strukturert output
```
*(Confidence: MEDIUM — Basert på Azure OpenAI best practices og prompt engineering guidance)*
---
## Integrasjon med Microsoft-stakken
### Azure OpenAI On Your Data
**Best practice for domain-specific prompting:**
```python
# Python SDK example
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-02-01",
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)
# Domain-specific configuration
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": """You are a medical information assistant for healthcare professionals in Norway.
Rules:
- Answer in Norwegian
- Always cite sources from Helsedirektoratet or approved medical literature
- Include medical disclaimers
- Never provide diagnostic advice"""
},
{
"role": "user",
"content": "Hva er anbefalte screeningintervaller for diabetes type 2?"
}
],
extra_body={
"data_sources": [{
"type": "azure_search",
"parameters": {
"endpoint": os.getenv("AZURE_SEARCH_ENDPOINT"),
"index_name": "helsedirektoratet-index",
"authentication": {
"type": "api_key",
"key": os.getenv("AZURE_SEARCH_KEY")
},
"in_scope": True, # Limit to grounding data only
"strictness": 4, # High strictness for medical domain
"top_n_documents": 5
}
}]
}
)
print(response.choices[0].message.content)
```
*(Confidence: HIGH — basert på Azure OpenAI SDK dokumentasjon)*
### Copilot Studio med domain grounding
For public sector:
1. **Custom topics** — Definer topic triggers basert på domene-keywords
2. **Generative answers** — Koble til Azure OpenAI On Your Data med domain-specific index
3. **Conversation boosting** — Bruk SharePoint/Dataverse som knowledge source
4. **Compliance guardrails** — Bruk content filters + custom system message
| Konfigurasjon | Anbefaling for offentlig sektor |
|---------------|--------------------------------|
| **Data source** | SharePoint med klassifiserte dokumenter |
| **System message** | Inkluder referanser til offentlighetsloven § 3 |
| **Content moderation** | Høy (block PII, sensitive topics) |
| **Citation style** | Inline citations med dokumentklassifisering |
*(Confidence: MEDIUM-HIGH — Copilot Studio best practices)*
### Microsoft Foundry
**Domain-specific deployment pattern:**
```yaml
# AI Foundry project configuration
project:
name: "medisinsk-assistent-pilot"
region: "norwayeast"
deployments:
- name: "gpt-4-medical"
model: "gpt-4"
sku: "Standard"
capacity: 10
system_message: |
You are a medical information assistant...
[domain-specific system message]
- name: "embedding-medical"
model: "text-embedding-ada-002"
sku: "Standard"
data_connections:
- type: "azure_ai_search"
name: "medical-knowledge-base"
index_name: "helsedirektoratet-retningslinjer"
safety:
content_filters:
- category: "medical_advice"
severity: "high"
action: "block"
```
*(Confidence: MEDIUM — Microsoft Foundry er relativt nytt, pattern basert på generell guidance)*
---
## Offentlig sektor (Norge)
### Juridiske og etiske rammeverk
| Regelverk | Implikasjon for prompting |
|-----------|---------------------------|
| **Offentlighetsloven § 3** | System message må inkludere: *"If document classification is 'UNNTATT', do not include in response"* |
| **Arkivloven § 6** | Alle AI-genererte svar må logges med metadata (timestamp, user, query, sources) |
| **GDPR Art. 22** | Hvis AI gjør "automated decision", må bruker informeres — legg til disclaimer |
| **Personopplysningsloven § 11** | PII må filtreres ut av prompts — bruk Azure OpenAI content filters |
*(Confidence: HIGH — Norsk lovverk er kjent, men krever juridisk validering for spesifikke use cases)*
### Use case: NAV selvbetjeningsbot
**Scenario:** NAV ønsker en chatbot som hjelper brukere med spørsmål om dagpenger.
**Domain-specific prompt design:**
```yaml
System: |
Du er NAV Assistent, en AI-assistent som hjelper brukere med spørsmål om NAVs tjenester.
REGLER:
- Svar alltid på norsk (bokmål)
- Referer til offisielle NAV-sider (nav.no)
- Hvis spørsmålet gjelder personlig situasjon, svar: "For å vurdere din konkrete situasjon, ta kontakt med NAV på telefon 55 55 33 33 eller book time via nav.no"
- Aldri gi juridisk rådgivning — referer til Folketrygdloven med paragraf
- Hvis usikker, svar: "Jeg er usikker på dette. Ta kontakt med NAV for sikker informasjon."
STRUKTUR:
- Start med direkte svar
- Gi lenke til relevant NAV-side
- Avslutt med "Trenger du mer hjelp? Ring 55 55 33 33"
User: "Hvor mye kan jeg tjene ved siden av dagpenger?"
Assistant: |
Du kan tjene inntil 60% av dagpengegrunnlaget ditt uten at dagpengene reduseres. Overstiger du dette, reduseres dagpengene krone for krone.
Les mer: https://www.nav.no/dagpenger#hvor-mye
(Ref: Folketrygdloven § 4-18)
Trenger du mer hjelp? Ring 55 55 33 33 eller book time via nav.no.
```
**RAG-konfigurasjon:**
| Parameter | Verdi | Begrunnelse |
|-----------|-------|-------------|
| `inScope` | `true` | Kun bruk NAV.no som kilde |
| `strictness` | `4` | Høy — feil kan ha store konsekvenser |
| `topNDocuments` | `3` | Fokusert svar, ikke overload |
| `roleInformation` | System message over | Domain-specific instruksjoner |
*(Confidence: HIGH — Basert på Azure OpenAI On Your Data og offentlig sektor best practices)*
### Personvernhensyn
**PII-filtrering:**
```json
{
"content_filter_config": {
"pii_detection": {
"enabled": true,
"categories": ["phone_number", "email", "ssn", "address"],
"action": "redact"
}
}
}
```
**Logging for etterrettelighet:**
```python
# Pseudo-code
import logging
logger = logging.getLogger("nav-assistent")
def log_conversation(user_id, query, response, sources):
logger.info({
"timestamp": datetime.utcnow().isoformat(),
"user_id_hash": hash(user_id), # Anonymized
"query_length": len(query),
"response_length": len(response),
"sources_used": [s["title"] for s in sources],
"model": "gpt-4",
"deployment": "nav-assistent-prod"
})
```
*(Confidence: MEDIUM-HIGH — Best practice, men krever organisasjonsspesifikk vurdering)*
---
## Kostnad og lisensiering
### Token-estimat per domene
Basert på testing (Azure OpenAI dokumentasjon):
| Konfigurasjon | Generation prompt tokens | Intent prompt tokens | Response tokens | Total avg |
|---------------|--------------------------|---------------------|-----------------|-----------|
| **Default (chunk 1024, top 5)** | 4297 | 1366 | 111 | ~5774 |
| **Medical (chunk 512, top 5, strictness 5)** | ~3800 | ~1200 | ~120 | ~5120 |
| **Legal (chunk 1536, top 10, strictness 4)** | ~7200 | ~1500 | ~150 | ~8850 |
**Kostnad (gpt-4, ca. priser):**
- Medical domain: ~5120 tokens × $0.00003/token (input) = $0.15 per query
- Legal domain: ~8850 tokens × $0.00003/token = $0.27 per query
**Optimaliseringstips:**
1. Bruk **GPT-3.5-turbo** for enklere queries (10x billigere)
2. Cache **intent prompt** hvis samme bruker stiller flere spørsmål
3. Bruk **semantic search** for å redusere antall irrelevante chunks
4. **Chunk size 512** for presisjon vs. 1024 for kontekst
*(Confidence: HIGH — basert på Azure OpenAI pricing og token usage documentation)*
### Lisenskrav
| Microsoft-produkt | Relevant for | Lisens |
|-------------------|--------------|--------|
| **Azure OpenAI** | Alle domener | Azure subscription + Azure OpenAI access (application required) |
| **Azure AI Search** | RAG-baserte løsninger | Standard tier ($250/month+) for semantic search |
| **Copilot Studio** | Public-facing bots | Per-user ($200/month) eller per-session ($100/1000 sessions) |
| **M365 Copilot** | Internal assistants | Microsoft 365 E3/E5 + Copilot ($30/user/month) |
*(Confidence: MEDIUM — Priser endres, sjekk offisiell Microsoft pricing)*
---
## For arkitekten (Cosmo)
### Når anbefale domain-specific prompting?
**JA hvis:**
1. ✅ Klient opererer i regulert domene (helse, finans, juss, offentlig)
2. ✅ Feil kan ha store konsekvenser (økonomi, helse, personvern)
3. ✅ Klient har eksisterende dokumentasjon (RAG mulig)
4. ✅ Terminologi er spesialisert og konsistent
**NEI hvis:**
1. ❌ Generisk FAQ uten compliance-krav
2. ❌ Klient har ikke dokumentasjon (fine-tuning eller GPT-4 generell kunnskap)
3. ❌ Budsjettet er svært begrenset (domain prompting øker token-bruk)
### Typiske feil å unngå
| Feil | Konsekvens | Fix |
|------|------------|-----|
| **For generisk system message** | Modellen gir generiske svar uten domenetilpasning | Legg til eksplisitt rolleinformasjon og compliance-krav |
| **Manglende disclaimers** | Juridisk/etisk risiko | Inkluder disclaimers i system message + output structure |
| **For stor chunk size** | Modellen drukner i informasjon | Reduser chunk size til 512 for presisjonsdomener |
| **inScope=false** | Modellen hallusinerer ved siden av grounding data | Sett `inScope=true` for compliance-domener |
| **Manglende citation** | Ikke mulig å verifisere svar | Bruk `"type": "CONTENT"` citation pattern i API |
*(Confidence: HIGH — Basert på Azure OpenAI best practices og Cosmo's erfaring)*
### Anbefalte verktøy
| Fase | Verktøy | Formål |
|------|---------|--------|
| **Prompt-testing** | Microsoft Foundry Playground | Iterativ testing av system messages |
| **Evaluation** | Prompt Flow + Custom evaluators | Måle domain accuracy (presisjon, recall, F1) |
| **Deployment** | Azure OpenAI API + RAG | Produksjon med logging og monitoring |
| **Monitoring** | Azure Monitor + Application Insights | Token usage, latency, error rate |
### Spørsmål å stille klienten
1. **Hva er konsekvensen av feil?** (Lav/Medium/Høy) → Bestemmer strictness, inScope
2. **Har dere eksisterende dokumentasjon?** → RAG vs. fine-tuning
3. **Hva er compliance-kravene?** → System message disclaimers, content filters
4. **Hva er forventet volum?** → Cost estimation (GPT-4 vs. GPT-3.5)
5. **Kreves det multi-språk støtte?** → Separat indeks per språk
6. **Må svar være auditable?** → Logging, citation, metadata tracking
---
## Kilder og verifisering
### Microsoft Learn dokumentasjon (fetched via MCP 2026-02-04)
1. **Prompt engineering techniques** (Azure OpenAI)
https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/prompt-engineering
*Source for: Best practices, few-shot learning, chain-of-thought, output structure*
2. **Azure OpenAI On Your Data**
https://learn.microsoft.com/en-us/azure/foundry-classic/openai/concepts/use-your-data
*Source for: RAG configuration, field mapping, strictness, multi-lingual support, token estimation*
3. **Transparency note for Azure OpenAI**
https://learn.microsoft.com/en-us/azure/foundry/responsible-ai/openai/transparency-note
*Source for: Model capabilities, limitations, responsible AI considerations*
4. **Azure OpenAI FAQ**
https://learn.microsoft.com/en-us/azure/foundry-classic/openai/faq
*Source for: Language handling, model behavior, grounding strategies*
5. **Apply prompt engineering with Azure OpenAI Service - Training**
https://learn.microsoft.com/en-us/training/modules/apply-prompt-engineering-azure-openai/
*Source for: Prompt engineering learning objectives, prerequisites*
### Confidence markers brukt i dokumentet
- **HIGH** — Direkte dokumentert i Microsoft Learn eller Azure OpenAI docs
- **MEDIUM-HIGH** — Logisk utledning basert på dokumentasjon + generell best practice
- **MEDIUM** — Best practice fra industrien, ikke eksplisitt dokumentert av Microsoft
- **MEDIUM-LOW** — Antatt basert på generell kunnskap, bør verifiseres
### Verifiseringsmetode
- **MCP-søk** — 3 søk mot microsoft-learn (2026-02-04)
- **Fetch** — 2 fullstendige dokumenter hentet via microsoft_docs_fetch
- **Code samples** — Søk mot microsoft_code_sample_search (ingen direkte treff for "domain prompting", men generelle patterns funnet)
---
**Cosmo's anbefaling:**
*Start med Azure OpenAI On Your Data + RAG for domener med dokumentasjon. Bruk GPT-4 med high strictness (4-5) og inScope=true for compliance-kritiske domener. Test grundig med representative queries før produksjon. For offentlig sektor: alltid inkluder disclaimers, logging og PII-filtering.*
---
**Dato generert:** 2026-02-04
**Generert av:** Cosmo Skyberg (AI Architect) via MCP-research
**Neste review:** 2026-08 (6 måneder) eller ved major Azure OpenAI API update