Audit trail per agenti AI: come registrare ogni azione del chatbot

Costruisci un audit trail per il tuo agente AI che mostri cosa il tuo chatbot ha inteso fare, tentato, cambiato e ritentato su ogni sistema collegato.

Cover Image for Audit trail per agenti AI: come registrare ogni azione del chatbot

Il 9 luglio, OpenAI ha aggiunto il tool calling programmatico e l'orchestrazione multi-agente in beta a GPT-5.6. Quel rilascio segue una tendenza più ampia che va dalle risposte brevi verso agenti che lavorano su più strumenti per molto più tempo: OpenAI ha riportato che il 70,2% degli utenti Codex campionati aveva richiesto almeno un'attività che, secondo le stime, avrebbe richiesto a una persona più di un'ora entro maggio 2026. Più azioni per task creano più punti in cui intento, esecuzione e risultato possono divergere.

I fallimenti sono spesso ordinari più che ostili. Dopo aver esaminato un milione di task di coding agent, Google DeepMind ha scoperto che la maggior parte degli eventi segnalati derivava da fraintendimenti o eccesso di iniziativa. Un audit trail per agenti AI utile deve quindi ricostruire ogni azione rilevante del chatbot, inclusi i retry apparentemente innocui che creano rimborsi, ticket, prenotazioni o email duplicate.

Parti da questo record minimo degli eventi. Memorizza un evento per ogni cambio di stato, aggiungi nuovi eventi invece di sovrascrivere quelli vecchi e collega ogni evento alla stessa trace.

CampoRegistraPerché è importante
trace_idUn ID per l'intera richiesta dell'utenteRicostruisce un'esecuzione multi-step
action_idUn ID per l'azione di business intesaRaggruppa tentativi e retry
attempt_idUn ID univoco per ogni invocazione dello strumentoEspone l'esecuzione duplicata
idempotency_keyChiave stabile inviata alla destinazionePreviene effetti collaterali ripetuti
actorUtente, chatbot, subagente, approvatore o servizioStabilisce la responsabilità
tool e operationConnettore più operazione esattaMostra quale capacità è stata eseguita
input_summary e input_hashRiepilogo oscurato più hash dell'input canonicoSupporta la revisione senza copiare segreti
decisionConsenti, nega, richiedi approvazione o esegui escalationCattura il risultato della policy
resultSuccesso, fallimento, timeout, sconosciuto o compensatoSepara lo stato di trasporto dal risultato di business
external_referenceID di rimborso, ticket, prenotazione o messaggioCollega la trace al sistema di record
occurred_atTimestamp del server in UTCOrdina gli eventi tra i servizi

Separa intento, tentativo ed effetto

Una trascrizione di chat di solito cattura l'intento: "Rimborsa il mio ultimo ordine". Un log HTTP cattura un tentativo: POST /refunds. Un processore di pagamenti cattura l'effetto: il rimborso rf_8421 ha modificato il saldo dell'account. Nessuno di questi record dimostra gli altri due.

Trattali come tre fatti correlati:

  • Intento registra la richiesta dell'utente, l'interpretazione dell'agente, lo strumento selezionato e i parametri proposti.
  • Tentativo registra l'operazione esatta inviata, la decisione della policy, la destinazione, il timeout e la classe di risposta.
  • Effetto registra il risultato esterno durevole, come un ID di rimborso e un importo, lo stato di una prenotazione o una transizione di ticket.

Questa separazione conta ogni volta che una richiesta va in timeout. Un timeout significa che il chiamante non ha ricevuto una risposta. La destinazione potrebbe comunque aver completato l'azione. Se il record di audit riduce "nessuna risposta" a "fallito", il chatbot potrebbe ritentare un'operazione già riuscita.

Lo stesso confine affina i permessi. La checklist dei permessi degli strumenti per chatbot aiuta a decidere se un bot può chiamare una capacità. L'audit trail fornisce le prove su cosa è successo dopo quella decisione.

Dai a ogni azione quattro ID

Un solo ID di conversazione non può reggere un'indagine in produzione. Una conversazione di supporto può avviare diverse azioni, e ogni azione può avere diversi tentativi.

Usa quattro identificatori con cicli di vita diversi:

ID conversazione. Raggruppa i messaggi visibili all'utente. Mantienilo stabile durante l'intera sessione di chat.

ID trace. Raggruppa il lavoro necessario per soddisfare una richiesta. Una nuova richiesta nella stessa conversazione dovrebbe ricevere una nuova trace.

ID azione. Identifica l'operazione di business che l'agente intende completare, come "rimborsa l'ordine 10492 per $48". I retry mantengono lo stesso ID azione.

ID tentativo. Identifica una singola chiamata di rete. Ogni retry ottiene un nuovo ID tentativo così gli operatori possono vedere quante volte il sistema ha provato.

Passa gli ID trace e azione attraverso webhook, code, servizi connettore e schermate di approvazione. Se un'API di terze parti accetta metadati, includili anche lì. Chi indaga dovrebbe poter partire da un messaggio del cliente, un job fallito o una transazione esterna e arrivare alla stessa trace.

Incidente analizzato: il rimborso eseguito due volte

Supponi che un cliente scriva: "Rimborsa l'addebito duplicato di $48 sull'ordine 10492." Il chatbot trova due pagamenti catturati, propone di rimborsare l'addebito più recente e riceve l'approvazione umana. L'API di pagamento elabora il rimborso ma la sua risposta supera un timeout di 10 secondi. Un worker ritenta la richiesta senza una chiave di idempotenza, creando un secondo rimborso.

Il primo tentativo dovrebbe produrre un evento append-only come questo:

{
  "event_type": "tool.attempt.finished",
  "trace_id": "tr_7f2c",
  "action_id": "act_refund_10492_48usd",
  "attempt_id": "att_01",
  "conversation_id": "conv_5198",
  "actor": {
    "type": "chatbot",
    "id": "billing-support"
  },
  "tool": "payments",
  "operation": "create_refund",
  "decision": "approved",
  "approval_event_id": "apr_6630",
  "input_summary": "Refund $48.00 to payment ending 8812",
  "input_hash": "sha256:4cb3...91e0",
  "idempotency_key": null,
  "result": "timeout_unknown",
  "external_reference": null,
  "occurred_at": "2026-07-15T09:42:18.511Z"
}

Il risultato timeout_unknown è l'indizio cruciale. Il worker deve interrogare il processore usando gli identificatori stabili dell'azione prima di ritentare. Se trova il rimborso rf_8421, aggiunge un evento effect.confirmed e chiude l'azione. Se non può interrogare, l'azione passa alla revisione invece di eseguire di nuovo alla cieca.

Ora immagina che il duplicato sia già avvenuto. Una trace completa mostra lo stesso ID azione, due ID tentativo, nessuna chiave di idempotenza e due ID di rimborso esterni. La remediation può registrare un'azione compensativa separatamente. Gli operatori possono rispondere al cliente, gli ingegneri possono correggere il comportamento di retry e il reparto amministrativo può riconciliare il registro contabile dalla stessa evidenza.

Questo è anche il motivo per cui i record di approvazione devono contenere più di un semplice clic. La guida ai workflow di approvazione per chatbot spiega come mostrare conseguenza e parametri prima dell'esecuzione. Il tuo audit trail dovrebbe vincolare quel payload approvato al payload eseguito con un hash canonico.

Rendi noioso il retry

I retry sono normali nei sistemi distribuiti. Le reti si bloccano, le code riconsegnano i job, i worker si riavviano e i provider restituiscono errori ambigui. Il design sicuro presuppone che ogni azione possa essere tentata più di una volta.

Genera la chiave di idempotenza dall'azione di business stabile, non dal tentativo. Per il rimborso sopra, la chiave potrebbe derivare da ID tenant, ID pagamento, importo del rimborso, motivo e ID azione. Ogni retry invia la stessa chiave. Un importo o una destinazione modificati diventano una nuova azione che richiede una nuova decisione.

Poi definisci le regole di retry in base al risultato:

  • Fallimento definitivo prima dell'accettazione: ritenta automaticamente con la stessa azione e chiave di idempotenza.
  • Timeout o perdita di connessione dopo l'invio: interroga prima lo stato; ritenta solo quando la destinazione dimostra che non esiste alcun effetto.
  • Fallimento di validazione o permesso: fermati e mostra la correzione specifica necessaria.
  • Rate limit o fallimento temporaneo del provider: rispetta il segnale di backoff del provider e conserva la stessa identità dell'azione.
  • Risultato sconosciuto senza supporto per il lookup: richiedi una revisione per le azioni rilevanti.

Registra il motivo dello scheduler per ogni retry. "Tentativo 2 avviato" è una prova debole. "Tentativo 2 avviato dopo che il lookup dello stato non ha restituito alcun rimborso corrispondente" è una prova verificabile.

Vincola le approvazioni al payload eseguito

Un'approvazione è valida solo per l'azione che la persona ha visto. Se un chatbot chiede di rimborsare $48 e poi esegue $96, la presenza di un evento di approvazione offre una falsa sicurezza.

Canonicalizza il payload proposto, rimuovi i campi volatili come i timestamp e calcola l'hash del risultato. Memorizza quell'hash con l'approvazione. Subito prima dell'esecuzione, ricalcola l'hash. Una discrepanza dovrebbe invalidare l'approvazione e restituire la proposta modificata all'approvatore.

Registra questi dettagli con l'evento di approvazione:

  • identità e ruolo dell'approvatore;
  • policy o regola che ha richiesto l'approvazione;
  • conseguenza mostrata in forma leggibile;
  • hash canonico del payload;
  • scadenza dell'approvazione;
  • decisione e motivo opzionale;
  • ID trace e azione.

Conserva anche gli eventi di rifiuto e scadenza. Una sequenza append-only mostra se un agente ha rispettato la decisione o ha tentato un percorso diverso dopo essere stato bloccato.

Oscura i dati senza distruggere le prove

I payload grezzi degli strumenti possono contenere token di accesso, dettagli di pagamento, informazioni sanitarie, messaggi privati e identificatori personali. Copiare tutto questo in un log ricercabile crea un secondo database sensibile.

Usa un record a strati. Metti un riepilogo oscurato nell'evento operativo. Memorizza un hash dell'input canonico per rilevare le modifiche. Se la conservazione del payload completo è davvero necessaria, cifralo in un archivio di evidenze ad accesso ristretto con un periodo di conservazione più breve e controlli di accesso separati.

Definisci l'oscuramento campo per campo, non solo tramite espressioni regolari. Un bearer token non dovrebbe mai entrare nella pipeline degli eventi. Gli indirizzi email possono essere mascherati nelle viste operative ampie pur restando disponibili a un piccolo gruppo di supporto. Gli input in testo libero hanno bisogno di limiti di dimensione e rilevamento dei segreti perché gli utenti incollano credenziali nelle finestre di chat.

La privacy influisce anche sui fornitori di observability. Prima di esportare le trace, decidi quali campi lasciano il tuo ambiente, quale regione li memorizza e se le richieste di cancellazione si propagano. La guida alla sicurezza amministrativa per chatbot copre le modifiche di configurazione privilegiate; applica la stessa separazione dei compiti all'accesso e alla conservazione dei log di audit.

Trasforma le trace in domande operative

Le dashboard dovrebbero rispondere a domande concrete invece di celebrare il volume di eventi. Parti dalle query che rivelano un danno al cliente:

  • Quali effetti di business riusciti hanno seguito una risposta in timeout?
  • Quali ID azione hanno prodotto più di un riferimento esterno?
  • Quali hash del payload approvato differiscono dagli hash del payload eseguito?
  • Quali strumenti hanno il tasso più alto di risultati sconosciuti?
  • Quali utenti o tenant generano più retry?
  • Quali azioni si sono completate dopo la scadenza di un'approvazione?
  • Quali azioni negate sono state seguite da un'azione simile tramite un altro strumento?

Rivedi un campione di trace normali insieme a ogni incidente. Gli esempi normali mostrano se lo schema è comprensibile prima che arrivi la pressione. Rivelano anche handoff mancanti, etichette di risultato fuorvianti e campi che i team davano per scontato che un altro servizio registrasse.

Per le azioni a basso rischio, una revisione differita può bastare. La roadmap di controllo di Google DeepMind distingue in modo simile il monitoraggio retrospettivo per i comportamenti reversibili dal blocco in tempo reale per le azioni gravi. Assegna a ogni strumento una modalità di revisione in base alla conseguenza: campionamento asincrono, avviso in caso di anomalia, approvazione prima dell'esecuzione o applicazione sincrona della policy.

Testa l'audit trail come superficie di prodotto

Un audit trail può fallire mentre il chatbot appare sano. Aggiungi test di rilascio che creano deliberatamente stati scomodi:

  1. Forza un timeout dopo che la destinazione ha accettato un'azione.
  2. Consegna due volte lo stesso messaggio di coda.
  3. Cambia un parametro approvato prima dell'esecuzione.
  4. Ruota una credenziale del connettore durante un task multi-step.
  5. Restituisci uno stato HTTP di successo con un risultato di business respinto.
  6. Esegui due subagenti sulla stessa richiesta del cliente.
  7. Elimina o maschera i dati del cliente e verifica le regole di conservazione tra le esportazioni.

Per ogni test, parti da tre punti: la conversazione, il job interno e la transazione esterna. Tutti e tre dovrebbero portare a un'unica trace coerente. Chi non ha costruito l'integrazione dovrebbe poter spiegare cosa ha richiesto l'utente, cosa ha deciso l'agente, cosa ha tentato il sistema e cosa è realmente cambiato.

La descrizione di Anthropic degli agenti affidabili enfatizza la trasparenza mentre gli agenti pianificano, agiscono, osservano e ripetono su più strumenti. Lo standard pratico è una trace che sopravvive a quel ciclo, inclusi gli handoff tra subagenti e gli interventi umani.

Una ricevuta fa parte dell'azione

La risposta visibile al cliente "Il tuo rimborso è completo" dovrebbe essere generata da un effetto confermato, non dall'intenzione del chatbot o da un dispatch dello strumento riuscito. Lo stesso riferimento esterno mostrato al supporto dovrebbe apparire nella ricevuta dell'utente, quando appropriato.

Man mano che i task dei chatbot si estendono su più strumenti, modelli, worker e approvazioni, un audit trail per agenti AI diventa parte del contratto dell'azione. Dà ai clienti una ricevuta difendibile e agli operatori un percorso da un risultato sorprendente fino alla decisione e al tentativo esatti che l'hanno prodotto.

In Agentkit, i log delle conversazioni forniscono il livello di revisione leggibile dall'uomo e le azioni API personalizzate collegano i chatbot ai sistemi di business; mantieni le ricevute dei sistemi di record collegate accanto a quelle conversazioni.

Crea gratis il tuo chatbot →

Nessuna carta di credito richiesta.

Inizia gratisNessuna carta di credito richiesta
Audit trail per agenti AI: come registrare ogni azione del chatbot – Agentkit