Vai al contenuto
Blog

AI

Perché la Tua Funzionalità AI ha Bisogno di Guardrail Deterministici, Non di un Modello più Potente

L'output di un LLM è probabilistico per natura. Ecco perché le funzionalità AI in produzione necessitano di regole pass/fail deterministiche attorno al modello — non di un modello più grande — per essere distribuite in modo affidabile.

Di Pykero Agency · Engineering team31 ago 20265 min di lettura

TL;DR

Non cercare di rendere deterministico un LLM: avvolgi un modello non deterministico in uno strato di regole deterministico e testabile che stabilisca cosa è fatale, lascia che il modello gestisca il giudizio e le regole gestiscano le conseguenze.

pannello di controllo sala server con interruttori, Perché la Tua Funzionalità AI ha Bisogno di Guardrail Deterministici, Non di un Modello più Potente

Gli LLM sono probabilistici: cercare di ottenere output consistenti da uno di essi è una battaglia persa in partenza. La soluzione non è un modello più grande né un prompt più lungo — è uno strato deterministico di regole che si interpone tra il modello e gli utenti, decide cosa è fatale e cosa non lo è, ogni volta, allo stesso modo.

I founder che valutano una funzionalità AI (o un'agenzia che la costruisce per loro) di solito si pongono prima la domanda sbagliata: "qual è il modello più affidabile?" Ogni modello — incluse le ultime versioni di Anthropic o OpenAI — campiona da una distribuzione di probabilità sui token. Esegui lo stesso prompt due volte e puoi ottenere due risposte diverse, anche a temperature basse, a causa del batching e del non determinismo dei calcoli in virgola mobile lato inference. Non è un difetto risolvibile con il prompt engineering. È il funzionamento della tecnologia.

L'errore: inseguire il determinismo a livello di modello

I team che non hanno ancora distribuito AI in produzione tendono a risolvere il problema dell'"inconsistenza del modello" in questi modi:

  • Abbassare la temperature a 0 assumendo che ciò significhi determinismo (non è del tutto vero)
  • Aggiungere più esempi few-shot per "fissare" il formato
  • Rieseguire lo stesso prompt e prendere la risposta maggioritaria, il che moltiplica i costi per un guadagno marginale
  • Passare a un modello più grande e costoso quando il problema è in realtà architetturale

Abbiamo percorso le prime tre strade con il nostro motore di outreach prima di ricostruirlo: più esempi nel prompt di estrazione per cercare di fissare il formato, temperature a 0 sulla chiamata di redazione, e a un certo punto uno step di riesecuzione-e-selezione-della-risposta-migliore che ha semplicemente raddoppiato il costo dei token senza risolvere l'inconsistenza di fondo. Nessuna di queste soluzioni ha retto, perché l'output era comunque il risultato di una valutazione compiuta da un processo stocastico a ognuno di quei passaggi concatenati, e nessun prompt engineering cambia questa categoria di problema. Se la tua business logic dipende dal fatto che il modello classifichi, valuti o instradri sempre allo stesso modo, quella logica deve risiedere fuori dal modello.

La soluzione: separare il giudizio dalle conseguenze

Il pattern che funziona: lascia che l'LLM faccia ciò in cui eccelle (giudizio aperto, estrazione, redazione) e passa il suo output a uno strato di regole deterministico che decide cosa accade dopo. In concreto:

  1. Il modello valuta o classifica. Può variare da un'esecuzione all'altra: non importa, perché nulla a valle si fida ciecamente di esso.
  2. Un insieme fisso di regole decide cosa è fatale e cosa non lo è. È semplice codice: un frozenset di condizioni escludenti, un validatore JSON Schema basato sulla specifica JSON Schema, o una piccola tabella di regole di business. Non chiama mai il modello e non cambia tra una richiesta e l'altra.
  3. Solo la decisione dello strato di regole viene registrata e agita. Il punteggio grezzo del modello diventa un input, non il verdetto.

Questo significa che la tua suite di test può essere genuinamente deterministica anche se l'oggetto testato non lo è. Scrivi unit test contro lo strato di regole (semplici, veloci, senza chiamate API) e monitori la distribuzione degli output del modello nel tempo (drift detection), invece di fare asserzioni su singole risposte. Sono due problemi distinti, e confonderli è il motivo per cui molti team finiscono con suite di test AI instabili che alla fine saltano del tutto.

Dove questo principio emerge nei build reali

Abbiamo visto lo stesso principio dare risultati nei nostri strumenti interni, al di fuori delle funzionalità di chat. Quando abbiamo costruito il nostro motore di outreach, inizialmente concatenavamo più chiamate LLM: scraping del sito del prospect, riassunto, estrazione dei fatti, poi redazione dell'email. Ogni passaggio aggiuntivo era un ulteriore punto in cui la varianza poteva accumularsi, e capire perché un'email era venuta male significava tracciare quattro hop non deterministici. Collassare tutto in una singola chiamata che estraeva i fatti e redigeva l'email insieme — con un post-check deterministico su lunghezza, frasi vietate e campi di personalizzazione obbligatori — ha superato la catena multi-step sia in termini di costo che di qualità. Meno hop stocastici significa meno punti in cui lo strato di regole deve intervenire, e i problemi intercettati sono più facili da ricondurre a una singola chiamata. È la stessa lezione di fondo del pattern dei guardrail: concentra la varianza nel minor numero di punti possibile, poi avvolgi ciò che resta in regole concretamente testabili. Se stai scegliendo tra una singola chiamata ben delimitata e una catena agent multi-step, i tradeoff sono gli stessi che affrontiamo in singola chiamata vs catene agent.

Cosa chiedere a un vendor o a un'agenzia

Se stai valutando chi costruirà una funzionalità AI per te, "come rendete l'output affidabile?" è una domanda legittima — e "usiamo l'ultimo modello" non è una risposta vera. Chiedi invece:

  • Qual è lo strato deterministico? La risposta dovrebbe suonare come il frozenset di condizioni escludenti o il validatore JSON Schema descritti sopra, non come "il modello è istruito a essere preciso." Se non riescono a nominare il set specifico di regole in una frase, non ne hanno costruito uno.
  • Come lo testate? Dovresti sentire parlare di unit test contro lo strato di regole e di drift monitoring sulla distribuzione del modello, non di "l'abbiamo eseguito alcune volte e sembrava funzionare."
  • Cosa succede quando lo strato di regole rifiuta un output? Retry con un prompt diverso, fallback a un default sicuro, o escalation a un operatore umano. Tutte e tre sono valide; "niente, lo logghiamo soltanto" non lo è.
  • Lo strato di regole è nel contratto? Se l'affidabilità è abbastanza importante da giustificare il pagamento, dovrebbe essere specificata insieme al deliverable, non lasciata implicita. Questo si sovrappone a quanto trattiamo in evals nei contratti con vendor AI.

C'è anche un impatto diretto sui costi: ogni retry o chiamata maggioritaria al modello è un costo in token che stai pagando per compensare l'assenza di uno strato di regole. I team che saltano lo strato deterministico spesso finiscono per affrontare il problema dei costi più avanti con rate limiting e caching — un pattern valido di per sé, ma che cura un sintomo che il guardrail avrebbe prevenuto; vedi rate limiting delle funzionalità AI per il controllo dei costi se è già questa la tua situazione.

La conclusione

Non cercare "il modello che allucinare meno." Scegli il team che sa mostrarti, in modo concreto, cosa succede a un output errato dopo che il modello lo ha prodotto. Un frozenset che decide cosa è fatale è una storia di affidabilità più onesta di qualsiasi affermazione sulla qualità del modello — perché è testabile, non deriva nel tempo e lo puoi leggere in cinque minuti durante una revisione del vendor.

Se stai definendo lo scope di una funzionalità AI e vuoi un secondo parere su dove posizionare lo strato deterministico, parliamone.

ai agentsllm reliabilityproduction aiengineering

Domande frequenti

Perché lo stesso prompt produce risposte diverse da un LLM?

I modelli campionano da una distribuzione di probabilità sui token, quindi anche a temperature basse, differenze minime nei calcoli in virgola mobile e nel batching producono output diversi da un'esecuzione all'altra. È un comportamento atteso, non un bug eliminabile tramite prompt.

Un modello più grande o più recente risolve l'inconsistenza dell'output AI?

Riduce la frequenza degli output errati, ma non elimina mai la varianza. Qualsiasi funzionalità in produzione ha quindi ancora bisogno di uno strato deterministico che decida quali output siano accettabili prima che raggiungano un utente o un database.

Come si presenta concretamente un guardrail deterministico nel codice?

È un insieme fisso di regole — tipicamente un validatore di schema, un allowlist o un `frozenset` di condizioni fatali, oppure un controllo basato su regex o regole di business — che viene eseguito dopo la chiamata al modello e decide pass o fail senza richiamare il modello.

Questo rallenta o aumenta il costo di una funzionalità AI?

I controlli dei guardrail sono semplice codice: aggiungono pochi millisecondi, non un'altra chiamata al modello, e solitamente riducono i costi intercettando output errati prima che inneschino retry o chiamate API a valle.

Come può aiutare Pykero

Servizi collegati a questo articolo.

State costruendo qualcosa di simile?

Pykero Agency progetta e rilascia prodotti web, mobile, SaaS e AI pronti per la produzione.

Parliamone

Discussion

Be the first to comment.

Letture correlate