Cosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti eseguibile
Un agente AI fa molto più che rispondere. Prende un obiettivo, sceglie le azioni, controlla i risultati e va avanti. Scopri cosa c’è dentro uno, esegui un piccolo ciclo in Python e comprendi i rischi prima di fidarti di uno.
- Un agente AI è tipicamente un modello linguistico che funziona in loop, con strumenti e un obiettivo.
- Il ciclo è semplice: decidi, agisci, osserva il risultato e ripeti fino alla fine.
- Il modello suggerisce solo azioni. Il tuo codice li esegue, ed è qui che applichi le regole.
- Gli agenti possono utilizzare in modo improprio o in loop gli strumenti, quindi imposta limiti di passaggi e richiedi l’approvazione per azioni rischiose.
Chiedi a un chatbot di un ordine in ritardo e ti darà qualche consiglio. Chiedi a un agente AI e lui potrà cercare l’ordine, verificare il ritardo, applicare un voucher e riferire. La differenza è che un agente può intraprendere azioni e reagire a ciò che accade, invece di produrre una sola risposta.
Il termine viene esteso nel marketing, quindi questa guida si concentra su come funzionano effettivamente questi sistemi. Per renderlo concreto, abbiamo creato un piccolo loop agente in Python 3.13 e lo abbiamo eseguito, e l’output seguente proviene da quelle esecuzioni. Il nostro “modello” è una funzione basata su script, non un vero modello di intelligenza artificiale, in modo che il ciclo possa essere eseguito e testato da chiunque. Mostra la struttura di controllo, non l’intelligenza. Nuovo alle basi? Leggi prima cos’è un modello linguistico ampio.
Cos’è un agente AI?
Non esiste una definizione unica concordata. Nella pratica attuale, un agente AI è un software che persegue un obiettivo decidendo ripetutamente cosa fare dopo, utilizzando strumenti per agire sul mondo e adattandosi in base ai risultati. Di solito, il processo decisionale deriva da un ampio modello linguistico.
Pensa alla differenza tra una persona che dà indicazioni e una persona che fa la commissione. I primi rispondono una volta. Il secondo esce, trova il negozio chiuso, ne prova un altro e torna solo a lavoro finito.
Chatbot, flusso di lavoro o agente?
| Digitare | Chi decide i passaggi? | Può agire? | Esempio |
|---|---|---|---|
| Chatbot | L’utente guida ogni turno | Di solito no | Risponde alle domande dal testo |
| Flusso di lavoro fisso | Lo sviluppatore, in anticipo | Sì, su percorsi prestabiliti | Riepiloga ciascun biglietto, quindi instradalo |
| Agente dell’intelligenza artificiale | Il modello, in fase di esecuzione | Sì, entro i limiti | Esamina e risolve un ticket |
Questi esistono su uno spettro e molti sistemi utili sono un mix. La domanda chiave è quanto del percorso viene deciso in fase di esecuzione.
Cosa c’è dentro un agente
| Parte | Ruolo |
|---|---|
| Modello | Decide il passo successivo, in base all’obiettivo e a quanto accaduto finora |
| Istruzioni | L’obiettivo, le regole e i limiti che dovrebbe seguire |
| Strumenti | Funzioni che può richiedere, come la ricerca o la chiamata di un’API |
| Memoria | Ciò che sa dai passaggi precedenti o dalle sessioni precedenti |
| Ciclo di controllo | Codice ordinario che esegue strumenti e impone limiti |
Il ciclo dell’agente
- Decidi. Il modello guarda l’obiettivo e la storia e sceglie un’azione o decide che è terminata.
- Act. Il tuo codice esegue lo strumento richiesto.
- Osserva. Il risultato viene aggiunto alla cronologia.
- Ripeti finché non viene raggiunto l’obiettivo o un limite.
Questo è il nocciolo della maggior parte degli agenti. La sofisticazione risiede principalmente nel modello, negli strumenti e nelle garanzie attorno a questo circuito.
Un ciclo che puoi eseguire
Il nostro piccolo agente gestisce gli ordini in ritardo. Ha due strumenti e uno di questi necessita dell’approvazione umana perché costa denaro:
ORDERS = {
"A100": {"status": "delayed", "days_late": 6},
"B200": {"status": "shipped", "days_late": 0},
}
def get_order(order_id):
return ORDERS.get(order_id, {"error": "order not found"})
def issue_voucher(order_id, amount):
return {"voucher": f"V-{order_id}", "amount": amount}
TOOLS = {"get_order": get_order, "issue_voucher": issue_voucher}
NEEDS_APPROVAL = {"issue_voucher"}
Ed ecco il loop stesso. È un codice ordinario e ogni regola di sicurezza risiede qui piuttosto che nel modello:
def run_agent(goal, model, approve, max_steps=5):
history = []
for step in range(1, max_steps + 1):
decision = model(goal, history)
if "finish" in decision:
return decision["finish"]
name, args = decision["tool"], decision["args"]
if name in NEEDS_APPROVAL and not approve(name, args):
result = {"denied": True}
else:
result = TOOLS[name](**args)
history.append({"tool": name, "result": result})
return None # stopped: step limit reached
Per utilizzare un modello reale, sostituiresti la funzione model con una chiamata a un’API LLM, passandole l’obiettivo, la cronologia e le descrizioni dei tuoi strumenti. Il ciclo rimane quasi lo stesso.
Cosa è successo durante le nostre corse
Abbiamo provato cinque situazioni con la funzione decisionale basata su script e registrato ogni passaggio.
Un ordine in ritardo, con il buono approvato
step 1: get_order({'order_id': 'A100'}) -> {'status': 'delayed', 'days_late': 6}
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'voucher': 'V-A100', 'amount': 200}
step 3: finish -> Sorry for the delay. Voucher V-A100 issued.
Ogni passaggio utilizzava il risultato di quello precedente. Il voucher è stato preso in considerazione solo una volta confermato il ritardo.
Lo stesso ordine, con l’approvazione negata
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'denied': True}
step 3: finish -> Your order is late. A person will review compensation.
L’umano ha detto di no, lo strumento non è mai stato eseguito e l’agente ha adattato la sua risposta.
Un ordine sconosciuto
step 1: get_order({'order_id': 'Z999'}) -> {'error': 'order not found'}
step 2: finish -> I could not find that order.
Fornire agli strumenti messaggi di errore chiari aiuta. Un vero modello può leggerli e rispondere in modo sensato, piuttosto che indovinare.
Un modello che si incastra
Abbiamo anche inserito una funzione decisionale errata che ripeteva la stessa azione per sempre:
step 1: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 2: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 3: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
stopped: step limit reached
Gli agenti possono davvero cadere in circuiti come questo e ogni passaggio con un modello reale costa denaro. Senza max_steps, questo non sarebbe mai finito.
Come funzionano gli strumenti
Questa è la parte più fraintesa. Un modello linguistico non può eseguire nulla da solo. Produce un testo strutturato che indica quale strumento desidera, con quali argomenti. Il tuo codice decide se eseguirlo. Ecco perché il ciclo è il posto giusto per autorizzazioni, convalida e registrazione.
I fornitori di modelli offrono strumenti o funzioni che lo richiedono. Il Model Context Protocol (MCP) è uno standard aperto per connettere modelli a strumenti e dati e il nostro articolo su Playwright MCP ne mostra un utilizzo. Scrivi nomi e descrizioni chiari degli strumenti, perché il modello fa affidamento su di essi per scegliere correttamente.
Suggerimento: inizia con strumenti di sola lettura. Un agente che può solo cercare informazioni è molto meno pericoloso di uno che può inviare, eliminare o pagare. Aggiungi l’accesso in scrittura uno strumento alla volta, dopo aver visto come si comporta.
Memoria
| Digitare | Tiene | Esempio |
|---|---|---|
| A breve termine | La cronologia dell’attività corrente | L’elenco history nel nostro ciclo |
| A lungo termine | Fatti conservati tra una sessione e l’altra | Preferenze dell’utente in un database |
| Conoscenza | Documenti che vengono recuperati quando necessario | RAG utilizzando incorporamenti |
Le attività lunghe possono superare la finestra di contesto di un modello, quindi i sistemi spesso riepilogano i passaggi più vecchi. I riepiloghi possono perdere dettagli, il che è uno dei motivi per cui gli agenti con esecuzione prolungata potrebbero deviare dal percorso.
Sistemi multiagente
Alcuni sistemi dividono il lavoro tra diversi agenti specializzati, come un pianificatore, un ricercatore e un revisore. Questo può aiutare con compiti di grandi dimensioni che si dividono ordinatamente. Inoltre aggiunge costi, più modi per fallire e un debug più difficile. Prova prima un singolo agente con buoni strumenti e dividilo solo quando c’è un motivo chiaro.
Rischi e limiti
- Azioni sbagliate. L’errore di un chatbot è una brutta frase. L’errore di un agente potrebbe essere un’e-mail inviata o un record eliminato.
- Iniezione rapida. Una pagina web o un’e-mail letta dall’agente potrebbe contenere istruzioni nascoste. Tratta tutti gli output dello strumento come dati non attendibili, non come comandi.
- Errori cumulativi. Un piccolo errore nella fase iniziale può indirizzare ogni passaggio successivo nella direzione sbagliata.
- Costo e latenza. Ogni passaggio può essere un’altra chiamata al modello, quindi un’attività potrebbe essere molto più lenta e costosa di un singolo prompt.
- Incoerenza. Lo stesso obiettivo può prendere un percorso diverso in ogni esecuzione, il che rende i test più difficili.
- Responsabilità. Le persone rimangono responsabili di ciò che fa il sistema, quindi tieni i registri.
Guardrail che contano
- Privilegio minimo. Fornisci a ciascun agente solo gli strumenti e l’accesso di cui ha bisogno.
- Approvazione umana per qualsiasi cosa costosa, irreversibile o esterna, come fa la nostra demo.
- Limiti rigidi su passaggi, tempo e spesa.
- Convalida gli input dello strumento nel codice e non fare affidamento sulle istruzioni del modello.
- Registra ogni passaggio, in modo da poter vedere perché è successo qualcosa. Vedi monitoraggio vs osservabilità.
- Test con scenari reali, compresi i guasti. Controllare i risultati finali e le risposte individuali. La nostra guida alle best practice per gli agenti AI va oltre l’implementazione.
Quando utilizzare un agente
| Usa un agente quando | Usa qualcosa di più semplice quando |
|---|---|
| I passaggi non possono essere conosciuti in anticipo | I passaggi sono sempre gli stessi |
| L’attività richiede diversi strumenti | Un prompt può fare il lavoro |
| I risultati cambiano ciò che accade dopo | Un flusso di lavoro fisso funzionerebbe |
| Gli errori sono economici o rivedibili | Gli errori sono costosi e difficili da correggere |
Gli assistenti di codifica sono uno degli esempi più maturi oggi, poiché possono leggere file, eseguire test, vedere gli errori e riprovare, con un essere umano che rivede il risultato. Una suite di test dà loro un chiaro segnale di successo. La nostra guida al prompt engineering si applica anche alla scrittura di istruzioni valide per l’agente. Inizia con la cosa più semplice che potrebbe funzionare, perché una singola chiamata ben motivata spesso batte un agente complicato.
Considerazioni finali
Un agente AI è meno misterioso di quanto sembri: un modello, alcuni strumenti e un circuito con limiti. La parte difficile è la fiducia, non il codice. Per scoprire come si comportano, prendi il nostro piccolo loop, collegalo a un modello reale con strumenti di sola lettura e osserva i log mentre funziona. Presto vedrai dove brilla e dove ha bisogno di un essere umano.
Domande frequenti
Cos’è un agente AI in parole semplici?
È un software che lavora per raggiungere un obiettivo scegliendo azioni, utilizzando strumenti e controllando i risultati in un ciclo, anziché fornire una sola risposta.
Qual è la differenza tra un chatbot e un agente AI?
Un chatbot risponde principalmente a ciascun messaggio. Un agente può pianificare diversi passaggi, richiamare strumenti e cambiare rotta in base a ciò che accade lungo il percorso.
Gli agenti IA necessitano di un modello linguistico ampio?
Quelli più moderni utilizzano un LLM per le decisioni, sebbene l’idea più ampia di agenti software sia più vecchia e possa utilizzare regole o altri metodi di intelligenza artificiale.
Gli agenti IA sono sicuri?
Esse comportano rischi reali, tra cui azioni sbagliate e iniezioni tempestive. Limita le loro autorizzazioni, richiedi l’approvazione per passaggi rischiosi, imposta limiti rigidi e registra tutto.
Un agente AI può sostituire uno sviluppatore o un tester?
Non oggi in generale. Possono gestire molti compiti ben definiti, ma le persone devono comunque fissare obiettivi, rivedere i risultati e assumersi la responsabilità del risultato.
Continua a imparare
Hai bisogno di aiuto con test, WordPress o SEO?
Aiutiamo i team a fornire software migliore e a far crescere i loro siti. Raccontaci a cosa stai lavorando e ti suggeriremo chiaramente il prossimo passo.
Altre guide su test, intelligenza artificiale e sviluppo moderno
Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.
Spiegazione delle allucinazioni dell'intelligenza artificiale: perché i modelli linguistici inventano le cose e come ridurle
Spiegazione delle allucinazioni dell'intelligenza artificiale: cosa sono, perché i modelli linguistici le producono, tipi comuni, come ridurle con b…
Leggi l'articolo →DevOpsSpiegazione delle variabili d'ambiente: file .env, segreti e configurazione eseguiti correttamente
Variabili d'ambiente spiegate con esempi Python che abbiamo eseguito: lettura e impostazione, perché ogni valore è una stringa, file .env, ereditari…
Leggi l'articolo →Sviluppo softwareSpiegazione della limitazione della velocità API: algoritmi, intestazioni e gestione degli errori 429
La limitazione della velocità dell'API spiegata con una simulazione che abbiamo eseguito: bucket di token, finestra fissa, finestra scorrevole, risp…
Leggi l'articolo →Automazione dei testDerisione in Python: unittest.mock, patch e gli errori che fanno mentire i test
Mocking in Python con unittest.mock, testato: Mock e return_value, side_effect, patch dove viene utilizzato un nome, specifiche e autospec, date moc…
Leggi l'articolo →Test del softwareSpiegazione della copertura del codice: copertura di linea o di filiale e cosa significa realmente il 100%.
Copertura del codice spiegata con una vera esecuzione di cover.py: copertura di linea, ramo e condizione, lettura di un rapporto, perché la copertur…
Leggi l'articolo →Database e SQLDELETE vs TRUNCATE vs DROP in SQL: differenze, rollback e quando utilizzarli
DELETE vs TRUNCATE vs DROP spiegato con SQL testato: cosa rimuove, rollback, trigger, reimpostazione dell'identità, velocità e come differiscono Pos…
Leggi l'articolo →Database e SQLSpiegazione delle visualizzazioni SQL: crea, utilizza ed evita le insidie, con esempi
Viste SQL spiegate con le query che abbiamo eseguito: creazione di una vista, risultati in tempo reale, nascondere colonne, prestazioni, viste aggio…
Leggi l'articolo →Sviluppo softwareInterfaccia TypeScript e tipo: differenze reali, testate con il compilatore
Interfaccia TypeScript vs tipo, verificata con il vero compilatore: cosa possono fare entrambi, cosa può fare solo uno, fusione delle dichiarazioni,…
Leggi l'articolo →Sviluppo softwareSpiegazione di Python *args e **kwargs: funzioni flessibili con esempi chiari
Python *args e **kwargs spiegati con il codice che abbiamo eseguito: compressione e decompressione, ordine dei parametri, argomenti solo per parole …
Leggi l'articolo →Sviluppo softwareFunzioni Lambda Python: sintassi, usi reali e quando non usarli
Funzioni lambda Python spiegate con il codice che abbiamo eseguito: sintassi, ordinamento con chiave, mappa e filtro, chiusure, trap dell'associazio…
Leggi l'articolo →Intelligenza artificialeCosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti che puoi eseguire
Cosa sono gli agenti IA? Una semplice guida al ciclo dell'agente, agli strumenti, alla memoria e ai guardrail, con un piccolo ciclo Python che abbia…
Leggi l'articolo →DevOpsMonitoraggio vs osservabilità: la vera differenza, con log, metriche e tracce
Spiegazione del monitoraggio e dell'osservabilità: errori noti e sconosciuti, log, metriche e tracce, una procedura dettagliata sugli incidenti di p…
Leggi l'articolo →DevOpsVolumi Docker e montaggi di associazione: mantenere i dati del contenitore nel modo giusto
Volumi Docker e montaggi di collegamento spiegati: perché i dati del contenitore scompaiono, volumi denominati, montaggi di collegamento, tmpfs, ese…
Leggi l'articolo →Automazione dei testTDD vs BDD: differenze chiave, una caratteristica costruita in entrambi i modi e quando utilizzarli ciascuno
TDD vs BDD spiegato con una funzione di sconto costruita in entrambi i modi: refactoring rosso-verde con il codice che abbiamo eseguito, scenari "Da…
Leggi l'articolo →Sviluppo softwareGit merge vs rebase: differenze, esempi e quando usare ciascuno
Git merge vs rebase spiegato con output reale del log, una tabella di confronto, la regola d'oro del rebase e un flusso di lavoro sicuro per i team.
Leggi l'articolo →Sviluppo softwareList comprehension in Python: sintassi, esempi e quando evitarla
List comprehension in Python spiegata: sintassi, filtri, if-else, cicli annidati, tempi misurati e i casi in cui un normale ciclo for è meglio.
Leggi l'articolo →Database e SQLSQL JOIN spiegati con esempi (Inner, Left, Right, Full)
Capisci i JOIN SQL passo dopo passo con tabelle e query di esempio: INNER, LEFT, RIGHT, FULL, CROSS e SELF, con errori comuni e consigli sulle prest…
Leggi l'articolo →