KB-currency refresh (medium priority, 2026-06-19) via /architect:kb-update. 74 medium-prioritets filer re-verifisert mot Microsoft Learn (MCP) — delegert til 15 parallelle Opus-subagenter (3 bølger) gruppert etter delt kilde, med disjunkte fil-sett. Verifisert i hovedkontekst (scope-sjekk + diff-review av de faktatunge gruppene + tester). Hovedendringer (faktuelle korreksjoner + currency): - Azure AI Search semantic ranker: TILGJENGELIG PÅ ALLE TIERS (også Free/Basic m/ gratis månedlig kvote) — gammel KB sa feilaktig "kun S1+". Korrigert i tier-tabell, anti-patterns og beslutningstabell (azure-ai-search-setup). - APIM score-threshold = DISTANSE (lavere = strengere): tuning-tabellen i rag-caching-optimization hadde retningen baklengs — invertert til korrekt. - Agentic retrieval GA/preview-nyanse presisert (hovedkontekst-korreksjon mot agentic-retrieval-how-to-migrate): GA via REST 2026-04-01 returnerer EKSTRAKTIV grounding (references + activity), IKKE syntetiserte svar. Answer synthesis, ikke-minimal reasoning effort (LLM query planning) og multi-turn messages forblir preview (2026-05-01-preview). Subagent hadde overforenklet til "hele kjernepipelinen GA"; rettet i agentic-rag-patterns + citation-tracking. - Copilot Studio modell-tabeller (platforms/copilot-studio): fjernet Claude Opus 4.5 + GPT-5.2 (borte fra kilde), lagt til Claude Sonnet 4.6/Opus 4.6 (GA), Opus 4.7 + Mistral Medium 3.5 (experimental); GPT-5 Reasoning/Auto = preview; A2A GA (apr 2026). - Computer Use (CUA): Copilot Studio GA 2026-05-07; 4 modeller m/ tier/status (OpenAI CUA + Sonnet 4.5 GA, Sonnet 4.6 + Opus 4.6 experimental); 5 credits/ steg standard, 15 premium; US-only region-krav FJERNET i GA-dok; Cloud PC pool + Hosted browser + bring-your-own-machine. - Azure AI Search REST API-versjoner bumpet: 2025-09-01 -> 2026-04-01 (stabil), 2025-11-01-preview -> 2026-05-01-preview (hybrid-search, rag-security-rbac, chunking). - Power Automate-integrasjon: trigger "Run a flow from Copilot" -> "When an agent calls the flow"; App Service innebygd MCP (preview) lagt til. - M365 Copilot-manifest v1.26 -> v1.28 (GA, mai) / v1.29 dokumentert (juni); "Tenant graph grounding" -> "Work IQ". - Speech fast transcription 2t/300MB -> 5t/500MB; multilingual 14 -> 15 locales (+ pt-BR). Content Understanding reasoning preview -> GA (v1.0, 2025-11-01). - Security Copilot E5 -> E5+E7. Død Databricks-URL ci-cd/best-practices -> ci-cd/flows. Prompt Flow retirement (2027-04-20 -> MAF) notert der den presenteres som go-forward. Gateway-topologi-tabell-feil rettet. - Alle 74 Last updated -> 2026-06-19. Discovery ikke kjørt (historisk kun Databricks-støy) -> 389-telling uendret, ingen resync. validate 239 PASS, kb-integrity 115/115 (262 orphan-warnings uendret), gitleaks clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
1080 lines
39 KiB
Markdown
1080 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 Azure AI 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:**
|
||
- **Azure AI 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. Azure AI Foundry Evaluation Portal
|
||
|
||
**Beskrivelse:** UI-basert evalueringsverktøy i Azure AI 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 Azure AI 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 Azure AI 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)** | Azure AI 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
|
||
|
||
### Azure AI 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 Azure AI Foundry** via API
|
||
3. **Kjør evaluation** i Azure AI 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 **Azure AI Foundry Playground**
|
||
2. Evaluer via **Azure AI 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
|
||
|
||
### Azure AI 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 |
|
||
|-----------|------------|-------------|
|
||
| **Azure AI Foundry Evaluation Portal** | Azure-subscription | Azure AI 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å Azure AI 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 Azure AI 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
|
||
- Azure AI 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 - Azure AI 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:** Azure AI Foundry v2 (2024-2026), Prompt Flow v1.13+ (2024-2026; utfases 2027-04-20 → Microsoft Agent Framework)
|
||
**MCP Calls:** 3 (microsoft_docs_search × 2, microsoft_docs_fetch × 2, microsoft_code_sample_search × 1)
|