Nessun trucco vince da solo. La più economica: ritenta

JailbreakDal team SwarmAttacker di JolocorpPubblicato 6 min di lettura

Fila di calabroni robotici neri identici con occhi rossi, uno che fa un passo avanti: ritentare richieste LLM rifiutate

Gli LLM sono dadi, non calcolatrici. Fai la stessa domanda allo stesso modello due volte e puoi ottenere due risposte diverse, perché sotto il cofano sta campionando un percorso in uno spazio di probabilità, non cercando un fatto. La maggior parte delle volte quel non determinismo è una seccatura che cerchi di eliminare a forza di ingegneria. Quando costruisci un agente che continua a farsi rifiutare da un filtro di sicurezza, si rivela lo strumento più economico che hai.

Il lavoro che fa SwarmAttacker è offensivo per natura, quindi il classificatore di sicurezza del modello a volte rifiuta una richiesta perfettamente autorizzata, e un rifiuto blocca l'agente a metà esecuzione. Abbiamo passato molto tempo su una sola domanda: quando il modello dice no, cosa lo porta davvero a dire sì?

Nessun singolo trucco vince

Abbiamo preso i casi difficili: 411 richieste già rifiutate una volta, e le abbiamo riprodotte una per una attraverso quattro interventi diversi su GPT-5.5. L'idea era trovare l'unica tecnica ingegnosa che rompe un rifiuto in modo affidabile. Non esiste.

Cosa sblocca una richiesta già rifiutata

Riprodotto sulla coda difficile di 411 richieste rifiutate, GPT-5.5. Nessuna tecnica domina da sola: solo impilarle, chiudendo con un cambio di modello, sblocca l'intera coda.

Manipolazione del contestoentro il rumore del controllo
52%
Semplice reinvio (solo retry)stessa richiesta, nessuna modifica
54%
Framing di autorizzazione+14 punti, ma instabile tra i modelli
68%
Passaggio a un modello permissivoil fallback garantito
100%

Vestire la richiesta con del contesto l'ha fatta passare il 52% delle volte, che rientra nel rumore del non fare nulla. Dire al modello che si trattava di un engagement autorizzato ha aiutato di più, 68%, ma quel guadagno è fragile: si sposta molto a seconda del modello, e abbiamo scritto sul perché travestire il prompt non funziona in modo affidabile. L'unico intervento che ha sbloccato tutto è stato passare a un modello più permissivo, che per definizione funziona il 100% delle volte. Non esiste una frase magica. La mossa vincente è impilare qualche tentativo economico e tenere una rete di sicurezza garantita alla fine.

Perché riprovare e basta una richiesta LLM rifiutata funziona?

Guarda di nuovo la barra evidenziata. Rimandare esattamente la stessa richiesta rifiutata, invariata, senza alcun trucco, l'ha sbloccata circa il 54% delle volte. Poco più della metà delle richieste che si erano già sentite dire no è passata con un semplice retry, per la semplice ragione che il modello campiona un percorso diverso la seconda volta.

Un rifiuto non è un verdetto. È un lancio di dadi, e ti è permesso lanciare di nuovo.

Ecco perché riprovare non è il ripiego noioso a cui ricorri dopo che le idee ingegnose hanno fallito. Su un sistema non deterministico è la mossa con il rendimento più alto. Costa una chiamata in più e batte ogni tecnica di prompt che abbiamo provato, tranne il cambio di modello.

Riprova un paio di volte, poi fai escalation

Il problema è che il retry decade in fretta. Ogni tentativo aggiuntivo lavora sulle richieste che i tentativi precedenti non sono riusciti a salvare, quindi le probabilità peggiorano a ogni giro.

Tasso di recupero del retry per tentativo

Ogni retry lavora sugli avanzi del precedente, quindi il rendimento cala rapidamente. Riprova un paio di volte, poi fai escalation.

1º retry
31%
2º retry
16%

Il primo retry ha recuperato il 31% delle richieste che ha visto; il secondo solo il 16%. La lezione non è «riprova all'infinito», è «riprova due volte, poi fai escalation». In produzione lo abbiamo cablato in una piccola scala di escalation: retry sullo stesso modello, un altro retry, poi passa la richiesta a un modello più permissivo. Su 598 rifiuti in un'esecuzione completa, quella scala li ha risolti tutti. Nessuno ha lasciato l'agente bloccato.

~54%
sbloccate con un semplice reinvio
598 / 598
rifiuti risolti dalla scala di escalation

Un avvertimento onesto su quel 54%

Dobbiamo essere chiari su una cosa. Quel «circa il 54% funziona semplicemente con un retry» è una misura fatta in replay, in un secondo momento. Durante le esecuzioni live originali, la stessa coda difficile di richieste rifiutate si sbloccava solo per circa il 16% con un semplice retry, stesso modello, stesse richieste. Da parte nostra non era cambiato nulla. Il classificatore di sicurezza è semplicemente diventato molto più permissivo tra l'esecuzione live e il replay.

Quindi non ancorarti al numero esatto. Il rendimento del retry oscilla molto a seconda dell'umore del classificatore in un dato giorno. Ciò che resta vero in entrambe le misurazioni è la forma: una fetta significativa dei rifiuti evapora con un reinvio gratuito, e il cambio di modello è la rete di sicurezza che chiude sempre il divario.

Cosa significa se stai costruendo un agente

La lezione pratica è più piccola di quanto sembri e facile da integrare:

  • Tratta un rifiuto o un cattivo risultato di uno strumento come un lancio di dadi, non come un muro. Prima di ricorrere a una riscrittura del prompt, riprova e basta.
  • Metti i retry nel loop per primi. Sono la cosa con il ROI più alto che puoi aggiungere e ti costano una chiamata in più.
  • Limita i retry e fai escalation. Due tentativi sullo stesso modello, poi salta a uno più permissivo. Non ciclare all'infinito inseguendo un rendimento che decade.

Il prompt engineering riceve tutta l'attenzione, ma su un modello frontier attuale è spesso la leva che si muove appena. Se sei curioso di sapere quanto poco valesse davvero l'impalcatura ingegnosa, è una storia a sé: i prompt sono morti? La leva più grande e più stupida è semplicemente lasciare che il modello riprovi.