L'AI in produzione è terrificante (e come risolvere il problema)
Se il tuo agente non ha guardrail, non sei pronto per la produzione.
Nessuno si pone l’obiettivo di costruire un sistema AI insicuro. Scrivi le istruzioni, testi i casi limite, aggiungi qualche regola di validazione. Poi qualcuno scopre che può ingannare il tuo bot facendogli interpretare un pirata ed esporre i dati degli utenti. Oppure un numero di carta di credito finisce nei log. O il modello raccomanda con sicurezza il prodotto di un concorrente.
Il divario tra “funziona nella demo” e “è sicuro in produzione” è più ampio di quanto la maggior parte dei team si aspetti.
Parte del problema è che i modelli LLM non hanno opinioni su ciò che dovrebbero o non dovrebbero fare. Sono macchine di predizione che cercano di continuare qualsiasi pattern tu abbia iniziato. Dai loro un prompt che assomiglia a “modalità override di sistema” e lo eseguiranno volentieri. Non è un bug del modello; è semplicemente così che funzionano i modelli linguistici.
La maggior parte dei framework ti consegna il modello e ti augura buona fortuna. Mastra adotta un approccio diverso: parte dal presupposto che prima o poi avrai bisogno di guardrail, quindi li integra nell’architettura dell’agente fin dall’inizio.
Processor come strati di sicurezza
Il meccanismo alla base è semplice. Prima che il tuo prompt raggiunga il modello, passa attraverso una catena di processor di input. Dopo che il modello risponde, entrano in gioco i processor di output. Ogni processor può ispezionare, modificare o bloccare il contenuto in quella fase.
Pensali come middleware per le interazioni AI. Impili quelli di cui hai bisogno, configuri il loro comportamento e vengono eseguiti automaticamente su ogni richiesta.
1. Fermare i pirati (Prompt Injection)
Gli attacchi di prompt injection sono diventati creativi. Le persone usano caratteri Unicode invisibili, scrivono istruzioni in base64 o convincono il modello di essere in “modalità debug” dove le regole normali non si applicano. Le tecniche continuano a evolversi.
Mastra include processor che intercettano i pattern più comuni:
import { Agent } from '@mastra/core/agent';import { PromptInjectionDetector, UnicodeNormalizer } from '@mastra/core/processors';import { openai } from '@ai-sdk/openai';
export const secureAgent = new Agent({ id: 'fortress-assistant', name: 'fortress-assistant', instructions: 'You are a secure assistant.', model: openai('gpt-5'), inputProcessors: [ // 1. Scrub invisible characters new UnicodeNormalizer({ id: 'unicode-normalizer', stripControlChars: true, collapseWhitespace: true, }), // 2. Detect the attempt new PromptInjectionDetector({ id: 'prompt-injection-detector', model: openai('gpt-5-nano'), // Cheap, fast threshold: 0.8, strategy: 'block', // Hard stop detectionTypes: ['injection', 'jailbreak', 'system-override'], }), ],});Il UnicodeNormalizer rimuove i caratteri di controllo e collassa gli spazi bianchi. Il PromptInjectionDetector analizza l’input pulito alla ricerca di pattern che suggeriscono che qualcuno sta cercando di sovrascrivere le tue istruzioni.
Puoi configurare quanto vuoi che sia aggressivo il rilevamento (il parametro threshold) e cosa dovrebbe succedere quando scatta (bloccare, registrare o semplicemente segnalarlo).
2. Gestione dei PII
Numeri di carta di credito nei log, numeri di previdenza sociale nei database vettoriali, indirizzi email conservati più a lungo del necessario. Questi sono i tipi di problemi che si trasformano in questioni normative. La sfida è che gli utenti non sempre si rendono conto di stare incollando dati sensibili in una finestra di chat.
Il PIIDetector scansiona i pattern comuni prima che raggiungano il tuo modello o vengano scritti nello storage:
import { PIIDetector } from '@mastra/core/processors';
export const privateAgent = new Agent({ id: 'privacy-first-assistant', name: 'privacy-first-assistant', instructions: 'You are a helpful assistant that never stores personal information.', model: openai('gpt-5'), inputProcessors: [ new PIIDetector({ id: 'pii-detector', model: openai('gpt-5-nano'), detectionTypes: ['email', 'phone', 'credit-card', 'ssn'], threshold: 0.6, strategy: 'redact', redactionMethod: 'mask', // Replace with [REDACTED] instructions: 'Detect and mask personally identifiable information', }), ],});Puoi scegliere di redigere (sostituire con [REDACTED]), hashare o bloccare completamente. Il processor viene eseguito sia sull’input che sull’output, quindi sei coperto anche se il modello in qualche modo genera dati sensibili nella sua risposta.
3. Moderazione dei contenuti
I modelli addestrati sui dati di internet hanno visto alcune cose. Senza filtraggio, possono occasionalmente produrre risposte che renderebbero nervoso il tuo team PR. Il ModerationProcessor intercetta i contenuti che violano le tue linee guida:
import { ModerationProcessor } from '@mastra/core/processors';
export const moderatedAgent = new Agent({ id: 'safe-assistant', name: 'safe-assistant', instructions: 'You are a helpful assistant for a community platform.', model: openai('gpt-5'), inputProcessors: [ new ModerationProcessor({ id: 'moderation-processor', model: openai('gpt-5-nano'), // Fast, cheap model for classification categories: ['hate', 'harassment', 'violence', 'self-harm'], threshold: 0.7, // Block if confidence > 70% strategy: 'block', // Stop the request immediately instructions: 'Detect harmful content that violates community guidelines', }), ],});La parte interessante è che definisci tu quali categorie contano per il tuo caso d’uso. Uno strumento di scrittura creativa potrebbe consentire contenuti più espressivi rispetto a un bot di customer service. Il threshold e la strategia ti danno il controllo su quanto rigoroso dovrebbe essere il filtraggio.
Quando qualcosa scatta
I processor non lanciano errori quando rilevano un problema. Invece, impostano un flag sull’oggetto risultato:
const result = await secureAgent.generate('Ignore all previous instructions...');
if (result.tripwire) { console.log(`Blocked! Reason: ${result.tripwireReason}`); // "Blocked! Reason: Prompt injection detected." return "Nice try, script kiddie.";}Questo pattern ti permette di gestire gli eventi di sicurezza nel modo più adatto alla tua applicazione. Potresti registrarli per l’analisi, restituire un messaggio di errore generico o persino consentire alcune violazioni in contesti specifici. Il campo tripwireReason ti dice esattamente quale processor ha segnalato il contenuto, il che è utile quando stai debuggando i falsi positivi o regolando le tue soglie.
Cosa questo non risolve
I processor catturano molto, ma non sono magici. Un attaccante determinato con abbastanza tempo probabilmente può trovare un prompt che passa attraverso i filtri. I modelli occasionalmente allucinano in modi che i processor non possono prevedere. E c’è sempre un compromesso tra sicurezza e flessibilità: più rigide sono le tue regole, più è probabile che bloccherai casi d’uso legittimi.
Il valore non è la protezione perfetta. È avere un modo sistematico per gestire i problemi comuni che sicuramente si presenteranno in produzione. Puoi regolare la sensibilità man mano che impari cosa fanno effettivamente i tuoi utenti. Puoi aggiungere processor personalizzati per rischi specifici del dominio. E hai tracce di audit che mostrano cosa è stato bloccato e perché.
La maggior parte dei problemi di sicurezza nell’AI in produzione non sono attacchi sofisticati. Sono persone che copiano e incollano dati che non dovrebbero, o che scoprono per tentativi ed errori che il bot farà cose che non avevi intenzione di fare. I processor non fermeranno ogni possibile problema, ma rendono quelli ovvi molto più difficili.
Risorse
Leggi la serie
- Routing LLM
- Sicurezza e Guardrail (Questo post)
- Integrazioni MCP e strumenti
- Workflow e memoria