Rastreamento com LangSmith
Instrumente sua aplicação LangChain com o rastreamento do LangSmith para registrar cada etapa da cadeia, chamada ao LLM, quantidade de tokens e latência em um explorador de rastreamentos pesquisável.
Rastreamento com LangSmith é uma aula grátis de AI Engineering Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Engineering Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Engineering Academy inclui 4 aulas no total.
O que é o LangSmith?
O LangSmith é uma plataforma de observabilidade criada especificamente para aplicações de LLM. Ela captura automaticamente os rastreamentos de cada execução do LangChain — cada etapa da cadeia, chamada ao LLM, execução de ferramenta, recuperação e analisador de saída — e os exibe em um explorador de rastreamentos hierárquico e pesquisável. É possível filtrar os rastreamentos por latência, custo, status de erro ou metadados personalizados, além de reproduzir qualquer rastreamento para depurar falhas.
# 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 agentRastreamento automático sem alterações no código
O recurso mais atraente do LangSmith é que, depois que você define as três variáveis de ambiente, todas as operações do LangChain são rastreadas automaticamente, sem código adicional. Cada cadeia LCEL, cada chamada a ChatOpenAI, cada chamada a um recuperador e cada execução de ferramenta são capturadas com entradas, saídas, medições de tempo e contagens de tokens. É possível implantar o rastreamento do LangSmith em produção alterando uma única variável de 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)Rastreamento de fluxos de RAG
Para aplicações de RAG, os rastreamentos do LangSmith são especialmente valiosos porque capturam todo o fluxo de recuperação e geração. Você pode ver: quais documentos foram recuperados, quais eram suas pontuações de similaridade, como o contexto foi formatado no prompt e o que o LLM gerou. Isso torna imediatamente evidente se uma resposta errada foi causada por uma recuperação inadequada ou por uma geração ruim.
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?')Adicionando metadados aos rastreamentos
Por padrão, os rastreamentos do LangSmith contêm as entradas e saídas de cada etapa. Você pode enriquecê-los com rótulos de metadados personalizados: o ID do usuário, o ID da sessão, os valores das sinalizações de recursos, a variante do teste A/B ou qualquer outro contexto que ajude a filtrar e analisar os rastreamentos na interface. Use o RunnableConfig para passar metadados que aparecerão em todos os rastreamentos dessa solicitação.
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'Criação manual de intervalos
Para códigos que não passam pelo LangChain (chamadas personalizadas à API, consultas a bancos de dados e etapas de pré-processamento), você pode criar intervalos manuais usando diretamente o cliente do LangSmith. Isso garante que as etapas que não usam LangChain sejam capturadas no mesmo rastreamento que as etapas do LangChain, proporcionando uma visão completa do caminho de execução de cada solicitação.
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 resultAvaliando rastreamentos no LangSmith
O LangSmith inclui uma estrutura de avaliação que permite executar avaliadores sobre seu conjunto de dados de rastreamentos. Você pode selecionar um conjunto de exemplos rastreados, executar avaliadores automatizados (incluindo avaliadores LLM como juiz para correção e relevância) e comparar os resultados entre diferentes versões do fluxo de processamento. Isso transforma seus rastreamentos de produção em um ciclo de feedback para aprimorar sua aplicação.
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')Criando conjuntos de dados de teste a partir de rastreamentos
Um dos recursos mais poderosos do LangSmith é a capacidade de criar conjuntos de dados de teste diretamente a partir de rastreamentos de produção. Quando você encontrar um rastreamento interessante (uma falha, um caso de exceção ou um ótimo exemplo), poderá adicioná-lo a um conjunto de dados com um único clique. Com o tempo, você criará um conjunto abrangente de testes de regressão a partir de consultas reais de usuários, em vez de exemplos 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')Filtrando e pesquisando rastreamentos
Em produção, você terá milhares de rastreamentos. A interface e a API do LangSmith oferecem recursos avançados de filtragem e pesquisa: encontre rastreamentos com latência acima de um limite, com um tipo específico de erro, de um usuário específico, que contenham uma palavra-chave específica na saída ou com uma contagem de tokens de conclusão acima de um limite. Isso torna prática a investigação de categorias específicas de falhas ou o monitoramento do comportamento de usuários 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}')Comparando experimentos no LangSmith
O LangSmith oferece suporte à comparação de experimentos: execute o mesmo conjunto de dados de teste em duas versões do seu fluxo de processamento (por exemplo, tamanho de trecho 500 versus tamanho de trecho 1.000) e compare-as lado a lado quanto às métricas de latência, custo e qualidade. Isso facilita validar se uma alteração no fluxo de processamento é uma melhoria, e não uma regressão, antes de implantá-la em produção.
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 em produção
O LangSmith está disponível como um SaaS hospedado em smith.langchain.com e também como opção auto-hospedada. Em produção, o rastreamento pode ser assíncrono (sem bloqueio) para evitar adicionar latência ao seu caminho crítico. Você também pode amostrar rastreamentos (por exemplo, rastrear apenas 10% das solicitações em uma produção com alto tráfego) para controlar os custos e manter a visibilidade. O painel exibe gráficos em tempo real do volume de solicitações, da latência, do custo e da taxa de erros.
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 versus registro personalizado
Você poderia criar seu próprio sistema de registro de rastreamentos e, para alguns casos de uso, essa é a escolha certa. As vantagens do LangSmith em relação ao registro personalizado são: integração sem código com o LangChain, uma interface criada especificamente para explorar rastreamentos de LLM (em vez de painéis genéricos do Kibana/Grafana), suporte nativo à avaliação e à comparação de experimentos e acompanhamento automático da contagem de tokens e dos custos. A desvantagem é a dependência do fornecedor e o custo em grande escala.
Verificação rápida
Teste sua compreensão sobre rastreamento com o LangSmith nesta lição.
Recapitulação da lição
Nesta lição, você aprendeu que o LangSmith permite o rastreamento automático de ponta a ponta de aplicações LangChain definindo três variáveis de ambiente, sem alterações no código; o decorador @traceable estende o rastreamento a etapas que não usam LangChain, como chamadas ao banco de dados e pré-processamento; e a comparação de experimentos permite validar melhorias na cadeia de processamento em relação a um conjunto de dados de teste antes da implantação. A seguir, exploraremos o Langfuse como uma alternativa de observabilidade independente de modelo.
Perguntas Frequentes
A aula “Rastreamento com LangSmith” é grátis?
Sim — o texto completo de “Rastreamento com LangSmith” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Engineering Academy, atualize para CoddyKit PRO. O curso de AI Engineering Academy inclui 4 aulas no total.
O que vou aprender em “Rastreamento com LangSmith”?
Instrumente sua aplicação LangChain com o rastreamento do LangSmith para registrar cada etapa da cadeia, chamada ao LLM, quantidade de tokens e latência em um explorador de rastreamentos pesquisável. Você pratica AI Engineering Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Engineering Academy?
Nenhuma experiência prévia é necessária. AI Engineering Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Rastreamento com LangSmith”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Engineering Academy?
Sim. Cada aula de AI Engineering Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que aplicações com LLM são difíceis de depurar
- Rastreamento com LangSmith
- Observabilidade independente de modelo com Langfuse
- Alertas sobre latência, custo e degradação da qualidade