Updates across all 5 skills: ms-ai-advisor, ms-ai-engineering, ms-ai-governance, ms-ai-security, ms-ai-infrastructure. Key changes: - Language Services (Custom Text Classification, Text Analytics, QnA): retirement warning 2029-03-31, migration guides to Foundry/GPT-4o - Agentic Retrieval: 50M free reasoning tokens/month (Public Preview) - Computer Use: Claude Sonnet 4.5 (preview) + OpenAI CUA models - Agent Registry: Risks column (M365 E7), user-shared/org-published types - Declarative agents: schema v1.5 → v1.6, Store validation requirements - MLflow 3: 13 built-in LLM judges, production monitoring, Genie Code - AG-UI HITL: ApprovalRequiredAIFunction (C#) + @tool(approval_mode) (Python) - Entra ID Ignite 2025: Agent ID Admin/Developer RBAC roles, Conditional Access - Security Copilot: 400 SCU/month per 1000 M365 E5 licenses, auto-provisioned - Fast Transcription API: phrase lists, 14-language multi-lingual transcription - Azure Monitor Workbooks: Bicep support, RBAC specifics - Power Platform Copilot: data residency (Norway/Europe → EU DB, Bing → USA) - RAG security-rbac: 4-approach table (GA + 3 preview access control methods) - IaC MLOps: Well-Architected OE:05 principles, Bicep/Terraform patterns - Translator: image file batch translation Preview (JPEG/PNG/BMP/WebP) All 106 files: Last updated 2026-04 | Verified: MCP 2026-04 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
563 lines
20 KiB
Markdown
563 lines
20 KiB
Markdown
# Multimodal Prompt Design with Images and Text
|
||
|
||
**Last updated:** 2026-04 | Verified: MCP 2026-04
|
||
**Status:** GA
|
||
**Category:** Prompt Engineering & LLM Optimization
|
||
|
||
---
|
||
|
||
## Introduksjon
|
||
|
||
Multimodal prompt design handler om å utforme effektive instruksjoner som kombinerer tekst og bilder for å maksimere responskvaliteten fra Large Multimodal Models (LMM). Vision-enabled modeller som GPT-4o, GPT-4o mini, GPT-4 Turbo with Vision, GPT-5-serien og o-serien kan analysere bilder og generere tekstlige responser basert på både visuelt og tekstlig innhold.
|
||
|
||
**Nøkkelkonsepter:**
|
||
- Vision-enabled modeller kombinerer Natural Language Processing (NLP) med visuell forståelse
|
||
- Støtter både URL-baserte bilder (HTTP/HTTPS) og Base64-enkodede bilder
|
||
- Bildeinput teller som tokens og påvirker kostnad og latency
|
||
- Kan håndtere opptil 10 bilder per chat request
|
||
- Detail-parameter (`low`, `high`, `auto`) styrer tokenforbruk og responskvalitet
|
||
|
||
**Tekniske tokens:**
|
||
| Modell | Low detail | High detail (1024×1024) |
|
||
|--------|-----------|------------------------|
|
||
| GPT-4o / GPT-4 Turbo | 85 tokens | 4160 tokens |
|
||
| GPT-4o mini | 2833 tokens | Varierer med dimensjon |
|
||
|
||
## Kjernekomponenter
|
||
|
||
### 1. Input-formater
|
||
|
||
**URL-basert bildeinnput:**
|
||
```json
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://example.com/image.jpg",
|
||
"detail": "high"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Base64-enkodet bildeinnput:**
|
||
```json
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "data:image/jpeg;base64,<base64_string>"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Python-eksempel for lokal fil:**
|
||
```python
|
||
import base64
|
||
from mimetypes import guess_type
|
||
|
||
def local_image_to_data_url(image_path):
|
||
mime_type, _ = guess_type(image_path)
|
||
if mime_type is None:
|
||
mime_type = 'application/octet-stream'
|
||
|
||
with open(image_path, "rb") as image_file:
|
||
base64_encoded_data = base64.b64encode(image_file.read()).decode('utf-8')
|
||
|
||
return f"data:{mime_type};base64,{base64_encoded_data}"
|
||
```
|
||
|
||
### 2. Detail Parameter Settings
|
||
|
||
| Setting | Oppførsel | Use case | Token-påvirkning |
|
||
|---------|----------|----------|------------------|
|
||
| `auto` | Modellen velger selv basert på bildestørrelse | Default, balansert | Varierer |
|
||
| `low` | 512×512 lavoppløselig analyse | Rask responsgivning, grov kategorisering | Lavt (85 tokens GPT-4o) |
|
||
| `high` | Segmentert analyse i 512×512-blokker | Detaljanalyse, OCR, objektdeteksjon | Høyt (4160+ tokens) |
|
||
|
||
### 3. Message Content Array Structure
|
||
|
||
Multimodale prompts bruker content-array i stedet for enkel string:
|
||
|
||
```python
|
||
messages=[
|
||
{
|
||
"role": "system",
|
||
"content": "You are a helpful assistant."
|
||
},
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "Describe this picture:"
|
||
},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "<image_url>",
|
||
"detail": "high"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
],
|
||
max_tokens=2000
|
||
```
|
||
|
||
**Viktig:** Alltid sett `max_tokens` eller output blir trunkert.
|
||
|
||
## Arkitekturmønstre
|
||
|
||
### Pattern 1: Single Image Analysis
|
||
|
||
**Bruksområde:** Bildeanalyse, beskrivelse, kategorisering
|
||
**Best practice:** Plasser bildet FØR teksten i prompten
|
||
|
||
```python
|
||
response = client.chat.completions.create(
|
||
model="gpt-4o",
|
||
messages=[
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "image_url", "image_url": {"url": image_url}},
|
||
{"type": "text", "text": "What objects are visible in this image?"}
|
||
]
|
||
}
|
||
],
|
||
max_tokens=500
|
||
)
|
||
```
|
||
|
||
### Pattern 2: Multi-Image Comparison
|
||
|
||
**Bruksområde:** Before/after, A/B testing, damage assessment
|
||
**Begrensning:** Maks 10 bilder per request
|
||
|
||
```python
|
||
content = [
|
||
{"type": "text", "text": "Compare these two images and identify differences:"},
|
||
{"type": "image_url", "image_url": {"url": image1_url, "detail": "high"}},
|
||
{"type": "image_url", "image_url": {"url": image2_url, "detail": "high"}}
|
||
]
|
||
```
|
||
|
||
### Pattern 3: Few-shot Learning with Images
|
||
|
||
**Bruksområde:** Konsistent formatering, klassifisering med eksempler
|
||
|
||
```python
|
||
messages = [
|
||
{"role": "system", "content": "You classify dog breeds with weight and height."},
|
||
{"role": "user", "content": [
|
||
{"type": "text", "text": "Q: What breed is this?"},
|
||
{"type": "image_url", "image_url": {"url": pomeranian_url}}
|
||
]},
|
||
{"role": "assistant", "content": "Breed: Pomeranian; weight: 3-7 lbs; height: 8-14 inches"},
|
||
{"role": "user", "content": [
|
||
{"type": "text", "text": "Q: What breed is this?"},
|
||
{"type": "image_url", "image_url": {"url": new_dog_url}}
|
||
]}
|
||
]
|
||
```
|
||
|
||
### Pattern 4: Step-by-step Visual Analysis
|
||
|
||
**Bruksområde:** Komplekse scenarioer, recipe extraction, damage assessment
|
||
|
||
```python
|
||
# Steg 1: Beskrivelse
|
||
"First, describe everything you see in this image in detail."
|
||
|
||
# Steg 2: Ekstraksjon
|
||
"Based on your description, extract the recipe ingredients and instructions."
|
||
|
||
# Steg 3: Strukturering
|
||
"Format the output as a JSON object with 'ingredients' and 'steps' arrays."
|
||
```
|
||
|
||
### Pattern 5: Multimodal RAG (Retrieval-Augmented Generation)
|
||
|
||
**Bruksområde:** Enterprise search over dokument med bilder/diagrammer
|
||
|
||
**To tilnærminger:**
|
||
1. **Image verbalization:** LLM beskriver bilder → embeddes som tekst → hybrid search
|
||
2. **Direct multimodal embeddings:** Bilder og tekst embeddes direkte i samme vektorrom
|
||
|
||
| Tilnærming | Fordel | Ulempe | Use case |
|
||
|-----------|--------|--------|----------|
|
||
| Verbalization | Semantisk dybde, LLM-sitérbare beskrivelser | LLM-kall per bilde, høyere latency | Diagrammer, flowcharts, infografikk |
|
||
| Direct embeddings | Rask, ingen LLM-kall ved indexing | Ingen forklaring av relasjoner | Visual similarity, produktsøk |
|
||
|
||
**Azure AI Search multimodal pipeline (Verified MCP 2026-04):**
|
||
1. **Content extraction** — velg mellom:
|
||
- Document Extraction skill: rask prototyping, PDF-støtte
|
||
- Document Layout skill: presise sidetall, bounding boxes, RAG-optimalisert
|
||
- Azure Content Understanding skill: avansert — cross-page tabeller, semantisk chunking, DOCX/XLSX/PPTX
|
||
2. **Text chunking:** Text Split skill
|
||
3. **Image verbalization:** GenAI Prompt skill + LLM (phi-4, gpt-4o, gpt-5) → naturlig-språklig beskrivelse
|
||
4. **Embedding:** Azure OpenAI / Microsoft Foundry / Azure Vision multimodal embeddings
|
||
5. **Knowledge store:** Lagrer bilder for retrieval; image-lokasjon lagres i indeks for sitert visning
|
||
|
||
**To retrieval-stier:**
|
||
- Verbalized content → hybrid queries (text + vector). Gir semantisk dybde og LLM-siterbare beskrivelser.
|
||
- Direct multimodal embeddings (Azure Vision) → image-to-vector queries. Effektiv visual similarity uten LLM-kall ved indexing.
|
||
- Mange løsninger kombinerer begge: forklaringsrike visuals verbaliseres, foto/produktbilder embeddes direkte.
|
||
|
||
## Beslutningsveiledning
|
||
|
||
### Når bruke multimodal prompting?
|
||
|
||
| Scenario | Anbefalt tilnærming | Detail setting |
|
||
|----------|-------------------|----------------|
|
||
| Produktkatalog beskrivelser | Single image + kontekstuell system prompt | `auto` eller `high` |
|
||
| Skadevurdering (forsikring) | Multi-image + task-oriented prompt | `high` |
|
||
| OCR + strukturert ekstraksjon | High detail + step-by-step prompting | `high` |
|
||
| Social media content moderation | Low detail for rask screening | `low` |
|
||
| Medisinske bilder | **IKKE bruk** (out of scope for modellen) | N/A |
|
||
|
||
### Prompt Engineering Prinsipper
|
||
|
||
| Prinsipp | Beskrivelse | Eksempel |
|
||
|----------|-------------|----------|
|
||
| **Contextual specificity** | Legg til kontekst om bruksområde | "Describe for an outdoor product catalog, enthusiastic tone" |
|
||
| **Task-oriented** | Definer spesifikk oppgave | "Analyze car damage for insurance report, detail all visible damage" |
|
||
| **Handle refusals** | Be om forklaring, bryt ned request | "What information do you need to plan this meal?" |
|
||
| **Add examples** | Few-shot learning med bilde+tekst par | Se Pattern 3 over |
|
||
| **Break down requests** | Del komplekse oppgaver i steg | Se Pattern 4 over |
|
||
| **Define output format** | Spesifiser JSON, Markdown, HTML, osv. | "Return as JSON with 'ingredients' and 'steps' arrays" |
|
||
|
||
### Håndtering av refusals
|
||
|
||
```python
|
||
# Initial prompt
|
||
"Plan this meal" # → "Sorry, I can't provide that information."
|
||
|
||
# Follow-up strategy
|
||
"What information do you need?"
|
||
# → Modellen lister opp: antall personer, allergier, anledning, osv.
|
||
|
||
# Refined prompt
|
||
"Plan a dinner for 4 people, vegetarian, casual setting. Image shows [...]"
|
||
# → Modellen gir detaljert plan
|
||
```
|
||
|
||
## Integrasjon med Microsoft-stakken
|
||
|
||
### Azure OpenAI Service
|
||
|
||
**Endpoint:** `https://{RESOURCE_NAME}.openai.azure.com/openai/v1/chat/completions`
|
||
|
||
**Autentisering:**
|
||
- API key: `api-key` header
|
||
- Managed Identity: `DefaultAzureCredential` + bearer token provider
|
||
|
||
**Python SDK:**
|
||
```python
|
||
from openai import OpenAI
|
||
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
|
||
|
||
token_provider = get_bearer_token_provider(
|
||
DefaultAzureCredential(),
|
||
"https://cognitiveservices.azure.com/.default"
|
||
)
|
||
|
||
client = OpenAI(
|
||
base_url="https://YOUR-RESOURCE.openai.azure.com/openai/v1/",
|
||
api_key=token_provider
|
||
)
|
||
```
|
||
|
||
### Azure AI Foundry (tidligere Azure AI Studio)
|
||
|
||
**Supported models for multimodal:**
|
||
- GPT-5 series (gpt-5, gpt-5-mini, gpt-5-nano)
|
||
- GPT-4.1 series
|
||
- GPT-4.5
|
||
- GPT-4o series (gpt-4o, gpt-4o-mini)
|
||
- o-series reasoning models (o1, o3, o4-mini)
|
||
|
||
**Model deployment types:**
|
||
- Standard deployment (region-bound)
|
||
- Global-standard deployment (dynamic routing, høyere quota)
|
||
|
||
### Prompt Flow Integration
|
||
|
||
**Azure OpenAI GPT-4 Turbo with Vision tool:**
|
||
|
||
```yaml
|
||
# Prompt template
|
||
# system:
|
||
As an AI assistant, your task involves interpreting images and responding to questions.
|
||
Remember to provide accurate answers based on the information present in the image.
|
||
|
||
# user:
|
||
Can you tell me what the image depicts?
|
||

|
||
```
|
||
|
||
**Tool configuration:**
|
||
1. Select Azure OpenAI connection
|
||
2. Specify deployment (GPT-4o, GPT-4o-mini, etc.)
|
||
3. Set `image_input` parameter (URL eller upload)
|
||
4. Validate and parse input
|
||
5. Run flow
|
||
|
||
### Azure AI Search Multimodal Integration
|
||
|
||
**Import data wizard → Multimodal RAG:**
|
||
|
||
**Forutsetninger:**
|
||
| Provider | Image verbalization | Multimodal embeddings |
|
||
|----------|-------------------|----------------------|
|
||
| Azure Foundry | phi-4, gpt-4o, gpt-5 (LLM) + text-embedding-3-* | N/A |
|
||
| Azure OpenAI | gpt-4o, gpt-5 (LLM) + text-embedding-3-* | N/A |
|
||
| Azure Vision | N/A | Multimodal embeddings (built-in) |
|
||
|
||
**Pipeline-steg (wizard):**
|
||
1. Data source: Azure Blob / ADLS Gen2
|
||
2. Content extraction: Document Extraction / Layout / Content Understanding skill
|
||
3. Text chunking: Text Split skill
|
||
4. Image verbalization (optional): GenAI Prompt skill
|
||
5. Embedding: Azure OpenAI / Foundry / Azure Vision
|
||
6. Knowledge store: Lagrer bilder for retrieval
|
||
|
||
**Query-tid:**
|
||
- Hybrid queries (text + vector) for verbalized content
|
||
- Image-to-vector queries KUN med Azure Vision multimodal embeddings vectorizer
|
||
|
||
### Power Platform Integration
|
||
|
||
**AI Builder + GPT-4o via Azure OpenAI connector:**
|
||
- Custom connector til Azure OpenAI endpoint
|
||
- Parse Base64-enkoded input fra Power Apps
|
||
- Return response til Power Automate flow
|
||
|
||
## Offentlig sektor (Norge)
|
||
|
||
### Compliance og databehandling
|
||
|
||
| Aspekt | Vurdering |
|
||
|--------|-----------|
|
||
| **GDPR** | Bilder kan inneholde personopplysninger → databehandleravtale påkrevd |
|
||
| **Schrems II** | Azure OpenAI EU-regioner (West Europe, North Europe) anbefales |
|
||
| **Sikkerhetsloven** | Klassifisert informasjon: IKKE send til sky-LLM |
|
||
| **Offentleglova** | Vurder om bildeinnhold er offentlig eller unntatt |
|
||
|
||
### Use cases offentlig sektor
|
||
|
||
| Sektor | Use case | Multimodal pattern |
|
||
|--------|----------|-------------------|
|
||
| **Vegvesen** | Skaderegistrering vei/bruer fra drone-bilder | Multi-image damage assessment |
|
||
| **NAV** | Automatisk dokumentklassifisering (skjema med vedlegg) | OCR + structured extraction |
|
||
| **Helsedirektoratet** | Visuell analyse av offentlige helsedata (grafer) | ⚠️ IKKE medisinske bilder |
|
||
| **Kulturminnevern** | Katalogisering av bygninger/artefakter | Product catalog pattern |
|
||
| **Krisehåndtering** | Situasjonsanalyse fra feltbilder | Step-by-step visual analysis |
|
||
|
||
**Viktig:** Multimodal embeddings er IKKE designet for medisinsk diagnostikk.
|
||
|
||
### Kostnadskontroll
|
||
|
||
**Strategier:**
|
||
- Bruk `low` detail for initielt screening, `high` kun for prioriterte bilder
|
||
- Pre-filter bilder med Azure AI Vision (klassisk) før LLM-analyse
|
||
- Batch-prosessering med Azure Batch + OpenAI
|
||
- Monitor token usage via Azure Monitor + Cost Management
|
||
|
||
## Kostnad og lisensiering
|
||
|
||
### Token-kostnader (per bilde)
|
||
|
||
**GPT-4o (2024-11-20 deployment):**
|
||
|
||
| Detail | Dimensjon | Input tokens | Estimert kostnad (NOK)* |
|
||
|--------|-----------|--------------|------------------------|
|
||
| `low` | Any | 85 | ~0.11 kr |
|
||
| `high` | 1024×1024 | 4160 | ~5.41 kr |
|
||
| `high` | 1024×1536 (portrait) | 6240 | ~8.11 kr |
|
||
| `high` | 1536×1024 (landscape) | 6208 | ~8.07 kr |
|
||
|
||
**GPT-4o mini (2024-07-18 deployment):**
|
||
|
||
| Detail | Dimensjon | Input tokens | Estimat kostnad (NOK)* |
|
||
|--------|-----------|--------------|------------------------|
|
||
| `low` | Any | 2833 | ~0.47 kr |
|
||
| `high` | 1024×1024 | Lavere enn GPT-4o | ~1-2 kr |
|
||
|
||
*Basert på ca. $0.0025 per 1K input tokens GPT-4o, $0.00015 per 1K GPT-4o mini (jan 2026), vekslingskurs ~10.5 NOK/USD. Verifiser aktuelle priser.
|
||
|
||
### Lisensiering
|
||
|
||
**Azure OpenAI:**
|
||
- Krever Azure-abonnement
|
||
- Pay-as-you-go (consumption-based)
|
||
- Ingen lisenskostnad utover API-kall
|
||
|
||
**M365 Copilot:**
|
||
- Multimodal capabilities i Copilot for M365 (chat with images)
|
||
- Krever M365 E3/E5 + Copilot lisens (~$30/bruker/måned)
|
||
- Begrenset til M365-kontekst (SharePoint, OneDrive, Teams)
|
||
|
||
**Power Platform:**
|
||
- AI Builder credits for custom connectors til Azure OpenAI
|
||
- Premium connector: $40/bruker/måned eller $200/kapasitet/måned
|
||
- Per-request costing via Azure OpenAI on top
|
||
|
||
### TCO-optimalisering
|
||
|
||
| Strategi | Besparelse | Trade-off |
|
||
|----------|-----------|-----------|
|
||
| Bruk GPT-4o mini i stedet for GPT-4o | ~94% | Noe lavere kvalitet |
|
||
| `low` detail i stedet for `high` | ~98% (GPT-4o) | Mister findetaljer |
|
||
| Pre-filter med Azure AI Vision | 50-80% | Ekstra kompleksitet |
|
||
| Batch-prosessering (asynkront) | 50% rabatt (Azure OpenAI batch API) | Latency 24t |
|
||
| Cache responses (semantic cache) | Varierer | Treff-rate avhengig |
|
||
|
||
## For arkitekten (Cosmo)
|
||
|
||
### Discovery-spørsmål
|
||
|
||
Når kunde ønsker multimodal løsning, kartlegg:
|
||
|
||
1. **Bildetyper:**
|
||
- Hva slags bilder? (foto, skjermbilder, diagrammer, dokumenter)
|
||
- Typisk oppløsning og størrelse?
|
||
- Volum (bilder/dag, bilder/måned)?
|
||
|
||
2. **Use case:**
|
||
- Hva skal skje med bildene? (kategorisering, OCR, beskrivelse, damage assessment)
|
||
- Responstidskrav? (sanntid vs. batch)
|
||
- Ønsket output-format? (JSON, tekst, strukturert data)
|
||
|
||
3. **Integrasjon:**
|
||
- Hvor kommer bildene fra? (bruker-upload, blob storage, SharePoint)
|
||
- Hvor skal responser? (app, database, Power BI)
|
||
- Eksisterende systemer?
|
||
|
||
4. **Compliance:**
|
||
- Inneholder bildene personopplysninger?
|
||
- Klassifiseringsnivå (offentlig, begrenset, konfidensiell)?
|
||
- GDPR-krav?
|
||
|
||
### Decision Tree
|
||
|
||
```
|
||
Multimodal scenario?
|
||
├─ Volum < 100 bilder/dag
|
||
│ └─ Azure OpenAI direct API (GPT-4o mini, low detail)
|
||
│
|
||
├─ Volum 100-10k bilder/dag
|
||
│ ├─ Sanntid påkrevd?
|
||
│ │ ├─ Ja → Azure OpenAI + caching + auto-scaling
|
||
│ │ └─ Nei → Azure OpenAI Batch API (50% rabatt)
|
||
│ └─ OCR primært? → Azure AI Document Intelligence i stedet
|
||
│
|
||
├─ Volum > 10k bilder/dag
|
||
│ └─ Azure AI Search multimodal pipeline + Azure Vision embeddings
|
||
│
|
||
├─ Trengs søk over historiske bilder?
|
||
│ └─ Azure AI Search multimodal RAG (verbalization eller direct embeddings)
|
||
│
|
||
└─ RAG over PDF/Office-dokumenter med embedded diagrammer?
|
||
├─ Forklaringsrike visuals: Document Layout skill + GenAI Prompt verbalization
|
||
└─ Visual similarity: Azure Content Understanding + Azure Vision embeddings
|
||
```
|
||
|
||
### Red Flags
|
||
|
||
⚠️ **Unngå multimodal LLM når:**
|
||
- Medisinsk diagnostikk (out of scope)
|
||
- Høy sikkerhetsgradert materiale (risiko for datalekkasje)
|
||
- Sanntids-video (bruk Azure Video Indexer i stedet)
|
||
- Kun OCR behov (Azure AI Document Intelligence er billigere)
|
||
- Ekstrem høy volum real-time (cost explosion)
|
||
|
||
### Proof-of-Concept anbefaling
|
||
|
||
**2-ukers POC:**
|
||
1. **Uke 1:** Bygg baseline med Azure OpenAI Playground
|
||
- Test 20-50 representative bilder
|
||
- Evaluer `low` vs `high` detail
|
||
- Test 3-5 prompt-variasjoner
|
||
- Mål accuracy og token usage
|
||
|
||
2. **Uke 2:** Implementer mini-pipeline
|
||
- Python/C# script med OpenAI SDK
|
||
- Integrer med blob storage
|
||
- Logger tokens og cost
|
||
- Demo til stakeholders
|
||
|
||
**Success criteria:**
|
||
- Accuracy > 85% på use case
|
||
- Token cost innenfor budsjett
|
||
- Latency < 5 sekunder (95th percentile)
|
||
|
||
### Arkitekturmaler
|
||
|
||
**Template 1: Simple image analysis API**
|
||
```
|
||
User → Azure Function (HTTP trigger)
|
||
→ OpenAI SDK (GPT-4o mini)
|
||
→ Parse response
|
||
→ Return JSON
|
||
```
|
||
|
||
**Template 2: Multimodal RAG**
|
||
```
|
||
Documents (PDF) → Azure AI Search Multimodal wizard
|
||
→ GenAI Prompt skill (verbalization)
|
||
→ Azure OpenAI embedding
|
||
→ Vector index
|
||
User query → Hybrid search (text + vector)
|
||
→ GPT-4o with grounding
|
||
→ Response + image citations
|
||
```
|
||
|
||
**Template 3: Batch processing**
|
||
```
|
||
Blob upload → Event Grid trigger
|
||
→ Azure Function (queue message)
|
||
→ OpenAI Batch API submit
|
||
→ Poll for completion (24h)
|
||
→ Write results to Cosmos DB
|
||
```
|
||
|
||
### Monitoring og observability
|
||
|
||
**Nøkkel-metrikker:**
|
||
- Tokens per request (avg, p50, p95, p99)
|
||
- Cost per image analyzed (NOK)
|
||
- Latency (end-to-end)
|
||
- Error rate (content filter, API errors)
|
||
- Accuracy (human-in-the-loop validation)
|
||
|
||
**Azure Monitor dashboard:**
|
||
```kusto
|
||
AzureDiagnostics
|
||
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
|
||
| where OperationName == "ChatCompletions_Create"
|
||
| extend tokens_used = toint(properties_s.usage.total_tokens)
|
||
| extend has_image = properties_s contains "image_url"
|
||
| summarize avg(tokens_used), percentile(tokens_used, 95) by bin(TimeGenerated, 1h), has_image
|
||
```
|
||
|
||
## Kilder og verifisering
|
||
|
||
**Microsoft Learn dokumentasjon (verifisert 2026-02):**
|
||
- [Use vision-enabled chat models](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/gpt-with-vision) — Offisiell how-to guide for GPT-4o/GPT-4 Turbo with Vision
|
||
- [Image prompt engineering techniques](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/gpt-4-v-prompt-engineering) — Best practices for multimodal prompting
|
||
- [Multimodal search in Azure AI Search](https://learn.microsoft.com/en-us/azure/search/multimodal-search-overview) (Re-verified MCP 2026-04) — RAG-arkitektur; extraction skill-sammenligning (Document Extraction vs Layout vs Content Understanding); verbalization vs direct embeddings; hybrid query-alternativ
|
||
- [Azure OpenAI models](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models) — Modelloversikt og token-kostnader
|
||
- [Quickstart: Multimodal search in Azure portal](https://learn.microsoft.com/en-us/azure/search/search-get-started-portal-image-search) — Wizard-basert oppsett
|
||
- [Get started with multimodal vision chat apps](https://learn.microsoft.com/en-us/azure/developer/ai/get-started-app-chat-vision) — End-to-end sample app med Base64 encoding
|
||
|
||
**Code samples:**
|
||
- Azure-Samples/cognitive-services-sample-data-files (GitHub)
|
||
- Azure AI Foundry multimodal RAG sample app (https://aka.ms/azs-multimodal-sample-app-repo)
|
||
|
||
**Confidence markers:**
|
||
- ✅ **High confidence:** Token counts, API structure, detail parameter behavior (direkte fra offisiell docs)
|
||
- ✅ **High confidence:** Prompt engineering patterns (bekreftet i Microsoft Learn)
|
||
- ⚠️ **Medium confidence:** Kostberegninger i NOK (basert på jan 2026 pricing, kan variere)
|
||
- ⚠️ **Medium confidence:** Offentlig sektor use cases (inferert fra generelle patterns, ikke Microsoft-spesifikt)
|
||
|
||
**Sist verifisert:** 2026-04-10
|
||
**Neste review:** 2026-07 (eller ved nye GPT-modeller/AI Search features)
|