Tracer avec LangSmith
Instrumentez votre application LangChain avec le traçage LangSmith pour enregistrer chaque étape de chaîne, chaque appel de LLM, le nombre de jetons et la latence dans un explorateur de traces interrogeable.
Tracer avec LangSmith est une leçon AI Engineering Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Engineering Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Engineering Academy comprend 4 leçons au total.
Qu’est-ce que LangSmith ?
LangSmith est une plateforme d’observabilité conçue spécifiquement pour les applications LLM. Elle capture automatiquement les traces de chaque exécution LangChain — chaque étape de chaîne, appel LLM, exécution d’outil, recherche et analyseur de sortie — et les affiche dans un explorateur de traces hiérarchique et interrogeable. Vous pouvez filtrer les traces par latence, coût, état d’erreur ou métadonnées personnalisées, et rejouer n’importe quelle trace pour déboguer les défaillances.
# 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 agentTraçage automatique sans modifier le code
La fonctionnalité la plus remarquable de LangSmith est qu’une fois les trois variables d’environnement définies, chaque opération LangChain est automatiquement tracée sans code supplémentaire. Chaque chaîne LCEL, chaque appel ChatOpenAI, chaque appel de récupérateur et chaque exécution d’outil sont capturés avec leurs entrées, leurs sorties, leur durée et le nombre de jetons. Vous pouvez déployer le traçage LangSmith en production en modifiant une seule variable d’environnement.
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)Tracer les processus RAG
Pour les applications RAG, les traces LangSmith sont particulièrement précieuses, car elles capturent l’intégralité du processus de recherche puis de génération. Vous pouvez voir quels documents ont été récupérés, quels étaient leurs scores de similarité, comment le contexte a été formaté dans l’invite et ce que le LLM a généré. Il devient ainsi immédiatement évident qu’une réponse erronée est due à une mauvaise recherche ou à une génération de mauvaise 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?')Ajouter des métadonnées aux traces
Par défaut, les traces LangSmith contiennent les entrées et les sorties de chaque étape. Vous pouvez les enrichir avec des balises de métadonnées personnalisées : ID utilisateur, ID de session, valeurs des indicateurs de fonctionnalité, variante d’un test A/B ou tout autre contexte vous aidant à filtrer et analyser les traces dans l’interface. Utilisez RunnableConfig pour transmettre des métadonnées qui apparaîtront sur chaque trace de cette requête.
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'Créer manuellement des segments de trace
Pour le code qui ne passe pas par LangChain (appels d’API personnalisés, requêtes de base de données, étapes de prétraitement), vous pouvez créer des segments de trace manuels en utilisant directement le client LangSmith. Ainsi, vos étapes ne faisant pas appel à LangChain sont capturées dans la même trace que les étapes LangChain, ce qui vous donne une vue complète du chemin d’exécution de chaque requête.
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 resultÉvaluer les traces dans LangSmith
LangSmith comprend un cadre d’évaluation qui vous permet d’exécuter des évaluateurs sur votre jeu de données de traces. Vous pouvez sélectionner un ensemble d’exemples tracés, exécuter des évaluateurs automatisés (notamment des évaluateurs LLM pour noter la justesse et la pertinence), puis comparer les résultats entre différentes versions du processus. Vos traces de production deviennent ainsi une boucle de rétroaction pour améliorer votre application.
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')Créer des jeux de données de test à partir des traces
L’une des fonctionnalités les plus puissantes de LangSmith est la possibilité de créer des jeux de données de test directement à partir des traces de production. Lorsque vous remarquez une trace intéressante (un échec, un cas limite ou un excellent exemple), vous pouvez l’ajouter à un jeu de données en un seul clic. Au fil du temps, vous constituez une suite complète de tests de régression à partir de requêtes d’utilisateurs réelles plutôt que d’exemples synthétiques.
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')Filtrer et rechercher des traces
En production, vous disposerez de milliers de traces. L’interface et l’API de LangSmith prennent en charge un filtrage et une recherche avancés : trouvez les traces dont la latence dépasse un seuil, qui présentent un type d’erreur précis, qui proviennent d’un utilisateur donné, qui contiennent un mot-clé précis dans la sortie ou dont le nombre de jetons de complétion dépasse une limite. Vous pouvez ainsi examiner des catégories précises de défaillances ou surveiller le comportement d’utilisateurs particuliers.
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}')Comparer des expériences dans LangSmith
LangSmith prend en charge la comparaison d’expériences : exécutez le même jeu de données de test avec deux versions de votre processus (par exemple, une taille de fragment de 500 contre une taille de 1 000), puis comparez-les côte à côte selon la latence, le coût et les métriques de qualité. Vous pouvez ainsi vérifier facilement qu’une modification du processus constitue une amélioration plutôt qu’une régression avant de la déployer en production.
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 en production
LangSmith est disponible sous forme de SaaS hébergé sur smith.langchain.com ainsi qu’en version auto-hébergée. En production, le traçage peut être rendu asynchrone (non bloquant) afin d’éviter d’ajouter de la latence à votre chemin critique. Vous pouvez également échantillonner les traces (par exemple, ne tracer que 10 % des requêtes en production à fort trafic) pour maîtriser les coûts tout en conservant de la visibilité. Le tableau de bord affiche des graphiques en temps réel du volume de requêtes, de la latence, du coût et du taux d’erreur.
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 ou la journalisation personnalisée
Vous pourriez créer votre propre système de journalisation des traces, et c’est le bon choix dans certains cas d’utilisation. Les avantages de LangSmith par rapport à une journalisation personnalisée sont les suivants : une intégration sans code avec LangChain, une interface conçue spécialement pour explorer les traces de LLM (et non des tableaux de bord Kibana/Grafana génériques), la prise en charge native de l’évaluation et de la comparaison des expériences, ainsi que le suivi automatique du nombre de jetons et des coûts. En contrepartie, vous dépendez d’un fournisseur et les coûts peuvent devenir élevés à grande échelle.
Vérification rapide
Vérifiez votre compréhension du traçage avec LangSmith à partir de cette leçon.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que LangSmith permet le traçage automatique de bout en bout des applications LangChain en définissant trois variables d’environnement, sans modifier le code ; que le décorateur @traceable étend le traçage aux étapes qui ne reposent pas sur LangChain, comme les appels à une base de données et le prétraitement ; et que la comparaison d’expériences permet de valider les améliorations du pipeline sur un jeu de données de test avant le déploiement. Nous allons maintenant découvrir Langfuse, une solution d’observabilité indépendante du modèle.
Apprends Python avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 30
- Leçons
- 120
Questions Fréquemment Posées
La leçon « Tracer avec LangSmith » est-elle gratuite ?
Oui — le texte complet de « Tracer avec LangSmith » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Engineering Academy, passe à CoddyKit PRO. Le cours AI Engineering Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Tracer avec LangSmith » ?
Instrumentez votre application LangChain avec le traçage LangSmith pour enregistrer chaque étape de chaîne, chaque appel de LLM, le nombre de jetons et la latence dans un explorateur de traces interr… Tu pratiques AI Engineering Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Engineering Academy ?
Aucune expérience préalable n'est requise. AI Engineering Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Tracer avec LangSmith » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Engineering Academy ?
Oui. Chaque leçon AI Engineering Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi les applications LLM sont difficiles à déboguer
- Tracer avec LangSmith
- Langfuse pour une observabilité indépendante des modèles
- Alerter en cas de latence, de coût ou de dégradation de la qualité