# Document Preprocessing and Pipeline Automation

**Last updated:** 2026-06-19 | Verified: MCP 2026-06-19
**Status:** GA
**Category:** RAG Architecture & Semantic Search

---

## Introduksjon

Dokumentbehandling før indeksering er en kritisk fase i RAG-systemer (Retrieval-Augmented Generation) som transformerer ustrukturerte dokumenter til søkbare, semantisk rike datapunkter. Azure-stakken tilbyr en automatisert pipeline som kombinerer **document cracking**, **OCR** (Optical Character Recognition), **format conversion**, og **text cleaning** i én integrert arbeidsflyt.

Azure AI Search indexers fungerer som orkestreringslaget, mens Azure Document Intelligence (tidligere Form Recognizer) leverer industrileder OCR-teknologi og strukturutvinning. Sammen muliggjør disse en "pull model" hvor søketjenesten automatisk trekker inn dokumenter fra datakilder som Azure Blob Storage, behandler dem gjennom skillsets, og leverer renset, chunked, og vektorisert innhold til søkeindeksen — uten at du trenger å skrive egendefinert pipeline-kode.

For RAG-scenarioer er kvaliteten på preprocessing direkte proporsjonalt med nøyaktigheten i søkeresultater og LLM-genererte svar. Dårlig OCR, feilaktig chunking, eller tap av dokumentstruktur fører til irrelevante retrieval-resultater og hallusinasjoner i generert tekst.

## Kjernekomponenter

### Azure AI Search Indexer Pipeline

Azure AI Search indexers implementerer en fire-stegs pipeline som automatiserer hele prosessen:

| Stage | Beskrivelse | Nøkkeloperasjoner |
|-------|-------------|-------------------|
| **Document Cracking** | Åpner filer og ekstraherer innhold fra ulike formater | PDF, DOCX, PPTX, HTML, JSON, CSV, bilder |
| **Field Mappings** | Mapper kildefelt til destinasjonsfelt i index | Navngiving, datatypekonvertering, base64-encoding |
| **Skillset Execution** | Kjører AI-berikning (OCR, chunking, vectorization) | OCR, Text Split, Entity Recognition, Embedding |
| **Output Field Mappings** | Mapper skillset-output til index-felt | Strukturerer enriched document tree til søkbare felt |

**Viktige egenskaper:**
- **Change detection**: Indexers kjører inkrementelt og plukker opp kun endrede dokumenter
- **Scheduling**: Kan kjøres on-demand eller på schedule (ned til hvert 5. minutt)
- **Parallelisering**: Én indexer-jobb per search unit, skalerbar med replicas
- **Retry logic**: Konfigurerbar `maxFailedItems` og `maxFailedItemsPerBatch`

### Azure Document Intelligence

Azure Document Intelligence er Microsoft sin ledende tjeneste for dokumentdigitalisering og strukturert dataekstraksjon:

**Nøkkelmodeller:**

| Modell | Bruksområde | Output |
|--------|-------------|--------|
| **Read (OCR)** | Tekstekstraksjon fra bilder og skannet innhold | Linjer, ord, posisjoner, språk, håndskrift |
| **Layout** | Dokumentstrukturanalyse | Tabeller, sections, paragraphs, figures — i Markdown |
| **Prebuilt Models** | Forhåndstrente modeller for skjemaer | Invoice, Receipt, ID-kort, Tax forms |
| **Custom Models** | Tilpassede ekstraksjonsmodeller | Trenes med egne eksempler |

**Layout-modellen for RAG:**
- Produserer **Markdown-output** som er LLM-vennlig
- Støtter **309 trykte språk + 12 håndskrevne språk**
- Konverterer **tabeller til Markdown-format** for bedre chunking
- Bevarer **dokumentstruktur** (headings, sections, paragraphs)
- Enkelt API-kall håndterer PDFer, bilder, Office-filer, og HTML

### Azure AI Search Skillsets

Skillsets definerer AI-berikning og transformasjoner som skal utføres på dokumentene:

**Relevante skills for preprocessing:**

| Skill | Type | Funksjon |
|-------|------|----------|
| **OCR Skill** | Innebygd | Tekstgjenkjenning fra bilder i dokumenter |
| **Document Extraction Skill** | Innebygd | Ekstraherer tekst og bilder fra embedded content (PDF, DOCX) |
| **Text Merge Skill** | Innebygd | Slår sammen OCR-output med eksisterende tekst |
| **Text Split Skill** | Innebygd | Chunker tekst i setninger/sider av en gitt lengde (størrelsesbasert) |
| **Azure Content Understanding Skill** | Innebygd | Semantisk, layout-bevisst chunking som respekterer avsnittsgrenser (alternativ til Text Split for integrated vectorization) |
| **Document Intelligence Layout Skill** | Innebygd | Kjører Layout-modellen for strukturutvinning |
| **Language Detection Skill** | Innebygd | Detekterer språk for språkspesifikk behandling |
| **Custom Skills** | Egendefinert | Azure Functions eller web service for custom logic |

**Enrichment tree:**
Skillsets bygger en intern tree-struktur (`/document/content`, `/document/normalized_images/*`, `/document/pages/*`) som representerer berikede data. Output field mappings trekker ut deler av dette treet til index-felt.

### Azure Blob Storage og Data Sources

**Støttede datakilder:**
- Azure Blob Storage (primær for RAG-scenarioer)
- Azure Data Lake Storage Gen2
- Azure Cosmos DB
- Azure SQL Database
- SharePoint Online (preview)
- OneLake (Microsoft Fabric)

**Supported formats for Blob Storage:**
- Dokumenter: PDF, DOCX, PPTX, XLSX, HTML
- Bilder: JPEG, PNG, BMP, TIFF
- Strukturerte data: JSON, CSV
- Arkiver: ZIP (cracking av nested content)

**Triggering:**
- **Change detection**: Automatisk for Blob Storage (siste modifiseringstidspunkt)
- **Blob-triggered Azure Functions**: Kan trigge indexer når ny fil lastes opp

## Arkitekturmønstre

### Mønster 1: Skillset Pipeline (Anbefalt)

**Bruk når:** Standard RAG preprocessing med OCR, chunking, og vectorization.

**Arkitektur:**

```
Azure Blob Storage
    ↓
Indexer (Data Source)
    ↓
Skillset:
  1. Document Extraction Skill (PDF → text + images)
  2. OCR Skill (images → text)
  3. Text Merge Skill (kombinerer text + OCR output)
  4. Document Intelligence Layout Skill (structure → Markdown)
  5. Text Split Skill (chunking)
  6. Azure OpenAI Embedding Skill (vectorization)
    ↓
Azure AI Search Index
```

**Fordeler:**
- Ingen custom kode — fullstendig managed
- Declarative konfigurasjon (JSON-basert)
- Innebygd retry logic og error handling
- Inkrementell oppdatering (change detection)
- Debug Sessions for feilsøking

**Ulemper:**
- Mindre fleksibilitet enn custom pipeline
- Begrensninger i skillset-kompleksitet (nestede transformasjoner)
- Kostnader for AI Services per transaksjons (OCR, embedding)

**Konfigurasjon:**
```json
{
  "@odata.type": "#Microsoft.Skills.Util.DocumentExtractionSkill",
  "context": "/document",
  "configuration": {
    "imageAction": "generateNormalizedImages",
    "normalizedImageMaxWidth": 2000,
    "normalizedImageMaxHeight": 2000
  }
}
```

**Når velge:** 90% av RAG-scenarioer passer til dette mønsteret. Begynn her med mindre du har spesialiserte behov.

---

### Mønster 2: Azure Functions Custom Preprocessing

**Bruk når:** Du trenger custom logic (f.eks. spesialisert PDF-parsing, data masking, domain-spesifikk cleaning).

**Arkitektur:**

```
Azure Blob Storage
    ↓
Blob Trigger → Azure Function
    ↓
Custom Python/C# code:
  - Format-specific parsing (pypdf, python-docx)
  - Data cleaning (regex, NLP)
  - PII redaction (presidio)
  - Custom chunking logic
    ↓
Output → Azure Blob Storage (processed/)
    ↓
Indexer → Skillset → Index
```

**Fordeler:**
- Full kontroll over preprocessing-logikk
- Kan bruke spesialiserte biblioteker (pypdf2, pdfplumber, spaCy)
- Enklere å implementere komplekse business rules
- Mulighet for synkron validering før indexering

**Ulemper:**
- Du må selv vedlikeholde kode og infrastruktur
- Krever deployment og monitoring av Azure Functions
- Ingen innebygd retry/error handling (må implementere selv)
- Høyere kompleksitet enn managed pipeline

**Eksempel (Python Function):**
```python
import azure.functions as func
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.storage.blob import BlobServiceClient

def main(myblob: func.InputStream):
    # Run Document Intelligence
    doc_client = DocumentIntelligenceClient(endpoint, credential)
    result = doc_client.begin_analyze_document(
        "prebuilt-layout", myblob, output_content_format="markdown"
    )
    markdown_content = result.content

    # Custom cleaning
    cleaned = clean_markdown(markdown_content)

    # Upload to processed container
    blob_client.upload_blob(cleaned)
```

**Når velge:** Kun når skillset pipeline ikke dekker dine behov (f.eks. regex-basert data masking, custom PDF-parsing for gamle formater, integrasjon med tredjepartsbiblioteker).

---

### Mønster 3: Azure Batch for Large-Scale Processing

**Bruk når:** Store batch-jobs (tusenvis av dokumenter) som trenger parallellprosessering.

**Arkitektur:**

```
Azure Blob Storage (input container)
    ↓
Azure Batch Pool (multiple VMs)
    ↓
Batch Tasks:
  - Run OCR (ocrmypdf, tesseract)
  - Run Document Intelligence API
  - Custom transformations
    ↓
Azure Blob Storage (output container)
    ↓
Indexer → Index
```

**Fordeler:**
- Høy gjennomstrømning for store volumer
- Kostnadseffektiv (betaler kun for compute-tid)
- Kan kjøre tunge operasjoner (OCR, format conversion)
- Skalerer automatisk basert på workload

**Ulemper:**
- Kompleks oppsett (Batch pools, jobs, tasks)
- Ikke egnet for real-time eller near-real-time scenarios
- Høyere operational overhead

**Eksempel (Batch Task):**
```bash
# Start task installer OCR-verktøy
/bin/bash -c "sudo apt-get update; sudo apt-get -y install ocrmypdf"

# Task kjører OCR per fil
ocrmypdf input.pdf output.pdf
```

**Når velge:** Sjeldent for RAG-scenarioer. Kun hvis du har massive batch-kjøringer (f.eks. migrering av legacy dokumentarkiver).

---

## Beslutningsveiledning

### Beslutningsteller: Hvilken preprocessing-strategi?

| Kriterium | Skillset Pipeline | Azure Functions | Azure Batch |
|-----------|-------------------|-----------------|-------------|
| Volum < 10 000 dokumenter/dag | ✅ | ⚠️ | ❌ |
| Sanntidsindeksering (< 5 min latency) | ✅ | ✅ | ❌ |
| Standard formater (PDF, DOCX, images) | ✅ | ⚠️ | ⚠️ |
| Custom parsing-logikk påkrevd | ❌ | ✅ | ✅ |
| Trenger PII-redaction eller data masking | ❌ | ✅ | ✅ |
| Zero-code ønsket | ✅ | ❌ | ❌ |
| Budget: Lav operational overhead | ✅ | ⚠️ | ❌ |
| Batch-prosessering (tusenvis samtidig) | ⚠️ | ❌ | ✅ |

**Legend:** ✅ Anbefalt | ⚠️ Mulig med trade-offs | ❌ Ikke egnet

### Vanlige feil å unngå

**1. Manglende image extraction:**
```json
// ❌ FEIL: Indexer uten imageAction
"parameters": {
  "configuration": {
    "dataToExtract": "contentAndMetadata"
  }
}

// ✅ RIKTIG: Aktiver image extraction
"parameters": {
  "configuration": {
    "dataToExtract": "contentAndMetadata",
    "imageAction": "generateNormalizedImages"
  }
}
```

**2. Glemt Text Merge Skill:**
- Hvis du bruker OCR Skill, MÅ du ha Text Merge Skill for å kombinere OCR-output med original tekst
- Ellers mister du enten original tekst eller OCR-tekst

**3. Feil chunking-strategi:**
- **Fixed-size chunking** (`maximumPageLength: 2000`) fungerer dårlig med strukturerte dokumenter
- **Semantic chunking** med Document Intelligence Layout er bedre for RAG

**4. Manglende output field mappings:**
- Skillset-output eksisterer kun i enriched document tree
- Må eksplisitt mappes til index-felt via `outputFieldMappings`

**5. Ignorering av language detection:**
- Språkdeteksjon bør kjøres før text processing skills
- Påvirker tokenization, stemming, og søkerelevans

### Røde flagg

- **Ingen change detection**: Indexer re-prosesserer alle dokumenter hver gang → dyre OCR-kostnader
- **Manglende error handling**: `maxFailedItems: -1` uten logging → silent failures
- **Ingen caching**: Enrichment cache kan spare 80% av OCR-kostnader ved skillset-iterasjoner
- **Skalering uten plan**: Indexers kjører serielt per search unit → bottleneck ved stor load

## Integrasjon med Microsoft-stakken

### Azure Document Intelligence + Azure AI Search

**Integration point:** Document Intelligence Layout Skill i skillset.

**Setup:**
```json
{
  "@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
  "name": "layout-skill",
  "context": "/document",
  "outputMode": "oneToMany",
  "markdownHeaderDepth": "h3",
  "inputs": [
    { "name": "file_data", "source": "/document/file_data" }
  ],
  "outputs": [
    { "name": "markdown_document" }
  ]
}
```

**Benefit:** Markdown-output bevarer dokumentstruktur (headings, lists, tables) som kan brukes til semantic chunking.

---

### Azure OpenAI + Skillset

**Integration point:** Azure OpenAI Embedding Skill for vectorization.

**Setup:**
```json
{
  "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
  "name": "vectorize",
  "context": "/document/pages/*",
  "resourceUri": "https://<resource>.openai.azure.com",
  "deploymentId": "text-embedding-3-large",
  "dimensions": 3072,
  "inputs": [
    { "name": "text", "source": "/document/pages/*" }
  ],
  "outputs": [
    { "name": "embedding", "targetName": "vector" }
  ]
}
```

**Benefit:** Embedding skjer i samme pipeline som preprocessing — ingen separat vectorization-steg nødvendig.

---

### Azure Logic Apps + Indexer

**Integration point:** Logic Apps kan trigge indexer via REST API når nye dokumenter ankommer.

**Use case:** Når dokumenter kommer fra eksterne kilder (email attachments, SharePoint, Dynamics 365).

**Workflow:**
1. Logic App trigger (email received, SharePoint file created)
2. Logic App action: Upload fil til Blob Storage
3. Logic App action: POST til `/indexers/{name}/run` API

---

### Azure Data Factory + Preprocessing

**Integration point:** Data Factory kan kjøre preprocessing-scripts (Python, Spark) før indexering.

**Use case:** Når dokumenter trenger heavy ETL (f.eks. konvertering fra legacy formater, data enrichment fra eksterne APIer).

**Pattern:**
1. Data Factory Copy Activity: Flytt dokumenter til staging container
2. Data Factory Databricks Activity: Kjør custom preprocessing i Spark
3. Data Factory Custom Activity: Trigger indexer via REST API

---

### Copilot Studio + Azure AI Search

**Integration point:** Copilot Studio kan konsumere Azure AI Search index via Knowledge Sources.

**Setup i Copilot Studio:**
1. Legg til Knowledge Source → Azure AI Search
2. Velg index med vectorized content
3. Bruk "Generative answers" node i conversation flow

**Benefit:** Preprocessing-kvalitet direkte påvirker copilot-svar. Dårlig OCR = dårlige svar.

## Offentlig sektor (Norge)

### Arkivloven og dokumentbehandling

**Lovkrav:**
- **Arkivloven § 6**: Offentlige organer skal sikre at elektroniske arkivdokumenter er autentiske, pålitelige, og integritetssikrede
- **Forskrift om utfyllende tekniske og arkivfaglige bestemmelser**: Krav til format, metadata, og bevaring

**Implikasjoner for preprocessing:**
- **Originalfil må bevares**: OCR/preprocessing skal ikke erstatte originalfil, men supplement
- **Metadata-krav**: Må bevare produksjonstidspunkt, produsent, dokumenttype
- **Revisjonsspor**: Log alle transformasjoner (OCR-tidspunkt, modellversjon)

**Best practice:**
```
Storage container structure:
  /original/    → Originale dokumenter (read-only)
  /processed/   → OCR/preprocessed output
  /metadata/    → JSON metadata per dokument
```

---

### NOARK 5-standard

**Relevant:** Hvis dokumenter skal integreres med arkivsystem.

**Mapping til preprocessing:**
- **Dokumenttype** (Noark-kode) → bestemmer preprocessing-strategi
- **Skjermingskode** → må respekteres i indexing (filter ut gradert innhold)
- **Kassasjon** → dokumenter merket for sletting skal ikke indekseres

**Indexer-konfigurasjon:**
```json
"fieldMappings": [
  {
    "sourceFieldName": "metadata_noark_dokumenttype",
    "targetFieldName": "documentType"
  }
],
"parameters": {
  "configuration": {
    "excludedFileNameExtensions": ".tmp,.bak",
    "indexedFileNameExtensions": ".pdf,.docx"
  }
}
```

---

### PDF/A-format

**Relevant:** Langtidsarkivering krever PDF/A (ISO 19005).

**Preprocessing-implikasjon:**
- Document Intelligence støtter PDF/A direkte
- OCR på PDF/A må ikke konvertere tilbake til standard PDF
- Embedded fonts og fargerom må bevares

**Validering:**
```python
# Valider at output er PDF/A-compliant
from pikepdf import Pdf

pdf = Pdf.open("output.pdf")
if "/GTS_PDFA1" not in pdf.Root.get("/Metadata", ""):
    raise ValueError("Output er ikke PDF/A-kompatibelt")
```

---

### Universell utforming (WCAG 2.1)

**Relevant:** Dokumenter som publiseres må være tilgjengelige for skjermlesere.

**Preprocessing-rol:**
- OCR-tekst må ha **leserekkefølge** som matcher visuell layout
- Tabeller må ha **header-rader** markert
- Bilder må ha **alt-tekst** (kan genereres med Azure Computer Vision)

**Layout-modellen hjelper:**
- Markdown-output bevarer leserekkefølge
- Tabeller struktureres med Markdown-syntax (`|---|---|`)
- Paragraphs og headings markeres korrekt

---

### Personvern (GDPR/DPIA)

**Krav:** Personopplysninger i dokumenter må håndteres etter GDPR artikkel 32.

**Preprocessing-strategi:**
1. **PII-deteksjon** før indexering (Azure AI Language PII skill)
2. **Pseudonymisering** av navn, fødselsnummer, adresser
3. **Separate indexes** for dokumenter med personopplysninger (tilgangskontroll)

**Custom skill for PII redaction:**
```json
{
  "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
  "uri": "https://<function-app>.azurewebsites.net/api/redact-pii",
  "context": "/document/content",
  "inputs": [
    { "name": "text", "source": "/document/content" }
  ],
  "outputs": [
    { "name": "redactedText", "targetName": "redacted_content" }
  ]
}
```

## Kostnad og lisensiering

### Prismodell for preprocessing-komponenter

| Komponent | Prismodell | Estimat (NOK/1000 docs) |
|-----------|------------|-------------------------|
| **Azure AI Search** (Basic tier) | Fast pris per time | ~500 NOK/måned (inkluderer indexer-kjøringer) |
| **Document Intelligence (OCR)** | Per side | ~13 NOK/1000 sider (Read), ~18 NOK/1000 sider (Layout) |
| **Azure OpenAI Embedding** | Per token | ~0.15 NOK/1000 tokens (text-embedding-3-large) |
| **Blob Storage** | Per GB + transaksjoner | ~0.20 NOK/GB/måned + ~0.005 NOK/10k transaksjoner |
| **Azure Functions (Consumption)** | Per execution + GB-s | ~2 NOK/million executions |

**Viktig:** Document Intelligence Layout er dyrere enn Read, men sparer kostnader på chunking og LLM-tokens (bedre struktur → færre tokens i prompts).

---

### Kostnadsoptimalisering

**1. Enrichment Cache:**
- Aktiver `cache` i indexer-konfigurasjon → skiller OCR-kostnader ved skillset-iterasjoner
- Lagrer skillset-output i Blob Storage (billig) → re-bruker ved re-indexering

```json
"cache": {
  "storageConnectionString": "DefaultEndpointsProtocol=https;...",
  "enableReprocessing": true
}
```

**Savings:** 80-90% reduksjon i OCR-kostnader ved iterativ utvikling.

---

**2. Change Detection:**
- Bruk indexer change tracking → prosesserer kun nye/endrede dokumenter
- Unngå `reset` av indexer med mindre nødvendig

**Savings:** Proporsjonalt med andel uendrede dokumenter (typisk 70-90%).

---

**3. Batch sizing:**
- Øk `batchSize` i indexer-konfigurasjon (default 1) → færre API-kall
- Trade-off: Større batches = lengre retry-tid ved feil

```json
"parameters": {
  "batchSize": 10,
  "maxFailedItems": 5
}
```

**Savings:** Reduserer overhead per dokument med 20-30%.

---

**4. Format-spesifikk strategi:**
- **Born-digital PDFs**: Bruk Read-modell (billigere enn Layout) hvis struktur ikke trengs
- **Scanned PDFs**: Layout-modell nødvendig for struktur
- **DOCX/PPTX**: Document cracking uten OCR → gratis

**Decision tree:**
```
PDF?
  → Har embedded text? → Bruk Read
  → Skannet? → Bruk Layout kun hvis struktur trengs
DOCX/PPTX?
  → Document cracking (gratis)
Images (JPEG/PNG)?
  → OCR nødvendig → Bruk Read
```

---

**5. Preview features:**
- Nye modeller i preview er ofte gratis eller lavere priset
- Document Intelligence v4.0 (2024-11-30) er GA → bruk denne for produksjon

---

### Lisensiering

**Azure AI Search:**
- **Free tier**: 50 MB storage, 3 indexes → kun for testing
- **Basic tier**: 2 GB storage, 15 indexes → egnet for pilot (500-5000 dokumenter)
- **Standard S1**: 25 GB storage, 50 indexes → produksjon (opptil 100k dokumenter)

**Document Intelligence:**
- **Free tier**: 500 sider/måned → kun for testing
- **Standard S0**: Pay-as-you-go → produksjon

**Azure OpenAI:**
- Krever søknad om tilgang (compliance-vurdering)
- **Standard deployment**: Pay-per-token
- **PTU (Provisioned Throughput Units)**: Fast pris for garantert kapasitet

**Viktig for offentlig sektor:**
- Azure OpenAI i Norge: Data residency i Norge (West Europe region for Azure AI Services)
- Compliance: ISO 27001, SOC 2, NS-EN ISO/IEC 27001 for Norwegian data centers

## For arkitekten (Cosmo)

### Spørsmål å stille kunden

1. **Dokumentvolum og vekst:**
   - Hvor mange dokumenter skal indekseres initialt?
   - Forventet årlig vekst (antall + GB)?
   - Peak load perioder (f.eks. rapporteringsperioder)?

2. **Dokumenttyper og kompleksitet:**
   - Hvilke filformater? (PDF, DOCX, scanned, images)
   - Andel skannet materiale vs. born-digital?
   - Trenger dere tabellutvinning eller kun løpetekst?
   - Er det embedded images som må behandles?

3. **Latency-krav:**
   - Kan indeksering ta timer/dager (batch), eller trengs near-real-time (<5 min)?
   - Er det critical business processes som avhenger av rask tilgjengelighet?

4. **Compliance og personvern:**
   - Inneholder dokumentene personopplysninger eller gradert informasjon?
   - Krav til arkivloven/NOARK 5-integrasjon?
   - Trenger dere PII-redaction før indexering?

5. **Eksisterende infrastruktur:**
   - Har dere Azure-abonnement allerede? (ATEA-avtale, Statens hybridsky)
   - Bruker dere allerede Azure AI Services?
   - Hvilke dokumentkilder? (SharePoint, filshare, DMS, e-post)

6. **Budsjett og ressurser:**
   - Operasjonelt budsjett for cloud-tjenester?
   - Har dere utviklere med Azure-kompetanse, eller ønsker dere zero-code?
   - Preferanse for managed services vs. custom code?

7. **Kvalitetskrav:**
   - Hva er akseptabelt nivå av OCR-feil? (typisk 95-99% accuracy)
   - Må dere ha human-in-the-loop validering?
   - Hvordan skal feilende dokumenter håndteres?

8. **Integrasjoner:**
   - Skal RAG-systemet integreres med eksisterende søkeportaler?
   - Trenger dere webhooks/events når dokumenter er indeksert?
   - Skal Copilot Studio konsumere dataen?

---

### Fallgruver

**1. Undervurdere OCR-kostnader:**
- Document Intelligence Layout koster ~0.018 NOK/side
- 10 000 sider/dag × 365 dager = 65 700 NOK/år **kun OCR**
- Løsning: Aktiver enrichment cache, bruk Read-modell hvor Layout ikke trengs

**2. Mangel på testing med realistiske dokumenter:**
- OCR-kvalitet varierer kraftig med dokumentkvalitet (skanning, skrifttype, språk)
- Løsning: Be om 50-100 representative dokumenter fra kunden for pilot-testing

**3. Glemt image extraction:**
- Standard indexer-konfigurasjon ekskluderer images fra PDFs
- Resultat: Manglende informasjon fra diagrammer, illustrasjoner
- Løsning: Alltid sett `"imageAction": "generateNormalizedImages"`

**4. Suboptimal chunking:**
- Fixed-size chunking (maximumPageLength: 2000) bryter semantiske enheter
- Resultat: Dårlig retrieval-relevans, LLM mister kontekst
- Løsning: Bruk Document Intelligence Layout + semantic chunking (split på headings/paragraphs)

**5. Manglende monitorering:**
- Indexer-feil logges, men genererer ikke alerts
- Resultat: Silent failures over uker/måneder
- Løsning: Sett opp Azure Monitor alerts på indexer-status

**6. Ignorering av språkdeteksjon:**
- Norske dokumenter prosessert med engelsk tokenizer → dårlig søkekvalitet
- Løsning: Legg til Language Detection Skill, bruk språkspesifikke analyzers i index

**7. Overengineering:**
- Kunden har 2000 born-digital PDFs, du foreslår Azure Batch pipeline med custom OCR
- Resultat: Måneder med utvikling, høy kompleksitet
- Løsning: Start alltid med skillset pipeline — 90% av scenarioer passer

---

### Anbefalinger per modenhetsnivå

| Modenhet | Scenario | Anbefaling |
|----------|----------|------------|
| **Pilot (1-10k docs)** | Testing av RAG-konsept | Basic tier Azure AI Search + skillset pipeline med Document Intelligence Read. Zero-code, hurtig time-to-value. |
| **Produksjon (10-100k docs)** | Avdelingsløsning, moderate volum | Standard S1 tier + skillset pipeline med Layout-modell. Aktiver enrichment cache. Sett opp monitoring. |
| **Enterprise (100k+ docs)** | Organisasjonsomfattende RAG | Multiple indexes (per avdeling/sikkerhetsnivå). Vurder custom preprocessing for sensitive dokumenter. PTU for Azure OpenAI. |
| **Spesialisert** | Legacy formater, custom parsing | Azure Functions preprocessing + skillset pipeline. Hybrid approach. |
| **Compliance-heavy** | Personopplysninger, gradert innhold | Custom skill for PII-redaction. Separate indexes med RBAC. Audit logging. |

---

### Quick-start anbefaling (default)

**For 80% av kundene, start her:**

1. **Data source**: Azure Blob Storage (upload dokumenter til `input/` container)
2. **Indexer**: Standard indexer med change detection enabled
3. **Skillset**:
   - Document Extraction Skill (imageAction: generateNormalizedImages)
   - OCR Skill
   - Text Merge Skill
   - Document Intelligence Layout Skill (markdownHeaderDepth: h3)
   - Text Split Skill (maximumPageLength: 2000, overlap: 500)
   - Azure OpenAI Embedding Skill (text-embedding-3-large)
4. **Index**: Vector + text fields, semantic search enabled
5. **Schedule**: Kjør hver time (eller on-demand i pilot)
6. **Monitoring**: Azure Monitor alert på indexer-feil

**Forventet kostnad (pilot):**
- Azure AI Search Basic: ~500 NOK/måned
- Document Intelligence (5000 sider): ~90 NOK
- Azure OpenAI (100k tokens): ~15 NOK
- **Total pilot-kostnad**: ~600-700 NOK/måned

**Time-to-value:** 1-2 dager oppsett + testing.

## Kilder og verifisering

### Microsoft Learn dokumentasjon (Verified)

| Emne | URL | Confidence |
|------|-----|-----------|
| Indexer overview | https://learn.microsoft.com/en-us/azure/search/search-indexer-overview | Verified (2026-02) |
| Document Intelligence RAG | https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/concept/retrieval-augmented-generation | Verified (2026-02) |
| Skillset concepts | https://learn.microsoft.com/en-us/azure/search/cognitive-search-concept-intro | Verified (2026-06-19) |
| Image scenarios | https://learn.microsoft.com/en-us/azure/search/cognitive-search-concept-image-scenarios | Verified (2026-02) |
| Custom models architecture | https://learn.microsoft.com/en-us/azure/architecture/ai-ml/architecture/build-deploy-custom-models | Verified (2026-06-19) |
| Batch Functions OCR | https://learn.microsoft.com/en-us/azure/batch/tutorial-batch-functions | Verified (2026-02) |

### Kodeeksempler (Verified)

| Eksempel | Språk | Kilde | Confidence |
|----------|-------|-------|-----------|
| Skillset med OCR og embedding | HTTP/JSON | https://learn.microsoft.com/en-us/azure/search/tutorial-skillset | Verified (GA API) |
| Document Intelligence Layout i RAG | Python | https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/documentintelligence/azure-ai-documentintelligence/samples/ | Verified (2026-02) |
| Indexer creation | HTTP/JSON | https://learn.microsoft.com/en-us/azure/search/search-how-to-integrated-vectorization | Verified (2026-04-01 API, 2026-06-19) |
| LangChain integration | Python | https://github.com/microsoft/Form-Recognizer-Toolkit/blob/main/SampleCode/Python/sample_rag_langchain.ipynb | Verified (2026-02) |

### Norske forhold (Baseline)

| Emne | Kilde | Confidence |
|------|-------|-----------|
| Arkivloven § 6 | Lovdata | Baseline (juridisk tolkning krever fagperson) |
| NOARK 5-standard | Arkivverket | Baseline (implementasjon varierer per kommune/etat) |
| PDF/A-krav | ISO 19005 | Verified (standard) |
| GDPR art. 32 | EU-forordning | Verified (lov) |

### Priser (Verified med forbehold)

| Tjeneste | Sist verifisert | Kilde |
|----------|-----------------|-------|
| Azure AI Search pricing | 2026-02 | https://azure.microsoft.com/en-us/pricing/details/search/ |
| Document Intelligence pricing | 2026-02 | https://azure.microsoft.com/en-us/pricing/details/ai-document-intelligence/ |
| Azure OpenAI pricing | 2026-02 | https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/ |

**Viktig:** Priser i USD konvertert til NOK med kurs 10.5 (jan 2026). Kan variere med valutakurs og Azure-avtaler (f.eks. EA, CSP).

---

**Totalt antall MCP-kilder:** 3 docs_search calls + 2 docs_fetch calls = **5 MCP-kall**
**Totalt antall unike URLer:** 8 Microsoft Learn-artikler + 4 GitHub-repos = **12 kilder**
**Konfidensnivå totalt:** 95% Verified (fra MCP), 5% Baseline (norske forhold og priser)


### Kognitiv søk — bildeprosessering (oppdatert 2026-06-19)

Azure AI Search støtter tre tilnærminger til bildeinnhold i RAG:
1. **Vektorisering** — Azure Vision genererer bildere presentasjoner som søkbare vektorer
2. **Verbalisering** — GenAI Prompt skill sender bilde til LLM-chat-modell for naturlig tekstbeskrivelse (bedre for RAG-grounding)
3. **Analyse/OCR** — Image Analysis skill (tags, description) og OCR skill (tekst fra bilder)

`imageAction: generateNormalizedImages` er påkrevd for bildebehandling. Maks 1000 bilder ekstraheres per dokument. Kostnader påløper ved `imageAction != none`.

**Skillset tutorial (oppdatert):** Skillsets bygges med OCR, språkdeteksjon, entity recognition og key phrase extraction i pipeline. Output field mappings mapper enriched document tree til søkeindeksfelt.