Se un sistema invoca un tool e modifica uno stato esterno, il log “tool chiamato” non basta. Occorre sapere quale azione è stata proposta, quali argomenti sono stati validati, chi era autorizzato e quale effetto è stato prodotto.
Separare proposta e autorizzazione
Nel codice, authorize, validate e tool sono dipendenze distinte. L'LLM può contribuire a proporre un'azione, ma non dovrebbe sostituire il controllo applicativo. L'evento registrato usa un hash degli argomenti, evitando di mettere automaticamente nel log il loro contenuto.
from hashlib import sha256
import json
def audit_event(actor, action, allowed, arguments, outcome):
canonical = json.dumps(arguments, sort_keys=True,
separators=(",", ":")).encode()
return {"actor": actor, "action": action, "allowed": allowed,
"arguments_sha256": sha256(canonical).hexdigest(),
"outcome": outcome}
def execute(user, action, arguments, authorize, validate, tool, sink):
allowed = authorize(user, action)
if not allowed:
sink(audit_event(user, action, False, arguments, "denied"))
raise PermissionError(action)
try:
clean = validate(arguments)
except Exception as exc:
sink(audit_event(user, action, True, arguments,
"validation:" + type(exc).__name__))
raise
try:
result = tool(clean)
except Exception as exc:
sink(audit_event(user, action, True, clean, type(exc).__name__))
raise
sink(audit_event(user, action, True, clean, "ok"))
return resultEsempio illustrativo. Un hash non rende anonimi gli argomenti e non sostituisce un archivio sicuro. In produzione servono ID di correlazione, persistenza affidabile, gestione dei dati personali, idempotenza e una policy per i casi in cui il log fallisce.
La traccia minima da progettare
| Campo | Perché serve | Attenzione |
|---|---|---|
| Identità e ruolo | Attribuire la richiesta e verificare i privilegi | Minimizzare i dati conservati |
| Versioni di fonti e policy | Riprodurre il contesto della decisione | Conservare riferimenti immutabili |
| Argomenti validati | Capire l'effetto richiesto al tool | Proteggere dati e segreti |
| Esito e approvazione | Ricostruire l'azione e chi l'ha autorizzata | Distinguere proposta da esecuzione |
Per le scritture aggiungerei una chiave di idempotenza e una strategia per i timeout: non sempre un errore di rete significa che l'azione non sia stata eseguita. Anche il percorso di recupero va rappresentato nella traccia.
Nel libro dedico spazio a guardrail, osservabilità, test e intervento umano informato. Sono requisiti da progettare insieme ai tool: aggiungerli alla fine significa spesso scoprire troppo tardi che la decisione non è più ricostruibile.
Se questi temi ti interessano, li approfondisco in Architetture Agentiche, con pattern, casi guida, scelte di progetto, metriche e modalità di guasto.
Scopri il libro su Amazon ↗