# Multi-Modal AI Evaluation and Metrics **Last updated:** 2026-02 **Status:** GA **Category:** Multi-Modal AI --- ## Introduksjon Evaluering av multi-modale AI-system er fundamentalt meir komplekst enn evaluering av rein tekst-AI. Når system kombinerer tekst, bilete, tale og video, treng ein metrikkrammeverk som dekker kvaliteten innanfor kvar modalitet, men også korleis modalitetane samhandlar — det som blir kalla cross-modal alignment. Azure AI Foundry og Azure OpenAI Evaluation API gir innebygd støtte for både NLP-baserte metrikktypar (BLEU, ROUGE, cosine similarity) og AI-assistert evaluering (groundedness, relevance, coherence, fluency). For norsk offentleg sektor er systematisk evaluering ikkje berre god praksis — det er eit krav under EUs AI Act for høgrisiko AI-system. Evalueringsrammeverket må dokumentere nøyaktigheit, rettferd og pålitelegheit på ein måte som tilfredsstiller regulatoriske krav til transparens og etterprøvbarheit. Microsoft Foundry tilbyr eit sentralisert evalueringsrammeverk der ein kan definere test-datasett, kjøre automatiserte evalueringar, og samanlikne resultat på tvers av modellar og versjonar. Dette er integrert med GenAIOps-pipelines for kontinuerleg evaluering i produksjon. --- ## Kjernekomponentar | Komponent | Formål | Teknologi | |-----------|--------|-----------| | **Azure OpenAI Evaluations** | Innebygd evalueringsrammeverk | Azure OpenAI API | | **Foundry Evaluation SDK** | Programmatisk evaluering | Azure AI Foundry SDK | | **NLP Metrics** | BLEU, ROUGE, F1, GLEU, METEOR | Matematisk-baserte metrikktypar | | **AI Quality (AI-assisted)** | Groundedness, Relevance, Coherence | GPT-basert dommar | | **Risk & Safety Metrics** | Content safety, protected material | Innhaldsfiltrering | | **Custom Evaluators** | Eigendefinerte evalueringspromptar | Custom prompt classifiers | --- ## Text Generation Metrics ### BLEU (BiLingual Evaluation Understudy) BLEU er den mest brukte metrikken for maskinoversetting og tekstgenerering. Den evaluerer overlap mellom generert tekst og referansetekst på n-gram-nivå. ```python from azure.ai.evaluation import BleuScoreEvaluator bleu_evaluator = BleuScoreEvaluator() result = bleu_evaluator( response="Azure AI Foundry gir verktøy for å bygge AI-løysingar.", ground_truth="Azure AI Foundry tilbyr verktøy for å utvikle AI-løysingar." ) print(f"BLEU Score: {result['bleu_score']:.4f}") # BLEU Score: 0.0-1.0 (høgare = betre) ``` **Eigenskapar:** - Samanliknar n-gram (1-gram til 4-gram) mellom generert og referansetekst - Range: 0.0 til 1.0 - Styrke: Korrelerer godt med menneskelig vurdering for oversetting - Svakheit: Tek ikkje omsyn til meining, berre ordoverlap ### ROUGE (Recall-Oriented Understudy for Gisting Evaluation) ROUGE er designa for evaluering av automatisk oppsummering og fokuserer på recall — kor godt den genererte teksten dekker referanseteksten. ```python from azure.ai.evaluation import RougeScoreEvaluator rouge_evaluator = RougeScoreEvaluator(rouge_type="rougeL") result = rouge_evaluator( response="Systemet brukar Azure AI for dokumentanalyse og ekstraksjon.", ground_truth="Azure AI-systemet analyserer dokument og ekstraherer strukturert data." ) print(f"ROUGE-L Score: {result['rouge_score']:.4f}") ``` **ROUGE-variantar:** | Variant | Beskriving | Beste bruk | |---------|-----------|-----------| | **ROUGE-1** | Overlap av enkeltord (unigrams) | Generell dekningssjekk | | **ROUGE-2** | Overlap av ordpar (bigrams) | Frasekvalitet | | **ROUGE-L** | Lengste felles subsekvens | Setningsstruktur | | **ROUGE-3 til -5** | Overlap av 3-5 gram | Detaljert n-gram analyse | ### Cosine Similarity (Semantic) Cosine similarity måler semantisk likskap mellom tekst-embeddings, uavhengig av ordval: ```python from azure.ai.evaluation import CosineSimilarityEvaluator # Krev ein embedding-modell cosine_evaluator = CosineSimilarityEvaluator( model_config={ "azure_endpoint": "https://.openai.azure.com/", "api_key": "", "azure_deployment": "text-embedding-3-large" } ) result = cosine_evaluator( response="Azure gir skybaserte AI-tenester for bedrifter.", ground_truth="Microsoft tilbyr enterprise AI-løysingar i skya." ) print(f"Cosine Similarity: {result['cosine_similarity']:.4f}") ``` **Støtta embedding-modellar:** - `text-embedding-3-small` - `text-embedding-3-large` - `text-embedding-ada-002` ### METEOR og GLEU ```python from azure.ai.evaluation import MeteorScoreEvaluator, GleuScoreEvaluator # METEOR — ser på eksakte treff, stemming og synonym meteor = MeteorScoreEvaluator() meteor_result = meteor( response="Modellen genererer nøyaktige svar.", ground_truth="Modellen produserer presise svar." ) # GLEU — Google BLEU-variant, betre for korte tekstar gleu = GleuScoreEvaluator() gleu_result = gleu( response="Azure AI er kraftig.", ground_truth="Azure AI er svært kraftig." ) ``` ### Val av tekstmetrikk per brukscase | Brukscase | Primær metrikk | Sekundær metrikk | |-----------|---------------|-----------------| | Maskinoversetting | BLEU | METEOR | | Oppsummering | ROUGE-L | BLEU, BERTScore | | Klassifisering | Precision, Recall, F1 | Accuracy | | RAG (retrieval) | Groundedness | Relevance, Coherence | | Fri-form tekstgenerering | Cosine Similarity | Fluency, GPT Similarity | --- ## Image Quality og Relevance Metrics ### AI-assistert bildeevaluering For evaluering av bilete-relaterte oppgåver (image captioning, VQA, bileteforståing) brukar ein GPT-4o som dommar: ```python from openai import AzureOpenAI def evaluate_image_caption(image_url, generated_caption, reference_caption): """Evaluer kvaliteten på ein AI-generert bilettekst.""" client = AzureOpenAI( azure_endpoint="https://.openai.azure.com/", api_key="", api_version="2024-08-01-preview" ) response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "system", "content": """Evaluer kvaliteten på ein bilettekst på ein skala frå 1-5: 1: Feil — beskriv ikkje biletet 2: Delvis rett — nokon element er korrekte 3: Akseptabel — hovudelement er beskrivne 4: God — nøyaktig og informativ 5: Utmerka — presis, informativ og naturleg Returner JSON: {"score": X, "begrunnelse": "..."}""" }, { "role": "user", "content": [ {"type": "image_url", "image_url": {"url": image_url}}, { "type": "text", "text": ( f"Generert bilettekst: {generated_caption}\n" f"Referanse: {reference_caption}\n\n" f"Evaluer den genererte biletteksten." ) } ] } ], response_format={"type": "json_object"}, max_tokens=200 ) return response.choices[0].message.content ``` ### Multimodal Embeddings for bildeliksskap Azure AI Vision sin multimodal embedding API muliggjer vektorbasert samanlikning mellom bilete og tekst: ```python import requests def compute_image_text_similarity(image_url, text_query): """Berekn similarity mellom bilete og tekst via multimodal embeddings.""" endpoint = "https://.cognitiveservices.azure.com/" # Vektoriser biletet image_response = requests.post( f"{endpoint}/computervision/retrieval:vectorizeImage", params={"api-version": "2024-02-01", "model-version": "2023-04-15"}, headers={ "Ocp-Apim-Subscription-Key": "", "Content-Type": "application/json" }, json={"url": image_url} ) image_vector = image_response.json()["vector"] # Vektoriser teksten text_response = requests.post( f"{endpoint}/computervision/retrieval:vectorizeText", params={"api-version": "2024-02-01", "model-version": "2023-04-15"}, headers={ "Ocp-Apim-Subscription-Key": "", "Content-Type": "application/json" }, json={"text": text_query} ) text_vector = text_response.json()["vector"] # Cosine similarity similarity = cosine_similarity(image_vector, text_vector) return similarity ``` --- ## Cross-Modal Alignment Measurement ### Alignment mellom modalitetar Cross-modal alignment måler kor godt ulike modalitetar (tekst, bilete, audio) samsvarar i eit multi-modal system: ```python class CrossModalEvaluator: """Evaluerer alignment mellom modalitetar.""" def __init__(self, openai_client, vision_client): self.openai = openai_client self.vision = vision_client def evaluate_text_image_alignment(self, text, image_url): """Evaluer om tekst og bilete formidlar same informasjon.""" # Generer bilettekst frå biletet image_caption = self.generate_caption(image_url) # Berekn semantisk likskap mellom tekst og bilettekst text_embedding = self.embed_text(text) caption_embedding = self.embed_text(image_caption) similarity = cosine_similarity(text_embedding, caption_embedding) # AI-assistert alignment-vurdering alignment_result = self.openai.chat.completions.create( model="gpt-4o", messages=[ { "role": "system", "content": "Vurder om teksten og biletet formidlar same bodskap." }, { "role": "user", "content": [ {"type": "text", "text": f"Tekst: {text}"}, {"type": "image_url", "image_url": {"url": image_url}}, {"type": "text", "text": "Er tekst og bilete aligna? Score 1-5."} ] } ] ) return { "semantic_similarity": similarity, "ai_alignment_score": alignment_result.choices[0].message.content, "image_caption": image_caption } def evaluate_audio_text_alignment(self, audio_transcript, reference_text): """Evaluer alignment mellom transkribert audio og referansetekst.""" # Word Error Rate (WER) for tale-til-tekst wer = self.compute_wer(audio_transcript, reference_text) # Semantisk likskap (handterer ulikt ordval) similarity = self.compute_cosine_similarity(audio_transcript, reference_text) return { "word_error_rate": wer, "semantic_similarity": similarity, "alignment_quality": "god" if wer < 0.15 and similarity > 0.85 else "treng forbetring" } ``` ### Evaluation Dashboard ```python def create_evaluation_report(eval_results): """Generer ein evalueringsrapport for multi-modal system.""" report = { "modell": eval_results["model_name"], "dato": eval_results["evaluation_date"], "tekstkvalitet": { "bleu": eval_results["bleu_score"], "rouge_l": eval_results["rouge_l_score"], "cosine_similarity": eval_results["cosine_score"] }, "bildekvalitet": { "caption_accuracy": eval_results["caption_score"], "image_text_alignment": eval_results["alignment_score"] }, "audiokvalitet": { "word_error_rate": eval_results["wer"], "speaker_accuracy": eval_results["speaker_accuracy"] }, "cross_modal": { "text_image_alignment": eval_results["text_image_alignment"], "audio_text_alignment": eval_results["audio_text_alignment"] }, "samla_score": compute_weighted_score(eval_results) } return report ``` --- ## User Satisfaction og Business KPIs ### Task Completion Rate ```python def measure_task_completion(interactions): """Mål brukartilfredsheit via oppgåvegjennomføring.""" metrics = { "total_interactions": len(interactions), "successful_completions": 0, "partial_completions": 0, "failures": 0, "avg_turns_to_completion": 0, "avg_response_time_ms": 0 } for interaction in interactions: if interaction["outcome"] == "success": metrics["successful_completions"] += 1 elif interaction["outcome"] == "partial": metrics["partial_completions"] += 1 else: metrics["failures"] += 1 metrics["task_completion_rate"] = ( metrics["successful_completions"] / metrics["total_interactions"] * 100 ) return metrics ``` ### Business-relevante KPIs for multi-modal AI | KPI | Beskriving | Målmetode | |-----|-----------|-----------| | **Task Completion Rate** | Andel vellykka oppgåver | Logging + brukarfeedback | | **Time to Resolution** | Tid frå start til løysing | Tidsstempel-analyse | | **User Satisfaction (CSAT)** | Brukartilfredsheit 1-5 | Post-interaksjon survey | | **Automation Rate** | Andel heilautomatiserte oppgåver | Logging av eskaleringar | | **Error Recovery Rate** | Kor ofte systemet retter eigne feil | Feillogging | | **Cost per Interaction** | Total kostnad per brukarinteraksjon | Token-tracking + infra | ### Foundry Evaluation Pipeline ```python from azure.ai.evaluation import evaluate # Batch-evaluering via Foundry SDK results = evaluate( evaluation_name="multi-modal-eval-v2", data="eval_dataset.jsonl", evaluators={ "bleu": BleuScoreEvaluator(), "rouge": RougeScoreEvaluator(rouge_type="rougeL"), "cosine": CosineSimilarityEvaluator(model_config=embedding_config), "groundedness": GroundednessEvaluator(model_config=judge_config), "relevance": RelevanceEvaluator(model_config=judge_config), "coherence": CoherenceEvaluator(model_config=judge_config), "fluency": FluencyEvaluator(model_config=judge_config) }, output_path="eval_results/" ) # Samanlikn med tidlegare evaluering print(f"BLEU delta: {results['bleu'] - previous_results['bleu']:+.4f}") print(f"ROUGE-L delta: {results['rouge'] - previous_results['rouge']:+.4f}") ``` --- ## Implementeringsmønstre ### Continuous Evaluation Pipeline ``` Code Change → Build → Deploy → Evaluate → Gate → Promote | ├── NLP Metrics (BLEU, ROUGE) ├── AI Quality (Groundedness, Relevance) ├── Safety Metrics └── Business KPIs ``` ### A/B Testing for multimodal system 1. **Definer hypotese** — "GPT-4o gir betre bilettekstar enn Image Analysis" 2. **Randomiser** — 50/50 trafikkfordeling 3. **Evaluer** — Same metrikk-suite på begge variantar 4. **Statistisk test** — Signifikanstest med tilstrekkeleg samplestorleik --- ## Norsk offentleg sektor ### AI Act-krav til evaluering | Krav | Implementering | |------|---------------| | **Artikkel 9: Risikostyring** | Dokumenterte evalueringsresultat for alle modellar | | **Artikkel 10: Data governance** | Evalueringsdatasett med kjend kvalitet | | **Artikkel 13: Transparens** | Publiserte metrikkresultat for høgrisiko-system | | **Artikkel 15: Nøyaktigheit** | Baseline-metrikktypar med definerte tersklar | ### Norsk kontekst - **Datatilsynet** tilrår systematisk testing av AI-system før produksjon - **Digdir sin veiledar for bruk av KI** krev dokumentert evaluering - **Norsk bokmål/nynorsk** treng eigne evalueringsdatasett — ikkje bruk engelske benchmarks åleine --- ## Beslutningsrammeverk | Scenario | Metrikk | Begrunnelse | |----------|---------|-------------| | Maskinoversetting | BLEU + METEOR | Industristandard for oversetting | | Oppsummering | ROUGE-L + BERTScore | Dekking + semantisk likskap | | RAG-system | Groundedness + Relevance + Coherence | Heilskapleg kvalitetsvurdering | | Bilettekst | GPT-4o Judge + Cosine | AI-assistert + semantisk | | Talegjenkjenning | WER + SER | Word/Sentence Error Rate | | Produksjonssystem | Business KPIs + NLP metrics | Kombinert kvalitet og verdi | --- ## For Cosmo - **Azure OpenAI Evaluations** tilbyr BLEU, ROUGE, GLEU, METEOR og Cosine Similarity som innebygde NLP-metrikktypar — bruk Foundry SDK for batch-evaluering med `evaluate()` API-et - **AI-assistert evaluering** (Groundedness, Relevance, Coherence, Fluency) krev ein GPT-modell som dommar — dette er meir robust enn NLP-metrikktypar for open-ended generering, men krev ekstra token-kostnad - **Cross-modal alignment** er den mest undervurderte evalueringsdimensjonen — mål om tekst, bilete og audio faktisk formidlar same bodskap, ikkje berre individuell kvalitet - **AI Act krev dokumentert evaluering** for høgrisiko AI-system — etabler automatiserte evalueringspipelines med definerte tersklar og versjonert metrikk-historie - **Norske evalueringsdatasett** er mangelvare — invester i domene-spesifikke testdatasett på bokmål/nynorsk for å unngå systematisk bias frå engelskspråklege benchmarks