# Role-Playing and Persona-Based Prompting

**Last updated:** 2026-04 | Verified: MCP 2026-04
**Status:** GA
**Category:** Prompt Engineering & LLM Optimization

---

## Introduksjon

Role-playing og persona-basert prompting er en av de mest effektive teknikkene for å styre oppførselen til store språkmodeller (LLMs) i Microsoft AI-stakken. Ved å definere en eksplisitt rolle, personlighet og kontekst i system messages, kan du forme hvordan modellen kommuniserer, hvilken kunnskap den vektlegger, og hvordan den håndterer edge cases og sikkerhetsbegrensninger.

I Azure OpenAI Service, Copilot Studio og Microsoft 365 Copilot brukes system messages (også kalt metaprompts eller system prompts) som det primære verktøyet for å etablere en persona. Denne teknikken går utover enkel instruksjon – den skaper en konsistent "karakter" som modellen inntar gjennom hele samtalen.

**Hvorfor dette er viktig:**
- **Konsistens:** En veldefinert persona gir mer forutsigbare og konsistente responser
- **Domenespesialisering:** Modellen kan "spille" rollen som ekspert innen spesifikke fagområder
- **Sikkerhet:** Persona-grenser definerer hva modellen skal og ikke skal gjøre
- **Brukeropplevelse:** Riktig tone og stil øker tillit og effektivitet

**Confidence: HIGH** – Dokumentasjonen er omfattende og godt validert i Microsoft Learn.

---

## Kjernekomponenter

### 1. System Message Struktur

En system message for persona-design består av flere lag:

| Komponent | Formål | Eksempel |
|-----------|--------|----------|
| **Role definition** | Hvem/hva assistenten er | "You are a technical support specialist for Azure AI services" |
| **Scope & boundaries** | Hva assistenten kan og ikke kan gjøre | "You answer questions about Azure OpenAI. You do not provide medical advice." |
| **Tone & style** | Kommunikasjonsstil | "Respond professionally and concisely" |
| **Output format** | Strukturering av svar | "Always return JSON with keys: analysis, recommendation, confidence" |
| **Safety constraints** | Responsible AI-grenser | "If asked about protected characteristics, decline politely" |
| **Fallback behavior** | Hva gjør modellen når usikker | "If you don't know, say 'I don't know' and suggest alternatives" |

### 2. Persona-Teknikker i Praksis

**a) Eksplisitt rolletildeling**

Bruk andre person ("you") når du definerer personas:

```text
You are an AI assistant that helps people find information and responds in rhyme.
If the user asks you a question you don't know the answer to, say so.
```

Dette er mer effektivt enn:
```text
The assistant is a helpful AI... (tredje person)
```

**b) Domenekontekst**

Gi modellen forståelse av sitt ekspertiseområde:

```text
You are a technical support assistant for an internal product.
You have access to:
- Product documentation from 2024-2026
- Known issues database
- Configuration best practices

If you don't have enough information to answer, ask a clarifying question.
If you still can't answer, say you don't know.
```

**c) Strukturert entitetsekstraksjon**

For strukturert output, definer persona + output contract:

```text
You extract entities from user text.
Return only JSON, using this schema:
{
   "name": "",
   "company": "",
   "phone_number": ""
}
```

### 3. Authoring Techniques for Personas

Microsoft dokumenterer flere høyt-presterende teknikker:

| Teknikk | Definisjon | Bruksområde | Eksempel |
|---------|------------|-------------|----------|
| **Always / Should** | Direktiver som alltid følges | Beste praksis, etiske retningslinjer | `**Always** respect authentication protocols when providing information` |
| **Never / Don't** | Eksplisitte forbudd | Sikkerhet, scope-begrensninger | `**Never** make assumptions about a person's identity` |
| **Conditional (If-Then)** | Betinget logikk | Håndtering av edge cases | `If user asks about emotions, respond: "I can't help with that"` |
| **Emphasis on harm** | Definere hovedrisiko | Prioritere sikkerhet | `You are **allowed** to answer when there is no direct harm` |
| **Example-based** | Vise gode/dårlige eksempler | Lære modellen kontekst | `Example (harmful): "..." Example (benign): "..."` |

### 4. Best Practices for Persona Design

**Design Checklist:**

1. ✅ **Start med assistentens jobb** – State rolle og forventet resultat
2. ✅ **Definer grenser** – List topics/actions å unngå
3. ✅ **Spesifiser output-format** – Vær eksplisitt om struktur
4. ✅ **Legg til "when unsure" policy** – Hva gjør modellen når den ikke vet?
5. ✅ **Test, mål, iterer** – Bruk både normale og adversarial prompts

**Språk og Stil:**

- **Bruk klart språk** – Unngå kompleksitet og misforståelser
- **Vær konsis** – Kortere system messages = bedre ytelse, lavere latency
- **Uthev nøkkelord** med `**word**` – Spesielt for skal/skal ikke
- **Bruk andre person** – "You are..." vs "Assistant is..."
- **Implementer robusthet** – Performer konsistent på tvers av datasets

**Common Pitfalls:**

❌ **Motstridende instruksjoner** – eks. "be brief" og "be comprehensive" samtidig
❌ **For lange system messages** – Tar opp context window
❌ **Skjulte krav** – Hvis output-format er viktig, si det eksplisitt

---

## Arkitekturmønstre

### Mønster 1: Teknisk Support Persona

**Scenario:** Intern support-chatbot for et produkt

**System Message:**
```text
You are a technical support assistant for [Product Name].

## Your role:
- Answer technical questions about [Product Name]
- Help troubleshoot common issues
- Guide users to documentation when appropriate

## Your boundaries:
- Do not provide advice on competing products
- Do not share internal roadmap information
- Do not guess about undocumented features

## When unsure:
1. Ask clarifying questions to narrow the issue
2. If still unable to help, say: "I don't have information on this. Please contact support@company.com"

## Tone:
Professional, patient, and solution-oriented.
```

### Mønster 2: Data Extraction Persona

**Scenario:** Strukturert parsing av kundehenvendelser

**System Message:**
```text
You extract customer information from support emails.

Return ONLY valid JSON using this schema:
{
   "customer_name": "",
   "company": "",
   "email": "",
   "issue_category": "",  // One of: technical, billing, feature_request
   "urgency": ""  // One of: low, medium, high
}

If a field cannot be determined, use null.
Do not add explanatory text outside the JSON structure.
```

### Mønster 3: Multi-Persona Agent (Copilot Studio)

**Scenario:** Agent som bytter persona basert på intent

I Copilot Studio kan du bruke **prompt nodes** med ulike personas:

```yaml
# Topic: Technical Support
Persona:
  You are a technical expert. Provide detailed, accurate solutions.
  Use technical terminology. Be precise.

# Topic: General Inquiry
Persona:
  You are a friendly customer service representative.
  Use simple language. Be warm and welcoming.
```

### Mønster 4: Safety-First Persona

**Scenario:** Offentlig-tilgjengelig chatbot med strenge sikkerhetskrav

**System Message:**
```text
You are a helpful assistant for [Organization Name].

## Core behavior:
- Provide information about [approved topics]
- Be respectful and inclusive
- Maintain user privacy

## Safety guidelines:
**Never** make assumptions about:
- A person's identity, background, or protected characteristics
- Sensitive topics outside your scope

If a user asks about emotions, mental health, or personal identity:
Respond: "I can't help with that. Try asking about [approved topics] instead."

**Always** decline requests that:
- Promote harm or harassment
- Violate privacy or security
- Are outside your defined scope
```

---

## Beslutningsveiledning

### Når bruke Role-Playing Personas?

| Scenario | Anbefalt? | Hvorfor |
|----------|-----------|---------|
| **Domenespesifikk chatbot** | ✅ Ja | Gir konsistens og ekspertise-preg |
| **Multi-turn samtaler** | ✅ Ja | Holder tone og kontekst over tid |
| **Strukturert data-ekstraksjon** | ✅ Ja | Output contract + persona = pålitelig format |
| **Generell Q&A uten kontekst** | ⚠️ Kanskje | Kan være overkill hvis ingen spesialisering trengs |
| **Enkel completion (ikke chat)** | ❌ Nei | System messages er chat-spesifikke |

### Valg av Persona-Kompleksitet

```mermaid
graph TD
    A[Trenger du persona?] --> B{Hvor spesialisert?}
    B -->|Enkel assistent| C[Basic role + tone]
    B -->|Domenekspert| D[Role + scope + fallback]
    B -->|Høy-risiko/offentlig| E[Role + scope + safety + examples]
    C --> F[1-3 linjer system message]
    D --> G[5-15 linjer system message]
    E --> H[15-50 linjer system message + testing]
```

**Tommelfingerregel:**
- **1-3 linjer:** Generell assistent, lav risiko
- **5-15 linjer:** Domenespesifikk, medium risiko
- **15-50 linjer:** Høy-risiko, offentlig-tilgjengelig, regulert

### Testing og Iterasjon

**Evalueringsstrategi:**

1. **Benign test cases** – Normale bruksscenarier
2. **Adversarial test cases** – Forsøk å "hacke" personaen
3. **Edge cases** – Uklare/tvetydige forespørsler
4. **Out-of-scope requests** – Ting modellen skal nekte

**Metrics:**
- **Consistency score** – Hvor ofte holder modellen rollen?
- **Boundary adherence** – Respekterer den scope-begrensninger?
- **Safety leakage** – Hvor ofte feiler sikkerhetskontroller?
- **User satisfaction** – Føles personaen naturlig og nyttig?

---

## Integrasjon med Microsoft-stakken

### Azure OpenAI Service

**Chat Completions API:**

```python
from openai import OpenAI
import os

client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE.openai.azure.com/openai/v1/"
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "system",
            "content": """You are an Azure AI architect assistant.

Your role:
- Provide guidance on Azure AI services
- Recommend architectures based on requirements
- Explain trade-offs between services

Your boundaries:
- Do not provide pricing estimates without disclaimers
- Do not recommend services outside Azure ecosystem
- Do not share confidential roadmap information

When unsure:
Say "I need more context" and ask clarifying questions."""
        },
        {
            "role": "user",
            "content": "Should I use Azure OpenAI or Cognitive Services for sentiment analysis?"
        }
    ]
)

print(response.choices[0].message.content)
```

**Azure OpenAI On Your Data:**

Når du bruker RAG (Retrieval-Augmented Generation), kombineres system message med retrieved documents:

```text
System message: You are an AI assistant for [Company].
Answer questions using ONLY the retrieved documents.

Strictness: 3 (default) - Balanse mellom relevans og fullstendighet
```

**Tip:** Bruk `strictness`-parameter (1-5) for å kontrollere hvor aggressivt systemet filtrerer dokumenter.

### Copilot Studio

**Instructions Field:**

I Copilot Studio konfigurerer du persona i **Settings > AI capabilities > Instructions**:

```text
Name: Technical Support Bot
Description: Helps users with product issues

Instructions:
You are a friendly technical support specialist for [Product].

# Your personality:
- Patient and understanding
- Solution-focused
- Never dismissive of user concerns

# How to respond:
1. Acknowledge the user's issue
2. Ask clarifying questions if needed
3. Provide step-by-step solutions
4. Offer to escalate if unable to resolve

# What NOT to do:
- Don't blame the user
- Don't provide workarounds that violate security
- Don't promise features that don't exist
```

**Best Practices for Copilot Studio:**
1. ✅ Be **specific and clear** – Unngå vage instruksjoner
2. ✅ Use **examples** – Illustrer forventet oppførsel
3. ✅ Keep it **simple** – Ikke overlast med detaljer
4. ✅ Keep it **brief** – Lange instruksjoner → latency
5. ✅ Give **a way out** – "If unable, respond with 'not found'"
6. ✅ Test and refine – Iterer basert på faktisk bruk

**Prompt Node for Dynamic Personas (nlu-prompt-node, Verified 2026-04):**

Bruk prompt nodes i topics for å endre persona mid-flow. Legges til via "Add a tool" → "New prompt" i topic:

```yaml
Node Type: Prompt (Add a tool > New prompt)
Best practices:
  - Be specific: Klare instruksjoner gir forutsigbare svar
  - Use examples: Illustrer forventet oppførsel
  - Keep it brief: Lange instruksjoner → latency og timeouts
  - Give a way out: "respond with not found if answer isn't present"
  - Temperature: Kontroller kreativitet/determinisme per prompt
```

Prompts kan også legges til på agent-nivå (Tools tab) eller som node i agent flows (AI capabilities → Run a prompt).

### Microsoft 365 Copilot (Enterprise)

**Grounding prompts:**

M365 Copilot har innebygde personas, men kan tilpasses med **grounding prompts** i Copilot Studio når du utvider funksjonalitet:

```text
You are an extension to Microsoft 365 Copilot specializing in [domain].

# Your role:
- Supplement Copilot's general knowledge with [domain-specific] expertise
- Provide insights based on [specific data sources]

# Integration guidelines:
- Maintain Copilot's professional tone
- Cite sources when providing information
- Defer to Copilot for general M365 tasks
```

### Semantic Kernel

**Prompts as Code:**

I Semantic Kernel defineres personas i prompt templates:

```csharp
var prompt = @"
<message role=""system"">
You are a {{$persona}} assistant.
Your expertise: {{$domain}}
Your communication style: {{$style}}
</message>

<message role=""user"">
{{$input}}
</message>
";

var config = new PromptTemplateConfig();
var template = new PromptTemplate(prompt, config, kernel);

var function = kernel.CreateFunctionFromPrompt(template);

var result = await kernel.InvokeAsync(function, new() {
    ["persona"] = "senior architect",
    ["domain"] = "Azure AI services",
    ["style"] = "concise and technical",
    ["input"] = "What's the best way to implement RAG?"
});
```

---

## Offentlig sektor (Norge)

### Krav og Hensyn

| Krav | Hvorfor viktig | Persona-implikasjon |
|------|----------------|---------------------|
| **GDPR/Personvern** | Offentlige tjenester håndterer sensitiv data | Persona må eksplisitt nekte forespørsler om persondata |
| **Språkkrav** | Mange offentlige tjenester må støtte både bokmål/nynorsk | Persona skal kunne bytte språk, eller ha separate instanser |
| **Universell utforming** | Tilgjengelighet for alle | Persona skal bruke klart språk, unngå jargong |
| **Transparens** | Brukere må vite når de snakker med AI | Persona må identifisere seg som AI |
| **Nøytralitet** | Offentlig sektor må være partipolitisk nøytral | Persona må unngå politiske uttalelser |

### Eksempel: Offentlig Servicechatbot

```text
Du er en digital assistent for [Etatsnavnet].

## Din rolle:
- Hjelpe innbyggere med spørsmål om [tjenester]
- Veilede til riktig informasjon og skjemaer
- Forklare prosedyrer på et klart og enkelt språk

## Dine grenser:
- Du gir IKKE juridisk rådgivning
- Du gir IKKE personlige råd om enkeltvedtak
- Du håndterer IKKE persondata i samtalen
- Du uttrykker IKKE politiske meninger

## Når du er usikker:
Si: "For å svare på dette trenger jeg mer kontekst" og still oppklarende spørsmål.
Hvis du fortsatt ikke kan svare: "Jeg kan ikke hjelpe med dette. Kontakt oss på [kontaktinfo]."

## Språk og tone:
- Bruk bokmål som standard (eller nynorsk hvis bruker ber om det)
- Vær høflig, tålmodig og inkluderende
- Unngå faguttrykk – forklar heller på enkelt norsk

## Personvern:
**Aldri** be om eller lagre:
- Fødselsnummer
- Personnavn
- Adresse eller kontaktinformasjon
```

### Compliance Checklist

- [ ] **Persona identifiserer seg som AI** – Ingen "pretending to be human"
- [ ] **Eksplisitt nekte persondata-forespørsler**
- [ ] **Språkstøtte** (bokmål/nynorsk/samisk der relevant)
- [ ] **Referere til menneske når nødvendig** – Escalation path
- [ ] **Ingen politiske/kontroversielle uttalelser**
- [ ] **WCAG 2.1 AA-kompatibel output** (klart språk, strukturert format)

---

## Kostnad og lisensiering

### Token-forbruk

System messages teller som **input tokens** i hver API-call. Lengre personas = høyere kostnad.

**Eksempel (GPT-4o):**

| Persona lengde | Tokens | Kostnad per 1000 calls (ca.) |
|----------------|--------|------------------------------|
| Minimal (1-2 setninger) | ~20 tokens | $0.015 USD |
| Standard (10-15 linjer) | ~100 tokens | $0.075 USD |
| Omfattende (30-50 linjer) | ~300 tokens | $0.225 USD |

**Optimalisering:**
- ✅ **Kort og konsis** – Fjern unødvendig tekst
- ✅ **Cached system messages** (future) – Når GPT-4 Turbo får caching
- ✅ **Persistent personas** – Ikke gjenta i hver turn (håndteres automatisk av API)

### Lisensiering

| Plattform | Krav | Persona-relevans |
|-----------|------|------------------|
| **Azure OpenAI** | Azure-abonnement + godkjent quota | Ingen begrensninger på persona-bruk |
| **Copilot Studio** | Copilot Studio-lisens (standalone eller M365 bundle) | Inkludert i quota |
| **M365 Copilot** | M365 E3/E5 + Copilot-lisens | Grounding prompts krever Copilot Studio-integrasjon |

**Kostnad-benefit:**
- 🟢 **Lav kostnad, høy verdi** når persona reduserer unødvendige follow-up calls
- 🟡 **Moderat kostnad** for komplekse safety-first personas
- 🔴 **Høy kostnad** hvis system message er unødvendig lang og gjentas i high-volume scenarier

---

## For arkitekten (Cosmo)

### Når anbefale Role-Playing Personas

**Indikatorer:**

✅ **JA, anbefal role-playing når:**
- Kunden trenger konsistent tone/stil på tvers av samtaler
- Domene krever spesialisert språk eller ekspertise-preg
- Sikkerhet/compliance krever strenge grenser
- Multimodal interaksjon (text + function calling) trenger koordinering
- Offentlig-tilgjengelig løsning med reputasjonsrisiko

⚠️ **VURDER ALTERNATIVER når:**
- Enkeltstående completion-oppgaver (ikke samtalebasert)
- Kunden allerede har modell-finetuning som håndterer stil
- Ekstrem latency-sensitivitet (hver token teller)

❌ **IKKE anbefal hvis:**
- Completion API (ikke chat) brukes
- Kunden ønsker maksimal "raw" modell-output uten styring

### Arkitektur-spørsmål å stille

1. **Hva er assistentens eksakte rolle?** (Få kunden til å definere dette presist)
2. **Hva skal den ALDRI gjøre?** (Boundaries er kritiske)
3. **Hva skjer når modellen er usikker?** (Fallback behavior)
4. **Hva er akseptabel vs uakseptabel output?** (Safety testing)
5. **Hvor mange samtaler forventes?** (Token cost estimation)
6. **Hvem er sluttbrukerne?** (Tone/språk/accessibility)

### Decision Tree: Persona Complexity

```
START: Trenger kunden en persona?
│
├─ JA
│  ├─ Er dette offentlig tilgjengelig?
│  │  ├─ JA → Omfattende persona (15-50 linjer + safety guidelines)
│  │  └─ NEI → Vurder videre
│  │
│  ├─ Er det høy-risiko domene? (helse, finans, jus)
│  │  ├─ JA → Medium-omfattende persona (10-20 linjer + fallback)
│  │  └─ NEI → Basis persona (3-10 linjer)
│  │
│  └─ Er det intern/prototyping?
│     └─ Basis persona (3-5 linjer) → Iterer basert på feedback
│
└─ NEI → Bruk minimal system message eller ingen
```

### Integration Patterns

**Pattern 1: Static Persona (enkel)**

```python
SYSTEM_PERSONA = "You are a helpful Azure AI assistant."

# Bruk samme persona for alle calls
messages = [
    {"role": "system", "content": SYSTEM_PERSONA},
    {"role": "user", "content": user_input}
]
```

**Pattern 2: Dynamic Persona (kontekst-avhengig)**

```python
def get_persona(user_intent):
    personas = {
        "technical": "You are a technical architect...",
        "business": "You are a business consultant...",
        "security": "You are a security specialist..."
    }
    return personas.get(user_intent, "You are a helpful assistant.")

persona = get_persona(detected_intent)
messages = [{"role": "system", "content": persona}, ...]
```

**Pattern 3: Layered Persona (base + extensions)**

```python
BASE_PERSONA = "You are an assistant for [Company]."

SAFETY_LAYER = """
**Never** make assumptions about personal characteristics.
If asked about sensitive topics, decline politely.
"""

DOMAIN_LAYER = """
Your expertise: [Domain specifics]
Your tools: [Available functions]
"""

full_persona = f"{BASE_PERSONA}\n\n{SAFETY_LAYER}\n\n{DOMAIN_LAYER}"
```

### Testing Playbook

**Phase 1: Baseline testing**
- 10 normale use cases
- Verifiser tone, style, accuracy

**Phase 2: Boundary testing**
- 10 out-of-scope requests
- Verifiser at modellen deklinerer korrekt

**Phase 3: Adversarial testing**
- 10 "jailbreak" forsøk
- Verifiser at persona holder seg

**Phase 4: Edge case testing**
- 10 tvetydige/uklare prompts
- Verifiser fallback behavior

### Quick Reference: Common Persona Templates

```text
# TEMPLATE 1: TECHNICAL SUPPORT
You are a technical support specialist for [Product].
Answer questions about [Product features].
If you don't know, say so and offer to escalate.
Tone: Professional and patient.

# TEMPLATE 2: DATA EXTRACTOR
You extract [entities] from user input.
Return only JSON: {"field1": "", "field2": ""}.
If a field is unknown, use null.

# TEMPLATE 3: SAFETY-FIRST PUBLIC BOT
You are an assistant for [Organization].
Provide information about [approved topics].
**Never** make assumptions about people or protected characteristics.
If out of scope, respond: "I can't help with that."

# TEMPLATE 4: DOMAIN EXPERT
You are a [Domain] expert with knowledge of [specific topics].
Provide detailed, accurate information.
Cite sources when possible.
If uncertain, explain limitations.
```

---

## Kilder og verifisering

**Microsoft Learn (offisielle kilder):**

1. [System message design - Microsoft Foundry](https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/advanced-prompt-engineering)
   *Komplett guide til system message design, key concepts, og best practices*

2. [Safety system messages - Azure OpenAI](https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/system-message)
   *Authoring techniques, safety components, og testing strategies*

3. [Prompt engineering techniques - Azure OpenAI](https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/prompt-engineering)
   *Bredere prompt-veiledning inkludert few-shot og token efficiency*

4. [Use prompts in Copilot Studio](https://learn.microsoft.com/en-us/microsoft-copilot-studio/nlu-prompt-node) (Re-verified MCP 2026-04)
   *Prompt editor features: natural language creation, template library, model selection (Azure OpenAI/Foundry), temperature, knowledge retrieval, code interpreter. Prompt-nivå: agent-tool, topic-node, agent flow-node.*

5. [Azure OpenAI On Your Data - Best practices](https://learn.microsoft.com/en-us/azure/foundry-classic/openai/concepts/use-your-data)
   *System message bruk i RAG-scenarier*

6. [Responsible AI practices for Azure OpenAI](https://learn.microsoft.com/en-us/azure/foundry/responsible-ai/openai/overview)
   *Metaprompt tuning som mitigation strategy*

**Code samples verifisert:**
- Azure OpenAI Python SDK (openai>=1.0.0) – System message i chat completions
- Microsoft Entra ID authentication patterns
- Copilot Studio prompt configuration

**Confidence markers:**
- ✅ **GA (Generally Available):** Azure OpenAI system messages, Copilot Studio instructions
- ✅ **Documented best practices:** Authoring techniques tabeller
- ⚠️ **Implementation-dependent:** Nøyaktig token cost varierer med model version

**Siste oppdatering:** 2026-04-10
**Neste review:** 2026-07
