Ciao a tutti, Emma qui di agent101.net!
Siamo a marzo 2026 e, se siete come me, avrete probabilmente sentito parlare del buzz riguardante gli agenti IA che stanno diventando più intelligenti, più capaci e, francamente, un po’ più intimidatori all’inizio. Solo pochi anni fa, eravamo tutti incantati dai LLM che scrivevano poesie; ora praticamente gestiscono piccole imprese per noi. Il ritmo è pazzesco, non è vero?
Oggi voglio affrontare qualcosa che mi frulla nella testa e, a giudicare dalla mia casella di posta, anche nella vostra: come andare oltre il *parlare* con un IA e farla realmente *fare cose* per voi, in modo ripetuto, senza doverla monitorare. In particolare, esploreremo la creazione di un agente IA personale super semplice utilizzando uno strumento che forse avete già sulla vostra macchina: uno script Python e un po’ di aiuto dall’OpenAI Assistant API. Pensatela come a un piccolo lavoro mirato per la vostra IA – come essere il vostro riassuntore personale di articoli su un argomento specifico.
Perché questo punto di vista specifico? Perché le panoramiche generiche su “cos’è un agente IA” sono ovunque. Ciò che è più difficile da trovare è una guida pratica e senza fronzoli che vi porti da zero a un agente funzionante senza bisogno di un dottorato in informatica. Ricordo le mie frustrazioni nel cercare di mettere insieme tutto questo, avendo la sensazione di dover comprendere ogni sfumatura dell’ingegneria delle query e delle chiamate API prima di poter anche solo far inviare un aggiornamento meteo da un bot. Avvertimento: non ne avete bisogno. Costruiremo qualcosa di piccolo, utile e, soprattutto, *comprensibile*, affinché possiate basarvi su di esso.
Il Mio Momento Aha! Personale con i Riassunti Gestiti da Agenti
Lasciate che vi racconti una piccola storia. Da un po’ di tempo sto cercando di tenere il passo con la quantità incredibile di notizie e ricerche che escono sulla sicurezza e sull’etica dell’IA. È cruciale per il mio lavoro qui, ma anche, francamente, solo per capire il futuro che stiamo costruendo. Passavo ore a setacciare articoli, documenti di ricerca e post di blog. Il mio cervello era in ebollizione durante l’ora di pranzo.
Ho provato i feed RSS, le app di lettura più tardi, ho persino assunto un’assistente virtuale per un po’. Niente sembra davvero all’altezza. L’assistente virtuale era costoso e le app non erano altro che aggregatori; dovevo ancora fare il grosso del lavoro di lettura e digestione. Poi, mi è venuto in mente: cosa succederebbe se potessi addestrare un piccolo agente IA a fare *proprio quest’unica cosa*? Trovare articoli sulla sicurezza dell’IA, leggerli e riassumere i punti chiave per me, quotidianamente?
È allora che ho cominciato a giocare con l’OpenAI Assistant API. È progettata precisamente per questo tipo di comportamento “agenteico” – dare a un IA un insieme di istruzioni, strumenti e una memoria, e lasciarla fare. Il mio primo tentativo è stato un disastro, onestamente. Ho cercato di renderlo troppo complesso, assegnandogli troppe responsabilità. Era come cercare di insegnare a un bambino a pilotare un aereo prima ancora che potesse camminare. Ma poi, ho semplificato. Ho limitato il suo campo d’azione a *soltanto* riassumere articoli da una lista che ho fornito, concentrandomi sugli argomenti chiave e sui potenziali bias.
La differenza è stata incredibile. All’improvviso, ricevevo riassunti concisi e pertinenti. Non era perfetto – a volte mancavano delle sfumature, a volte si concentrava su qualcosa che non mi interessava – ma era un enorme miglioramento rispetto al mio metodo precedente. E la parte migliore? Ho capito *come* funzionava, il che mi ha dato la fiducia di modificarlo e ampliare le sue capacità gradualmente. È questo il sentimento che voglio che proviate oggi.
Perché l’OpenAI Assistant API per i Principianti?
Ci sono tonnellate di framework per creare agenti IA – LangChain, AutoGen, CrewAI, per citarne alcuni. Sono potenti, senza dubbio. Ma per un vero principiante, può sembrare come cercare di bere da un idrante. L’OpenAI Assistant API, invece, riduce gran parte della complessità. Definite un “Assistente” con uno scopo, un modello e alcuni “strumenti”, poi interagite con esso tramite “Threads” e “Messaggi”. Gestisce la cronologia delle conversazioni, le chiamate agli strumenti e persino un po’ di ragionamento di base per voi.
È come impostare un mini-lavoratore IA specializzato. Gli date una descrizione del lavoro (le sue istruzioni), alcuni manuali di riferimento (file di conoscenza) e una cassetta degli attrezzi (funzioni che può chiamare). Poi, semplicemente, gli assegnate dei compiti.
La Nostra Missione Oggi: Un Agente Riassuntore di Articoli Web Semplice
Creeremo uno script Python che:
- Crea un Assistente OpenAI.
- Gli dà un’istruzione specifica: articoli web.
- Fornisce uno “strumento” per recuperare il contenuto di una pagina web.
- Prende un URL da parte vostra, lo trasmette all’agente e recupera un riassunto.
Questo agente non andrà a “navigare” sul web da solo né deciderà nulla. Voi gli fornirete il link. Questo mantiene le cose semplici e controllabili, perfetto per comprendere i meccanismi di base.
Prerequisiti (Non Dimenticateli!)
- Python 3.8+ installato: Se non lo avete, una ricerca veloce su Google per “installare Python [il vostro OS]” vi porterà lì.
- Una chiave API OpenAI: Potete ottenerla dal sito della piattaforma OpenAI. Assicuratevi di avere dei crediti!
- Una conoscenza di base della riga di comando: Giusto abbastanza per eseguire uno script Python.
- Un editor di testo: VS Code, Sublime Text, anche Notepad andrà bene.
Passo 1: Configurare il Vostro Ambiente
Per prima cosa, prepariamo il nostro ambiente Python. Aprite il vostro terminale o prompt dei comandi.
# Crea una nuova directory per il nostro progetto
mkdir ai_summarizer_agent
cd ai_summarizer_agent
# Crea un ambiente virtuale (buona pratica!)
python -m venv venv
# Attiva l'ambiente virtuale
# Su macOS/Linux:
source venv/bin/activate
# Su Windows:
venv\Scripts\activate
# Installa le librerie necessarie
pip install openai beautifulsoup4 requests
Cosa abbiamo installato?
openai: Questa è la libreria ufficiale per interagire con le API di OpenAI.beautifulsoup4: Una libreria fantastica per analizzare l’HTML. La useremo per estrarre testo dalle pagine web.requests: Per fare richieste HTTP, ovvero per scaricare il contenuto della pagina web.
Successivamente, create un file chiamato .env nella vostra directory ai_summarizer_agent e aggiungete la vostra chiave API:
OPENAI_API_KEY="YOUR_OPENAI_API_KEY_HERE"
Sostituite YOUR_OPENAI_API_KEY_HERE con la vostra chiave reale. Questo mantiene la vostra chiave al sicuro e fuori dal codice principale, il che è importante per la sicurezza!
Passo 2: Creazione del Nostro Strumento di Recupero Web
Il nostro agente IA ha bisogno di un modo per “leggere” una pagina web. Poiché i LLM non possono navigare nativamente su internet (a meno che non stiate utilizzando un modello particolare con capacità di navigazione, il che aggiungerebbe una complessità che vogliamo evitare per ora), gli forniremo uno strumento personalizzato. Questo strumento sarà una semplice funzione Python che prende un URL, recupera il suo contenuto e estrae il testo principale.
Create un nuovo file chiamato tools.py nella vostra directory di progetto:
import requests
from bs4 import BeautifulSoup
def fetch_web_article_content(url: str) -> str:
"""
Recupera il contenuto principale di un articolo web da un'URL fornita.
"""
try:
response = requests.get(url, timeout=10)
response.raise_for_status() # Solleva un'eccezione per gli errori HTTP (4xx o 5xx)
soup = BeautifulSoup(response.text, 'html.parser')
# Tenta di trovare elementi di contenuto dell'articolo comuni
article_body = soup.find('article') or soup.find('main') or soup.find('div', class_='content')
if article_body:
paragraphs = article_body.find_all('p')
article_text = '\n'.join([p.get_text() for p in paragraphs])
else:
# Riserva se elementi specifici dell'articolo non vengono trovati
article_text = soup.get_text(separator='\n', strip=True)
# Pulizia di base e troncatura per evitare enormi ingressi
cleaned_text = ' '.join(article_text.split())
return cleaned_text[:30000] # Troncatura per evitare di superare i limiti di token
except requests.exceptions.RequestException as e:
return f"Errore durante il recupero dell'URL: {e}"
except Exception as e:
return f"Si è verificato un errore imprevisto: {e}"
if __name__ == '__main__':
# Testare lo strumento direttamente
test_url = "https://www.theverge.com/2024/3/20/24106575/nvidia-gputech-ai-chips-future-computing"
content = fetch_web_article_content(test_url)
print(f"--- Contenuto Recuperato (primi 500 caratteri) ---")
print(content[:500])
print(f"--- Lunghezza totale: {len(content)} ---")
Questa funzione fa alcune cose:
- Utilizza
requestsper scaricare l’HTML della pagina. - Utilizza
BeautifulSoupper analizzare l’HTML. - Tenta di trovare elementi dell’articolo comuni (come
<article>,<main>) per estrarre il testo pertinente. Se non riesce a trovarli, prende semplicemente tutto il testo visibile. - Pulisce un po’ il testo e lo tronca per evitare di inviare ingressi eccessivamente lunghi all’IA (cosa che costa di più e può raggiungere i limiti di token).
- Include una gestione degli errori per problemi di rete o URL errati.
Esegui python tools.py per testarlo con l’URL di esempio. Dovresti vedere una versione troncata del contenuto di un articolo stampata nella tua console.
Step 3: Creazione e Interazione con il Nostro Agente Riassuntore
Passiamo ora all’evento principale! Scriveremo lo script che metterà tutto insieme.
Crea un nuovo file chiamato summarizer_agent.py:
import os
import time
import json
from openai import OpenAI
from dotenv import load_dotenv
from tools import fetch_web_article_content # Importa il nostro strumento personalizzato
# Carica le variabili di ambiente (come la tua chiave API)
load_dotenv()
# Inizializza il client OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# Definisci il nostro schema di strumento per l'API Assistant
# Questo indica all'API Assistant come chiamare la nostra funzione fetch_web_article_content
web_fetch_tool = {
"type": "function",
"function": {
"name": "fetch_web_article_content",
"description": "Recupera il contenuto testuale principale da un'URL web fornita per il riassunto.",
"parameters": {
"type": "object",
"properties": {
"url": {"type": "string", "description": "L'URL dell'articolo web."},
},
"required": ["url"],
},
},
}
def create_or_retrieve_assistant(name="Agente Riassuntore di Articoli", model="gpt-4o"):
"""
Controlla se esiste già un assistente con il nome dato.
Se sì, lo recupera. Se no, ne crea uno nuovo.
"""
assistants = client.beta.assistants.list(order="desc", limit="20")
for assistant in assistants.data:
if assistant.name == name:
print(f"Assistente esistente trovato: {assistant.id}")
return assistant
print(f"Creazione di un nuovo assistente: {name}")
assistant = client.beta.assistants.create(
name=name,
instructions=(
"Sei un esperto nel riassumere articoli. Il tuo compito è recuperare il contenuto di un'URL web fornita "
"utilizzando lo strumento 'fetch_web_article_content', quindi riassumere l'articolo in modo conciso. "
"Concentrati sugli argomenti principali, le conclusioni chiave e i risultati. "
"Se il contenuto è troppo lungo o si verifica un errore, menzionalo nel tuo riassunto."
),
model=model,
tools=[web_fetch_tool],
)
print(f"Assistente creato con ID: {assistant.id}")
return assistant
def run_assistant_and_get_response(assistant_id, user_message, thread_id=None):
"""
Invia un messaggio all'assistente, esegue il thread e gestisce le chiamate agli strumenti.
Restituisce la risposta finale dell'assistente e l'ID del thread.
"""
if thread_id is None:
thread = client.beta.threads.create()
thread_id = thread.id
print(f"Nuovo thread creato: {thread_id}")
else:
print(f"Utilizzo del thread esistente: {thread_id}")
# Aggiungi il messaggio dell'utente al thread
client.beta.threads.messages.create(
thread_id=thread_id,
role="user",
content=user_message,
)
# Esegui l'assistente
run = client.beta.threads.runs.create(
thread_id=thread_id,
assistant_id=assistant_id,
)
# Controlla lo stato dell'esecuzione finché non è completata o richiede un'azione
while run.status in ['queued', 'in_progress', 'cancelling']:
time.sleep(1)
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run.id
)
if run.status == 'requires_action':
print("L'assistente richiede un'azione dallo strumento...")
tool_outputs = []
for tool_call in run.required_action.submit_tool_outputs.tool_calls:
if tool_call.function.name == "fetch_web_article_content":
url_to_fetch = json.loads(tool_call.function.arguments)["url"]
print(f"Chiamata allo strumento: fetch_web_article_content con l'URL: {url_to_fetch}")
# Esegui la nostra funzione Python locale
article_content = fetch_web_article_content(url_to_fetch)
tool_outputs.append({
"tool_call_id": tool_call.id,
"output": article_content,
})
# Se avessimo altri strumenti, li gestiremmo qui
# Invia i risultati degli strumenti all'assistente
run = client.beta.threads.runs.submit_tool_outputs(
thread_id=thread_id,
run_id=run.id,
tool_outputs=tool_outputs
)
# Controlla di nuovo la risposta finale
while run.status in ['queued', 'in_progress', 'cancelling']:
time.sleep(1)
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run.id
)
if run.status == 'completed':
messages = client.beta.threads.messages.list(
thread_id=thread_id,
order="asc" # Ottieni i messaggi in ordine cronologico
)
assistant_responses = []
for message in messages.data:
if message.role == 'assistant':
for content_block in message.content:
if content_block.type == 'text':
assistant_responses.append(content_block.text.value)
return "\n".join(assistant_responses), thread_id
else:
return f"Esecuzione completata con stato: {run.status}", thread_id
if __name__ == '__main__':
assistant = create_or_retrieve_assistant()
current_thread_id = None # Inizia senza thread, lasciare che la funzione ne crei uno
print("\n--- Agente Riassuntore di Articoli ---")
print("Digita un'URL o 'exit' per uscire.")
while True:
user_input = input("\nInserisci l'URL: ").strip()
if user_input.lower() == 'exit':
break
if not user_input.startswith("http"):
print("Per favore inserisci un'URL valida che inizi con http:// o https://")
continue
try:
print("Riassumendo l'articolo... Potrebbe richiedere un momento.")
response, current_thread_id = run_assistant_and_get_response(
assistant.id,
f"Per favore riassumi l'articolo trovato a questo URL: {user_input}",
current_thread_id # Passa l'ID del thread per mantenere il contesto della conversazione
)
print("\n--- Riassunto ---")
print(response)
print("-----------------")
except Exception as e:
print(f"Si è verificato un errore: {e}")
# Ripristina l'ID del thread nel caso di errore se vuoi ricominciare fresco la prossima volta
# current_thread_id = None
print("Uscita dall'agente riassuntore. Arrivederci!")
Analizziamo questo script:
web_fetch_tool
Questo dizionario descrive la nostra funzione fetch_web_article_content per l’API Assistant di OpenAI. Specifica il nome della funzione, una descrizione utile (cruciale per far sapere all’IA quando utilizzarla!), e i suoi parameters. L’IA utilizzerà questo schema per capire come chiamare la nostra funzione Python.
create_or_retrieve_assistant()
Questa funzione è astuta. Controlla prima se hai già creato un assistente chiamato “Agente Riassuntore di Articoli” sul tuo account OpenAI. Se sì, lo riutilizza, facendoti risparmiare chiamate API e mantenendo la tua configurazione pulita. Altrimenti, ne crea uno nuovo. Elementi importanti qui:
name: Un nome comprensibile per il tuo assistente.instructions: Questa è la “descrizione del lavoro” del tuo agente. Più sei chiaro e preciso qui, migliore sarà il funzionamento del tuo agente. Gli ho detto di concentrarsi sui punti chiave e di gestire gli errori.model: Sto usandogpt-4oqui per le sue capacità di ragionamento e richiamo degli strumenti. Potresti provaregpt-3.5-turboper un’opzione più economica e veloce, ma i risultati possono variare.tools=[web_fetch_tool]: Qui indichiamo all’assistente il nostro strumento di recupero web personalizzato.
run_assistant_and_get_response()
Questo è il ciclo principale di interazione. Esso:
- Gestisce i thread: Crea un nuovo thread di conversazione o continua un thread esistente (
thread_id). I thread sono il modo in cui l’API Assistant tiene traccia della cronologia delle conversazioni. - Aggiunge il messaggio dell’utente: Invia la tua richiesta di URL all’assistente nel thread.
- Esegue l’assistente: Inizia un'”esecuzione”, che è il processo di riflessione dell’assistente.
- Controlla lo stato: L’API Assistant è asincrona, quindi dobbiamo continuare a controllare il
run.statusfino a quando non è completato o richiede il nostro input. - Gestisce
requires_action: Questa è la parte magica! Se l’assistente decide che deve utilizzare uno strumento (come il nostrofetch_web_article_content), lo stato dell’esecuzione diventeràrequires_action. Il nostro script analizza quindi la chiamata allo strumento, esegue la nostra funzione Python *locale* (fetch_web_article_content) e restituisce l’output all’assistente. - Recupera la risposta: Una volta che l’esecuzione è
completata, recupera tutti i messaggi dell’assistente e restituisce l’ultimo.
if __name__ == '__main__':
Questo blocco rende lo script interattivo. Ti invita costantemente a inserire un URL, chiama il nostro agente e stampa il riepilogo. Mantiene anche il current_thread_id in modo che il tuo agente ricordi le interazioni precedenti (anche se per questo compito di riepilogo specifico non è strettamente necessario, è una buona pratica per agenti più complessi).
Passaggio 4: Esegui il tuo Agente Riepilogatore!
Ora, salva i due file (tools.py e summarizer_agent.py) nella stessa directory. Assicurati che il tuo ambiente virtuale sia attivato.
# Assicurati di essere nella directory ai_summarizer_agent
# e che il tuo venv sia attivato
python summarizer_agent.py
Alla prima esecuzione, vedrai che crea l’assistente. Potrebbe richiedere alcuni secondi. Le esecuzioni successive saranno più rapide poiché recupera l’assistente esistente.
Successivamente, ti chiederà un URL. Prova a incollare un link di un articolo, come:
https://www.nytimes.com/2024/03/23/technology/ai-agents-google-openai.html
O qualsiasi altro articolo che ti interessi. Guarda come elabora, chiama lo strumento e infine produce un riepilogo!
Potresti notare un ritardo mentre l’assistente lavora e compie le sue chiamate agli strumenti. È normale. Il ciclo di verifica attende che i server di OpenAI elaborino la richiesta, chiamino lo strumento e continuino il ragionamento.
Conclusioni e Passi Successivi
Congratulazioni! Hai appena costruito il tuo primo agente IA semplice utilizzando l’API Assistant di OpenAI e strumenti personalizzati. Ecco cosa dovresti ricordare da questo e come puoi ampliarlo:
-
Inizia Piccolo e Mirato:
Questo è il mio principale consiglio. Invece di cercare di costruire un’IA versatile che faccia tutto, scegli un compito specifico e ripetibile. Il nostro riepilogatore è un esempio perfetto. Questo rende il debug più facile e ti aiuta a comprendere i meccanismi fondamentali.
-
Le Istruzioni sono Fondamentali:
La qualità dei risultati del tuo agente è direttamente proporzionale alla chiarezza e specificità delle sue istruzioni. Sperimenta con diverse formulazioni. Dì all’agente cosa deve dare priorità, quale tono utilizzare e come gestire casi particolari.
Strumenti per gli Agenti:
Gli agenti IA sono potenti non solo grazie al loro “cervello” (il LLM) ma anche grazie alle “mani” che fornisci loro (gli strumenti). Il nostro strumento fetch_web_article_content ha ampliato le capacità dell’IA oltre la semplice generazione di testo. Pensa ad altri strumenti che potresti creare: scrivere in un file, inviare un’email, interrogare un database, cercare una base di conoscenza specifica.
La gestione degli errori è un tuo alleato:
I dati del mondo reale sono disordinati. I siti web vanno giù, le API restituiscono errori. Nota come abbiamo aggiunto blocchi try-except nella nostra funzione fetch_web_article_content. Il tuo agente deve gestire queste situazioni con delicatezza, altrimenti semplicemente si bloccherà. Dì al tuo agente nelle sue istruzioni cosa deve fare se uno strumento fallisce.
Esplora e sperimenta:
- Aggiungi più strumenti: Il tuo agente potrebbe anche cercare un database specifico di articoli di ricerca? Potrebbe salvare i riepiloghi in un file di testo?
- Affina le istruzioni: Chiedigli di mirare a un pubblico specifico (ad esempio, “riassumere per un bambino di 10 anni”, o “riassumere concentrandosi sulle implicazioni economiche”).
- Aggiungi memoria (oltre al thread): La nostra configurazione attuale utilizza il thread per la memoria. Per agenti più persistenti, potresti voler salvare la cronologia delle conversazioni o fatti chiave in un database.
- Esecuzioni programmate: Invece di incollare manualmente URL, potresti collegare questo a un feed RSS e fargli riassumere nuovi articoli ogni giorno?
Questo è solo l’inizio del tuo percorso per costruire agenti IA. I principi che abbiamo utilizzato oggi – definire uno scopo chiaro, fornire strumenti e iterare sulle istruzioni – si applicano a sistemi di agenti molto più complessi. Ora hai un esempio tangibile e funzionante che hai creato tu stesso. Vai e crea!
Se stai costruendo qualcosa di interessante con questo, o se incontri difficoltà, contattami su Twitter o lascia un commento qui sotto. Mi piacerebbe saperne di più!
Alla prossima,
Emma Walsh
agent101.net
Articoli Correlati
- Gli Agenti IA possono migliorare il servizio clienti
- Piattaforme Low-Code per la creazione di agenti IA
- Costruire un Agente di Ricerca OpenClaw
🕒 Published: