Come impostare il logging con LangChain: un tutorial pratico passo dopo passo
Se lavori con LangChain, devi affinare il logging per assicurarti di catturare tutti i pezzi essenziali delle informazioni generate dalla tua applicazione. Ci stiamo preparando qui per impostare il logging con LangChain, una libreria che vanta 130.178 stelle su GitHub e ha mostrato una crescita notevole in popolarità. Se vuoi essere ascoltato tra tutto quel rumore, un sistema di logging ben strutturato è la tua migliore scommessa.
Prerequisiti
- Python 3.11+
- pip install langchain>=0.2.0
- Familiarità con i principi di programmazione Python
- Conoscenza di base della gestione dei log
Passo 1: Installazione di LangChain
Prima di tutto, facciamo partire LangChain. Se hai già la libreria installata, puoi saltare questo passo. Se non lo hai fatto, ti suggerisco di eseguire il comando di pip install qui sotto. Non vuoi conflitti di versione, fidati.
pip install langchain
Stiamo installando la versione 0.2.0 per garantire la compatibilità con la nostra configurazione di logging. Usa il seguente comando per verificare la tua installazione:
pip show langchain
Questo output dovrebbe confermare che LangChain è installato correttamente. Se incontri un errore Not Found, dai un’occhiata al tuo setup di Python, specialmente alle variabili PATH. Una comune fonte di mal di testa.
Passo 2: Configurazione di base del logging
Ora che abbiamo LangChain installato, configuriamo il logging di base. Il livello di logging predefinito è WARNING, che non è ideale per lo sviluppo. Vogliamo dettagli; abbiamo bisogno di livelli DEBUG per questo. Ecco come possiamo farlo:
import logging
# Configurazione di base del logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
Questo blocco di logging imposta il livello di logging su DEBUG e formatta i messaggi di log per mostrare timestamp, livello di severità e contenuto del messaggio. Se non stai vedendo abbastanza output, prova livelli di log diversi come INFO per ridurre la verbosità.
Passo 3: Integrazione dei componenti LangChain
Assumendo che tu abbia impostato una pipeline LangChain, integriamo i tuoi componenti esistenti con il framework di logging. Ecco un modo semplice per avvolgere i tuoi componenti LangChain con il logging:
from langchain import LLMChain, PromptTemplate
# Definisci una funzione di log per un LLMChain
def create_llm_chain(prompt_template):
logging.info('Creando LLMChain con il modello di prompt fornito.')
llm_chain = LLMChain(prompt=PromptTemplate.from_template(prompt_template))
logging.debug(f'LLMChain creato: {llm_chain}')
return llm_chain
# Crea la tua LLM Chain
chain = create_llm_chain("What is LangChain?")
Quando crei il tuo LLMChain, prima registriamo un messaggio di livello INFO, utile per tenere traccia delle attività di creazione della catena senza troppi dettagli. Il log DEBUG accompagnato fornirà una rappresentazione completa della catena per approfondimenti più dettagliati se necessario. Non sottovalutare questo; registrare gli stati delle catene può salvarti quando diagnostichi problemi in seguito.
Passo 4: Logging degli errori
Aggiungiamo il logging degli errori. Questo è cruciale quando le cose vanno male. Catturare le eccezioni con il logging ti consente di monitorare problemi frequenti e stabilire un sistema di tracciamento degli errori più solido.
try:
# Immagina che questo sia il tuo codice della pipeline
result = chain.run()
logging.info(f'Risultato della catena: {result}')
except Exception as e:
logging.error(f'Si è verificato un errore: {str(e)}', exc_info=True)
Il blocco Exception registra l’errore al livello ERROR e fornisce informazioni sullo stack trace. Questo rende la risoluzione dei problemi molto più semplice perché potrai vedere esattamente dove si è verificato l’errore. Fidati, saltare questo passo ti causerà grandi problemi in produzione.
Passo 5: Gestori di logging personalizzati
Qui le cose diventano un po’ più interessanti. Puoi definire gestori di log personalizzati. Diciamolo, potresti voler archiviare i tuoi log in un file o inviarli a un servizio di logging come Sentry o Graylog invece di semplicemente stamparli tutto sulla console. Ecco come impostare un logger di file di base:
class MyCustomHandler(logging.FileHandler):
def emit(self, record):
logging.FileHandler.emit(self, record)
# Imposta il logger per scrivere in un file
file_handler = MyCustomHandler('application.log')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(file_handler)
logger.info('File logger impostato.')
Questo gestore di log personalizzato salva i log in `application.log` nella directory corrente. È un’implementazione semplice, ma è qualcosa su cui puoi costruire. Senza una corretta gestione del logging, i tuoi file di log possono diventare ingestibili e le sessioni di debug possono trasformarsi in un incubo.
Passo 6: Revisione dei log
Il pezzo finale è la revisione dei tuoi log. Guarda, anche con una solida impostazione del logging, devi tornare indietro e controllare. Usa strumenti che possono aiutarti ad aggregare e cercare tra i log. Questo potrebbe essere semplice come usare `grep` per file locali o complesso come usare Splunk se stai gestendo sistemi più grandi.
grep ERROR application.log
Questo comando mostra tutti i log di errore, fornendo una rapida visibilità sui problemi. Se non controlli regolarmente i tuoi log, stai volando alla cieca in produzione.
I punti critici
La tua impostazione di logging sembra perfetta, vero? Ma lascia che ti faccia notare alcuni ostacoli da evitare:
- Logging eccessivo: Comune nelle fasi iniziali. Troppo logging può ingombrare i tuoi file di log e rendere difficile trovare messaggi importanti. Accontentati di DEBUG durante lo sviluppo attivo ma diminuisci per la produzione.
- Mancanza di contesto: Aggiungi sempre contesto ai tuoi messaggi di log. Se si verificano errori, sapere quale parte della catena lo ha causato ti farà risparmiare un sacco di ore di debug.
- Rotazione dei log: Non ruotare i tuoi log può causare problemi di spazio su disco. Sii proattivo e imposta un meccanismo di rotazione.
- Ignorare le prestazioni: Un heavy logging può rallentare la tua applicazione, specialmente se scrivi serialmente in un file o in un altro supporto. Misura gli impatti delle prestazioni della tua strategia di logging.
Esempio di codice completo
Ora che abbiamo affrontato i dettagli, ecco tutto messo insieme in un esempio unico:
import logging
from langchain import LLMChain, PromptTemplate
# Configurazione di base del logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
class MyCustomHandler(logging.FileHandler):
def emit(self, record):
logging.FileHandler.emit(self, record)
# Imposta File Logger
file_handler = MyCustomHandler('application.log')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(file_handler)
logger.info('File logger impostato.')
# Definisci Logging intorno a LLMChain
def create_llm_chain(prompt_template):
logger.info('Creando LLMChain con il modello di prompt fornito.')
llm_chain = LLMChain(prompt=PromptTemplate.from_template(prompt_template))
logger.debug(f'LLMChain creato: {llm_chain}')
return llm_chain
try:
chain = create_llm_chain("What is LangChain?")
result = chain.run()
logger.info(f'Risultato della catena: {result}')
except Exception as e:
logger.error(f'Si è verificato un errore: {str(e)}', exc_info=True)
Cosa c’è dopo
Se hai fatto funzionare questa configurazione, il tuo passo successivo dovrebbe essere integrare un servizio di logging centralizzato. Strumenti come ELK (Elasticsearch, Logstash, Kibana) o Grafana con Loki meritano di essere considerati. Raccoglierai metriche e avrai un meccanismo di ricerca più diretto attraverso più istanze della tua applicazione.
FAQ
Q: Come posso cambiare i livelli di log dinamicamente?
A: Puoi impostare i livelli di log a runtime usando il metodo setLevel sulla tua istanza di logger. Questo può essere molto utile per il debug di problemi specifici senza toccare il tuo codice.
Q: È possibile registrare in file diversi in base al livello di log?
A: Sì! Puoi impostare gestori diversi per livelli di log diversi e indirizzarli a file specifici di conseguenza. Questo può aiutare a organizzare i log in modo più efficiente.
Q: Posso utilizzare un servizio di logging cloud?
A: Certamente. Integrare con servizi di logging cloud come AWS CloudWatch o Google Cloud Logging è semplice. Ti servirà solo un gestore di logging appropriato per inviare i log a questi servizi.
Raccomandazioni per diverse persona di sviluppatori
Per un data scientist: Attieniti al logging strutturato. Ti aiuterà a estrarre facilmente intuizioni dai tuoi log, soprattutto quando i tuoi modelli stanno funzionando con input di dati variabili.
Se sei uno sviluppatore full-stack: Tieni i log accessibili tramite un sistema centralizzato come ELK per avere una panoramica delle tue applicazioni senza perdere il contesto.
Per gli ingegneri DevOps: Concentrati sulle politiche di ritenzione dei log e sulle configurazioni di monitoraggio. Considera di implementare avvisi su eventi di log critici per gestire proattivamente problemi di produzione.
Dati aggiornati al 19 marzo 2026. Fonti: GitHub – langchain-ai/langchain, Documentazione LangChain.
Articoli Correlati
- Limitazione della velocità API per AI: Navigare le sfumature con suggerimenti e trucchi pratici
- Compatibilità retroattiva dell’API dell’agente AI
- Ambienti sandbox per API dell’agente AI
🕒 Published: