Trazas con LangSmith
Instrumente su aplicación de LangChain con las trazas de LangSmith para registrar cada paso de la cadena, llamada al LLM, cantidad de tokens y latencia en un explorador de trazas consultable.
Trazas con LangSmith es una lección gratuita de AI Engineering Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Engineering Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Engineering Academy incluye 4 lecciones en total.
¿Qué es LangSmith?
LangSmith es una plataforma de observabilidad creada específicamente para aplicaciones basadas en LLM. Captura automáticamente traces de cada ejecución de LangChain —cada paso de la cadena, llamada al LLM, ejecución de herramientas, recuperación y analizador de salida— y los muestra en un explorador de traces jerárquico y con función de búsqueda. Puede filtrar los traces por latencia, coste, estado de error o metadatos personalizados, y reproducir cualquier trace para depurar fallos.
# 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 automático sin cambios en el código
La característica más destacada de LangSmith es que, una vez configuradas las tres variables de entorno, cada operación de LangChain se registra automáticamente mediante tracing sin código adicional. Cada cadena LCEL, cada llamada a ChatOpenAI, cada llamada al recuperador y cada ejecución de herramientas se captura con sus entradas, salidas, tiempos y recuentos de tokens. Puede implementar el tracing de LangSmith en producción cambiando una sola variable de entorno.
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)Tracing de pipelines de RAG
En las aplicaciones de RAG, los traces de LangSmith son especialmente valiosos porque capturan todo el pipeline de recuperación y generación. Puede ver qué documentos se recuperaron, cuáles eran sus puntuaciones de similitud, cómo se formateó el contexto en el prompt y qué generó el LLM. Esto permite determinar de inmediato si una respuesta incorrecta se debió a una mala recuperación o a una generación deficiente.
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?')Añadir metadatos a los traces
De forma predeterminada, los traces de LangSmith contienen las entradas y salidas de cada paso. Puede enriquecerlos con etiquetas de metadatos personalizadas: el ID de usuario, el ID de sesión, los valores de las feature flags, la variante de la prueba A/B o cualquier otro contexto que le ayude a filtrar y analizar los traces en la interfaz. Utilice RunnableConfig para pasar metadatos que aparecerán en todos los traces de esa solicitud.
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'Creación manual de spans
Para el código que no pasa por LangChain (llamadas personalizadas a API, consultas a bases de datos o pasos de preprocesamiento), puede crear spans manuales utilizando directamente el cliente de LangSmith. Así se asegura de que los pasos que no pertenecen a LangChain se capturen en el mismo trace que los pasos de LangChain, lo que le proporciona una visión completa de la ruta de ejecución de cada solicitud.
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 resultEvaluación de traces en LangSmith
LangSmith incluye un framework de evaluación que permite ejecutar evaluadores sobre su conjunto de datos de traces. Puede seleccionar un conjunto de ejemplos registrados, ejecutar evaluadores automatizados (incluidos evaluadores LLM-as-judge para la corrección y la relevancia) y comparar los resultados entre distintas versiones del pipeline. Así, sus traces de producción se convierten en un ciclo de feedback para mejorar la aplicación.
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')Creación de conjuntos de datos de prueba a partir de traces
Una de las características más potentes de LangSmith es la capacidad de crear conjuntos de datos de prueba directamente a partir de traces de producción. Cuando encuentre un trace interesante (un fallo, un caso límite o un buen ejemplo), puede añadirlo a un conjunto de datos con un solo clic. Con el tiempo, creará una suite completa de pruebas de regresión a partir de consultas reales de los usuarios, en lugar de ejemplos sintéticos.
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')Filtrado y búsqueda de traces
En producción, tendrá miles de traces. La interfaz y la API de LangSmith admiten un filtrado y una búsqueda avanzados: puede encontrar traces cuya latencia supere un umbral, con un tipo de error específico, de un usuario concreto, que contengan una palabra clave específica en la salida o cuyo recuento de tokens de finalización supere un límite. Esto facilita la investigación de categorías concretas de fallos o la supervisión del comportamiento de usuarios específicos.
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}')Comparación de experimentos en LangSmith
LangSmith admite la comparación de experimentos: ejecute el mismo conjunto de datos de prueba con dos versiones de su pipeline (por ejemplo, un tamaño de fragmento de 500 frente a uno de 1000) y compárelas lado a lado según las métricas de latencia, coste y calidad. Así resulta sencillo validar que un cambio en el pipeline supone una mejora y no una regresión antes de implementarlo en producción.
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 producción
LangSmith está disponible como SaaS alojado en smith.langchain.com y como opción autoalojada. En producción, el tracing puede hacerse de forma asíncrona (sin bloqueo) para evitar añadir latencia a su ruta crítica. También puede muestrear traces (por ejemplo, registrar mediante tracing solo el 10 % de las solicitudes en una producción con mucho tráfico) para controlar los costes sin perder visibilidad. El panel muestra gráficos en tiempo real del volumen de solicitudes, la latencia, el coste y la tasa de errores.
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 frente al logging personalizado
Podría crear su propio sistema de registro de trazas, y para algunos casos de uso esa es la opción adecuada. Las ventajas de LangSmith frente al registro personalizado son: integración sin código con LangChain, una interfaz diseñada específicamente para explorar trazas de LLM (no paneles genéricos de Kibana/Grafana), compatibilidad nativa con la evaluación y la comparación de experimentos, y seguimiento automático del recuento de tokens y los costes. La desventaja es la dependencia del proveedor y el coste a gran escala.
Comprobación rápida
Compruebe sus conocimientos sobre el tracing con LangSmith en esta lección.
Resumen de la lección
En esta lección ha aprendido lo siguiente: LangSmith permite realizar tracing automático de extremo a extremo en aplicaciones de LangChain mediante la configuración de tres variables de entorno, sin cambios en el código; el decorador @traceable extiende el tracing a pasos que no pertenecen a LangChain, como las llamadas a bases de datos y el preprocesamiento; y la comparación de experimentos permite validar las mejoras de un pipeline con un conjunto de datos de prueba antes de implementarlas. A continuación, exploraremos Langfuse como alternativa de observabilidad independiente del modelo.
Preguntas frecuentes
¿La lección «Trazas con LangSmith» es gratis?
Sí — el texto completo de «Trazas con LangSmith» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Engineering Academy, actualiza a CoddyKit PRO. El curso de AI Engineering Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Trazas con LangSmith»?
Instrumente su aplicación de LangChain con las trazas de LangSmith para registrar cada paso de la cadena, llamada al LLM, cantidad de tokens y latencia en un explorador de trazas consultable. Practicas AI Engineering Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Engineering Academy?
No se requiere experiencia previa. AI Engineering Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Trazas con LangSmith»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Engineering Academy?
Sí. Cada lección de AI Engineering Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué las aplicaciones con LLM son difíciles de depurar
- Trazas con LangSmith
- Observabilidad independiente del modelo con Langfuse
- Alertas sobre latencia, costes y degradación de la calidad