Tracing con LangSmith
Aggiunga il tracing LangSmith alla Sua applicazione LangChain per registrare ogni passaggio della chain, ogni chiamata LLM, il numero di token e la latenza in un trace explorer ricercabile.
Tracing con LangSmith è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.
Che cos'è LangSmith?
LangSmith è una piattaforma di osservabilità progettata specificamente per le applicazioni LLM. Acquisisce automaticamente le tracce di ogni esecuzione LangChain — ogni passaggio della catena, chiamata LLM, esecuzione di strumenti, retrieval e parser dell'output — e le visualizza in un esploratore gerarchico delle tracce, con funzione di ricerca. Può filtrare le tracce per latenza, costo, stato dell'errore o metadati personalizzati e riprodurre qualsiasi traccia per eseguire il debugging dei malfunzionamenti.
# Install: pip install langsmith
import os
# Set environment variables to enable automatic tracing
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_...your_key_here...'
os.environ['LANGCHAIN_PROJECT'] = 'my-rag-app' # project name in LangSmith UI
# That's all - LangChain now sends traces to LangSmith automatically
# No code changes needed to your chain or agentTracing automatico senza modifiche al codice
La caratteristica più interessante di LangSmith è che, una volta impostate le tre variabili d'ambiente, ogni operazione LangChain viene tracciata automaticamente senza codice aggiuntivo. Ogni catena LCEL, ogni chiamata ChatOpenAI, ogni chiamata al retriever e ogni esecuzione di uno strumento vengono acquisiti con input, output, tempi e conteggio dei token. Può attivare il tracing di LangSmith in produzione modificando una sola variabile d'ambiente.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# This chain is automatically traced - no extra code needed
llm = ChatOpenAI(model='gpt-4o')
prompt = ChatPromptTemplate.from_template('Answer this question: {question}')
chain = prompt | llm | StrOutputParser()
# This call creates a trace in LangSmith showing:
# - The formatted prompt (with question substituted)
# - The LLM call with model, temperature, token counts
# - The parsed output
# - End-to-end latency and cost
result = chain.invoke({'question': 'What is RAG?'})
print(result)Tracciare le pipeline RAG
Per le applicazioni RAG, le tracce di LangSmith sono particolarmente preziose perché acquisiscono l'intera pipeline di recupero e generazione. Può vedere: quali documenti sono stati recuperati, quali erano i relativi punteggi di similarità, come è stato formattato il contesto nel prompt e che cosa ha generato l'LLM. In questo modo diventa immediatamente evidente se una risposta errata sia stata causata da un retrieval inadeguato o da una generazione di scarsa qualità.
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings)
retriever = vectorstore.as_retriever(search_kwargs={'k': 5})
rag_chain = (
{'context': retriever, 'question': RunnablePassthrough()}
| ChatPromptTemplate.from_template('Context: {context}\n\nQuestion: {question}\n\nAnswer:')
| ChatOpenAI(model='gpt-4o')
| StrOutputParser()
)
# LangSmith traces EVERY step:
# 1. Retriever: query embedding + vector search + returned documents (with scores)
# 2. Prompt: formatted template with context injected
# 3. LLM: full prompt, response, tokens, latency, cost
# 4. Parser: final string output
answer = rag_chain.invoke('What is the capital of France?')Aggiungere metadati alle tracce
Per impostazione predefinita, le tracce di LangSmith contengono gli input e gli output di ogni passaggio. Può arricchire le tracce con tag di metadati personalizzati: ID utente, ID di sessione, valori dei feature flag, variante del test A/B o qualsiasi altro contesto utile per filtrare e analizzare le tracce nell'interfaccia. Utilizzi RunnableConfig per passare metadati che appariranno in ogni traccia di quella richiesta.
from langchain_core.runnables import RunnableConfig
def handle_user_request(user_id: str, query: str, ab_variant: str):
config = RunnableConfig(
tags=['production', ab_variant],
metadata={
'user_id': user_id,
'ab_variant': ab_variant,
'feature': 'rag_qa'
}
)
result = rag_chain.invoke(query, config=config)
return result
# In LangSmith UI you can now:
# - Filter traces by user_id to debug a specific user's issue
# - Compare latency between ab_variant='A' and ab_variant='B'
# - See all traces tagged 'production' vs 'staging'Creazione manuale degli span
Per il codice che non passa attraverso LangChain (chiamate API personalizzate, query al database, passaggi di pre-elaborazione), può creare span manuali utilizzando direttamente il client LangSmith. In questo modo i passaggi non basati su LangChain vengono acquisiti nella stessa traccia dei passaggi LangChain, offrendo una visione completa del percorso di esecuzione di ogni richiesta.
from langsmith import Client, traceable
client = Client()
# Decorate functions to auto-trace them
@traceable(name='preprocess_query')
def preprocess_query(raw_query: str) -> str:
# This step is now traced even though it doesn't use LangChain
cleaned = raw_query.strip().lower()
cleaned = ' '.join(cleaned.split()) # normalize whitespace
return cleaned
@traceable(name='fetch_user_history')
def fetch_user_history(user_id: str) -> list[str]:
# Database call - also traced
return db.query('SELECT message FROM chat_history WHERE user_id = ? ORDER BY timestamp DESC LIMIT 5', user_id)
# All three steps appear in the same trace
def handle_request(user_id: str, raw_query: str):
query = preprocess_query(raw_query) # traced
history = fetch_user_history(user_id) # traced
result = rag_chain.invoke({'query': query, 'history': history}) # traced by LangChain
return resultValutare le tracce in LangSmith
LangSmith include un framework di valutazione che consente di eseguire valutatori sul dataset delle tracce. Può selezionare un insieme di esempi tracciati, eseguire valutatori automatizzati (inclusi i valutatori LLM-as-judge per correttezza e pertinenza) e confrontare i risultati tra diverse versioni della pipeline. In questo modo le tracce di produzione diventano un ciclo di feedback per migliorare l'applicazione.
from langsmith.evaluation import evaluate, LangChainStringEvaluator
# Create an evaluator that uses an LLM to judge correctness
correctness_evaluator = LangChainStringEvaluator(
'qa',
config={'llm': ChatOpenAI(model='gpt-4o')}
)
# Run evaluation against a dataset of traced examples
results = evaluate(
rag_chain,
data='my-rag-test-set', # name of dataset in LangSmith
evaluators=[correctness_evaluator],
experiment_prefix='rag-v2-chunking-test'
)
print('Evaluation results:')
print(f'Correctness: {results.results["correctness"].mean():.2f}')
print(f'Average latency: {results.results["latency"].mean():.2f}s')Creare dataset di test dalle tracce
Una delle funzionalità più potenti di LangSmith è la possibilità di creare dataset di test direttamente dalle tracce di produzione. Quando nota una traccia interessante (un malfunzionamento, un caso limite o un ottimo esempio), può aggiungerla a un dataset con un solo clic. Nel tempo, costruirà una suite completa di test di regressione basata su query reali degli utenti anziché su esempi sintetici.
from langsmith import Client
client = Client()
# Create a dataset from existing traces
dataset = client.create_dataset('rag-regression-tests')
# Add examples from production traces (by trace ID)
for trace_id in failed_trace_ids:
run = client.read_run(trace_id)
client.create_example(
inputs=run.inputs,
outputs={'answer': run.outputs.get('output', '')},
dataset_id=dataset.id,
metadata={'source': 'production_failure', 'date': run.start_time.isoformat()}
)
print(f'Added {len(failed_trace_ids)} examples to regression test dataset')Filtrare e cercare le tracce
In produzione, avrà migliaia di tracce. L'interfaccia e l'API di LangSmith supportano funzioni avanzate di filtraggio e ricerca: può trovare tracce con latenza superiore a una soglia, con uno specifico tipo di errore, provenienti da un determinato utente, contenenti una parola chiave specifica nell'output o con un conteggio dei token di completamento superiore a un limite. Questo rende pratico analizzare specifiche categorie di malfunzionamenti o monitorare il comportamento di determinati utenti.
from langsmith import Client
client = Client()
# Find slow traces (useful for performance investigation)
slow_runs = client.list_runs(
project_name='my-rag-app',
filter='gt(latency, 5)', # latency > 5 seconds
limit=20
)
# Find error traces
error_runs = client.list_runs(
project_name='my-rag-app',
filter='eq(error, true)',
limit=50
)
# Find traces from a specific user
user_runs = client.list_runs(
project_name='my-rag-app',
filter='has(metadata, user_id="user_abc123")',
limit=100
)
for run in slow_runs:
print(f'Slow run: {run.id}, latency: {run.end_time - run.start_time}')Confrontare gli esperimenti in LangSmith
LangSmith supporta il confronto tra esperimenti: esegua lo stesso dataset di test attraverso due versioni della pipeline (ad esempio, dimensione dei chunk pari a 500 rispetto a 1000) e le confronti affiancate in base a latenza, costo e metriche di qualità. In questo modo è facile verificare che una modifica alla pipeline rappresenti un miglioramento anziché una regressione prima della distribuzione in produzione.
from langsmith.evaluation import evaluate
test_dataset = 'my-rag-eval-set'
# Run experiment A: chunk size 500
results_a = evaluate(
rag_pipeline_v1,
data=test_dataset,
evaluators=[correctness_evaluator, relevance_evaluator],
experiment_prefix='chunk-500'
)
# Run experiment B: chunk size 1000
results_b = evaluate(
rag_pipeline_v2,
data=test_dataset,
evaluators=[correctness_evaluator, relevance_evaluator],
experiment_prefix='chunk-1000'
)
# Compare in LangSmith UI: Experiments tab shows A vs B side by side
# Or compare programmatically:
print(f'Correctness - v1: {results_a.results["correctness"].mean():.2f}, v2: {results_b.results["correctness"].mean():.2f}')LangSmith in produzione
LangSmith è disponibile come SaaS in hosting all'indirizzo smith.langchain.com e come soluzione self-hosted. In produzione, il tracing può essere eseguito in modo asincrono (non bloccante) per evitare di aggiungere latenza al percorso critico. Può anche campionare le tracce (ad esempio, tracciando solo il 10% delle richieste in una produzione ad alto traffico) per contenere i costi mantenendo la visibilità. Il dashboard mostra grafici in tempo reale relativi al volume delle richieste, alla latenza, ai costi e al tasso di errore.
import os
# Production configuration
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'
os.environ['LANGCHAIN_PROJECT'] = 'production'
# Enable async tracing (non-blocking - does not add latency to requests)
os.environ['LANGCHAIN_CALLBACKS_BACKGROUND'] = 'true'
# Optional: sample 10% of traces to reduce cost in high-traffic scenarios
import random
def should_trace() -> bool:
return random.random() < 0.10 # 10% sampling rate
def handle_request(query):
config = RunnableConfig()
if not should_trace():
config = RunnableConfig(callbacks=[]) # disable tracing for this request
return rag_chain.invoke(query, config=config)LangSmith rispetto al logging personalizzato
Potreste creare un vostro sistema di registrazione delle tracce e, per alcuni casi d’uso, questa è la scelta giusta. I vantaggi di LangSmith rispetto alla registrazione personalizzata sono: integrazione senza codice con LangChain, un’interfaccia progettata appositamente per esplorare le tracce degli LLM (non dashboard generiche di Kibana/Grafana), supporto nativo per la valutazione e il confronto tra esperimenti e monitoraggio automatico del numero di token e dei costi. Il compromesso consiste nella dipendenza dal fornitore e nei costi su larga scala.
Verifica rapida
Verificate la vostra comprensione del tracciamento con LangSmith trattato in questa lezione.
Riepilogo della lezione
In questa lezione avete imparato che LangSmith consente il tracciamento automatico end-to-end delle applicazioni LangChain impostando tre variabili d’ambiente, senza modifiche al codice; il decoratore @traceable estende il tracciamento a passaggi non basati su LangChain, come le chiamate al database e la preelaborazione; inoltre, il confronto tra esperimenti consente di convalidare i miglioramenti della pipeline su un dataset di test prima della distribuzione. Ora esploreremo Langfuse come alternativa di osservabilità indipendente dal modello.
Domande Frequenti
La lezione «Tracing con LangSmith» è gratuita?
Sì — il testo completo di «Tracing con LangSmith» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.
Cosa imparerò in «Tracing con LangSmith»?
Aggiunga il tracing LangSmith alla Sua applicazione LangChain per registrare ogni passaggio della chain, ogni chiamata LLM, il numero di token e la latenza in un trace explorer ricercabile. Eserciti AI Engineering Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Engineering Academy?
Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Tracing con LangSmith»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Engineering Academy?
Sì. Ogni lezione AI Engineering Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché le app LLM sono difficili da sottoporre a debug
- Tracing con LangSmith
- Langfuse per l'observability indipendente dal modello
- Avvisi su latenza, costi e peggioramento della qualità