Creare un agente IA locale in Python con LangChain e Ollama
Un agente IA locale in Python con LangChain e Ollama non è semplicemente un chatbot: è un programma che decide da solo quando chiamare una funzione, leggere un file o eseguire più passaggi in sequenza per rispondere. Questa guida realizza passo dopo passo un agente funzionante in una ventina di minuti, con un modello Qwen 3.5 9B che gira interamente sul tuo computer. Zero chiavi API, zero dati inviati a terzi.
#Perché un agente IA locale in Python?
Un agente, nel senso di LangChain, è un semplice ciclo: il LLM riceve una domanda e la lista dei suoi strumenti, sceglie di chiamarne uno (oppure no), legge il risultato e ricomincia finché non può rispondere. Tutto il meccanismo di "decisione" si basa sulla capacità del modello di generare una chiamata strutturata a uno strumento.
Farlo in locale, con Ollama, cambia due cose concrete: i tuoi dati non escono mai dalla macchina e ogni chiamata costa zero euro. È la differenza tra creare prototipi con OpenAI e ritrovarsi una fattura di 50 € a fine settimana, e iterare senza badare al numero di chiamate.
- Privacy
- I file letti dall'agente (contratti, codice proprietario, note mediche) non escono dal computer. Nessun DPA da firmare, nessun trasferimento al di fuori dell'UE.
- Costo marginale nullo
- Una volta scaricato il modello, puoi iterare centinaia di volte al giorno senza che la fattura aumenti.
- Riproducibilità
- Fissi la versione esatta del modello (qwen3.5:9b, granite4.2:8b, ecc.). Nessun drift silenzioso come con gpt-4o-2024-11-20 che diventa un'altra cosa un mese dopo.
- Latenza prevedibile
- Nessun viaggio di andata e ritorno sulla rete. Su una GPU adeguata, il primo token arriva in meno di un secondo.
#Prerequisiti
Questa guida ti porta al modello. Il kit ti porta al copilota che scrive codice nel tuo editor.
- Spazio online a vita
- PDF + file
- Aggiornamenti a vita
- Python 3.10+
- LangChain non è più testato su 3.9. Verifica con python --version.
- Ollama installato e avviato
- Deve essere in ascolto su http://localhost:11434. Consultare le guide di installazione di Ollama (Windows, macOS, Linux) se non è già stato installato e avviato.
- Un modello che sa chiamare strumenti
- Non tutti i LLM ne sono capaci. Qwen 3.5, Granite 4.2, Gemma 4, Devstral e GLM 4.7 Flash supportano nativamente il tool calling. Evita i modelli ormai obsoleti (Llama 2/3, Qwen 2.5, Mistral 7B).
- Hardware
- Qwen 3.5 9B Q4 occupa circa 6,6 GB di VRAM. Una GPU da 8 GB (RTX 3060, 4060) basta, una da 12 GB (4070) offre un margine. Su Mac, considera 16 GB di memoria unificata per avere un po' di respiro.
#1. Inizializzare il progetto Python
Un ambiente virtuale, tre pacchetti e basta. Evitiamo di installare LangChain nell'ambiente Python di sistema: cambia rapidamente e ingombra l'ambiente.
- langchain
- Il cuore: astrazioni dei prompt, degli strumenti, dei messaggi.
- langchain-ollama
- Integrazione ufficiale Ollama. Mantenuta dal team LangChain dal 2024.
- langgraph
- Per il ciclo degli agenti. È il motore consigliato oggi, più stabile dei vecchi AgentExecutor.
#2. Collegare Ollama da Python
Prima di creare un agente, si verifica che si stia effettivamente comunicando con il modello. Scarica il modello se non l'hai già fatto, poi prova la chiamata più semplice possibile.
Il download è di circa 6,6 GB in Q4_K_M (la quantizzazione predefinita di Ollama). Una volta installato il modello, crea il primo script:
Se vedi una frase coerente, la connessione Python ↔ Ollama funziona. Se ottieni una ConnectionError, verifica che Ollama sia in esecuzione (ollama ps deve elencare un servizio attivo).
#3. Definire gli strumenti dell'agente
Un tool di LangChain è semplicemente una funzione Python decorata con @tool. La docstring diventa la descrizione che vede il LLM — il modello la usa per decidere quando chiamare il tool. Sii preciso: una docstring vaga genera chiamate casuali.
Creeremo due strumenti rappresentativi: un valutatore di espressioni aritmetiche e un lettore di file.
Tre regole per strumenti che il modello usa correttamente:
- Nome esplicito
- calculer anziché process, lire_fichier anziché get. Il LLM sceglie innanzitutto in base al nome.
- Docstring dettagliata
- Descrivi cosa fa lo strumento, quali input si aspetta e cosa restituisce. Le annotazioni di tipo Python vengono lette da LangChain ed esposte al modello.
- Restituire una stringa
- Sempre. Se la funzione restituisce un dict o un oggetto, LangChain lo serializza, ma il risultato è meno leggibile per il modello.
#4. Assemblare l'agente
Abbiamo un LLM, abbiamo degli strumenti. La funzione create_react_agent di langgraph collega i due e gestisce il ciclo: finché il modello vuole chiamare strumenti, continuiamo; quando risponde con del testo, ci fermiamo.
Crea un piccolo file notes.txt accanto per testare:
#5. Eseguire e osservare il ciclo
Dovresti vedere una risposta che contiene sia il risultato del calcolo (7 006 652) sia un riassunto del file. Ma è più istruttivo vedere cosa accade durante l'esecuzione. Aggiungi questa modalità verbose per seguire il ciclo passo passo:
Osserverai la sequenza tipica di un agente: il modello genera una chiamata a calculer, riceve il risultato, genera una chiamata a lire_fichier, riceve il contenuto e poi genera la risposta finale. Tre iterazioni per una sola domanda dell'utente.
#Suggerimenti e risoluzione dei problemi
- Contesto troppo breve
- Per impostazione predefinita, Ollama tronca a 2048 token. Se il tuo agente esegue più strumenti in sequenza, questo limite viene superato rapidamente. Imposta num_ctx=8192 in ChatOllama(model="...", num_ctx=8192).
- Modello che inventa strumenti
- Se l'agente inventa nomi di funzioni, abbassa la temperatura a 0 e riformula il prompt di sistema elencando esplicitamente gli strumenti disponibili.
- Loop infinito
- Imposta un limite: create_react_agent(..., recursion_limit=10). Superato questo limite, l'agente si arresta correttamente.
- Latenza troppo alta
- Su CPU, un 9B fa 5-10 tok/s. Passa a qwen3.5:4b (3,4 GB VRAM, 30+ tok/s su GPU modesta) se la qualità rimane accettabile per il tuo caso.
- Errore "context length exceeded"
- Il riassunto di un file lungo supera num_ctx. Aggiungi uno strumento intermedio che suddivida il file in blocchi oppure aumenta num_ctx fino a 32768 se la tua VRAM lo permette.
#Per approfondire
Hai un agente che calcola, legge, ragiona localmente. Tre direzioni naturali per approfondire:
- Dargli accesso ai tuoi documenti
- Collegare l'agente a un database vettoriale affinché possa rispondere sulla base di un corpus interno — è esattamente l'argomento della guida introduttiva al RAG locale.
- Lavorare dalla CLI per programmare
- Aider è un agente di sviluppo che modifica direttamente i tuoi file dal terminale. Puoi collegarlo allo stesso Ollama e sfruttare Qwen3-Coder 30B o Devstral per modificare i file con assistenza.
- Regolare la quantizzazione del modello
- Se trovi Qwen 3.5 9B Q4 troppo lento o appena sufficiente in termini di qualità, la guida alla quantizzazione spiega quando passare a Q5_K_M o scegliere un modello più piccolo.
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.