Un motore linguistico, da solo, è un interlocutore passivo. Per costruire un sistema che valuta un problema, pianifica, corregge i propri errori e porta a termine un compito complesso, serve un’architettura radicalmente diversa. Questa guida traccia la mappa esatta di quell’architettura: sette passaggi tecnici che separano un semplice script chiuso da ecosistemi capaci di reale orchestrazione e delega.
L’evoluzione dell’AI agentica non rappresenta una singola tecnologia, ma una successione di capacità emergenti. A ogni livello vengono aggiunte nuove proprietà computazionali che modificano profondamente il comportamento del sistema.
1. SCRIPT BOTS: Il gradino zero
Uno script bot non comprende nulla. È un insieme di condizioni if/else o di pattern matching che mappa input noti a output predefiniti. Zero ambiguità gestita, zero adattamento: se l’input non corrisponde a un pattern previsto, il bot fallisce o risponde in modo generico.
Esempio applicativo
# script_bot.py
# Un sistema totalmente deterministico: prevedibile, ma fragile.
regole = {
"orari": "Siamo aperti dal lunedì al venerdì, 9-18.",
"prezzo": "Il prezzo base è di 49€/mese.",
"contatti": "Scrivici a [email protected]"
}
def rispondi(messaggio_utente):
testo = messaggio_utente.lower()
for chiave, risposta in regole.items():
if chiave in testo:
return risposta
return "Non ho capito, prova a riformulare."
>>> rispondi("Quali sono i vostri orari?")
"Siamo aperti dal lunedì al venerdì, 9-18."
>>> rispondi("Posso venire di domenica?")
"Non ho capito, prova a riformulare." # Il sistema crolla fuori dai binari
Dove si usa ancora oggi: Menu IVR telefonici, automazioni di form, chatbot di primo livello su siti con FAQ statiche. Il vantaggio è la prevedibilità totale: non ci sono allucinazioni perché non c’è generazione di linguaggio.
2. LLMs: L’arrivo della comprensione linguistica
Un modello linguistico (LLM) introduce la prima vera capacità cognitiva: comprendere ed elaborare linguaggio naturale non strutturato. L’LLM qui è isolato: non ha accesso a strumenti esterni, non ha memoria tra una conversazione e l’altra, risponde solo sulla base di ciò che è cristallizzato nei suoi pesi neurali.
Esempio applicativo
# llm_puro.py
# L'LLM può ragionare sul testo, ma la sua conoscenza è congelata.
prompt = "Qual è la temperatura attuale a Milano?"
risposta_llm = "Non ho accesso a dati in tempo reale, "
"ma a giugno Milano ha in media 24°C." # Plausibile, ma inutile ai fini pratici
Utile per: Riassunti, riscrittura, classificazione testuale, estrazione di concetti. Il limite strutturale è netto: non c’è modo di agire sul mondo esterno.
3. LLMs + TOOLS: Dal “sapere” al “fare”
Attraverso il function calling, il modello smette di essere un sistema chiuso. Può decidere autonomamente di invocare un’API esterna , meteo, SQL, motore di ricerca, passando parametri strutturati, per poi integrare il risultato nella risposta finale.
Esempio applicativo
# llm_con_tools.py
tools = [{
"name": "get_weather",
"description": "Ottiene il meteo attuale per una città",
"parameters": {"city": "string"}
}]
messaggio = "Che tempo fa a Milano oggi?"
# Il modello non genera testo libero, ma una struttura dati azionabile:
tool_call = {"name": "get_weather", "arguments": {"city": "Milano"}}
# Il sistema esegue la chiamata API reale
risultato_api = get_weather(city="Milano") # Output: {"temp": 27, "condizioni": "sereno"}
# L'LLM riprende il controllo e sintetizza:
"A Milano oggi ci sono 27°C con cielo sereno."
Il salto concettuale è enorme: l’LLM passa da generatore di testo a orchestratore di azioni.
4. RAG: Ancorare le risposte ai fatti
Il Retrieval-Augmented Generation (RAG) risolve il problema della conoscenza congelata. Recupera documenti da un database vettoriale, li inserisce nel contesto e forza il modello a rispondere basandosi esclusivamente su quei frammenti.
Esempio applicativo
# rag_pipeline.py
domanda = "Qual è la policy di reso della nostra azienda?"
# 1. RETRIEVAL: ricerca semantica nei documenti aziendali
documenti_rilevanti = database_vettoriale.search(query=domanda, top_k=3)
# 2. AUGMENTATION: iniezione del contesto nel prompt
prompt = f"""
Contesto: {documenti_rilevanti}
Domanda: {domanda}
Rispondi SOLO basandoti sul contesto fornito.
"""
# 3. GENERATION
"Il reso è possibile entro 30 giorni dall'acquisto, conservando lo scontrino."
Perché conta: Riduce drasticamente le allucinazioni su documentazione tecnica e policy interne, vincolando l’output a fonti verificabili.
5. AGENTIC MEMORY: Continuità nel tempo
La memoria agentica introduce la capacità di accumulare contesto. Distingue tra cache a breve termine, memoria semantica (fatti generali) e memoria episodica (eventi passati).
Esempio applicativo
# agentic_memory.py
memoria_semantica = {"utente": "Emanuela", "ruolo": "Analyst"}
memoria_episodica = []
def gestisci_richiesta(messaggio):
# L'agente inietta il passato prima di valutare il presente
contesto = f"""
Utente: {memoria_semantica}
Storico recente: {memoria_episodica[-3:]}
Richiesta attuale: {messaggio}
"""
risposta = llm.generate(contesto)
memoria_episodica.append({"data": "2026-07-02", "evento": messaggio})
return risposta
6. MCP: Standardizzare gli strumenti enterprise
Il Model Context Protocol (MCP) funge da livello di standardizzazione. Invece di scrivere connettori custom per ogni singolo database o applicativo aziendale, un server MCP espone gli strumenti in un formato universale, agganciabile da qualsiasi agente compatibile.
Esempio applicativo
// mcp_config.json
// L'agente vede automaticamente gli strumenti esposti senza codice di integrazione custom
{
"mcpServers": {
"chroma-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-chroma"]
},
"kusto-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-kql"]
}
}
}
7. A2A (Agent-to-Agent): Come funzionano davvero i sistemi in produzione

L’orchestrazione A2A è il punto in cui gli agenti smettono di essere “chatbot evoluti” e diventano un vero e proprio sistema distribuito.
Non c’è più un singolo LLM che tenta di risolvere l’intero prompt. Al suo posto, una rete di agenti specializzati collabora su uno stato condiviso. È un’architettura a microservizi, ma con capacità cognitive al posto della rigida logica applicativa. Il risultato è potente ma intrinsecamente fragile: quando funziona sembra magia; quando fallisce, il punto di rottura è spesso invisibile.
7.1 Non messaggi, ma stato condiviso
Il primo equivoco da smontare è pensare agli agenti come entità che si scambiano messaggi in una sorta di chat room. In produzione, l’A2A non funziona così.
Gli agenti non “parlano” tra loro: leggono e scrivono su uno stato strutturato condiviso. Solitamente si tratta di un JSON, di oggetti fortemente tipizzati (TypedDict in Python) o di uno state graph in memoria.
Ogni agente esegue ciclicamente lo stesso pattern:
- Legge lo stato attuale.
- Esegue una trasformazione (ragionamento o chiamata tool).
- Aggiorna lo stato.
- Cede il controllo.
Il flusso reale: Nessuno parla direttamente con nessuno. L’orchestratore aggiorna lo stato scrivendo: “Analizzare questi log”. Il Data Agent si attiva, estrae le informazioni e popola la variabile “log estratti”. L’Analyst Agent legge quella variabile, cerca anomalie e aggiorna i “pattern sospetti”. Tutto transita rigorosamente dallo stato.
7.2 Il vero motivo per cui esiste l’A2A: l’economia dei token
L’A2A non nasce per “creare un’AI più intelligente”. Nasce per ottimizzare il budget.
Se utilizzi un modello top-level per ogni singola transazione — generare la query al database, fare il parsing, estrarre i dati, classificarli — stai bruciando token e budget inutilmente. Un’architettura pronta per la produzione sfrutta una precisa frattura economica tra i modelli:
- Orchestratore (Premium): Modelli ad alto costo e forte capacità logica (come Claude Opus). Non eseguono task operativi; decidono la strategia, costruiscono il piano e valutano gli errori.
- Worker Agents (Commodity): Modelli più piccoli, veloci e specializzati (come DeepSeek V4). Fanno il lavoro sporco. Non “pensano” al macro-obiettivo, ma sono estremamente efficienti nell’eseguire bene un singolo compito (es. scrivere codice o parsare JSON).
7.3 Esempio reale: SOC Automation
Analizziamo un caso reale: un sistema progettato per indagare su attacchi di tipo Brute Force, Impossible Travel o login anomali.
L’architettura poggia su uno stato condiviso chiaramente definito:
# Python
class SOCState(TypedDict):
goal: str
kql_query: str
logs: list
findings: dict
report: str
errors: list
7.4 Data Agent: Dal linguaggio alla query (KQL)
Questo è uno dei nodi operativi più delicati. Il Data Agent deve tradurre l’obiettivo investigativo in una query Kusto (KQL) ed eseguirla sul database di sicurezza.
Dove fallisce spesso: Genera una query sintatticamente perfetta, ma logicamente errata. Potrebbe omettere un filtro temporale o fallire nell’estrazione.
La soluzione deterministica: Qui servono guardrail rigidi nel codice, non nell’LLM. Ad esempio, prima di aggiornare lo stato con i dati estratti, il sistema deve applicare una logica anti-rumore: se la query ha restituito un campione troppo piccolo e ad altissima unicità, l’estrazione va scartata e l’agente deve riformulare la KQL per allargare la finestra temporale. Senza questo controllo, l’errore diventa invisibile.
7.5 Analyst Agent: Il rischio dei falsi negativi
Questo agente prende in carico i log per cercare pattern d’attacco.
Il problema critico emerge quando i dati forniti dal passaggio precedente sono parziali o filtrati male. L’Analyst Agent elaborerà la sua deduzione logica e dichiarerà: “Nessuna anomalia rilevata”. Questa risposta è tecnicamente coerente con i dati che ha ricevuto, ma completamente sbagliata rispetto alla realtà.
7.6 L’Orchestratore: Il routing decisionale
L’orchestratore non tocca i log e non scrive report. Il suo unico scopo è il routing basato sullo stato del sistema.
# Logica decisionale dell'Orchestratore
if state.get("errors"):
# C'è stato un problema nel parsing o nell'API
return "fix_data_agent"
elif not state.get("findings") and len(state.get("logs", [])) > 0:
# I dati ci sono, ma non sono stati ancora analizzati
return "run_analyst"
else:
# Il ciclo è completo
return "generate_report"
7.7 Il vero problema: La propagazione silente degli errori
Questo è il punto di rottura dell’intero sistema. In un’architettura A2A, i fallimenti raramente fanno crashare l’applicazione lanciando un’eccezione chiara. Al contrario, si propagano.
- Cascata Silenziosa: Il Data Agent sbaglia leggermente la sintassi di estrazione KQL → L’Analyst Agent lavora su log incompleti → Il Reporter genera un output falso ma rassicurante.
- Falso Senso di Correttezza: Ogni singolo agente, valutato isolatamente, “ha fatto bene il suo lavoro” in base all’input ricevuto. Eppure, il risultato finale è un disastro operativo.
- Loop Infiniti: L’Orchestratore rileva un’incongruenza, rimanda il task al Data Agent, che ripete lo stesso identico errore per cinque iterazioni di fila esaurendo il context window e il budget.
Attrito e Complessità: Quando usare cosa
Non tutte le architetture necessitano del livello 7. Anzi, aggiungere autonomia operativa significa aggiungere punti di rottura. Più agenti e tool si inseriscono in un funnel decisionale, maggiore è il rischio di attrito: un sistema A2A mal progettato non risolve problemi, crea loop di errori ricorsivi e consuma risorse a vuoto.
| Livello | Capacità Aggiunta | Scenari Applicativi Ideali |
|---|---|---|
| Script Bot | Automazione deterministica | FAQ statiche, IVR, routing di base |
| LLM | Comprensione linguistica | Classificazione, estrazione, sintesi |
| LLM + Tools | Azione sul mondo esterno | Interrogazioni API, calcoli strutturati |
| RAG | Conoscenza ancorata | Assistenti normativi, policy aziendali |
| Agentic Memory | Continuità temporale | CRM conversazionali, supporto tecnico lungo |
| MCP | Integrazione scalabile | Ecosistemi aziendali frammentati |
| A2A Agents | Delega e orchestrazione | Workflow multi-dominio complessi |
Il Planning: Il cervello operativo
Abbiamo visto l’hardware concettuale dei sette livelli. Ma qual è il software che li fa muovere? La risposta risiede nel Planning.
Un agente autonomo non si limita a usare strumenti. Deve scomporre l’obiettivo, stabilire l’ordine di esecuzione, verificare ogni output e correggere il proprio piano.
- Il reasoning decide dove conviene andare (logica).
- Il planning stabilisce quale percorso seguire (organizzazione).
- L’execution percorre il tragitto (azione).
Strategie di Planning Moderne
- ReAct (Reason + Act): Il pattern più diffuso. L’agente riflette sullo stato, esegue un’azione, osserva il risultato e ripete il ciclo. Ideale per ambienti dinamici.
- Plan-and-Execute: Il planner costruisce subito l’intero albero delle operazioni; un esecutore lo percorre pedissequamente. Eccellente per pipeline dati prevedibili.
- Tree of Thoughts: Invece di seguire un singolo binario logico, il sistema ramifica l’elaborazione valutando più scenari in parallelo, potando progressivamente i percorsi ciechi.
- Self-Refine: Un processo iterativo in cui l’agente critica e migliora la propria bozza fino a raggiungere una soglia qualitativa.
L’Economia degli Agenti: Affidabilità vs Costi
L’introduzione di tecniche di planning e iterazione trasforma l’economia del software. A differenza delle architetture tradizionali con costi fissi, un agente autonomo consuma token per pensare, per sbagliare e per correggersi. L’efficacia non si misura più dalla mera “intelligenza testuale”, ma dal Costo per Task Completato con Successo.
Questo rende cruciale sfruttare la frattura economica tra i modelli.
Prendiamo un caso numerico reale: un task di analisi log di sicurezza che richiede 3 iterazioni in architettura ReAct.
Se utilizziamo un modello premium come Claude Opus ([math]\$15[/math] per milione di token) per orchestrare, estrarre e parsare, il costo medio esplode a circa [math]\$2.40[/math] per singolo task.
Se applichiamo un routing cognitivo rigoroso all’interno di un sistema A2A, la spesa cambia drasticamente:
- L’Orchestratore: Utilizza il modello premium (Opus) esclusivamente per la pianificazione e il routing.
- Gli Esecutori: Delega le operazioni di estrazione dati e manipolazione stringhe a modelli commodity veloci (come DeepSeek V4, a [math]\$0.50[/math] per milione di token).
Con questa gerarchia, il costo medio crolla a [math]\$0.12[/math] per task. L’architettura distribuita non si limita a separare le competenze software: abbatte il costo computazionale del 95%.
| Modello | Costo per Milione di Token | Ruolo | Costo per Task (3 iterazioni) |
|---|---|---|---|
| Claude Opus (Premium) | [math]\$15.00[/math] | Orchestratore + Worker | [math]\$2.40[/math] |
| Claude Opus (Orchestratore) + DeepSeek V4 (Worker) | [math]\$15.00[/math] + [math]\$0.50[/math] | Routing cognitivo | [math]\$0.12[/math] |
Un agente aziendale pronto per la produzione deve dimostrare non solo di saper risolvere un problema, ma di saperlo fare garantendo un ROI positivo tra il costo computazionale speso e il tempo umano risparmiato. La vera maestria nell’AI agentica oggi consiste nel sapere esattamente dove fermarsi nella scala dell’autonomia.
AI generativa, agenti intelligenti e carriere nell’AI Engineering
👉Quale AI scegliere nel 2026? Confronto tra ChatGPT, Claude, Gemini e modelli open source
👉LangChain e Mistral AI: crea un assistente conversazionale in Python
👉CrewAI e Risk Management: come funziona l’AI multi-agente
👉Come diventare Junior AI Engineer: cosa chiedono davvero le aziende
👉L’architettura dell’ingresso: perché la vera AI si forgia oltre i confini del semplice stage







