Torna al blog
Agentic AI20 aprile 20265 min di lettura

Progettare tool use per agenti AI che non si perdono tra dieci chiamate

Più tool dai a un agente, più probabilità ha di scegliere male. Come strutturare i tool, le loro descrizioni e i loro confini operativi perché l'agente resti efficace quando la superficie di scelta cresce.

Di AI Expert

Il paradosso del tool use

Quando un agente AI ha tre tool a disposizione, funziona bene. Quando ne ha dodici, inizia a fare scelte strane. Quando ne ha trenta, diventa imprevedibile.

Non è un problema del modello. È un problema di superficie di decisione.

Ogni tool che aggiungi non è solo una capacità in più — è un'opzione in più che il modello deve valutare a ogni turno. E come in qualunque sistema di decisione, più opzioni hai, più errori di selezione commetti.

La prima regola: ogni tool deve avere una ragione per esistere

Un pattern che vedo spesso: il team aggiunge tool mano a mano che emergono casi d'uso, senza mai consolidare. Dopo sei mesi, hai get_customer_info, fetch_customer_data, lookup_customer, customer_details — tutti che fanno cose leggermente diverse che nessuno ricorda.

Il modello, a quel punto, sceglie a caso.

Prima di aggiungere un tool, rispondi a tre domande:

  • Esiste già un tool che fa qualcosa di simile?
  • Se sì, posso estendere quello invece di crearne uno nuovo?
  • Un utente umano che legge solo i nomi dei tool capirebbe quando usare questo e non un altro?

Se il tuo team non riesce a distinguere get_user da fetch_user guardando solo i nomi, il modello non ce la farà mai.

Tool name e description sono prompt, non documentazione

Il nome e la descrizione di un tool non sono metadati passivi. Sono il prompt che il modello legge per decidere se usarlo. Trattali di conseguenza.

Tool name: deve essere un verbo + oggetto specifico. get_order_status batte orders senza storia. send_approval_reminder batte remind.

Description: in 1-3 frasi, devi coprire tre cose:

  1. Cosa fa il tool (la meccanica)
  2. Quando usarlo (il trigger operativo)
  3. Quando NON usarlo (l'antitrigger)

Un esempio di descrizione debole:

"Questo tool permette di ottenere informazioni sull'ordine."

Un esempio di descrizione utile:

"Restituisce lo stato, le date di spedizione e i prodotti di un ordine. Usare quando l'utente chiede dello stato di un ordine specifico o menziona un ID ordine. Non usare per query generiche sul catalogo o sul profilo cliente."

La differenza, misurata in produzione, è sostanziale: la seconda versione riduce drasticamente i falsi positivi in cui l'agente chiama il tool quando non serve.

Input schema come contratto, non come placeholder

Gli schema degli input tool sono un altro prompt implicito. Ogni parametro dovrebbe avere:

  • Un nome che comunica il contenuto (customer_id non id)
  • Un tipo preciso (string con format email non solo string)
  • Una descrizione che copre i casi limite ("Lasciare vuoto se il cliente non è ancora registrato")
  • Una gestione esplicita di required vs optional

Un pattern utile: rendi required solo i campi che il modello può davvero inferire dalla conversazione. Tutto il resto optional, con default espliciti. Un tool con sei required field che il modello non può riempire da solo diventa inusabile.

Il problema del ritorno non controllato

I tool ritornano dati. Quei dati finiscono nel contesto. Se un tool restituisce un JSON di 40KB ogni volta che viene chiamato, stai iniettando rumore nel contesto futuro.

Tre pratiche che salvano molto contesto:

Pagination o limit di default. Se un tool potrebbe restituire 1000 record, restituiscine 10 di default con un flag per chiedere di più.

Filtering at tool level. Invece di far restituire al tool tutti i campi del record, accetta un parametro fields e restituisci solo quelli richiesti.

Sommari invece di dump. Per tool che ritornano strutture complesse, affianca una summary in linguaggio naturale alla struttura completa. Il modello spesso userà la summary e risparmierà token.

Quando l'agente si blocca: gli errori sono tool come gli altri

Una fonte di crash silenti nei sistemi agentici è la gestione degli errori dei tool. Se un tool fallisce, cosa riceve il modello?

Se riceve uno stack trace Python, la risposta sarà confusa. Se riceve un null silenzioso, proverà a continuare come se nulla fosse. Se riceve un errore strutturato e interpretabile, può decidere cosa fare.

Un tool error ben progettato ha:

  • Un status ("error")
  • Un error_code stabile ("NOT_FOUND", "PERMISSION_DENIED", "RATE_LIMITED")
  • Un message in linguaggio naturale che il modello può parafrasare all'utente
  • Un suggerimento esplicito ("Prova a chiedere all'utente l'ID ordine corretto")
{
  "status": "error",
  "error_code": "ORDER_NOT_FOUND",
  "message": "Nessun ordine trovato con ID ORD-12345 per questo cliente",
  "suggested_action": "Chiedi all'utente di verificare l'ID ordine o di fornire data e prodotto"
}

Con questa struttura, l'agente può recuperare senza bisogno di hard-coded fallback. Senza, ogni errore è una potenziale conversazione rotta.

Il pattern del tool selector

Quando il numero di tool supera una soglia (nella mia esperienza, intorno ai 10-15), smette di funzionare bene tenerli tutti visibili al modello allo stesso tempo. Due pattern architettonici aiutano.

Tool namespace: raggruppare i tool per dominio (orders.get_status, orders.cancel, billing.get_invoice, billing.send_reminder). Il modello ragiona prima sul dominio, poi sul tool specifico.

Tool search dinamico: il modello prima chiede quali tool sono disponibili per un certo task, poi sceglie. È un passo in più, ma diventa essenziale quando il catalogo supera le decine. OpenAI ha introdotto questo pattern a livello di API con GPT-5.4; Anthropic e altri stanno andando nella stessa direzione.

La disciplina che paga: riduci prima di aggiungere

Ogni due-tre mesi, qualcuno nel team dovrebbe fare un audit dei tool: quali vengono usati davvero in produzione? Quali non sono mai chiamati? Quali vengono chiamati ma con accuratezza bassa?

I tool dimenticati sono il problema più insidioso. Non creano valore, ma occupano spazio nella superficie di decisione del modello. Rimuoverli è quasi sempre un win puro.

La regola pratica: se un tool non viene usato da più di un mese in produzione, è candidato alla deprecazione. Mantenerlo "perché magari serve" è un costo pagato a ogni chiamata da tutti gli altri tool.

La domanda strutturale

La domanda che merita di essere fatta quando un agente inizia a comportarsi male non è "come miglioro il prompt?". È:

"L'agente ha il set di tool giusto per rispondere a questa categoria di richieste, presentato in modo che possa scegliere bene?"

Spesso la risposta è no, e la soluzione non è un prompt migliore — è un set di tool più piccolo, più coerente, meglio documentato. Gli agenti che funzionano bene non sono quelli che possono fare tutto. Sono quelli che sanno esattamente cosa possono fare e cosa no.

Continua a leggere

Altro dal journal

Anthropic20 aprile 20265 min di lettura

Claude Haiku 4.5: velocità near-frontier e il paradigma dei sub-agenti

Analisi di Claude Haiku 4.5, il modello compatto rilasciato da Anthropic il 15 ottobre 2025. Prestazioni paragonabili a Sonnet 4 a un terzo del costo, extended thinking introdotto sulla fascia Haiku, e il nuovo pattern di orchestrazione multi-agent con Sonnet come coordinatore.

Anthropic20 aprile 20265 min di lettura

Claude Mythos Preview: il modello che Anthropic ha scelto di non rilasciare

Analisi di Claude Mythos Preview, il modello frontier di Anthropic distribuito solo tramite Project Glasswing a un gruppo ristretto di partner per lavoro difensivo di cybersecurity. Migliaia di zero-day scoperti, un bug di 27 anni in OpenBSD, e la prima volta in cui un laboratorio rifiuta apertamente il rilascio generale di un suo modello di punta.