ms-ai-architect/skills/ms-ai-advisor/references/prompt-engineering/prompt-testing-and-evaluation.md
Kjell Tore Guttormsen 79bb54412b fix(ms-ai-architect): de 40 slettingene er anvendt — og residu-soeket fant defekten ved siden av editen, tolvte gang
idx-26an er LUKKET. Alle 40 medlemmer editert, én fil om gangen, med
eksakt-treff per fil. Ingen kryss-fil search-and-replace kjoerte paa noe
tidspunkt, saa prefiks-faren ble aldri testet av flaks.

Diff-formen er MAALT, ikke paastaatt: 40 filer, 42 slettinger, 0 innsettinger.
38 filer −1 linje, 2 filer −2.

FOER EDIT, alle 40: ankeret verifisert ordrett, unikt ved split-telling i sin
egen fil, OG likt HELE linja (lines[n] === anker for 40/40). Den siste sjekken
er den som beviser at intet anker var en delstreng av en lengre blandet linje —
idx-26ao/idx-26ap-defektklassen — i stedet for aa stole paa at screenet fanget
alle.

TO MEDLEMMER FIKK TO-LINJERS SLETTING, ved presedens og ikke ved valg:
i ai-services-api-best-practices.md:762 og model-deployment-strategies-azure.md:1067
sto footerlinja som eget avsnitt mellom blanklinjer, saa den tilhoerende
blanklinja fulgte med. Samme form ble slettet samme vei i 088cf06 (idx-26j);
aa slette linja alene ville etterlatt dobbel blanklinje.

STRUKTURSJEKK OVER HELE SETTET FOER EDIT, ikke paa oeyemaal: naermeste
ikke-blanke linje over hvert medlem testet for overskriftsform, for aa fange en
sletting som gjoer en overskrift foreldreloes. Nooeyaktig ett treff — «## Kilder
og verifisering» rett over reserved-capacity-planning.md:557 — og det er falsk
alarm: overskriften beholder kropp, «**Unique Sources:** 9» foelger rett etter.

ETTER EDIT: alle 40 ankere bekreftet borte.

RESIDU-SOEK PER FIL, med TO nett med ULIK blindhet. Nett A (etikett- eller
overskriftsform + kall-vokabular + siffer, etikett-fritt per §9.15) ga 11, alle
falske positive ved handlesning: backoff-sekunder, soek per bruker i et
kosteksempel, en ToolCallAccuracy-terskel, KQL-retensjon, en pris-per-kall-tabell.
Nett B (ordet MCP med et siffer paa samme linje) ga 82, hvorav 81 er
proveniens-DATOSTEMPLER av formen «(Verified MCP 2026-04)» — nettopp
current-provenance-klassen denne formen BEHOLDER, ikke tellinger.

ETT EKTE RESIDU, BOKFOERT SOM idx-26aq OG IKKE REPARERT.
ai-services-cost-optimization.md: slettingen av totalen paa :396 fjernet en
motsigelse, men lot den SAMME uverifiserbare paastanden staa ti linjer over, i
en form ingen linjebasert sveip enumererer — sju MCP-kall oppramset ett per
linje paa :388-394, under en overskrift som selv baerer tallet. Den er
overskriftsbaaren og hoerer derfor under aapent spoersmaal #22 ved siden av
idx-26aj og idx-26ak, ikke under denne entryens linjeform.

RESIDUET BLE STOERRELSESMAALT FOER DET BLE BOKFOERT: noeyaktig 5 filer av 389
baerer en enumerert MCP-kall-liste. Én er falsk positiv, tre er alt bokfoert
(idx-26z, idx-26ai, idx-26ak), og denne var den eneste ubokfoerte — og den
eneste av de fem blant disse 40.

EN RESOLVED ENTRY BLE FALSIFISERT, og rettet med datert tilleggsklausul i samme
pass (presedens 4032dfc, ikke stille gjenaapning): idx-26j la denne filas :396 i
boetta «not checkable — a total with no per-tool numbers to sum». De per-verktoey-
tallene FINNES, de ligger bare ti linjer opp og forbi en overskrift.
Aritmetikk-testen var anvendelig og den feiler: 6 oppgitt mot 7 oppramset.
De tre andre i boetta ble re-verifisert mot HEAD FOER klausulen ble skrevet og
alle tre staar. Én av fire feil, ikke fire av fire — boetta er bulket, ikke tom.

Boettene styrte KUN bokfoering, som ratifisert: konsistente og inkonsistente
medlemmer ble slettet av identisk grunn.

Koe: 51 entries (30 aapne, 21 resolved). Suite: 1052/1052.
2026-08-11 22:46:30 +02:00

1079 lines
39 KiB
Markdown

# Prompt Testing, Evaluation and Iteration
**Last updated:** 2026-06-19
**Status:** GA
**Category:** Prompt Engineering & LLM Optimization
---
## Introduksjon
Evaluering av prompt-baserte LLM-løsninger er kritisk for å måle ytelse, kvalitet og sikkerhet i generative AI-applikasjoner. Microsoft tilbyr en omfattende evalueringsplattform gjennom Microsoft Foundry og Prompt Flow som støtter både automatisert testing, AI-assistert evaluering og kontinuerlig overvåking.
Denne referansen dekker evalueringsrammeverket for prompt testing, iterasjon og optimalisering på tvers av Microsoft AI-stakken — fra utviklingsfasen (prototyping), via eksperimentering (evaluation flows), til produksjon (continuous evaluation).
**Hovedkomponenter:**
- **Microsoft Foundry Evaluation**: UI-basert evalueringsportal med innebygde metrics
- **Prompt Flow Evaluation**: SDK-basert rammeverk for programmatisk evaluering
- **Azure AI Evaluation SDK**: Python SDK for custom evaluators og batch-evaluering
- **Continuous Evaluation**: Automatisk evaluering av agent-responser i produksjon
- **Evaluation Metrics**: AI-assisterte, NLP-baserte og safety-fokuserte metrics
**Evalueringstyper:**
- **Model evaluation**: Evaluerer output fra en modell mot et datasett
- **Agent evaluation**: Evaluerer agent-responser (inkl. tool calls og reasoning)
- **Dataset evaluation**: Evaluerer pre-genererte outputs i et datasett
- **Synthetic evaluation**: Evaluerer modell mot syntetisk genererte testdata
---
## Kjernekomponenter
### 1. Microsoft Foundry Evaluation Portal
**Beskrivelse:** UI-basert evalueringsverktøy i Microsoft Foundry portalen som lar deg opprette evaluation runs med innebygde metrics, visualisere resultater og sammenligne evalueringer.
**Kapabiliteter:**
- Wizard-basert opprettelse av evaluation runs (Evaluation → Create)
- Test mot model deployments, agents eller forhåndsgenererte datasets
- Støtte for CSV/JSONL datasets
- Automatisk field mapping mellom dataset og evaluators
- Synthetic dataset generation (GPT-genererte spørsmål basert på topic)
- Evaluator library for versjonering og gjenbruk av evaluators
**Built-in Evaluation Metrics (3 kategorier):**
| Kategori | Metrics | Krever | Beskrivelse |
|----------|---------|--------|-------------|
| **AI Quality (AI-assisted)** | Groundedness, Relevance, Coherence, Fluency, GPT Similarity | GPT-4/GPT-3.5 deployment | AI-vurdert kvalitet med Likert-skala (1-5) |
| **AI Quality (NLP)** | F1 Score, ROUGE, BLEU, GLEU, METEOR | Ground truth data | Matematiske metrics for tekstlikhet |
| **Risk & Safety** | Violence, Hate/Unfairness, Self-Harm, Sexual Content, Protected Material, Indirect Attack | Ingen (Foundry provisjonerer GPT-4) | Content safety scoring (0-7 severity) |
**Data Mapping Requirements:**
| Metric | Query | Response | Context | Ground Truth |
|--------|-------|----------|---------|--------------|
| Groundedness | ✅ | ✅ | ✅ | — |
| Relevance | ✅ | ✅ | ✅ | — |
| Coherence | ✅ | ✅ | — | — |
| Fluency | ✅ | ✅ | — | — |
| GPT Similarity | ✅ | ✅ | — | ✅ |
| F1/BLEU/ROUGE | — | ✅ | — | ✅ |
| Safety metrics | ✅ | ✅ | — | — |
**Regiontilgjengelighet (Safety Metrics):**
AI-assisted risk and safety metrics er hostet av Foundry safety evaluations og tilgjengelig i: **East US 2, France Central, UK South, Sweden Central**.
**Synthetic Data Generation (Preview):**
Tilgjengelig i regioner som støtter Response API. Genererer testdata basert på en prompt + optional file upload for kontekst.
---
### 2. Prompt Flow Evaluation Framework
> **Utfasing (verifisert MCP 2026-06-19):** Prompt Flow i Microsoft Foundry og Azure Machine Learning utfases **20. april 2027** og anbefales ikke lenger for ny utvikling. Migrer eksisterende Prompt Flow-applikasjoner og -deployments til **Microsoft Agent Framework (MAF)** før denne datoen. Prompt Flow-runtime-images (`promptflow-runtime`, `promptflow-runtime-stable`, `promptflow-python`) får ikke lenger oppdateringer, inkludert sikkerhetsoppdateringer. Evaluation-mønstrene under er fortsatt gyldige for eksisterende løsninger, men velg MAF / Azure AI Evaluation SDK for nye prosjekter.
**Beskrivelse:** SDK-basert evalueringsrammeverk som lar deg bygge custom evaluation flows som Python-kode eller Prompty-filer, kjøre batch evaluations og logge metrics programmatisk.
**Evaluation Flow Lifecycle:**
```
1. Input Definition → Definer inputs (query, response, context, ground_truth)
2. Line Processing → Kalkuler score per data row (Python/LLM node)
3. Output Specification → Spesifiser outputs (scores, reasoning)
4. Aggregation → Kalkuler overall metrics (mean, median, pass rate)
5. Metric Logging → Log metrics med `log_metric()` funksjon
```
**Evaluation Flow Structure:**
| Node Type | Formål | Input | Output |
|-----------|--------|-------|--------|
| **Line Process** | Kalkuler score per rad | Single row data | Score (float/int), reasoning (str) |
| **Aggregation** | Kalkuler overall metrics | List of scores | Aggregated metric (float/int) |
**Kodeeksempel: Custom Evaluator (Python node):**
```python
from typing import List
from promptflow import tool, log_metric
@tool
def calculate_accuracy(grades: List[str]):
"""
Aggregation node som kalkulerer overall accuracy.
"""
accuracy = round((grades.count("Correct") / len(grades)), 2)
log_metric("accuracy", accuracy)
return accuracy
```
**Built-in Evaluators (Prompt Flow SDK):**
```python
from azure.ai.evaluation import (
RelevanceEvaluator,
CoherenceEvaluator,
GroundednessProEvaluator,
ViolenceEvaluator,
BleuScoreEvaluator
)
# AI-assisted evaluator
model_config = {
"azure_endpoint": os.environ["AZURE_OPENAI_ENDPOINT"],
"api_key": os.environ["AZURE_OPENAI_API_KEY"],
"azure_deployment": "gpt-4o"
}
relevance_eval = RelevanceEvaluator(model_config)
result = relevance_eval(
query="What is the capital of Japan?",
response="The capital of Japan is Tokyo.",
context="Japan is a country in East Asia."
)
# NLP evaluator (no model required)
bleu_eval = BleuScoreEvaluator()
result = bleu_eval(
response="Tokyo is the capital of Japan.",
ground_truth="The capital of Japan is Tokyo."
)
```
**Prompt Flow CLI for Batch Evaluation:**
```bash
# Kjør evaluation flow mot et batch run
pfazure run create --file run_evaluation.yml
# Vis evaluation metrics
pfazure run show-metrics --name <evaluation-run-name>
# Stream evaluation logs
pfazure run stream --name <evaluation-run-name>
```
---
### 3. Azure AI Evaluation SDK
**Beskrivelse:** Python SDK (`azure-ai-evaluation`) for programmatisk evaluering av LLM-applikasjoner, med støtte for custom evaluators, batch evaluation og integration med Microsoft Foundry.
**Installasjon:**
```bash
pip install azure-ai-evaluation
pip install "azure-ai-evaluation[remote]" # For remote evaluation
pip install "azure-ai-evaluation[redteam]" # Inkluderer PyRIT for red teaming
```
**Evaluate Function (Core API):**
```python
from azure.ai.evaluation import evaluate, RelevanceEvaluator, CoherenceEvaluator
model_config = {
"azure_endpoint": os.environ["AZURE_OPENAI_ENDPOINT"],
"api_key": os.environ["AZURE_OPENAI_KEY"],
"azure_deployment": "gpt-4o"
}
# Batch evaluation mot JSONL dataset
result = evaluate(
data="evaluation_data.jsonl", # CSV eller JSONL
evaluators={
"coherence": CoherenceEvaluator(model_config=model_config),
"relevance": RelevanceEvaluator(model_config=model_config)
},
evaluator_config={
"coherence": {
"column_mapping": {
"response": "${data.response}",
"query": "${data.query}"
}
},
"relevance": {
"column_mapping": {
"response": "${data.response}",
"context": "${data.context}",
"query": "${data.query}"
}
}
},
tags={"environment": "production", "version": "v1.2"}
)
# Access results
print(f"Coherence score: {result['metrics']['coherence']}")
print(f"Relevance score: {result['metrics']['relevance']}")
```
**Custom Evaluators (AzureOpenAIPythonGrader):**
```python
from azure.ai.evaluation import AzureOpenAIPythonGrader
# Custom evaluator med Python-basert grading logic
custom_grader = AzureOpenAIPythonGrader(
model_config=model_config,
name="custom_accuracy",
pass_threshold=0.8,
source="""
def grade(sample: dict, item: dict) -> float:
output = item.get("response", "").lower()
label = item.get("ground_truth", "").lower()
if output == label:
return 1.0
elif output in label or label in output:
return 0.5
return 0.0
"""
)
# Kjør evaluation
result = evaluate(
data="test_data.jsonl",
evaluators={"custom_accuracy": custom_grader}
)
print(f"Pass rate: {result['metrics']['custom_accuracy.pass_rate']}")
```
**Agent-Specific Evaluators:**
```python
from azure.ai.evaluation import (
IntentResolutionEvaluator,
ResponseCompletenessEvaluator
)
intent_eval = IntentResolutionEvaluator(model_config)
result = intent_eval(
query="What are the opening hours of the Eiffel Tower?",
response="Opening hours of the Eiffel Tower are 9:00 AM to 11:00 PM."
)
print(result["score"]) # 1-5 skala
```
---
### 4. Continuous Evaluation (Production Monitoring)
**Beskrivelse:** Automatisk evaluering av agent-responser i produksjon ved hjelp av Evaluation Rules som trigger på agent events (f.eks. `RESPONSE_COMPLETED`).
**Setup via Azure AI Projects SDK:**
```python
from azure.ai.projects.models import (
EvaluationRule,
ContinuousEvaluationRuleAction,
EvaluationRuleFilter,
EvaluationRuleEventType
)
# Opprett evaluation object (som i batch evaluation)
data_source_config = {"type": "azure_ai_source", "scenario": "responses"}
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "violence_detection",
"evaluator_name": "builtin.violence"
}
]
eval_object = openai_client.evals.create(
name="Continuous Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria
)
# Opprett continuous evaluation rule
continuous_eval_rule = project_client.evaluation_rules.create_or_update(
id="my-continuous-eval-rule",
evaluation_rule=EvaluationRule(
display_name="Production Agent Safety Monitor",
description="Evaluerer alle agent-responser for violence content",
action=ContinuousEvaluationRuleAction(
eval_id=eval_object.id,
max_hourly_runs=100 # Rate limiting
),
event_type=EvaluationRuleEventType.RESPONSE_COMPLETED,
filter=EvaluationRuleFilter(agent_name="MyProductionAgent"),
enabled=True
)
)
```
**Event Types:**
- `RESPONSE_COMPLETED`: Trigger når agent ferdigstiller en respons
- `RESPONSE_FAILED`: Trigger ved agent errors
**Use Cases:**
- Real-time safety monitoring (violence, hate speech)
- Quality drift detection (relevance, coherence)
- Compliance logging (protected material, GDPR)
---
### 5. Evaluator Library & Version Management
**Beskrivelse:** Sentralisert bibliotek i Microsoft Foundry for lagring, versjonering og deling av custom evaluators.
**Registrere Custom Evaluator:**
```python
from azure.ai.ml import MLClient
from azure.ai.ml.entities import Model
from promptflow.client import PFClient
# Opprett MLClient for Azure AI Project
ml_client = MLClient(
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"],
resource_group_name=os.environ["AZURE_RESOURCE_GROUP"],
workspace_name=os.environ["AZURE_PROJECT_NAME"],
credential=DefaultAzureCredential()
)
# Konverter evaluator til Prompt Flow format
pf_client = PFClient()
pf_client.flows.save(entry=MyCustomEvaluator, path="custom_eval_local")
# Registrer evaluator i Evaluator Library
custom_evaluator = Model(
path="custom_eval_local",
name="MyCustomEvaluator",
description="Evaluator som måler svar-lengde og relevans."
)
registered_evaluator = ml_client.evaluators.create_or_update(custom_evaluator)
print(f"Registered evaluator: {registered_evaluator.id}")
# Hent spesifikk versjon
versioned_evaluator = ml_client.evaluators.get("MyCustomEvaluator", version=1)
```
**Fordeler:**
- **Versjonering**: Spor endringer i evaluators over tid
- **Gjenbruk**: Del evaluators på tvers av team og prosjekter
- **Governance**: Sentralisert kontroll over evaluation logic
---
## Arkitekturmønstre
### Mønster 1: Iterativ Prompt Development Workflow
**Bruksområde:** Utvikle og tune prompts gjennom systematisk evaluering og iterasjon.
**Prosess:**
```
1. Initialization
└─ Definer business use case
└─ Samle sample data (50-100 eksempler)
└─ Utvikle baseline prompt
2. Experimentation (Inner Loop)
└─ Test prompt i Playground/SDK
└─ Kjør batch evaluation (5-10 samples)
└─ Analyser failure cases
└─ Iterer prompt (instruksjoner, few-shot examples)
└─ Repeat til tilfredsstillende results
3. Evaluation & Refinement (Outer Loop)
└─ Kjør batch evaluation (100-500 samples)
└─ Mål metrics: quality (coherence, relevance), safety (violence, hate)
└─ Sammenlign prompt variants (A/B testing)
└─ Analyser edge cases og failure modes
└─ Refiner prompt basert på metrics
4. Production
└─ Deploy prompt til production
└─ Aktiver continuous evaluation
└─ Monitor metrics over time (drift detection)
└─ Feedback loop til steg 1 for continuous improvement
```
**Best Practices:**
- **Start smått**: 5-10 samples i inner loop, 100-500 i outer loop
- **Diverse metrics**: Kombiner AI-assisted (coherence, relevance) + safety (violence, hate)
- **Ground truth data**: Kuratér høy-kvalitet ground truth for NLP metrics
- **Human-in-the-loop**: Kombiner automated evaluation med human feedback
- **Versjonering**: Bruk Evaluator Library for å tracke prompt changes
---
### Mønster 2: Multi-Evaluator Testing Strategy
**Bruksområde:** Evaluere prompts på tvers av flere dimensjoner (quality, safety, task-specific metrics) for helhetlig vurdering.
**Evaluator Stack:**
| Layer | Evaluator Type | Metrics | Threshold |
|-------|----------------|---------|-----------|
| **Layer 1: Safety** | Risk & Safety Evaluators | Violence, Hate, Self-Harm, Sexual | 100% pass rate (severity < 2) |
| **Layer 2: Quality** | AI-Assisted Quality | Groundedness, Relevance, Coherence | Avg score ≥ 4/5 |
| **Layer 3: Task Performance** | NLP/Custom Evaluators | F1 Score, ROUGE, Custom Logic | F1 ≥ 0.8 |
| **Layer 4: User Experience** | Human Feedback | Thumbs up/down, CSAT | ≥ 80% positive |
**Implementasjon:**
```python
# Layer 1: Safety evaluators (blokkerende)
safety_evaluators = {
"violence": ViolenceEvaluator(azure_ai_project),
"hate": HateUnfairnessEvaluator(azure_ai_project),
"self_harm": SelfHarmEvaluator(azure_ai_project)
}
# Layer 2: Quality evaluators (krav: avg ≥ 4/5)
quality_evaluators = {
"groundedness": GroundednessProEvaluator(azure_ai_project, threshold=4),
"relevance": RelevanceEvaluator(model_config),
"coherence": CoherenceEvaluator(model_config)
}
# Layer 3: Task performance
task_evaluators = {
"f1_score": F1ScoreEvaluator(),
"custom_accuracy": AzureOpenAIPythonGrader(...)
}
# Kjør evaluation i sekvens
safety_result = evaluate(data=data, evaluators=safety_evaluators)
if safety_result["metrics"]["violence.defect_rate"] == 0:
quality_result = evaluate(data=data, evaluators=quality_evaluators)
if quality_result["metrics"]["relevance"] >= 4:
task_result = evaluate(data=data, evaluators=task_evaluators)
```
**Når bruke:**
- **RAG-applikasjoner**: Safety → Groundedness → Relevance → F1 Score
- **Conversational agents**: Safety → Coherence → IntentResolution → CSAT
- **Classification tasks**: Safety → Custom Logic → F1/Accuracy
---
### Mønster 3: Dataset-Driven Evaluation (Golden Dataset Strategy)
**Bruksområde:** Opprette et kuratert "golden dataset" for konsistent evaluering av prompt changes over tid.
**Dataset Structure (JSONL format):**
```json
{"query": "What is the capital of France?", "context": "France is a country in Europe.", "ground_truth": "Paris", "category": "geography"}
{"query": "Explain photosynthesis", "context": "Photosynthesis is a process...", "ground_truth": "Photosynthesis converts light to energy...", "category": "science"}
```
**Golden Dataset Characteristics:**
- **Size**: 300-1000 samples (representative of production distribution)
- **Diversity**: Dekker edge cases, common queries, failure modes
- **Quality**: Manuelt validert ground truth av domain experts
- **Version Control**: Lagret i Git, oppdatert ved nye use cases
- **Stratification**: Balansert på tvers av kategorier (f.eks. 30% geography, 30% science, 40% history)
**Evaluation Workflow:**
```python
# Last inn golden dataset
golden_dataset = "golden_dataset_v3.jsonl"
# Evaluer prompt variant
result = evaluate(
data=golden_dataset,
evaluators={
"relevance": RelevanceEvaluator(model_config),
"f1_score": F1ScoreEvaluator()
},
tags={"prompt_version": "v2.1", "dataset_version": "v3"}
)
# Sammenlign med baseline
baseline_metrics = load_baseline_metrics("v1.0")
improvement = result["metrics"]["f1_score"] - baseline_metrics["f1_score"]
print(f"F1 Score improvement: {improvement:.2%}")
```
**Best Practices:**
- **Versjonering**: Tag både dataset version og prompt version i evaluation runs
- **Regression Testing**: Kjør golden dataset evaluation ved hver prompt change
- **Continuous Update**: Legg til nye failure cases fra production til golden dataset
- **Stratified Sampling**: Sikre balansert distribusjon av query types
---
### Mønster 4: Continuous Evaluation + Human-in-the-Loop (Production)
**Bruksområde:** Kombinere automated continuous evaluation med human feedback i produksjon for å fange kvalitetsproblemer og safety issues i real-time.
**Arkitektur:**
```
Production Agent
↓ (response_completed event)
Continuous Evaluation Rule
↓ (automated metrics)
Evaluation Dashboard
↓ (flagged samples)
Human Review Queue
↓ (feedback)
Feedback Loop → Retraining/Prompt Tuning
```
**Implementasjon:**
```python
# Setup continuous evaluation
continuous_eval_rule = project_client.evaluation_rules.create_or_update(
id="production-safety-monitor",
evaluation_rule=EvaluationRule(
action=ContinuousEvaluationRuleAction(eval_id=eval_object.id, max_hourly_runs=100),
event_type=EvaluationRuleEventType.RESPONSE_COMPLETED,
filter=EvaluationRuleFilter(agent_name="CustomerSupportAgent"),
enabled=True
)
)
# Query flagged samples for human review
flagged_samples = project_client.evaluations.query_samples(
filter="violence_score > 2 OR groundedness_score < 3"
)
# Human reviewer workflow
for sample in flagged_samples:
print(f"Query: {sample['query']}")
print(f"Response: {sample['response']}")
print(f"Flags: Violence={sample['violence_score']}, Groundedness={sample['groundedness_score']}")
feedback = input("Approve (y/n)? ")
if feedback == "n":
# Log to feedback dataset for retraining
feedback_dataset.append({
"query": sample["query"],
"response": sample["response"],
"feedback": "rejected",
"reason": "low_groundedness"
})
```
**Alerting Strategy:**
| Metric | Threshold | Alert Level | Action |
|--------|-----------|-------------|--------|
| Violence Score > 4 | Immediate | Critical | Block response, manual review |
| Groundedness < 3 | > 5% of responses | Warning | Review prompt, update context |
| Relevance < 3 | > 10% of responses | Warning | Retrain/tune prompt |
| Response Time > 10s | > 20% of responses | Info | Optimize inference |
---
### Mønster 5: A/B Testing for Prompt Optimization
**Bruksområde:** Teste flere prompt variants i produksjon for å identifisere beste prompt basert på real-world metrics.
**Workflow:**
```python
# Definer prompt variants
prompt_a = "You are a helpful assistant. Answer briefly."
prompt_b = "You are an expert assistant. Provide detailed answers with examples."
# Deploy variants med traffic split
traffic_split = {"prompt_a": 0.5, "prompt_b": 0.5}
# Continuous evaluation per variant
for variant in ["prompt_a", "prompt_b"]:
continuous_eval_rule = project_client.evaluation_rules.create_or_update(
id=f"ab-test-{variant}",
evaluation_rule=EvaluationRule(
action=ContinuousEvaluationRuleAction(eval_id=eval_object.id),
filter=EvaluationRuleFilter(agent_name=f"Agent-{variant}"),
enabled=True
)
)
# Analyser results etter 1 uke
results_a = query_evaluation_metrics(agent="Agent-prompt_a", time_range="7d")
results_b = query_evaluation_metrics(agent="Agent-prompt_b", time_range="7d")
# Statistical significance test (t-test)
from scipy.stats import ttest_ind
t_stat, p_value = ttest_ind(results_a["relevance_scores"], results_b["relevance_scores"])
if p_value < 0.05:
winner = "prompt_a" if results_a["avg_relevance"] > results_b["avg_relevance"] else "prompt_b"
print(f"Winner: {winner} (p={p_value:.4f})")
```
**Evaluering Metrics (A/B Test):**
- **Primary Metrics**: Relevance, Coherence, Task Completion Rate
- **Secondary Metrics**: Response Time, User Satisfaction (CSAT)
- **Guardrail Metrics**: Safety (violence, hate), Groundedness
---
## Beslutningsveiledning
### Spørsmål 1: Hvilken evalueringsmetode passer for mitt use case?
| Use Case | Evalueringsmetode | Begrunnelse |
|----------|-------------------|-------------|
| **Prototyping (5-50 samples)** | Playground + Manual Review | Rask iterasjon, minimal overhead |
| **Development (100-500 samples)** | Prompt Flow Batch Evaluation | Strukturert testing, metrics logging |
| **Pre-Production (1000+ samples)** | Microsoft Foundry Evaluation (UI/SDK) | Golden dataset testing, A/B comparison |
| **Production Monitoring** | Continuous Evaluation + HITL | Real-time safety, drift detection |
---
### Spørsmål 2: Hvilke metrics skal jeg bruke?
| Scenario | Primary Metrics | Secondary Metrics | Rationale |
|----------|----------------|-------------------|-----------|
| **RAG (Q&A)** | Groundedness, Relevance | F1 Score, ROUGE | Sikre factuelt korrekte svar basert på context |
| **Conversational Agent** | Coherence, Fluency, IntentResolution | CSAT, Response Time | Sikre naturlig dialog og user intent-oppfyllelse |
| **Classification** | F1 Score, Accuracy | Precision, Recall | Måle task performance matematisk |
| **Content Generation** | Coherence, Fluency, GPT Similarity | BLEU, Human Feedback | Kvalitet og likhet til menneskeskrevne tekster |
| **Public Sector (Norge)** | **Safety metrics** (Violence, Hate), Groundedness | Relevance, Coherence | Compliance med AI-loven, GDPR, etiske retningslinjer |
**Best Practice:** Kombiner alltid AI-assisted quality metrics (relevance, coherence) med safety metrics (violence, hate) for helhetlig evaluering.
---
### Spørsmål 3: Hvor mange samples trenger jeg i evalueringen?
| Fase | Sample Count | Begrunnelse |
|------|--------------|-------------|
| **Inner Loop (Rapid Iteration)** | 5-20 | Rask feedback på prompt changes |
| **Outer Loop (Validation)** | 100-500 | Statistisk signifikante resultater |
| **Pre-Production (Golden Dataset)** | 500-1000 | Representativ for production distribution |
| **Continuous Evaluation (Production)** | Alle responses (sampled) | Kontinuerlig overvåking av quality drift |
**Rule of Thumb:** Minimum 100 samples for pålitelig metric calculation (confidence interval < 5%).
---
### Spørsmål 4: Når skal jeg bruke custom evaluators vs. built-in evaluators?
| Situasjon | Anbefaling | Eksempel |
|-----------|------------|----------|
| Standardiserte use cases (RAG, classification) | **Built-in evaluators** | Groundedness, Relevance, F1 Score |
| Domain-spesifikk logikk | **Custom evaluators** | Medical terminology accuracy, Legal citation format |
| Business-spesifikke KPIs | **Custom evaluators** | Customer satisfaction scoring, Brand compliance |
| Regulatory compliance (Norge) | **Custom evaluators** | GDPR-compliance check, Norwegian language quality |
| Cost optimization | **Built-in evaluators** | Raskere utvikling, ingen custom logic vedlikehold |
**Best Practice:** Start med built-in evaluators, utvikle custom evaluators kun når nødvendig for spesifikke krav.
---
## Integrasjon med Microsoft-stakken
### Microsoft Foundry
**Evaluation Workflow:**
```
1. Develop Prompt (Playground)
└─ Test interaktivt med sample queries
2. Batch Test (Evaluation Portal)
└─ Upload dataset (CSV/JSONL)
└─ Select evaluators (Groundedness, Relevance, Safety)
└─ Map fields (query, response, context, ground_truth)
└─ Submit evaluation run
3. View Results (Evaluation Portal)
└─ Metrics dashboard (avg scores, pass rate)
└─ Per-sample analysis (drill-down)
└─ Comparison view (A vs B)
4. Iterate Prompt
└─ Refiner prompt basert på failure cases
└─ Re-run evaluation → Compare metrics
```
**Integration Points:**
- **Model Catalog**: Evaluer modeller i katalogen med egne data
- **Playground**: Test prompts interaktivt før batch evaluation
- **Deployments**: Evaluer deployed models og agenter
- **Evaluator Library**: Lagre og versjonere custom evaluators
---
### Prompt Flow
**SDK-Based Evaluation Workflow:**
```python
from promptflow import PFClient
from azure.ai.evaluation import evaluate
# Step 1: Opprett PFClient
pf_client = PFClient()
# Step 2: Kjør batch run
batch_run = pf_client.run(
flow="./my_flow",
data="./test_data.jsonl",
column_mapping={"query": "${data.query}"}
)
# Step 3: Kjør evaluation
eval_result = evaluate(
data="./test_data.jsonl",
evaluators={
"relevance": RelevanceEvaluator(model_config),
"coherence": CoherenceEvaluator(model_config)
},
evaluator_config={
"relevance": {
"column_mapping": {
"query": "${data.query}",
"response": "${run.outputs.response}",
"context": "${data.context}"
}
}
}
)
# Step 4: Analyser metrics
print(f"Relevance: {eval_result['metrics']['relevance']}")
```
**DevOps Integration:**
```yaml
# Azure Pipelines YAML
trigger:
branches:
include:
- main
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install promptflow azure-ai-evaluation
pfazure run create --file run.yml
pfazure run create --file run_evaluation.yml
displayName: 'Run Prompt Flow Evaluation'
- script: |
python validate_metrics.py # Fail pipeline hvis metrics under threshold
displayName: 'Validate Metrics'
```
---
### Copilot Studio
**Limitation:** Copilot Studio har begrenset native evaluation support (ingen built-in evaluation framework).
**Workaround:**
1. **Eksporter conversation logs** fra Copilot Studio til Dataverse
2. **Sync til Microsoft Foundry** via API
3. **Kjør evaluation** i Microsoft Foundry mot eksporterte logs
**Alternativ:** Bruk **Power Automate** flow for å samle conversation logs og kalle Azure AI Evaluation API.
---
### Power Platform AI Builder
**Limitation:** AI Builder har ikke native evaluation support for prompt-baserte modeller.
**Workaround:**
1. Test prompts i **Microsoft Foundry Playground**
2. Evaluer via **Microsoft Foundry Evaluation Portal**
3. Deploy finalized prompt til AI Builder (via custom connector til Azure OpenAI)
---
### Microsoft 365 Copilot
**Limitation:** M365 Copilot er closed-source, ingen direkte evaluation access.
**Enterprise-Level Monitoring:**
- **Microsoft Purview**: Compliance monitoring (DLP, sensitivity labels)
- **Microsoft Viva Insights**: User adoption metrics (ikke quality metrics)
- **Azure Monitor**: Latency, error rates (ikke semantic quality)
**Recommendation:** For custom Copilot Extensions (via Copilot Studio), bruk Copilot Studio evaluation workflow ovenfor.
---
## Offentlig sektor (Norge)
### Compliance-Krav
| Regulering | Krav | Evaluation Metrics |
|------------|------|-------------------|
| **EU AI Act (Article 52)** | Transparency om AI-generert innhold | Groundedness, Source Attribution (custom evaluator) |
| **GDPR (Article 22)** | No automated decision-making uten human review | Human-in-the-Loop metrics (% human-reviewed) |
| **Diskrimineringsloven** | No bias mot beskyttede grupper | Fairness metrics (custom evaluator for Norwegian context) |
| **Språkkrav (Norsk offentlig sektor)** | Norwegian language quality | Language Quality Evaluator (custom, trained on Norwegian corpus) |
---
### Anbefalt Evaluation Stack for Norske Myndigheter
| Layer | Evaluator | Threshold | Begrunnelse |
|-------|-----------|-----------|-------------|
| **Safety (Obligatorisk)** | Violence, Hate, Self-Harm | 100% pass rate (severity < 2) | AI-loven krav til innholdssikkerhet |
| **Factuality (Obligatorisk)** | Groundedness | 100% pass rate (score ≥ 4/5) | Forhindre feilinformasjon i offentlig sektor |
| **Language Quality** | Norwegian Language Evaluator (custom) | 95% pass rate | Sikre korrekt norsk grammatikk og terminologi |
| **Transparency** | Source Attribution Evaluator (custom) | 100% (alle claims må ha kilde) | AI-loven transparency requirement |
| **Quality** | Relevance, Coherence | Avg ≥ 4/5 | Brukerkvalitet |
---
### Custom Evaluator: Norwegian Language Quality
**Bruksområde:** Sjekke at AI-generert tekst følger norsk grammatikk, terminologi og bokmål/nynorsk-standarder.
**Implementasjon:**
```python
from azure.ai.evaluation import AzureOpenAIPythonGrader
norwegian_language_evaluator = AzureOpenAIPythonGrader(
model_config=model_config,
name="norwegian_language_quality",
pass_threshold=0.9,
source="""
def grade(sample: dict, item: dict) -> float:
response = item.get("response", "")
# Sjekk 1: Ingen engelske ord (unntatt tekniske termer)
english_words = ["the", "and", "is", "are", "to", "for"]
has_english = any(word in response.lower() for word in english_words)
# Sjekk 2: Korrekt bokmål/nynorsk (basert på terminologi)
# Implementer custom logic basert på LanguageTool API eller spaCy Norwegian model
# Sjekk 3: Formell tone (offentlig sektor krav)
informal_words = ["hei", "sånn", "skjønner"]
has_informal = any(word in response.lower() for word in informal_words)
if has_english or has_informal:
return 0.6
return 1.0
"""
)
```
**Best Practice:** Integrer LanguageTool API eller GPT-4o med Norwegian system prompt for mer avansert grammatikksjekk.
---
### Custom Evaluator: Source Attribution (GDPR Transparency)
**Bruksområde:** Sikre at alle factual claims i AI-generert tekst har en identifiserbar kilde (GDPR Article 22, AI Act Article 52).
**Implementasjon:**
```python
source_attribution_evaluator = AzureOpenAIPythonGrader(
model_config=model_config,
name="source_attribution",
pass_threshold=1.0, # Alle claims må ha kilde
source="""
def grade(sample: dict, item: dict) -> float:
response = item.get("response", "")
context = item.get("context", "")
# Prompt GPT-4o til å identifisere claims
claims = extract_claims(response) # Custom function via LLM
# Sjekk at hver claim kan traces til context
attributed_claims = 0
for claim in claims:
if is_claim_in_context(claim, context): # Custom function via LLM
attributed_claims += 1
attribution_rate = attributed_claims / len(claims) if claims else 1.0
return attribution_rate
"""
)
```
---
## Kostnad og lisensiering
### Microsoft Foundry Evaluation Costs
| Komponent | Kostnadsmodell | Estimat (NOK/måned) |
|-----------|----------------|---------------------|
| **AI-Assisted Evaluators** | Charged per GPT-4 token consumption | NOK 500-2000 (avhenger av dataset size) |
| **Safety Evaluators** | **Gratis** (Foundry-provisjonert GPT-4) | NOK 0 |
| **NLP Evaluators** | **Gratis** (matematisk beregning) | NOK 0 |
| **Synthetic Data Generation** | Charged per GPT-4 token consumption | NOK 100-500 per 1000 samples |
| **Continuous Evaluation** | Charged per GPT-4 token consumption | NOK 2000-10 000 (avhenger av traffic volume) |
**Optimalisering:**
- Bruk **NLP evaluators** (F1, ROUGE) for bulk testing (gratis)
- Bruk **AI-assisted evaluators** kun for final validation (mindre dataset)
- Limit **max_hourly_runs** i continuous evaluation for cost control
---
### Lisensiering
| Komponent | Lisenskrav | Inkludert i |
|-----------|------------|-------------|
| **Microsoft Foundry Evaluation Portal** | Azure-subscription | Microsoft Foundry Hub |
| **Prompt Flow SDK** | Ingen lisens (open-source) | Gratis (pip install) |
| **Azure AI Evaluation SDK** | Ingen lisens (open-source) | Gratis (pip install) |
| **Azure OpenAI (for GPT-4 judges)** | Azure-subscription + model deployment | Pay-as-you-go pricing |
| **Foundry Safety Evaluators** | Inkludert i Foundry-subscription | Gratis (limited regions) |
**Note:** Foundry Safety Evaluators er kun tilgjengelig i **East US 2, France Central, UK South, Sweden Central**.
---
### Kostnadsestimat: Typisk Evaluation Workflow
| Fase | Dataset Size | Evaluators | GPT-4 Token Consumption | Kostnad (NOK) |
|------|--------------|------------|-------------------------|---------------|
| **Inner Loop (Development)** | 10 samples | Relevance, Coherence | ~10K tokens | NOK 10 |
| **Outer Loop (Validation)** | 500 samples | Groundedness, Relevance, Safety | ~500K tokens | NOK 500 |
| **Golden Dataset (Pre-Prod)** | 1000 samples | Full stack (6 evaluators) | ~2M tokens | NOK 2000 |
| **Continuous Eval (Production)** | 10K responses/month | Safety only (gratis) | 0 tokens | NOK 0 |
**Total estimat (per måned i produksjon):** **NOK 2000-5000** (avhenger av evaluation frequency og dataset size).
---
## For arkitekten (Cosmo)
### Når foreslå Microsoft Foundry Evaluation?
**JA, når:**
- Kunden jobber med RAG, conversational agents eller content generation
- Kunden trenger **systematisk prompt testing** for å sikre kvalitet før produksjon
- Kunden er underlagt **compliance-krav** (AI Act, GDPR, norsk offentlig sektor)
- Kunden har **eksisterende Microsoft Foundry infrastructure**
- Kunden trenger **continuous evaluation** for production monitoring
**NEI, når:**
- Kunden har simple keyword-based eller rule-based logic (ikke LLM-based)
- Kunden mangler resurser til å kuratere golden dataset (100+ samples)
- Kunden har **svært lave budsjetter** (< NOK 5000/måned) og høy traffic volume
- Kunden har **ingen Azure-subscription** og vil unngå cloud lock-in
---
### Diskusjonsspørsmål til kunden
1. **"Har dere en testdatasett med 100-500 eksempler som representerer typiske bruksscenarioer?"**
- Hvis NEI → Foreslå synthetic data generation (kostnad: ~NOK 500)
2. **"Hvilke kvalitetsdimensjoner er viktigst for dere: faktakorrekthet (groundedness), relevans, eller sikkerhet (safety)?"**
- Tailor evaluator stack basert på svar
3. **"Trenger dere compliance-dokumentasjon for AI-loven eller GDPR?"**
- Hvis JA → Inkluder source attribution evaluator + human-in-the-loop
4. **"Hvor ofte planlegger dere å oppdatere prompts i produksjon?"**
- Hvis ofte (ukentlig) → Foreslå golden dataset + regression testing
- Hvis sjelden (kvartalsvis) → Enklere ad-hoc evaluation
5. **"Har dere kapasitet til manuell review av 5-10% av AI-genererte responses?"**
- Hvis JA → Foreslå continuous evaluation + human-in-the-loop
- Hvis NEI → Fokuser på automated safety evaluators
---
### Red Flags (Advarselssignaler)
⚠️ **Ingen testdata tilgjengelig**
*Løsning:* Start med synthetic data generation (50-100 samples), deretter kuratér golden dataset over tid.
⚠️ **Kunden forventer 100% accuracy fra AI**
*Løsning:* Eduker om LLM-limitasjoner, foreslå human-in-the-loop for kritiske use cases.
⚠️ **Kunden vil hoppe rett til produksjon uten evaluering**
*Løsning:* Påpek risiko for reputational damage, compliance issues. Minimum krav: Safety evaluators (gratis).
⚠️ **Ingen budsjettkontroll for GPT-4 evaluation costs**
*Løsning:* Kombiner NLP evaluators (gratis) med AI-assisted (payg). Sett `max_hourly_runs` limit.
---
### Trinnvis Anbefalingsstrategi
#### Steg 1: Minimal Viable Evaluation (MVE)
**Kostnad:** NOK 0-500/måned
**Komponenter:**
- Safety evaluators (gratis) for violence, hate, self-harm
- NLP evaluators (F1 Score, ROUGE) for task performance
- Manual testing i Playground (5-10 samples)
**Når bruke:** Early-stage prototyping, tight budget.
---
#### Steg 2: Standard Evaluation Stack
**Kostnad:** NOK 2000-5000/måned
**Komponenter:**
- Safety evaluators (gratis)
- AI-assisted quality evaluators (Groundedness, Relevance, Coherence)
- Golden dataset (500-1000 samples)
- Batch evaluation via Prompt Flow SDK
**Når bruke:** Pre-production, medium-sized deployments (< 10K responses/month).
---
#### Steg 3: Enterprise Evaluation (Production-Grade)
**Kostnad:** NOK 10 000-50 000/måned
**Komponenter:**
- Full evaluator stack (safety + quality + custom)
- Continuous evaluation + human-in-the-loop
- A/B testing framework
- Custom evaluators for compliance (Norwegian language, source attribution)
- Dedicated evaluation team (manual review 5-10% of responses)
**Når bruke:** Large-scale production (> 50K responses/month), public sector, regulated industries.
---
### Confidence Markers
**High Confidence (>95%):**
- Built-in evaluators (Groundedness, Relevance, Safety) er production-ready og widely used
- Prompt Flow SDK evaluation workflow er stable (GA siden 2023), men utfases 20. april 2027 — migrer til Microsoft Agent Framework / Azure AI Evaluation SDK for ny utvikling
- Microsoft Foundry Evaluation Portal er GA (as of 2024)
**Medium Confidence (70-95%):**
- Synthetic data generation quality (Preview-feature, limited regions)
- Custom evaluator performance (avhenger av prompt engineering quality)
- Continuous evaluation pricing (can vary significantly based on traffic patterns)
**Low Confidence (<70%):**
- Copilot Studio native evaluation support (mangler offisiell løsning per Feb 2026)
- M365 Copilot evaluation (closed-source, ingen official API)
- Cross-region safety evaluator availability (kun 4 regioner støttet)
---
## Kilder og verifisering
**Primary Sources (Microsoft Learn):**
1. [Evaluate generative AI models and applications - Microsoft Foundry](https://learn.microsoft.com/en-us/azure/foundry/how-to/evaluate-generative-ai-app?view=foundry-classic) — GA
2. [Evaluation flows and metrics - Azure Machine Learning Prompt Flow](https://learn.microsoft.com/en-us/azure/machine-learning/prompt-flow/how-to-develop-an-evaluation-flow?view=azureml-api-2) — GA. Re-verifisert MCP 2026-06-19: Prompt Flow utfases 20. april 2027 → migrer til Microsoft Agent Framework. `log_metric()`/aggregation-mønster uendret.
3. [Azure AI Evaluation SDK - Python API](https://learn.microsoft.com/en-us/python/api/overview/azure/ai-evaluation-readme?view=azure-python) — GA
4. [Agent evaluation with Azure AI Evaluation SDK](https://learn.microsoft.com/en-us/azure/foundry-classic/how-to/develop/agent-evaluate-sdk?view=foundry-classic) — GA
**Code Samples (Microsoft Learn):**
1. [Cloud evaluation with Azure AI Projects SDK](https://learn.microsoft.com/en-us/azure/foundry/how-to/develop/cloud-evaluation?view=foundry-classic)
2. [Continuous evaluation setup](https://learn.microsoft.com/en-us/azure/foundry/observability/how-to/how-to-monitor-agents-dashboard?view=foundry)
3. [Custom evaluator registration](https://learn.microsoft.com/en-us/azure/foundry/how-to/develop/cloud-evaluation?view=foundry-classic#specify-custom-evaluators)
**Last Verified:** 2026-06-19
**Version:** Microsoft Foundry v2 (2024-2026), Prompt Flow v1.13+ (2024-2026; utfases 2027-04-20 → Microsoft Agent Framework)