Azure AI Foundry Responsible AI Guardrails: una guida completa all'implementazione

Una guida completa, code-first, per la costruzione di un livello di sicurezza AI responsabile di livello produzione su Azure. Separa Azure AI Content Safety (categorie di danni e segnali `shield_prompt` opzionali) dai filtri di distribuzione di Azure OpenAI – Prompt Shields, Groundedness e Protected Material – e li collega tramite middleware FastAPI, con Terraform bloccato su francecentral in modo che la groundedness funzioni nelle regioni supportate.

Azure AI Foundry Responsible AI Guardrails: una guida completa all'implementazione
TL;DR

Una guida completa, code-first, per la costruzione di un livello di sicurezza AI responsabile di livello produzione su Azure. Separa Azure AI Content Safety (categorie di danni e segnali `shield_prompt` opzionali) dai filtri di distribuzione di Azure OpenAI – Prompt Shields, Groundedness e Protected Material – e li collega tramite middleware FastAPI, con Terraform bloccato su francecentral in modo che la groundedness funzioni nelle regioni supportate.

l'architettura dei guardrail a strati

nelle distribuzioni di ia azure in settori regolamentati, il modello è spesso lo stesso: il team perfeziona la pipeline rag, il datastore vettoriale e l'interfaccia utente di streaming – e poi distribuisce senza alcuna protezione. questa è sempre stata una mossa rischiosa, ma con la legge eu sull'ia ora in vigore, ha cambiato permanentemente il calcolo del rischio. ciò che una volta era un 'nice-to-have' è ora un requisito di conformità rigoroso per qualsiasi applicazione llm aziendale seria.

costruire applicazioni llm di livello produttivo non riguarda solo l'ottenimento della risposta corretta; si tratta di garantire la risposta sicura e responsabile. le organizzazioni, in particolare quelle nei settori finanziario, sanitario e pubblico in tutta europa, stanno affrontando allucinazioni di modelli, attacchi di iniezione di prompt, la generazione di contenuti dannosi e la violazione della proprietà intellettuale. questi non sono rischi astratti; si traducono direttamente in multe regolamentari, danni alla reputazione e una completa perdita di fiducia degli utenti.

questa guida fornisce un approccio completo, code-first, per la costruzione di un robusto livello di sicurezza ia responsabile su azure. andremo oltre i concetti di marketing e ci immergeremo in controlli di ingegneria concreti utilizzando due percorsi complementari: l'api di analisi autonoma azure ai content safety per uno screening rapido e basato su policy delle categorie di danno (e segnali opzionali di tipo jailbreak tramite shield_prompt su tale api), e azure openai service per i controlli a livello di distribuzione – prompt shields, groundedness detection e protected material detection – che si abilitano e si leggono dalla risposta di completamento di azure openai, non solo da contentsafetyclient. vi mostrerò come comporli in un'unica catena di middleware fastapi modulare, provisionare l'intero stack con terraform e mappare ogni guardrail alla sua corrispondente obbligazione ai sensi della legge eu sull'ia.

questo è l'articolo pilastro per la nostra serie 'responsible ai guardrails con azure ai foundry'. introduce tutti i guardrail chiave con esempi di codice autonomi, copiabili e incollabili, e si collegherà ad articoli specifici per approfondimenti ancora maggiori.

quando progetto questi sistemi su azure, non tratto la sicurezza di llm come un singolo componente. è un modello di difesa in profondità a strati. l'idea centrale è implementare una sequenza di controlli — alcuni prima che il llm venga mai chiamato, alcuni dopo che genera una risposta — per garantire che sia gli input dell'utente che gli output del modello aderiscano alle nostre politiche di sicurezza predefinite. è una pipeline di fiducia.

la nostra architettura utilizza due servizi azure chiave, composti in un ordine specifico:

  1. azure ai content safety: un servizio autonomo e ad alte prestazioni che utilizziamo come prima linea di difesa. tramite contentsafetyclient.analyze_text, valuta l'input dell'utente rispetto alle categorie di danno (odio, sessuale, violenza, autolesionismo) e può generare segnali di jailbreak / attacco indiretto quando shield_prompt è abilitato — prima che il testo raggiunga il costoso llm.
  2. azure openai service: il llm e i suoi filtri a livello di distribuzione. prompt shields (attacchi di prompt utente), groundedness e protected material sono integrati con questo servizio: li configuri per la distribuzione e interpreti le annotazioni restituite nella risposta dell'api azure openai insieme al completamento.

il diagramma sottostante illustra questo flusso a strati dalla richiesta dell'utente alla risposta finale e sicura dell'applicazione.

questo modello componibile, che implementeremo come middleware fastapi, è potente perché consente configurazioni specifiche dell'ambiente. il tuo ambiente dev può avere soglie permissive per i test, mentre il tuo ambiente production rimane bloccato e altamente sicuro.

prerequisiti

prima di scrivere una riga di codice, configuriamo il nostro ambiente. questo è il toolkit standard che uso per tutti i miei progetti ia basati su azure.

  • azure cli: assicurati di avere la cli installata e di essere autenticato all'abbonamento azure corretto.
az login
az account set --subscription "your-azure-subscription-id"
  • terraform cli: useremo terraform per il provisioning dichiarativo dell'infrastruttura. sto usando la versione 1.5+, ma qualsiasi versione recente dovrebbe funzionare.
terraform --version
  • python 3.12+: il nostro livello applicativo è costruito esclusivamente con python. insisto nell'utilizzare un ambiente virtuale per ogni progetto per gestire le dipendenze in modo pulito.
python3.12 -m venv .venv
source .venv/bin/activate
python3.12 --version
  • pacchetti python richiesti: installa gli sdk azure necessari, fastapi per il nostro livello web e alcune utilità.
pip install "azure-ai-contentsafety==1.0.0b2" "azure-identity>=1.15.0" "fastapi>=0.110.0" "uvicorn[standard]>=0.29.0" "python-dotenv>=1.0.0" "openai>=1.23.0"
  • variabili d'ambiente: utilizziamo variabili d'ambiente per la configurazione. crea un file .env nella directory principale del tuo progetto. defaultazurecredential le userà per lo sviluppo locale e passerà senza problemi a managed identity in azure.
# .env file
AZURE_TENANT_ID="your-tenant-id"
AZURE_CLIENT_ID="your-service-principal-app-id"
AZURE_CLIENT_SECRET="your-service-principal-password"
AZURE_SUBSCRIPTION_ID="your-azure-subscription-id"

# Endpoints from Terraform output
AZURE_CONTENT_SAFETY_ENDPOINT="https://your-content-safety-resource.cognitiveservices.azure.com/"
AZURE_OPENAI_ENDPOINT="https://your-aoai-resource.openai.azure.com/"

# Azure OpenAI Configuration
AZURE_OPENAI_API_VERSION="2024-05-01-preview"
AZURE_OPENAI_DEPLOYMENT_NAME="gpt-4o-demo"

migliore pratica di sicurezza: identità gestite

anche se qui ho mostrato le credenziali del service principal per lo sviluppo locale, in qualsiasi distribuzione reale (staging, produzione), uso *sempre* le identità gestite di azure. questo elimina completamente la necessità di gestire i segreti client. defaultazurecredential è abbastanza intelligente da rilevare quando è in esecuzione in un ambiente azure (come un'app service o una vm) con un'identità gestita assegnata e la utilizzerà automaticamente. è il modo più sicuro e semplice per autenticarsi ai servizi azure.

con il nostro ambiente pronto, provisioniamo l'infrastruttura cloud di cui abbiamo bisogno.

terraform: provisioning dello stack di sicurezza ai

prima di tutto: dobbiamo creare le risorse di azure. uso terraform per questo per garantire che la nostra infrastruttura sia ripetibile, versionata e documentata come codice. eseguiremo il provisioning di tutto in francecentral. questa regione è nell'elenco attuale di microsoft dove la groundedness detection è disponibile (insieme a regioni come east us e canada east); diverse regioni adiacenti all'ue non sono su quell'elenco, quindi la scelta di una regione supportata evita errori silenziosi quando si abilita la groundedness nel codice.

questa configurazione creerà: 1. un gruppo di risorse per contenere i nostri servizi. 2. un workspace di azure machine learning, che funge da nostro hub ai foundry. 3. un account autonomo azure ai content safety. 4. un account azure openai con una distribuzione gpt-4o. 5. l'assegnazione di ruolo necessaria per consentire al workspace ml di accedere al servizio openai.

ecco il file main.tf completo:

# main.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">=3.90.0"
    }
  }
}

provider "azurerm" {
  features {}
}

data "azurerm_client_config" "current" {}

resource "azurerm_resource_group" "rg" {
  name     = "rg-ai-foundry-guardrails-francecentral"
  location = "francecentral"
}

# 1. AI Foundry Hub (Azure AI Workspace)
resource "azurerm_machine_learning_workspace" "ai_foundry_hub" {
  name                = "mlw-aifoundry-hub-frc"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku_name            = "Premium" # Premium SKU for advanced features

  identity {
    type = "SystemAssigned"
  }

  tags = {
    environment = "production"
    project     = "AI_Foundry_Guardrails"
  }
}

# 2. Standalone Content Safety Service
resource "azurerm_cognitive_account" "content_safety" {
  name                = "cogs-contentsafety-guardrails-frc"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  kind                = "ContentSafety"
  sku_name            = "S0"

  tags = {
    environment = "production"
    project     = "AI_Foundry_Guardrails"
  }
}

# 3. Azure OpenAI Service Account
resource "azurerm_cognitive_account" "openai" {
  name                = "cogs-openai-guardrails-frc"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  kind                = "OpenAI"
  sku_name            = "S0"
}

# 4. Azure OpenAI Deployment (e.g., GPT-4o)
resource "azurerm_cognitive_deployment" "gpt4o" {
  name                 = "gpt-4o-demo" # This must match your AZURE_OPENAI_DEPLOYMENT_NAME env var
  cognitive_account_id = azurerm_cognitive_account.openai.id
  model {
    format  = "OpenAI"
    name    = "gpt-4o"
    version = "2024-05-13"
  }
  scale {
    type = "Standard"
  }
}

# 5. RBAC: Granting the ML workspace access to OpenAI
resource "azurerm_role_assignment" "mlw_to_openai" {
  scope                = azurerm_cognitive_account.openai.id
  role_definition_name = "Cognitive Services OpenAI User"
  principal_id         = azurerm_machine_learning_workspace.ai_foundry_hub.identity[0].principal_id
}

# Outputs for our .env file
output "content_safety_endpoint" {
  description = "Endpoint for the Azure AI Content Safety service."
  value       = azurerm_cognitive_account.content_safety.endpoint
}

output "openai_endpoint" {
  description = "Endpoint for the Azure OpenAI service."
  value       = azurerm_cognitive_account.openai.endpoint
}

eseguire terraform init, terraform plan e terraform apply per creare queste risorse. una volta completato, copiare i valori di output nel file .env.

implementazione dei guardrail: il codice

ora implementeremo ogni guardrail come componente distinto in python. questo approccio modulare rende il sistema più facile da testare, mantenere e configurare.

guardrail 0: il messaggio di sistema di sicurezza

prima di qualsiasi altra verifica, la nostra prima linea di difesa è il messaggio di sistema che inviamo al llm. è qui che definiamo la persona, lo scopo e le istruzioni di sicurezza fondamentali del modello. un messaggio di sistema ben formulato può prevenire una vasta gamma di comportamenti indesiderati alla fonte.

per un'applicazione rag, consiglio un pattern che istruisce esplicitamente il modello a fare affidamento solo sui documenti di contesto forniti, a rifiutarsi di rispondere se il contesto è insufficiente e ad adottare una persona sicura e utile.

# prompts/system_prompts.py

def create_rag_system_message(company_name: str = "Contoso Inc.") -> str:
    """Creates a robust system message for a RAG assistant."""
    return f"""
    You are a helpful and harmless AI assistant for {company_name}.
    Your primary function is to answer questions based *only* on the provided context documents.

    **Core Instructions:**
    1.  **Strict Grounding:** Base your entire answer on the information contained within the documents provided in the 'CONTEXT' section. Do not use any external knowledge or information you were trained on.
    2.  **Cite Sources:** When you use information from a document, cite it using the document's ID (e.g., [doc-1]).
    3.  **Refuse if Unrelated:** If the user's question cannot be answered using the provided context, you MUST respond with: 'I'm sorry, but I cannot answer that question based on the information I have.' Do not try to guess or infer an answer.
    4.  **Safety First:** Do not engage in any harmful, unethical, discriminatory, or offensive behavior. Do not generate content related to violence, hate speech, self-harm, or sexually explicit topics. If a user asks for such content, politely refuse.
    5.  **Persona:** Be professional, polite, and objective.
    """

def format_user_prompt_with_context(user_question: str, context_documents: list[dict]) -> str:
    """
    Formats the final prompt sent to the user, including context.
    """
    context_str = "\n".join([f"[doc-{i+1}] {doc['content']}" for i, doc in enumerate(context_documents)])

    return f"""
    **CONTEXT:**
    {context_str}

    **QUESTION:**
    {user_question}
    """

questo metaprompt stabilisce chiari confini prima ancora che il modello inizi a generare token.

guardrail 1: analisi dell'input con azure ai content safety

successivamente, costruiamo un servizio per pre-filtrare ogni prompt utente con l'api di analisi di azure ai content safety (contentsafetyclient). questo è un passaggio critico per bloccare input dannosi o malevoli prima che vengano elaborati dal llm.

all'interno di quella singola chiamata api combiniamo:

  1. categorie di danno: scansione di contenuti d'odio, sessuali, violenti e autolesionistici rispetto a soglie che scegli (i valori di gravità seguono il contratto api di content safety attuale — conferma gli intervalli consentiti in microsoft learn per la tua versione api).
  2. shield_prompt: segnali di jailbreak e attacco indiretto esposti dall'api di analisi di content safety quando shield_prompt=true. questo non è la stessa cosa di prompt shields su una distribuzione azure openai; trattali come un ulteriore livello lato modello che ispezioni dalla risposta di azure openai (ad esempio annotazioni di filtro prompt), insieme al corpo di completamento.

ecco l'implementazione della classe di servizio:

# services/content_safety_service.py
import os
from azure.ai.contentsafety.aio import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions, TextCategory
from azure.core.exceptions import HttpResponseError
from azure.identity import DefaultAzureCredential

class PreemptiveContentSafety:
    def __init__(self):
        endpoint = os.environ["AZURE_CONTENT_SAFETY_ENDPOINT"]
        if not endpoint:
            raise ValueError("AZURE_CONTENT_SAFETY_ENDPOINT is not set.")

        # Use DefaultAzureCredential which handles Managed Identity in prod
        self.client = ContentSafetyClient(endpoint, DefaultAzureCredential())

    async def analyze_input(self, prompt: str, thresholds: dict[TextCategory, int]) -> tuple[bool, dict]:
        """
        Analyzes input text for jailbreak attacks and harm categories.

        Args:
            prompt: The user input text.
            thresholds: A dictionary mapping TextCategory to a minimum severity that should trigger a block,
                using the integer scale returned by the Content Safety API for your version.

        Returns:
            A tuple (is_safe, analysis_details).
        """
        request = AnalyzeTextOptions(
            text=prompt,
            categories=list(thresholds.keys()),
            shield_prompt=True # Enable Jailbreak and Indirect Attack detection
        )

        try:
            response = await self.client.analyze_text(request)
        except HttpResponseError as e:
            print(f"Content Safety analysis failed: {e}")
            # Fail open or closed? In a high-risk environment, I'd fail closed.
            return False, {"error": f"Content Safety API error: {e.message}"}

        # 1. Check shield_prompt (jailbreak / indirect attack) results from Content Safety
        if response.shield_prompt_result and response.shield_prompt_result.attack_detected:
            return False, {"reason": "jailbreak_attack", "confidence": "high"}

        # 2. Check Harm Category results against thresholds
        violated_categories = {}
        if response.categories_analysis:
            for analysis in response.categories_analysis:
                if analysis.severity is not None and analysis.severity >= thresholds.get(analysis.category, 7):
                    violated_categories[analysis.category.value] = analysis.severity

        if violated_categories:
            return False, {"reason": "harm_category_violation", "details": violated_categories}

        return True, {"reason": "safe"}

guardrail 2 e 3: filtri integrati su azure openai (prompt shields, groundedness, protected material)

dopo che un input supera la nostra pre-verifica di content safety, chiamiamo azure openai. i prompt shields a livello di distribuzione vengono eseguiti come parte di questo servizio; consultare i metadati di completamento e filtro prompt dall'api di azure openai per i segnali di attacco prompt utente. per l'analisi dell'output in questa guida ci concentriamo su:

  • groundedness detection (rilevamento della messa a terra): verifica se la risposta del modello si basa sul materiale sorgente che abbiamo fornito nel prompt (il nostro contesto rag). questa è la nostra difesa primaria contro le allucinazioni.
  • protected material detection (rilevamento di materiale protetto): scansiona l'output per testo o codice che corrisponde a proprietà intellettuale di terze parti note.

abilitiamo queste funzionalità aggiungendo il parametro extra_body alla nostra chiamata client openai.

# services/openai_service.py
import os
from openai import AsyncAzureOpenAI
from prompts.system_prompts import create_rag_system_message, format_user_prompt_with_context

class GuardedOpenAIService:
    def __init__(self):
        self.client = AsyncAzureOpenAI(
            api_version=os.environ["AZURE_OPENAI_API_VERSION"],
            azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
            # DefaultAzureCredential will be used automatically by the SDK
        )
        self.deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"]
        self.system_message = create_rag_system_message()

    async def get_grounded_completion(self, user_question: str, grounding_docs: list[str]) -> dict:
        """
        Calls Azure OpenAI with Groundedness and Protected Material detectors enabled.
        """
        formatted_prompt = format_user_prompt_with_context(
            user_question,
            [{'content': doc} for doc in grounding_docs]
        )

        try:
            response = await self.client.chat.completions.create(
                model=self.deployment_name,
                messages=[
                    {"role": "system", "content": self.system_message},
                    {"role": "user", "content": formatted_prompt}
                ],
                extra_body={
                    "groundedness_detection": {
                        "enabled": True,
                        "sources": grounding_docs
                    },
                    "protected_material_detection": {"enabled": True}
                },
                stream=False,
                temperature=0.0
            )
            return self.parse_response(response)
        except Exception as e:
            print(f"Azure OpenAI call failed: {e}")
            return {"error": str(e)}

    def parse_response(self, response) -> dict:
        """
        Parses the AOAI response to extract content and safety analysis.
        """
        choice = response.choices[0]
        content = choice.message.content
        safety_results = {}

        if choice.content_filter_results:
            # Groundedness Check
            groundedness = choice.content_filter_results.get('groundedness')
            if groundedness:
                safety_results['groundedness'] = {
                    'detected': groundedness.detected,
                    'score': groundedness.score,
                    'ungrounded_segments': [
                        {'segment': seg.segment, 'sources': seg.sources}
                        for seg in groundedness.ungrounded_segments
                    ] if groundedness.ungrounded_segments else []
                }

            # Protected Material Check
            protected_text = choice.content_filter_results.get('protected_material_text')
            if protected_text and protected_text.filtered:
                safety_results['protected_material_text'] = True

            protected_code = choice.content_filter_results.get('protected_material_code')
            if protected_code and protected_code.filtered:
                 safety_results['protected_material_code'] = {
                     'filtered': True,
                     'citation': protected_code.citation.url if protected_code.citation else 'N/A'
                 }

        return {"content": content, "safety_analysis": safety_results}

notare come controlliamo ungrounded_segments. in un sistema di produzione, uso queste informazioni per aggiungere un avviso all'utente o, in scenari ad alto rischio, per bloccare la risposta e segnalarla per la revisione umana. per il materiale protetto, la migliore pratica è includere la citazione se disponibile o bloccare la risposta per evitare violazioni della proprietà intellettuale.

composizione della catena di guardrail con middleware fastapi

ora, mettiamo insieme tutto. un middleware fastapi è il luogo perfetto per orchestrare questa catena di guardrail. ci permette di intercettare ogni richiesta in entrata al nostro endpoint di chat, applicare i nostri controlli di sicurezza e modificare o bloccare la risposta prima che raggiunga l'utente.

questa implementazione definisce una classe responsibleaimiddleware che esegue la nostra logica di pre-elaborazione e post-elaborazione.

# main.py
import os
import json
from fastapi import FastAPI, Request, Response, HTTPException
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.responses import JSONResponse

from azure.ai.contentsafety.models import TextCategory
from services.content_safety_service import PreemptiveContentSafety
from services.openai_service import GuardedOpenAIService

# --- App and Service Initialization ---
app = FastAPI(
    title="Secure AI Chat API",
    description="An API for chat completions with Responsible AI guardrails."
)

safety_service = PreemptiveContentSafety()
openai_service = GuardedOpenAIService()

# --- Middleware Configuration ---
# In a real app, load this from a config file or env vars
PROD_HARM_THRESHOLDS = {
    TextCategory.HATE: 2,
    TextCategory.SEXUAL: 2,
    TextCategory.VIOLENCE: 2,
    TextCategory.SELF_HARM: 4,
}

class ResponsibleAIMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
        if not request.url.path == "/chat/invoke":
            return await call_next(request)

        try:
            body = await request.json()
            user_prompt = body.get("prompt")
            if not user_prompt:
                return JSONResponse(status_code=400, content={"detail": "'prompt' field is required."})
        except json.JSONDecodeError:
            return JSONResponse(status_code=400, content={"detail": "Invalid JSON body."})

        # === GUARDRAIL CHAIN: PRE-PROCESSING ===
        is_safe, analysis = await safety_service.analyze_input(user_prompt, PROD_HARM_THRESHOLDS)
        if not is_safe:
            raise HTTPException(status_code=400, detail={"error": "Input rejected by content safety filter", "details": analysis})

        # If input is safe, proceed to the actual endpoint
        response = await call_next(request)

        # === GUARDRAIL CHAIN: POST-PROCESSING ===
        if response.status_code == 200:
            response_body = b''
            async for chunk in response.body_iterator:
                response_body += chunk
            response_data = json.loads(response_body)

            safety_analysis = response_data.get("safety_analysis", {})

            # Check for protected material
            if safety_analysis.get('protected_material_text') or safety_analysis.get('protected_material_code'):
                # For this example, we block. You could also replace with a citation.
                raise HTTPException(status_code=400, detail={"error": "Response blocked due to protected material detection."})

            # Check for ungroundedness
            groundedness = safety_analysis.get('groundedness', {})
            if not groundedness.get('detected', True) or groundedness.get('score', 1.0) < 0.5:
                # Append a warning instead of blocking
                response_data['content'] += "\n\n[Warning: This response may contain information not present in the source documents and should be verified.]"
                response_data['safety_analysis']['warning'] = 'low_groundedness_score'
                return JSONResponse(content=response_data)

        return response

app.add_middleware(ResponsibleAIMiddleware)

# --- API Endpoint ---
@app.post("/chat/invoke")
async def invoke_chat(request: Request):
    """
    This endpoint is protected by the ResponsibleAIMiddleware.
    It expects a body with {'prompt': '...', 'documents': ['doc1', 'doc2']}
    """
    body = await request.json()
    user_prompt = body.get("prompt")
    documents = body.get("documents", [])

    # The middleware has already validated the prompt. Now call the LLM.
    result = await openai_service.get_grounded_completion(user_prompt, documents)

    if "error" in result:
        raise HTTPException(status_code=500, detail=result)

    return JSONResponse(content=result)

con questa configurazione, ogni richiesta a /chat/invoke passa automaticamente attraverso l'intera pipeline di sicurezza. è un modo pulito, scalabile e non intrusivo per applicare le politiche di ia responsabile in tutta l'applicazione.

mappatura dei guardrail agli obblighi dell'eu ai act

per le organizzazioni in europa, la domanda più pressante è: "come mi aiuta questo a rispettare l'eu ai act?" la risposta è che questi controlli tecnici si mappano direttamente a specifiche obbligazioni legali. la costruzione di questo livello di sicurezza non è solo una buona ingegneria; è un componente fondamentale della vostra strategia di conformità.

ecco come ogni guardrail si allinea agli articoli chiave della legge per i sistemi ia ad alto rischio:

guardrail obbligo dell'eu ai act come soddisfa l'obbligo
api content safety art. 9: sistema di gestione del rischio identifica, valuta e mitiga i rischi di generazione di contenuti dannosi (odio, violenza, ecc.) nella fase di input.
prompt shields (distribuzione azure openai) art. 15: accuratezza, robustezza e cybersicurezza difende il sistema da uso improprio prevedibile, manipolazione e attacchi di iniezione di prompt all'endpoint del modello; integra la pre-scansione di content safety.
groundedness detection (rilevamento della messa a terra) art. 13: trasparenza e fornitura di informazioni mitiga le allucinazioni garantendo che gli output siano basati sui dati forniti, migliorando l'accuratezza fattuale e la trasparenza per gli utenti.
groundedness detection (rilevamento della messa a terra) art. 14: misure di supervisione umana segnala contenuti non messi a terra o con bassa confidenza, creando un segnale che consente un'efficace revisione e intervento umano.
protected material detection (rilevamento materiale protetto) art. 9: sistema di gestione del rischio gestisce i rischi legali e di proprietà intellettuale rilevando e filtrando testi e codici di terze parti protetti da copyright.
safety system messages (messaggi di sistema di sicurezza) art. 13: trasparenza e fornitura di informazioni istruisce il modello a definire il proprio comportamento, a rifiutare richieste inappropriate e a essere trasparente sui propri limiti.
registrazione completa art. 12: tenuta dei registri ogni decisione del middleware (blocchi, flag, avvisi) deve essere registrata, creando una traccia verificabile delle misure di sicurezza in azione.

conclusione: da scommessa rischiosa a pronto per la produzione

la distribuzione di un llm grezzo in un ambiente di produzione, specialmente in un settore regolamentato, non è più un'opzione praticabile. i rischi di contenuti dannosi, allucinazioni catastrofiche e attacchi di iniezione di prompt sono troppo grandi, e il panorama normativo, guidato dall'eu ai act, richiede controlli concreti e dimostrabili.

abbiamo esaminato un modello completo e testato sul campo per la costruzione di una difesa a più livelli. componendo azure ai content safety per una scansione rapida degli input e sfruttando i filtri profondamente integrati di azure openai per minacce avanzate come jailbreak e non-groundedness, è possibile costruire un'applicazione ia robusta, conforme e affidabile. il modello di middleware fastapi che ho mostrato fornisce un modo flessibile e scalabile per applicare queste politiche centralmente, assicurando che il vostro llm operi in sicurezza all'interno dei guardrail che definite.

la mia raccomandazione sul campo: non cercate di fare tutto in una volta. iniziate con due guardrail: azure ai content safety su tutti gli input utente con soglie conservative e groundedness detection (rilevamento della messa a terra) su tutti gli output basati su rag. questi due controlli da soli mitigheranno oltre l'80% dei comuni problemi di sicurezza e qualità nelle distribuzioni aziendali. da lì, abilitate azure openai prompt shields sulla distribuzione e aggiungete la protected material detection (rilevamento materiale protetto) in base al profilo di rischio della vostra applicazione.

passo successivo attuabile: prendete il codice middleware fastapi da questa guida e integratelo in un nuovo ramo della vostra applicazione llm esistente. configuratelo con soglie permissive e distribuitelo in un ambiente di staging. iniziate a raccogliere i log su ciò che segnala e blocca. questi dati saranno inestimabili per la messa a punto delle vostre politiche prima di applicarle in produzione. è così che si passa dalla teoria a un sistema di sicurezza tangibile, di livello aziendale.

Last updated:

This article was produced using an AI-assisted research and writing pipeline. Learn how we create content →