Initial addition of ms-ai-architect plugin to the open-source marketplace. Private content excluded: orchestrator/ (Linear tooling), docs/utredning/ (client investigation), generated test reports and PDF export script. skill-gen tooling moved from orchestrator/ to scripts/skill-gen/. Security scan: WARNING (risk 20/100) — no secrets, no injection found. False positive fixed: added gitleaks:allow to Python variable reference in output-validation-grounding-verification.md line 109. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
16 KiB
Document Chunking — Strategies and Implementation
Last updated: 2026-02 Status: GA (core features), Preview (token chunking) Category: RAG Architecture & Semantic Search
Introduksjon
Chunking er prosessen med å dele opp dokumenter i mindre segmenter som kan indekseres og hentes uavhengig i en RAG-pipeline. Kvaliteten på chunking har direkte innvirkning på retrieval-kvalitet, svar-nøyaktighet og kostnader — og er ofte den viktigste faktoren for om en RAG-løsning oppleves som nyttig eller frustrerende.
Azure AI Search tilbyr fem innebygde chunking-strategier gjennom integrated vectorization: fixed-size (Text Split skill), variable-size (sentence mode), document layout-basert (Document Intelligence), semantisk (Azure Content Understanding), og document parsing (native formatstøtte). I tillegg støttes custom skills for egendefinert logikk via Azure Functions eller eksterne biblioteker som LangChain og Semantic Kernel.
Valg av chunking-strategi avhenger av dokumenttype, bruksmønster, kvalitetskrav og kostnadsrammer. Det finnes ingen universell "beste" strategi — men det finnes gode utgangspunkt og kjente fallgruver.
Kjernekomponenter
Chunking-strategier i Azure AI Search
| Strategi | Skill / Metode | Status | Kostnad | Best for |
|---|---|---|---|---|
| Fixed-size | Text Split skill (pages mode) |
GA | Inkludert i AI Search | Generell RAG, rask oppsett |
| Sentence-basert | Text Split skill (sentences mode) |
GA | Inkludert | Finkornet søk (bruk forsiktig) |
| Document Layout | Document Intelligence Layout skill | GA | Per side (DI-prising) | Strukturerte dokumenter (PDF, DOCX) |
| Semantisk | Azure Content Understanding skill | GA | Per dokument (CU-prising) | Komplekse dokumenter, kryssende sider |
| Document parsing | Indexer parsing modes (Markdown, JSON) | GA | Inkludert | Pre-strukturert innhold |
| Custom | Custom Web API skill | GA | Egen infrastruktur | Domenespesifikk logikk |
Konfigurasjonsparametere (Text Split skill)
| Parameter | Default | Anbefalt start | Beskrivelse |
|---|---|---|---|
textSplitMode |
pages |
pages |
pages = multi-sentence chunks, sentences = enkeltsetninger |
maximumPageLength |
2000 | 2000 (tegn) | Maks tegn per chunk (~512 tokens) |
pageOverlapLength |
0 | 500 (25%) | Overlapp mellom chunks |
defaultLanguageCode |
en |
no (for norsk) |
Språkspesifikk setningsdeteksjon |
maximumPagesToTake |
0 | 0 | Begrens antall chunks (0 = alle) |
Skillset-definisjon (Text Split)
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"defaultLanguageCode": "no",
"context": "/document/content",
"inputs": [{"name": "text", "source": "/document/content"}],
"outputs": [{"name": "textItems", "targetName": "pages"}]
}
Document Layout skill (strukturert chunking)
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"context": "/document",
"outputMode": "oneToMany",
"markdownHeaderDepth": "h3",
"inputs": [{"name": "file_data", "source": "/document/file_data"}],
"outputs": [{"name": "markdown_document", "targetName": "markdownDocument"}]
}
Arkitekturmønstre
Mønster 1: Standard fixed-size chunking
Arkitektur: Data source → Indexer → Text Split skill → Embedding skill → Index
Fordeler:
- Enklest å sette opp og forstå
- Forutsigbar chunk-størrelse og kostnad
- Ingen ekstra API-kostnader (inkludert i AI Search)
- God nok for de fleste generelle brukstilfeller
Ulemper:
- Kan bryte semantisk sammenheng midt i avsnitt
- Ingen bevissthet om dokumentstruktur
- Overlap er eneste mekanisme for kontekstbevaring
Anbefalt for: Rask prototyping, generell RAG, homogent tekstinnhold.
Mønster 2: Strukturbasert chunking med Document Intelligence
Arkitektur: Data source → Indexer → Document Layout skill → Text Split skill (om nødvendig) → Embedding skill → Index
Fordeler:
- Bevarer overskrifter, avsnitt og dokumentstruktur
- Markdown-output med hierarkiske headings
- Metadata om posisjon (sidenummer, bounding boxes)
- Kan kombineres med Text Split for størrelsesbegrensning
Ulemper:
- Ekstra kostnad per side (Document Intelligence-prising)
- Begrenset portalstøtte (East US, West Europe, North Central US)
- Krever filbasert datakilde (PDF, DOCX, PPTX, etc.)
Anbefalt for: Offentlig sektor (policy-dokumenter, regelverk), strukturerte rapporter, juridiske tekster.
Mønster 3: Parent-child med index projections
Arkitektur: Data source → Indexer → Chunking skill → Index projections → Parent index + Child index
Fordeler:
- Sporbarhet: chunk → kildedokument via
text_parent_id - Muliggjør "zoom ut" fra chunk til fullt dokument
- Automatisk felt-mapping uten
outputFieldMappings - Viktig for citation tracking og audit
Ulemper:
- Mer kompleks indeksstruktur
- Krever forståelse av index projections
- Noe mer lagringskostnad
Anbefalt for: Enterprise RAG med krav til kildehenvisning, compliance-systemer, revisjonsklare løsninger.
Mønster 4: Semantisk/kontekst-bevisst chunking
Arkitektur: Data source → Indexer → Azure Content Understanding skill → Semantiske enheter → Embedding skill → Index
Konsept: I stedet for å dele dokumenter etter fast størrelse eller setningsgrenser, identifiserer semantisk chunking meningsfulle tematiske enheter som kan spenne over sider. Azure Content Understanding (GA nov 2025) analyserer dokumentstruktur og semantikk for å produsere chunks som bevarer sammenhengende konsepter.
Fordeler:
- Chunks bryter ikke midt i et konsept eller argument
- Støtter kryss-side-enheter (tabeller, avsnitt som fortsetter)
- Markdown-output med LaTeX, HTML-tabeller og headings
- Bedre retrieval-kvalitet for komplekse dokumenter
Ulemper:
- Høyere kostnad enn Text Split (Content Understanding-prising)
- Regional tilgjengelighet begrenset
- Mindre forutsigbar chunk-størrelse
Sammenligning med andre strategier:
| Aspekt | Fixed-size | Document Layout | Semantisk (CU) |
|---|---|---|---|
| Chunk-grenser | Tegntelling | Headings/avsnitt | Semantiske enheter |
| Kryss-side | Nei | Nei | Ja |
| Tabellhåndtering | Brytes | Delvis | Full støtte |
| Kostnad | Gratis | Per side (DI) | Per dokument (CU) |
| Forutsigbarhet | Høy | Middels | Lav |
Custom semantic chunking via Azure Functions:
For domenespesifikke krav kan du implementere egen semantisk chunking via custom skill:
# Custom skill: Semantisk chunking med embedding-likhet
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("all-MiniLM-L6-v2")
def semantic_split(text, threshold=0.5):
sentences = text.split(". ")
embeddings = model.encode(sentences)
chunks, current = [], [sentences[0]]
for i in range(1, len(sentences)):
sim = np.dot(embeddings[i], embeddings[i-1]) / (
np.linalg.norm(embeddings[i]) * np.linalg.norm(embeddings[i-1]))
if sim < threshold:
chunks.append(". ".join(current))
current = [sentences[i]]
else:
current.append(sentences[i])
chunks.append(". ".join(current))
return chunks
Anbefalt for: Komplekse dokumenter med tabeller, kryssende seksjoner, og semantisk rike avsnitt.
Beslutningsveiledning
Beslutningstabell
| Dokumenttype | Volumkrav | Budsjett | → Anbefalt strategi |
|---|---|---|---|
| Ren tekst (artikler, e-post) | Alle | Lavt | Text Split (fixed-size) |
| Strukturerte PDF-er (rapporter) | Alle | Moderat | Document Layout skill |
| Komplekse dokumenter (tabeller over sider) | Lavt-moderat | Høyere | Content Understanding |
| Pre-strukturert (Markdown, JSON) | Alle | Lavt | Document parsing modes |
| Domenespesifikke krav | Alle | Varierer | Custom skill |
| Blanding av formater | Høyt | Moderat | Document Layout + fallback til Text Split |
Vanlige feil
| Feil | Konsekvens | Løsning |
|---|---|---|
sentences mode i produksjon |
200-siders PDF → 13 000+ chunks, enorm kostnad | Bruk pages mode |
| Overlap > 50% av chunk size | Gir faktisk ingen overlapp (Azure-begrensning) | Hold overlap ≤ 25-30% |
| Ignorerer token-grenser | Embedding-modellen trunkerer, kvalitetstap | Sjekk med tiktoken, hold under 8191 tokens |
| Ingen parent-child tracking | Kan ikke spore tilbake til kildedokument | Bruk index projections |
| Hardkodet chunk-størrelse | Suboptimal for ulike dokumenttyper | Test og iterer basert på kvalitetsmetrikker |
| Glemmer språkparameter | Feil setningsoppdeling for norsk tekst | Sett defaultLanguageCode: "no" |
Røde flagg
- Chunk-størrelse valgt uten testing med faktiske spørringer
- Ingen overlapp i chunks med narrativt innhold
- Bruker
sentencesmode for annet enn analyse/forskning - Ingen evaluering av retrieval-kvalitet etter chunking-endring
- Blander chunking-strategi og embedding-modell uten å re-evaluere
Integrasjon med Microsoft-stakken
| Tjeneste | Integrasjonspunkt |
|---|---|
| Azure AI Search | Integrated vectorization pipeline (indexer → skillset → index) |
| Azure OpenAI | Embedding-generering (text-embedding-3-small/large) |
| Document Intelligence | Document Layout skill for strukturbasert chunking |
| Azure Content Understanding | Semantisk chunking med kryssende sider |
| Azure Functions | Custom chunking skills via Web API |
| Microsoft Fabric / Databricks | Pre-processing pipeline for stor-skala dokumentbehandling |
| Semantic Kernel | TextChunker-klasse for kode-basert chunking |
| LangChain | RecursiveCharacterTextSplitter for fleksibel chunking |
Integrated vectorization pipeline
Blob Storage → Indexer → Skillset:
1. Document Layout / Text Split (chunking)
2. AzureOpenAIEmbedding (vektorisering)
→ Index (med index projections for parent-child)
→ Query (med semantic ranker + vectorizer)
Offentlig sektor (Norge)
Dataplassering og suverenitet
- Azure AI Search: Tilgjengelig i Norway East — data forblir i Norge
- Document Intelligence: Tilgjengelig i West Europe — data i EU, men ikke Norge spesifikt
- Content Understanding: Sjekk regional tilgjengelighet (endres hyppig)
- GDPR: Chunking-prosessen behandler potensielt personopplysninger — databehandleravtale påkrevd
Relevante vurderinger
| Krav | Implikasjon for chunking |
|---|---|
| Forvaltningsloven | Chunks må kunne spores tilbake til kildedokument (bruk parent-child) |
| GDPR Art. 17 | Sletting av kildedokument må kaskadere til chunks (index projections) |
| AI Act | Dokumentasjon av chunking-strategi som del av AI-systemdokumentasjon |
| Schrems II | Unngå tjenester som sender data utenfor EU/EØS under chunking |
| Sikkerhetsloven | Gradert informasjon krever on-premises chunking (custom skill) |
Norsk språkstøtte
- Text Split skill:
defaultLanguageCode: "no"for korrekt norsk setningsoppdeling - Document Intelligence Layout: Støtter norsk tekst i OCR og strukturgjenkjenning
- Embedding-modeller (text-embedding-3): Støtter norsk, men tren/evaluer med norske testdata
Kostnad og lisensiering
Kostnadskomponenter
| Komponent | Prismodell | Estimat (liten skala) |
|---|---|---|
| Text Split skill | Inkludert i AI Search | $0 ekstra |
| Document Layout skill | DI Standard per side | ~$0.01-0.05/side |
| Content Understanding | Per dokument/side | Varierer |
| Embedding (text-embedding-3-small) | Per 1M tokens | ~$0.02/1M tokens |
| Vektorlagring | Per GB i indeksen | Avhenger av tier |
| Custom skill | Azure Functions compute | ~$0.20/million invocations |
Optimaliseringstips
- Start med Text Split: $0 ekstra kostnad, god nok for 70% av brukstilfeller
- Bruk Document Layout selektivt: Kun for dokumenter som har viktig struktur
- Optimaliser chunk-størrelse: Færre, større chunks = lavere embedding- og lagringskostnad
- Sett
stored: falsepå vektorfelt: Sparer lagring hvis du ikke trenger rå-vektorer i søkeresultater - Batch-indeksering: Kjør under off-peak for lavere compute-kostnad
- Monitor med Azure Cost Management: Tag AI Search-ressurser for sporbarhet
Kostnadseffekt av overlapp
Overlapp øker antall chunks proporsjonalt:
- 0% overlapp: N chunks
- 25% overlapp: ~1.33N chunks (+33% lagring og embedding-kostnad)
- 50% overlapp: ~2N chunks (+100% kostnad)
For arkitekten (Cosmo)
Spørsmål å stille kunden
- "Hva slags dokumenter skal indekseres?" — Strukturerte PDF-er krever Document Layout, ren tekst klarer seg med Text Split
- "Hvor viktig er kildehenvisning i svarene?" — Hvis viktig, krev parent-child med index projections
- "Hva er typisk spørringslengde og -type?" — Korte, presise spørringer → mindre chunks. Brede tematiske → større chunks
- "Finnes det gradert eller sensitiv informasjon?" — Kan kreve on-premises chunking med custom skill
- "Hva er akseptabel latency?" — Flere chunks = mer søketid, men potensielt bedre kvalitet
- "Har dere norskspråklige dokumenter?" — Sett
defaultLanguageCode: "no", test embedding-kvalitet - "Hva er volumet?" — Høyt volum + Document Intelligence = betydelig kostnad per side
- "Hvordan håndterer dere dokumentoppdateringer?" — Inkrementell oppdatering vs. full re-indeksering påvirker arkitekturen
Fallgruver
- Over-engineering fra dag 1: Start med Text Split, mål kvaliteten, iterer. Ikke begynn med Content Understanding før du har bevist at det trengs.
- Chunk-størrelse som dogme: "512 tokens" er et utgangspunkt, ikke et fasitsvar. Evaluer med faktiske spørringer og dokumenter.
- Glemmer overlapp: Uten overlapp mistes kontekst ved chunk-grenser. 25% er en god start.
- Sentences-fellen:
textSplitMode: sentencesser logisk ut men genererer tusenvis av chunks per dokument. Brukpages.
Anbefalinger per modenhetsnivå
| Modenhet | Anbefaling |
|---|---|
| Prototyp | Text Split, 2000 tegn, 25% overlapp. Evaluer med 5-10 testspørringer. |
| Pilot | Legg til Document Layout for strukturerte dokumenter. Implementer parent-child med index projections. |
| Produksjon | Differensiert strategi per dokumenttype. Automatisert kvalitetsevaluering. Kostnadsmonitorering. |
| Enterprise | Custom skills for domenespesifikke krav. Token chunking (preview). A/B-testing av chunk-strategier. |
Kilder og verifisering
| Kilde | Konfidens | URL |
|---|---|---|
| Chunk large documents for RAG (Azure AI Search) | Verified | learn.microsoft.com |
| Chunk and vectorize by document layout | Verified | learn.microsoft.com |
| Integrated vectorization overview | Verified | learn.microsoft.com |
| Set up integrated vectorization (REST) | Verified | learn.microsoft.com |
| RAG chunking phase (Architecture Guide) | Verified | learn.microsoft.com |
| RAG with Document Intelligence | Verified | learn.microsoft.com |
| Azure Search Vector Samples (GitHub) | Verified | github.com/Azure |
| Token chunking (preview) | Baseline | Annonsert i 2025-11-01-preview API |
| Prisinformasjon | Baseline | Basert på offentlige prislister, sjekk Azure-kalkulator for oppdaterte priser |