Initial addition of ms-ai-architect plugin to the open-source marketplace. Private content excluded: orchestrator/ (Linear tooling), docs/utredning/ (client investigation), generated test reports and PDF export script. skill-gen tooling moved from orchestrator/ to scripts/skill-gen/. Security scan: WARNING (risk 20/100) — no secrets, no injection found. False positive fixed: added gitleaks:allow to Python variable reference in output-validation-grounding-verification.md line 109. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
24 KiB
Content Safety and Harm Mitigation - Azure Implementation
Last updated: 2026-02 Status: GA Category: Responsible AI & Governance
Introduksjon
Azure AI Content Safety er Microsofts omfattende løsning for å oppdage og mitigere skadelig innhold i AI-drevne applikasjoner. Tjenesten tilbyr både standalone API-er og integrerte content filters som fungerer sammen med Azure OpenAI Service for å beskytte både brukerinndata og AI-genererte utdata.
Løsningen dekker fire kjernekategorier av skadelig innhold (hate, sexual, violence, self-harm) med granulære severity levels (0-6), og tilbyr spesialiserte funksjoner som Prompt Shields (jailbreak detection), Groundedness detection, Protected material detection, og Custom categories. Content Safety Studio gir et visuelt grensesnitt for testing og konfigurering, mens blocklists og custom policies tillater tilpasning til organisasjonens spesifikke behov.
For offentlig sektor er implementering av content safety kritisk ikke bare for å overholde lover som GDPR og AI-forordningen, men også for å opprettholde tillit og sikre at AI-systemer ikke forsterker skjevheter eller produserer upassende innhold i møte med borgere.
Kjernekomponenter
Azure AI Content Safety Features
| Feature | Formål | Input | Output | Status |
|---|---|---|---|---|
| Analyze Text API | Oppdager hate, sexual, violence, self-harm i tekst | Tekst (maks 10K tegn) | Severity 0-6 per kategori | GA |
| Analyze Image API | Oppdager skadelig innhold i bilder | JPEG, PNG, GIF, BMP, TIFF, WEBP (maks 4MB) | Severity 0-6 per kategori | GA |
| Prompt Shields | Oppdager jailbreak og indirect attacks | Tekst (maks 10K tegn) + dokumenter | Binær risikoflagg | GA |
| Groundedness Detection | Verifiserer at LLM-svar er grunnlagt i kildemateriale | Query + grounding sources (maks 55K tegn) | Grounded/ungrounded score | Preview |
| Protected Material (Text) | Oppdager kjent tekst (sangtekster, artikler) | LLM completion (min 110 tegn) | Match/no match | GA |
| Protected Material (Code) | Oppdager kopiert kode fra public repos | LLM-generert kode | Match med source citation URL | GA |
| Custom Categories (Standard) | Tren ML-modeller på egne kategorier | Training data i Azure Blob | Custom severity scoring | Preview |
| Custom Categories (Rapid) | LLM-basert rask kategorisering | Samples + definition | Semantic matching | Preview |
| Blocklists | Eksakt/semantic matching mot egendefinerte termer | Tekst | Match/no match | GA |
Severity Levels (Content Analysis)
| Level | Beskrivelse | Konfigurerbar? | Typisk bruk |
|---|---|---|---|
| 0 - Safe | Generell, journalistisk, vitenskapelig kontekst | Nei (kun annotert) | Baseline |
| 2 - Low | Fordommer, stereotypier, fiksjon (gaming, litteratur) | Ja | Permissive policies |
| 4 - Medium | Fornærmelser, mobbing, glorifisering av skade | Ja | Standard policies (Azure OpenAI default) |
| 6 - High | Eksplisitte instruksjoner på vold, radikalisering, overgrep | Ja | Strict policies |
Merk: Azure OpenAI default content filter blokkerer Medium (4) og High (6) for alle fire kategorier.
Integrasjon med Azure OpenAI Service
Azure OpenAI har innebygd content filtering som kjører automatisk på både prompts og completions:
User Prompt → Content Filter (input) → LLM → Content Filter (output) → Response
Responsatferd ved filtrering:
| Scenario | HTTP Status | finish_reason |
Beskrivelse |
|---|---|---|---|
| Prompt blokkert | 400 | N/A | error.code = "content_filter" |
| Completion blokkert (non-streaming) | 200 | content_filter |
Ingen tekst returneres |
| Completion blokkert (streaming) | 200 | content_filter |
Strøm stopper, siste chunk har finish_reason |
| Alle outputs OK | 200 | stop eller length |
Normal respons |
| Filter feilet | 200 | stop/length |
content_filter_results.error populated |
Custom content filtering policies:
Kan konfigureres i Azure AI Foundry per deployment for å:
- Justere severity thresholds per kategori (blokkere Low/Medium/High)
- Aktivere/deaktivere Prompt Shields, Protected Material detection
- Definere blocklists
- Sette opp annotate-only mode (logge uten å blokkere)
Arkitekturmønstre
Mønster 1: Standalone Content Safety (Pre-LLM Filtering)
Når: Du bruker non-Azure LLM-er (OpenAI, Anthropic, etc.) eller trenger filtering uavhengig av LLM-integrasjon.
User Input → Azure AI Content Safety API → Severity Check → [BLOCK | ALLOW] → LLM
↓
Custom Content Safety API ← LLM Output
↓
[BLOCK | RETURN]
Fordeler:
- Fungerer med hvilken som helst LLM-leverandør
- Full kontroll over filtering logic
- Kan kombinere flere Content Safety features (Prompt Shields + Analyze Text)
Ulemper:
- To ekstra API-kall (latency overhead ~100-300ms per kall)
- Du må håndtere retry logic og error handling selv
- Koster per API-kall (se prismodell)
Implementering (C#):
var client = new ContentSafetyClient(new Uri(endpoint), new AzureKeyCredential(key));
var request = new AnalyzeTextOptions(userInput);
var response = client.AnalyzeText(request);
foreach (var category in response.Value.CategoriesAnalysis)
{
if (category.Severity >= 4) // Block Medium og High
{
return new ContentFilteredResponse("Input blocked");
}
}
// Proceed to LLM if all categories < 4
Mønster 2: Azure OpenAI Integrated Filtering (Default)
Når: Du bruker Azure OpenAI Service og ønsker automatic filtering uten ekstra kode.
User Input → Azure OpenAI Service (built-in filter) → LLM → (built-in filter) → Response
Fordeler:
- Zero-code content safety (aktivert by default)
- Ingen ekstra latency (innebygd i LLM-call)
- Konsistent policy enforcement på tvers av deployments
Ulemper:
- Kun for Azure OpenAI (ikke andre LLM-er)
- Mindre granulær kontroll (enten blokkere eller ikke)
- Kan ikke kjøre custom logic mellom filter og LLM
Konfigurasjon (Azure AI Foundry):
Deployments → Select deployment → Content filters → Create custom policy
├─ Hate: Block Medium+High
├─ Sexual: Block Medium+High
├─ Violence: Block High only
├─ Self-Harm: Block Medium+High
├─ Prompt Shields: Enabled
└─ Protected Material (Code): Enabled (for Copyright Commitment)
Mønster 3: Hybrid Approach (Layered Defense)
Når: Høy-risiko applikasjoner (offentlig sektor, barn, helsevesen) som krever defense-in-depth.
User Input → Pre-filter (Prompt Shields + Custom Categories) → Azure OpenAI (built-in) → Post-filter (Groundedness) → Response
Fordeler:
- Maksimal beskyttelse (three layers of defense)
- Custom categories fanger domene-spesifikke issues før LLM
- Groundedness sikrer faktisk korrekthet i svar
- Blocklists gir instant blocking av kjente problematiske termer
Ulemper:
- Høyere latency (3 ekstra API-kall)
- Høyere kostnad
- Kompleks feilhåndtering (hva hvis layer 2 feiler?)
Eksempel use case (NAV chatbot):
1. Pre-filter: Custom blocklist ("trygdesvindel", "uføretrygd svindel") + Prompt Shields
2. Azure OpenAI: Standard filter (Medium+High block)
3. Post-filter: Groundedness detection mot NAV fagdokumenter
Beslutningsveiledning
Velg riktig arkitekturmønster
| Kriterium | Standalone | Azure OpenAI Integrated | Hybrid |
|---|---|---|---|
| LLM-leverandør | Hvilken som helst | Kun Azure OpenAI | Kun Azure OpenAI |
| Risikoprofil | Lav-medium | Medium | Høy |
| Latency-budsjett | +200-600ms OK | Minimal overhead | +500ms+ OK |
| Kostnadssensitivitet | Medium | Lav (inkludert i OpenAI cost) | Høy |
| Custom categories behov | Høy | Middels | Høy |
| Compliance-krav | Medium | Medium | Høy (NIS2, AI Act) |
Vanlige feil og anti-patterns
| Anti-pattern | Hvorfor det er galt | Riktig approach |
|---|---|---|
| "Vi blokkerer alt på Low severity" | Over-filtering, brukerfrustrering, false positives | Start med Medium+High, juster basert på false positive rate |
| "Vi skrur av content filtering for bedre UX" | Regulatorisk risiko, omdømmerisiko | Bruk annotate-only mode + human review for edge cases |
"Vi håndterer ikke finish_reason=content_filter" |
Brukeren får tom respons uten forklaring | Sjekk finish_reason, vis vennlig feilmelding |
| "Vi logger ikke filtered prompts/completions" | Kan ikke forbedre modellen eller oppdage misbruk | Logg metadata (ikke innholdet selv) for analyse |
| "Vi bruker samme policy for barn og voksne" | Upassende innhold for barn | Lag separate deployments med stricter policies for barn |
Røde flagg (når du MÅ bruke Hybrid approach)
- Applikasjonen brukes av barn (<18 år)
- Offentlig-facing tjeneste med høy eksponering (millioner av brukere)
- Helsevesen/jus/finans (regulated industries)
- AI-generert innhold publiseres uten human review
- NIS2/AI Act høyrisiko-klassifisering
Integrasjon med Microsoft-stakken
Azure AI Foundry (tidligere Azure AI Studio)
Guardrails + Controls tab gir:
- Try it out: Interaktiv testing av tekst/bilde-moderering med justerbare thresholds
- Custom filters: Opprett deployment-spesifikke policies
- Monitoring: Latency, block rate, category distribution
Eksempel workflow:
1. AI Foundry → Guardrails + Controls → Try it out
2. Test sample prompts mot ditt bruksområde (f.eks. kundeservice)
3. Juster thresholds til du får <2% false positive rate
4. Create custom policy → Apply to deployment
5. Monitor → Track block rate over tid
Copilot Studio
Content moderation for Copilot agents:
- Automatisk integrert med Azure OpenAI content filters
- Kan aktivere custom blocklists i Agent Settings
- Overvåk i Analytics → Safety metrics
Begrensning: Kan ikke (per feb 2026) konfigurere severity levels per kategori i Copilot Studio — bruker Azure OpenAI deployment settings.
Power Platform (AI Builder, Power Automate)
AI Builder Text generation:
- Bruker Azure OpenAI under the hood → content filtering aktivert by default
- Ingen konfigurasjonsmuligheter (uses default Medium+High block)
Custom Connector til Azure AI Content Safety:
Power Automate → Custom Connector (REST API) → Content Safety Analyze Text
↓
Parse JSON → Condition (check severity) → [Approve | Reject]
Use case: Pre-moderation av user-generated content før lagring i Dataverse.
Microsoft 365 Copilot
Built-in filtering:
- Microsoft 365 Copilot har egne content filtering policies (ikke konfigurerbare av customer)
- Filtrer både prompts og responses for enterprise-wide safety
- Compliance-aligned med Microsoft 365 data residency
Ingen customer-kontroll: Du kan ikke justere severity levels for M365 Copilot (managed by Microsoft).
Offentlig sektor (Norge)
GDPR og personvern
PII Detection: Azure AI Content Safety har PII-detection for completions:
- Oppdager navn, adresser, fødselsnummer (norsk format støttes ikke offisielt)
- Kan konfigureres til å blokkere eller maskere PII i LLM-output
Data residency:
- Content Safety tilgjengelig i West Europe og Norway East (via Azure OpenAI)
- Ingen prompts/completions lagres for training (GDPR Article 5)
- Blocklist-data lagres i samme region som ressursen (encrypted at rest)
Schrems II-implikasjoner:
- Content Safety-modellene kjører i EU (ikke data transfer til USA)
- Customer-managed keys (CMK/BYOK) støttes for blocklist-data
AI-forordningen (EU AI Act)
Høyrisiko-systemer (Annex III: offentlige tjenester, rettshåndhevelse) krever:
| AI Act-krav | Content Safety-implementering |
|---|---|
| Risk management system | Deploy Hybrid approach (layered defense) |
| Data governance | Logg all content filtering activity (Azure Monitor) |
| Transparency | Informer brukere om automated moderation + appeal process |
| Human oversight | Annotate-only mode + human review for High severity blocks |
| Accuracy/robustness | Monitor false positive rate (mål: <5%), adjust thresholds |
| Record-keeping | Retain logs i 6+ år (Azure Log Analytics long-term retention) |
Transparency Note: Microsoft publiserer Transparency Note for Azure AI Content Safety som dekker:
- System capabilities and limitations
- Training data og known biases
- Best practices for deployment
Forvaltningsloven og klagerett
Når Content Safety brukes i vedtakssystemer (NAV, skatteetaten):
- Forhåndsvarsel: Informer bruker om at innhold kan bli moderert automatisk
- Begrunnelse: Hvis blocking skjer, forklar hvorfor ("Innholdet ble blokkert pga. upassende språk")
- Klagerett: Tilby manuell review (send til saksbehandler)
- Dokumentasjon: Logg original input + severity scores + final decision i sakssystem
Eksempel (fiktivt NAV chatbot-vedtak):
User prompt: "Hvorfor får jeg ikke uføretrygd? Dette er diskriminering!"
→ Hate severity: 2 (Low) - ALLOWED
→ Response genereres
→ Groundedness check: PASSED
→ Response returneres til bruker
Men hvis:
User prompt: "Dere er rasister som diskriminerer mot [etnisk gruppe]!"
→ Hate severity: 4 (Medium) - BLOCKED
→ User ser: "Vi kunne ikke behandle din henvendelse. Vennligst omformuler eller kontakt vår kundeservice."
→ Saksbehandler notifiseres for manuell oppfølging
Datasuverenitet og Nasjonal sikkerhetsmyndighet (NSM)
NSM Grunnprinsipper for IKT-sikkerhet:
- Logging: Aktiver Azure Monitor for Content Safety (logg alle API-kall, severity scores)
- Kryptering: CMK (Customer-Managed Keys) for blocklist-data
- Tilgangskontroll: Bruk Managed Identity (ikke API keys) + RBAC (Cognitive Services User role)
- Incident response: Sett opp alerts for unormal block rate (f.eks. plutselig spike = attack?)
Sikkerhetsgradert informasjon: Hvis applikasjonen håndterer Begrenset/Konfidensielt:
- Deploy Content Safety i Norway East (norsk dataregion)
- Ikke bruk Content Safety Studio (data sendes til portal, potensiell lekkasje)
- Bruk private endpoints (VNet integration)
Kostnad og lisensiering
Prismodell (Azure AI Content Safety Standalone)
Februar 2026 priser (estimat basert på USD/NOK 10.5):
| Tier | RPS/RP10S Limit | Pris per 1000 transaksjoner (NOK) | Egnet for |
|---|---|---|---|
| F0 (Free) | 5 RPS | NOK 0 (gratis) | Proof-of-concept, dev/test |
| S0 (Standard) | 1000 RP10S | ~NOK 10.5 (Analyze Text/Image) | Produksjon |
| ~NOK 10.5 (Prompt Shields) | |||
| ~NOK 26 (Groundedness - 50 RPS limit) | Høy-verdi scenarios | ||
| Varierer (Custom categories) | Training cost + inference |
Azure OpenAI Integrated Filtering:
- Inkludert gratis i Azure OpenAI token pricing (ingen separate Content Safety costs)
- Men: Kan ikke bruke standalone features som Custom Categories eller Groundedness
Eksempel TCO-beregning (NAV chatbot):
Scenario: 1 million samtaler/måned, gjennomsnitt 2 meldinger per samtale = 2M transaksjoner/måned
| Approach | API-kall/måned | Kostnad/måned (NOK) |
|---|---|---|
| Azure OpenAI Integrated | 0 (innebygd) | NOK 0 (inkludert i token cost) |
| Standalone (Analyze Text only) | 2M (input only) | 2M / 1000 × 10.5 = NOK 21,000 |
| Hybrid (Pre + Post filter) | 4M (input + output) | 4M / 1000 × 10.5 = NOK 42,000 |
| Hybrid + Groundedness | 4M + 2M groundedness | 42K + (2M / 1000 × 26) = NOK 94,000 |
Optimaliseringstips:
- Bruk Azure OpenAI integrated filtering som baseline (gratis)
- Legg til Prompt Shields pre-filter kun for high-risk prompts (klassifiser først: hvis user input inneholder "ignore previous instructions" → kjør Prompt Shields)
- Groundedness kun på final output (ikke på hver streaming chunk)
- Cache blocklist matching client-side (unngå API-kall for åpenbart OK-innhold)
Lisensiering (Azure OpenAI)
Azure OpenAI content filtering krever:
- Azure subscription (Pay-As-You-Go eller Enterprise Agreement)
- Azure OpenAI resource (申请 access via Azure OpenAI access form)
Ingen ekstra lisenser for content filtering (inkludert i Azure OpenAI Service).
Microsoft 365 Copilot:
- Content filtering inkludert i Copilot for M365-lisens (E3/E5)
- Ingen konfigurasjonsmuligheter (Microsoft-managed)
For arkitekten (Cosmo)
Spørsmål å stille kunden
-
Scope og risiko:
- Hvilken brukergruppe vil interagere med AI-systemet? (barn, sårbare grupper, generell befolkning)
- Hva er konsekvensen hvis upassende innhold slipps gjennom? (omdømme, juridisk, psykologisk skade)
- Er dette en høyrisiko-applikasjon under EU AI Act? (vedtakssystemer, helsevesen, rettshåndhevelse)
-
Teknisk kontekst:
- Bruker dere Azure OpenAI eller andre LLM-leverandører?
- Hva er akseptabelt latency-budsjett? (kritisk for real-time chat vs. batch processing)
- Har dere eksisterende moderasjonspolicies eller compliance-krav vi må kartlegge?
-
Customization-behov:
- Er det domene-spesifikke termer eller konsepter som default kategorier ikke dekker? (medisinsk terminologi, norske dialekter, etc.)
- Trenger dere ulike severity policies for ulike brukergrupper? (barn vs. voksne, intern vs. ekstern)
- Skal AI-generert innhold publiseres direkte, eller er det human-in-the-loop review?
-
Compliance og datasuverenitet:
- Hvor skal data lagres? (Norge, EU, globalt)
- Hvilke compliance-rammeverk må dere følge? (GDPR, AI Act, NIS2, Forvaltningsloven)
- Har dere CMK (Customer-Managed Keys) krav?
-
Monitoring og kontinuerlig forbedring:
- Hvordan vil dere måle success? (false positive rate, user complaints, etc.)
- Hvem har ansvar for å reviewe filtered content og justere policies?
- Hva er prosessen for klager fra brukere? (appeal process)
Fallgruver å unngå
-
One-size-fits-all policies:
- Ikke bruk samme severity threshold for alle bruksområder (chatbot for barn ≠ interne kunnskapsbase for voksne)
- Lag separate deployments med ulike content filtering policies
-
Ingen testing av edge cases:
- Default kategorier kan ha kulturelle skjevheter (trainert primært på engelsk)
- Test med norske eksempler, dialekter, særnorske uttrykk
- Eksempel: "Helvete!" = vanlig uttrykk i Norge, men kan flagges som høy severity
-
Ignorering av false positives:
- Over-filtering ødelegger UX (brukere gir opp hvis legitime spørsmål blokkeres)
- Monitorér block rate: hvis >5% av prompts blokkeres, vurder å øke threshold
-
Mangel på transparency:
- Brukere må informeres om at moderering skjer (GDPR Article 13 + AI Act transparency-krav)
- Gi konkret feedback: "Your message was blocked due to inappropriate language" (ikke bare "Error 400")
-
Compliance-naivitet:
- Mange forventer at Content Safety automatisk gjør dem GDPR-compliant (NEI!)
- Du må fortsatt:
- Ha data processing agreement (DPA) med Microsoft
- Dokumentere data flows i DPIA (Data Protection Impact Assessment)
- Implementere klagerett og manuell review
Anbefalinger per modenhetsnivå
Nivå 1: Proof-of-Concept (1-3 måneder)
- Arkitektur: Azure OpenAI Integrated filtering (default settings)
- Konfigurasjon: Bruk default Medium+High blocking for alle 4 kategorier
- Monitoring: Manuell testing i Content Safety Studio
- Kostnad: Free tier (F0) eller inkludert i Azure OpenAI cost
- Output: Validering av at default filtering passer use case
Nivå 2: Pilot (3-6 måneder)
- Arkitektur: Azure OpenAI Integrated + Prompt Shields
- Konfigurasjon: Custom content filtering policy per deployment (juster thresholds basert på pilot feedback)
- Monitoring: Azure Monitor Logs (logg alle content_filter events)
- Kostnad: S0 tier for Prompt Shields (~NOK 10,000-50,000/måned for pilot)
- Output: False positive rate <5%, documented user feedback
Nivå 3: Produksjon (6-12 måneder)
- Arkitektur: Hybrid (Pre-filter Prompt Shields + Custom Categories + Azure OpenAI + Post-filter Groundedness)
- Konfigurasjon: Multiple custom policies (per user segment: children, adults, admins)
- Monitoring: Dashboards i Azure AI Foundry, alerting på anomalous block rates
- Kostnad: S0 tier, budsjettér ~NOK 50,000-200,000/måned for 1M+ transaksjoner
- Output: AI Act compliance documentation, DPIA, incident response playbook
Nivå 4: Enterprise-Scale (12+ måneder)
- Arkitektur: Samme som Nivå 3 + private endpoints, CMK, multi-region failover
- Konfigurasjon: Automated policy tuning basert på ML over blocked content patterns
- Monitoring: Integrated med SIEM (Sentinel), automated incident response
- Kostnad: Enterprise Agreement pricing, ~NOK 200,000-1M+/måned
- Output: NIS2 compliance, continuous model retraining, A/B testing av policies
Kilder og verifisering
Verified (fra Microsoft Learn MCP-research, februar 2026):
-
What is Azure AI Content Safety? Confidence: High — Oversikt over features, pricing tiers, region availability, service limits
-
Content filtering overview (Azure OpenAI) Confidence: High — Filter categories, severity levels, scenario details for API response behavior
-
Harm categories in Azure AI Content Safety Confidence: High — Detaljert beskrivelse av severity levels 0-7 per kategori (hate, sexual, violence, self-harm)
-
Data, privacy, and security for Azure AI Content Safety Confidence: High — Data residency, encryption at rest, customer controls, GDPR compliance statements
-
Custom categories (preview) Confidence: Medium — Preview feature, API-detaljer kan endre seg før GA
-
Transparency note: Azure AI Content Safety Confidence: High — System capabilities, intended uses, limitations, best practices
-
Default Guidelines & controls policies (Azure OpenAI) Confidence: High — Default severity thresholds for text/image models, table of blocked categories
-
Azure AI Content Safety Quickstart (C# code samples) Confidence: High — Code examples for AnalyzeText, AnalyzeImage, Blocklist APIs
-
Mitigate false results in Azure AI Content Safety Confidence: High — Best practices for severity tuning, custom categories, blocklists
-
Content Safety in the Microsoft Foundry portal Confidence: High — Beskrivelse av Content Safety Studio features, Try it out workflow
Baseline (modellkunnskap, ikke verifisert mot ferske kilder):
- GDPR Article 5 (data minimization), Article 13 (transparency obligations)
- EU AI Act Annex III (high-risk systems classification)
- NSM Grunnprinsipper for IKT-sikkerhet (norsk kontekst)
- Forvaltningsloven §§ om begrunnelse og klagerett (norsk kontekst)
- Schrems II-implikasjoner for EU-US data transfers
Merk: Prisestimat (NOK) er basert på offisielle USD-priser konvertert med kurs 10.5 (februar 2026). Faktisk pris kan variere.