Ordre 20260912T193441Z-7358817909. Steg 1 var ikke transformen, men å rette
roadmapens R13-gate og få den ratifisert. Gaten `grep -rl "Cosmo"
skills/*/references -> 0` var usann på to uavhengige måter:
1. Ordren fanget den første: 451 av forekomstene er Azure Cosmos DB, ekte
produktinnhold. Diskriminatoren er ikke bokstaven «s» — `Cosmos <norsk
substantiv>` er genitiv av personaen (`### Cosmos tonalitet`), mens
`Cosmos DB`/`CosmosClient`/`cosmos_ru` er produkt.
2. Denne økten fant den andre: 132 persona-forekomster ligger i prosa,
tabeller, dialog-replikker og proveniens-linjer. Heading-nøytralisering
kan ikke nå dem, så «0 persona» er uoppnåelig også under den ratifiserte
formen. Operatøren ratifiserte alternativ A: gaten speiler formen, og de
132 bokføres til R13b/R14.
Tre korreksjoner av premisser som sto i ordren og STATE:
«ca 320 produkt» -> 451 (case-sensitivt nett manglet 327 lowercase
TOC-ankre + 99 identifikatorer; sann nevner 1 638)
«169 headinger» -> 401. 169 var `^## For Cosmo`-prefikset (168) og var
internt inkonsistent med sin egen topp-variant (204)
«417 matcher ingen
populasjon» -> 417 er cosmo-headinger utenfor kodefences; briefens
nevner var reell hele tiden
Fence-bevissthet er målt skadelig, ikke nødvendig: begge toggle-regler er
gale på dette korpuset (naiv toggle skjuler en ekte heading i
chain-of-thought-prompting.md, CommonMark-regelen ubalanserer
service-level-documentation-dr.md). Fence-agnostisk deteksjon finner 401
heading-linjer i nøyaktig de samme 40 variantene som fence-bevisst finner
400 i — ingen kodeblokk-linje er byte-identisk til en persona-heading. Derfor
nøkles transformen på 40 enumererte heading-tekster og ignorerer fences. En
ukjent variant kaster; en slug-kollisjon kaster. Ingenting auto-fikses.
TOC-en regenereres ikke, den rettes kirurgisk: alle 327 persona-lenker hadde
lenketekst lik én av de 40 heading-tekstene og anker lik slugify av den
(327/327, 0 avvik), så heading og TOC-entry skrives i samme operasjon og
ingen mellomtilstand etterlater en død lenke.
Ratifisert målform: `For Cosmo`, `For Cosmo Skyberg` og `For arkitekten
(Cosmo)` konvergerer på `For arkitekten`. To filer kolliderte og er adjudisert
ved å lese dem, ikke ved regel.
Verifisering (alle 7 kriterier fra ordren):
G1 persona på heading-linjer 401 -> 0
G2 døde fragmentlenker 1 -> 1 (pre-eksisterende, unntatt)
G3 produkt-forekomster 451 -> 451; `Cosmos DB|Azure Cosmos` 308 = 308
de 3 kun-produkt-filene byte-identiske
nettet validert begge veier injisert persona feller G1; genitiv feller G1;
produkt-heading og de 3 filene passerer
hele diffen 802 heading-linjer + 654 TOC-linjer, ANNET = 0
linjeantall 728 lagt til = 728 slettet
suite 1120/1120 (1097 + 23 nye)
validate-plugin 250 PASS / 0 FAIL
stikkprøve 10 filer, alle 5 skills, inkl. de 3 mest
produkt-tunge (26/20/19) — kun heading+TOC
Utenfor scope, urørt: de 4 SKILL.md, de 23 commands, CLAUDE.md, README.md,
NOTICE.md, docs/ (alt R14).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
454 lines
16 KiB
Markdown
454 lines
16 KiB
Markdown
# Computer Vision and LLM Integration
|
|
|
|
**Last updated:** 2026-02
|
|
**Status:** GA
|
|
**Category:** Multi-Modal AI
|
|
**Type:** reference
|
|
|
|
---
|
|
|
|
## Innhold
|
|
|
|
- [Introduksjon](#introduksjon)
|
|
- [Kjernekomponentar](#kjernekomponentar)
|
|
- [Vision Encoder Selection og Fine-Tuning](#vision-encoder-selection-og-fine-tuning)
|
|
- [Prompt Injection for Visual Grounding](#prompt-injection-for-visual-grounding)
|
|
- [Scene Understanding og Spatial Reasoning](#scene-understanding-og-spatial-reasoning)
|
|
- [Few-Shot Learning med visuelle eksempel](#few-shot-learning-med-visuelle-eksempel)
|
|
- [Implementeringsmønstre](#implementeringsmønstre)
|
|
- [Norsk offentleg sektor](#norsk-offentleg-sektor)
|
|
- [Beslutningsrammeverk](#beslutningsrammeverk)
|
|
- [For arkitekten](#for-arkitekten)
|
|
|
|
## Introduksjon
|
|
|
|
Integrasjonen av spesialiserte computer vision (CV) modellar med large language models (LLMs) representerer ein av dei viktigaste trendane i AI-arkitektur. I staden for å bruke GPT-4o sin innebygde vision direkte for alle oppgåver, kombinerer avanserte arkitekturar spesialiserte vision encoders med generative LLMs for å oppnå betre nøyaktigheit, lågare kostnad og meir kontrollerte resultat.
|
|
|
|
Azure-plattforma gir eit rikt økosystem for dette: Azure AI Vision for spesialisert bildeanalyse (OCR, objektdeteksjon, multimodal embeddings), Azure OpenAI for GPT-4o og GPT-4.1 sine vision-kapabilitetar, Microsoft Foundry for modellfinetuning og deployment, og Phi-4-multimodal-instruct som ein kostnadseffektiv open-source-modell for edge-scenario. Florence-2-modellen frå Microsoft er eit anna sterkt alternativ for spesialiserte vision-oppgåver.
|
|
|
|
For norsk offentleg sektor er denne integrasjonen relevant for byggesaksbehandling (analyse av arkitektteikningar), veginfrastruktur (skadevurdering frå bilete), helsevesen (medisinsk bildeanalyse), og kulturarv (digitalisering og klassifisering av museumsgjenstandar). Nøkkelen er å kombinere rette verktøy for rette oppgåver — bruk spesialiserte CV-modellar for presis ekstraksjon og LLMs for tolking og resonnering.
|
|
|
|
---
|
|
|
|
## Kjernekomponentar
|
|
|
|
| Komponent | Formål | Teknologi |
|
|
|-----------|--------|-----------|
|
|
| **Azure AI Vision** | Spesialisert bildeanalyse og OCR | Image Analysis 4.0 |
|
|
| **GPT-4o / GPT-4.1 Vision** | Multimodal LLM med bildeforståing | Azure OpenAI |
|
|
| **Phi-4-multimodal** | Open-source multimodal modell | Microsoft Foundry / Edge |
|
|
| **Florence-2** | Universell vision foundation model | Hugging Face / Azure ML |
|
|
| **Multimodal Embeddings** | Vektor-representasjon av bilete og tekst | Azure AI Vision v4.0 |
|
|
| **Custom Vision** | Eigendefinert objektdeteksjon/klassifisering | Azure AI Custom Vision |
|
|
|
|
---
|
|
|
|
## Vision Encoder Selection og Fine-Tuning
|
|
|
|
### Valet av vision encoder
|
|
|
|
| Modell | Styrke | Svakheit | Bruksscenario |
|
|
|--------|--------|----------|---------------|
|
|
| **GPT-4o native vision** | Generell forståing, resonnering | Kostnad, ingen spesialisering | Generell bildeforståing |
|
|
| **Azure AI Vision 4.0** | OCR, objektdeteksjon, embeddings | Ikkje generativ | Strukturert ekstraksjon |
|
|
| **Florence-2** | Universell, finetunable | Krev GPU for inferens | Spesialiserte oppgåver |
|
|
| **Phi-4-multimodal** | Liten, edge-kompatibel | Lågare kapasitet | Edge/IoT-scenario |
|
|
| **Custom Vision** | Høg nøyaktigheit for spesifikt domene | Krev treningsdata | Domene-spesifikk klassifisering |
|
|
|
|
### Vision Fine-Tuning av GPT-4o
|
|
|
|
GPT-4o støttar vision fine-tuning for å tilpasse modellen til spesifikke bildedomene:
|
|
|
|
```python
|
|
# Treningsdata format (JSONL)
|
|
training_example = {
|
|
"messages": [
|
|
{
|
|
"role": "system",
|
|
"content": "Du er ein ekspert på analyse av norske vegskilt."
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "Identifiser og klassifiser skiltet i biletet."
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "data:image/jpeg;base64,<base64_encoded_image>"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"role": "assistant",
|
|
"content": "Skiltet er eit fartsgrenseskilt som viser 80 km/t. "
|
|
"Type: Forbudsskilt (skilt 362). Tilstand: God."
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Krav for vision fine-tuning:**
|
|
- Modell: `gpt-4o` versjon `2024-08-06` eller `gpt-4.1` versjon `2025-04-14`
|
|
- Maks 50 000 eksempel med bilete
|
|
- Maks 64 bilete per eksempel
|
|
- Maks 10 MB per bilete
|
|
- Format: JPEG, PNG, WEBP (RGB eller RGBA)
|
|
- Minimum 10 eksempel
|
|
|
|
### Student-Teacher arkitektur
|
|
|
|
Phi-4-multimodal kan fintunast med labels frå GPT-4o i ein Student-Teacher-arkitektur:
|
|
|
|
```python
|
|
# Teacher: GPT-4o genererer treningsdata
|
|
teacher_labels = generate_labels_with_gpt4o(images)
|
|
|
|
# Student: Phi-4-multimodal fintunast
|
|
from transformers import AutoModelForCausalLM, AutoProcessor
|
|
import torch
|
|
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|
"microsoft/Phi-4-multimodal-instruct",
|
|
torch_dtype=torch.bfloat16,
|
|
device_map="auto"
|
|
)
|
|
|
|
processor = AutoProcessor.from_pretrained(
|
|
"microsoft/Phi-4-multimodal-instruct"
|
|
)
|
|
|
|
# Fine-tuning med LoRA for effektivitet
|
|
from peft import LoraConfig, get_peft_model
|
|
|
|
lora_config = LoraConfig(
|
|
r=16,
|
|
lora_alpha=32,
|
|
target_modules=["q_proj", "v_proj"],
|
|
lora_dropout=0.05
|
|
)
|
|
|
|
model = get_peft_model(model, lora_config)
|
|
```
|
|
|
|
---
|
|
|
|
## Prompt Injection for Visual Grounding
|
|
|
|
### Teknikkar for visuell grounding
|
|
|
|
Visual grounding er prosessen med å kople språklege referansar til spesifikke regionar i eit bilete. Gjennom prompt engineering kan ein styre korleis LLM-en tolkar og refererer til biletinnhald.
|
|
|
|
### Strukturert prompting
|
|
|
|
```python
|
|
def grounded_image_analysis(client, image_url, analysis_type):
|
|
"""Analyser bilete med strukturert grounding-prompt."""
|
|
|
|
grounding_prompts = {
|
|
"spatial": (
|
|
"Analyser biletet systematisk:\n"
|
|
"1. Kva er i SENTRUM av biletet?\n"
|
|
"2. Kva er i BAKGRUNNEN?\n"
|
|
"3. Kva er i FORGRUNNEN?\n"
|
|
"4. Kva er til VENSTRE?\n"
|
|
"5. Kva er til HØGRE?\n"
|
|
"Beskriv relative storleikar og avstandar."
|
|
),
|
|
"technical": (
|
|
"Analyser det tekniske diagrammet:\n"
|
|
"1. Identifiser alle komponentar (bounding box: oppe-venstre, nede-høgre)\n"
|
|
"2. Beskriv koplingane mellom komponentar\n"
|
|
"3. Les all tekst i diagrammet\n"
|
|
"4. Identifiser dataflyt-retning"
|
|
),
|
|
"document": (
|
|
"Analyser dokumentet:\n"
|
|
"1. Identifiser dokumenttype\n"
|
|
"2. Les og strukturer all tekst\n"
|
|
"3. Ekstraher tabellar i Markdown-format\n"
|
|
"4. Identifiser signaturfelt og stempel\n"
|
|
"5. Vurder dokumentet sin tilstand"
|
|
)
|
|
}
|
|
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": "Du er ein visuell analyseekspert. Ver presis om posisjonar."
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": grounding_prompts[analysis_type]},
|
|
{"type": "image_url", "image_url": {"url": image_url, "detail": "high"}}
|
|
]
|
|
}
|
|
],
|
|
max_tokens=1500
|
|
)
|
|
|
|
return response.choices[0].message.content
|
|
```
|
|
|
|
### Region-of-Interest Prompting
|
|
|
|
```python
|
|
def analyze_image_region(client, image_url, region_description):
|
|
"""Fokuser analyse på ein spesifikk region av biletet."""
|
|
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": (
|
|
f"Sjå nøye på {region_description} i biletet. "
|
|
f"Ignorer resten og fokuser berre på denne regionen. "
|
|
f"Beskriv detaljert kva du ser."
|
|
)
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {"url": image_url, "detail": "high"}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
)
|
|
|
|
return response.choices[0].message.content
|
|
```
|
|
|
|
---
|
|
|
|
## Scene Understanding og Spatial Reasoning
|
|
|
|
### Romleg resonnering med GPT-4o
|
|
|
|
GPT-4o har evne til å forstå romlege relasjonar i bilete, men treng strukturert prompting for å utnytte dette fullt ut:
|
|
|
|
```python
|
|
def spatial_reasoning_analysis(client, image_url):
|
|
"""Utfør romleg resonnering på eit bilete."""
|
|
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"Du er ein ekspert på romleg resonnering og scene-forståing. "
|
|
"Beskriv 3D-relasjonar, avstandar, storleiksforhold og "
|
|
"romlege mønster. Bruk presise retningstermar."
|
|
)
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": (
|
|
"Analyser det romlege oppsettet i dette biletet:\n"
|
|
"1. Objektplassering — kor er kvart objekt relativt til andre?\n"
|
|
"2. Djupne — kva er nært/fjernt?\n"
|
|
"3. Skala — relative storleikar mellom objekt\n"
|
|
"4. Symmetri — er det mønster i oppsettet?\n"
|
|
"5. Funksjonelle relasjonar — korleis heng tinga saman?"
|
|
)
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {"url": image_url, "detail": "high"}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
max_tokens=1000
|
|
)
|
|
|
|
return response.choices[0].message.content
|
|
```
|
|
|
|
### Scene Understanding Pipeline
|
|
|
|
```
|
|
Bilete
|
|
|
|
|
├── Azure AI Vision (strukturert analyse)
|
|
| ├── Objektdeteksjon med bounding boxes
|
|
| ├── OCR med posisjonar
|
|
| └── Tags og kategoriar
|
|
|
|
|
├── GPT-4o (semantisk analyse)
|
|
| ├── Scene-beskriving
|
|
| ├── Romleg resonnering
|
|
| └── Kontekstuell tolking
|
|
|
|
|
└── Fusion
|
|
├── Strukturerte data + semantisk forståing
|
|
├── Grounded captions (tekst knytt til regionar)
|
|
└── Handlingsbar innsikt
|
|
```
|
|
|
|
---
|
|
|
|
## Few-Shot Learning med visuelle eksempel
|
|
|
|
### In-Context Visual Learning
|
|
|
|
GPT-4o støttar few-shot learning der ein viser eksempel med bilete:
|
|
|
|
```python
|
|
def few_shot_visual_classification(client, target_image_url, examples):
|
|
"""Klassifiser bilete basert på visuelle eksempel."""
|
|
|
|
messages = [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"Du klassifiserer bilete basert på eksempla du får. "
|
|
"Lær mønsteret frå eksempla og bruk det på det nye biletet."
|
|
)
|
|
}
|
|
]
|
|
|
|
# Legg til few-shot eksempel
|
|
for example in examples:
|
|
messages.append({
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "Klassifiser dette biletet:"},
|
|
{"type": "image_url", "image_url": {"url": example["image_url"]}}
|
|
]
|
|
})
|
|
messages.append({
|
|
"role": "assistant",
|
|
"content": f"Klassifisering: {example['label']}\n"
|
|
f"Begrunnelse: {example['reasoning']}"
|
|
})
|
|
|
|
# Legg til målbilete
|
|
messages.append({
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "Klassifiser dette nye biletet:"},
|
|
{"type": "image_url", "image_url": {"url": target_image_url}}
|
|
]
|
|
})
|
|
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=messages,
|
|
max_tokens=300
|
|
)
|
|
|
|
return response.choices[0].message.content
|
|
```
|
|
|
|
### Token Cost Management for visuelle eksempel
|
|
|
|
```python
|
|
def optimize_visual_tokens(images, detail_levels):
|
|
"""Optimaliser token-kostnad for visuelle eksempel."""
|
|
|
|
# detail="low" — 85 tokens per bilete (uansett storleik)
|
|
# detail="high" — 170 tokens per tile + 85 base tokens
|
|
# detail="auto" — GPT vel automatisk
|
|
|
|
optimized = []
|
|
for img, detail in zip(images, detail_levels):
|
|
content = {
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": img["url"],
|
|
"detail": detail # "low" for eksempel, "high" for target
|
|
}
|
|
}
|
|
optimized.append(content)
|
|
|
|
return optimized
|
|
|
|
# Bruk "low" detail for few-shot eksempel, "high" for analyse-target
|
|
# Sparar ~85% tokens på eksempelbilete
|
|
```
|
|
|
|
---
|
|
|
|
## Implementeringsmønstre
|
|
|
|
### Mønster 1: Cascade Pipeline
|
|
|
|
```
|
|
Bilete → Azure AI Vision (rask, billeg) → Filtrering → GPT-4o (dyr, presis)
|
|
```
|
|
|
|
Bruk Azure AI Vision for å filtrere og kategorisere bilete, og send berre relevante bilete til GPT-4o for djupare analyse. Reduserer GPT-4o-kostnad med 60-80%.
|
|
|
|
### Mønster 2: Specialist Ensemble
|
|
|
|
```
|
|
Bilete → [OCR-spesialist, Objektdeteksjon, Sceneanalyse] → GPT-4o fusjon
|
|
```
|
|
|
|
Bruk spesialiserte modellar for kvar oppgåve og la GPT-4o syntetisere resultata.
|
|
|
|
### Mønster 3: Edge + Cloud
|
|
|
|
```
|
|
Edge (Phi-4-multimodal) → Filtrering/Triagering → Cloud (GPT-4o) → Detaljert analyse
|
|
```
|
|
|
|
Bruk Phi-4 på edge for rask triagering, send berre komplekse tilfelle til cloud.
|
|
|
|
---
|
|
|
|
## Norsk offentleg sektor
|
|
|
|
### Bruksscenario
|
|
|
|
- **Direktoratetet**: Analyse av vegdekkeskade frå inspeksjonsbilete
|
|
- **Kartverket**: Klassifisering av satellittbilete og kartdata
|
|
- **Kulturminnevern**: Digital katalogisering av kulturminne
|
|
- **Helsesektoren**: Analyse av røntgen/MR med AI-assistanse (medisinsk produkt-regulering)
|
|
|
|
### Regulatoriske omsyn
|
|
|
|
| Aspekt | Krav |
|
|
|--------|------|
|
|
| **Medisinsk bruk** | MDR (Medical Device Regulation) for diagnostiske AI |
|
|
| **Personvern** | GDPR for bilete som inneheld personar |
|
|
| **Ansiktsgjenkjenning** | Strengt regulert i Noreg — krev lovheimel |
|
|
| **Vision fine-tuning** | Azure filtrerer ut personar/ansikt frå treningsdata |
|
|
| **Transparens** | Dokumenter modellar og avgjerdsprosessar |
|
|
|
|
---
|
|
|
|
## Beslutningsrammeverk
|
|
|
|
| Scenario | Anbefaling | Begrunnelse |
|
|
|----------|------------|-------------|
|
|
| Generell bildeforståing | GPT-4o native vision | Best generell kvalitet |
|
|
| Presis OCR og tabellekstraksjon | Azure AI Vision / Doc Intelligence | Spesialisert, lågare kostnad |
|
|
| Edge-inferens (offline) | Phi-4-multimodal + LoRA | Liten, rask, offline-kapabel |
|
|
| Domene-spesifikk klassifisering | Fine-tuned GPT-4o eller Custom Vision | Høg nøyaktigheit for spesifikt domene |
|
|
| Multimodal søk | Azure AI Vision embeddings | Vektorsøk på tvers av bilete/tekst |
|
|
| Kostnad-sensitiv bildeanalyse | Cascade: Vision → GPT-4o | 60-80% reduksjon i GPT-4o-kall |
|
|
|
|
---
|
|
|
|
## For arkitekten
|
|
|
|
- **Cascade-mønsteret** (Azure AI Vision først, GPT-4o for komplekse tilfelle) reduserer kostnad med 60-80% — bruk Vision for filtrering/kategorisering og GPT-4o berre for det som krev resonnering
|
|
- **Vision fine-tuning av GPT-4o** (2024-08-06) gir domene-spesialisering — men Azure filtrerer automatisk ut bilete med personar/ansikt frå treningsdata, noko som avgrensar bruksområdet
|
|
- **Phi-4-multimodal-instruct** med Student-Teacher fine-tuning frå GPT-4o gir edge-kapabel vision AI — relevant for Direktoratetet sin inspeksjonsinfrastruktur og andre offline-scenario
|
|
- **Few-shot visual learning** med GPT-4o krev berre 3-5 eksempelbilete for ny klassifiseringsoppgåve — bruk `detail: "low"` på eksempel (85 tokens) og `detail: "high"` på target for å optimalisere kostnad
|
|
- **Multimodal embeddings** (Azure AI Vision v4.0) støttar 102 språk og muliggjer semantisk bildesøk — bruk for å bygge søkbare bildearkiv i offentleg sektor
|