0Pricing
AI Agents · Lezione

Analisi delle tracce con LangSmith e Langfuse

Lettura delle tracce: identificazione degli strumenti lenti, delle decisioni errate e dei modelli di errore.

Analisi delle tracce con LangSmith e Langfuse è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 1 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 Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Perché tracciare il proprio agente?

Gli agenti effettuano più chiamate all'LLM e invocazioni di tool durante ogni esecuzione. Senza tracing, il debug diventa un tentativo alla cieca. Il tracing registra ogni passaggio: input, output, utilizzo dei token, latenza ed errori, fornendo una visione completa di ogni esecuzione.

Configurazione di LangSmith

LangSmith è la piattaforma di tracing di Anthropic per LangChain. La abiliti impostando due variabili d'ambiente. Ogni chiamata a LangChain viene tracciata automaticamente ed è visibile nell'interfaccia utente di LangSmith.

import os
from dotenv import load_dotenv

load_dotenv()

# LangSmith tracing configuration
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = os.environ.get('LANGSMITH_API_KEY', 'ls__...')
os.environ['LANGCHAIN_PROJECT'] = 'my-agent-project'

# Now any LangChain code is automatically traced
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

llm = ChatOpenAI(model='gpt-4o-mini', api_key=os.environ.get('OPENAI_API_KEY', 'sk-...'))

# This call is traced automatically
response = llm.invoke([HumanMessage(content='What is 2+2?')])
print(response.content)
# Check trace at: https://smith.langchain.com

Aggiunta dei metadati dell'esecuzione

Aggiunga tag e metadati alle tracce per poter filtrare ed effettuare ricerche nell'interfaccia utente di LangSmith. È utile per monitorare diverse versioni dell'agente, gli ID degli utenti o le etichette degli esperimenti.

import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langsmith import traceable

os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'ls__your-key'
os.environ['LANGCHAIN_PROJECT'] = 'my-agent-project'

llm = ChatOpenAI(model='gpt-4o-mini', api_key='sk-...')

@traceable(name='my-agent-run', tags=['production', 'v2'], metadata={'user_id': '42'})
def run_agent(question: str) -> str:
    response = llm.invoke(
        [HumanMessage(content=question)],
        config={
            'run_name': f'agent-{question[:20]}',
            'tags': ['production'],
            'metadata': {'user_id': '42', 'version': 'v2.1'}
        }
    )
    return response.content

result = run_agent('Explain LangChain tracing')
print(result)

Visualizzazione delle tracce nell'interfaccia utente di LangSmith

Nella dashboard di LangSmith può visualizzare ogni esecuzione con il relativo albero completo delle tracce. Ogni nodo mostra: input, output, conteggi dei token, latenza ed eventuali errori. Può confrontare le esecuzioni e filtrare per tag o progetto.

  • Filtri per stato di errore per trovare le esecuzioni non riuscite
  • Ordini per latenza per individuare i passaggi lenti
  • Confronti due esecuzioni affiancate per eseguire il debug delle regressioni
# Programmatically query LangSmith for run data
from langsmith import Client

client = Client(api_key='ls__your-key')

# List recent runs for a project
runs = list(client.list_runs(
    project_name='my-agent-project',
    execution_order=1,      # Top-level runs only
    error=True,             # Only failed runs
    limit=10
))

for run in runs:
    print(f'Run: {run.name}')
    print(f'  Status: {run.status}')
    print(f'  Latency: {run.end_time - run.start_time if run.end_time else "running"}')
    print(f'  Error: {run.error}')
    print()

Langfuse per il tracing personalizzato

Langfuse è un'alternativa open source a LangSmith. Funziona con qualsiasi framework per LLM o con codice personalizzato. Utilizzi l'SDK di Langfuse per creare manualmente tracce e span.

from langfuse import Langfuse

lf = Langfuse(
    public_key='pk-lf-...',
    secret_key='sk-lf-...',
    host='https://cloud.langfuse.com'  # Or your self-hosted URL
)

# Create a trace
trace = lf.trace(
    name='email-agent-run',
    user_id='user-42',
    metadata={'environment': 'production'}
)

# Create a span for entity extraction
span = trace.span(
    name='entity-extraction',
    input={'text': 'Meeting with Alice from Google tomorrow'}
)

# Simulate work
extracted = ['Alice', 'Google']

# End the span with output
span.end(output={'entities': extracted})

print('Trace created in Langfuse')
print(f'View at: https://cloud.langfuse.com/trace/{trace.id}')

Tracing delle chiamate all'LLM in Langfuse

Crei uno span di tipo generation per ogni chiamata all'LLM. In questo modo vengono acquisiti il modello utilizzato, il prompt, il completamento e i conteggi dei token, ovvero i dati più importanti per l'analisi dei costi.

from langfuse import Langfuse
import openai

lf = Langfuse(public_key='pk-lf-...', secret_key='sk-lf-...')
client = openai.OpenAI(api_key='sk-...')

def traced_llm_call(trace, prompt: str, model: str = 'gpt-4o-mini') -> str:
    generation = trace.generation(
        name='llm-call',
        model=model,
        input=[{'role': 'user', 'content': prompt}]
    )
    
    response = client.chat.completions.create(
        model=model,
        messages=[{'role': 'user', 'content': prompt}]
    )
    content = response.choices[0].message.content
    
    generation.end(
        output=content,
        usage={
            'prompt_tokens': response.usage.prompt_tokens,
            'completion_tokens': response.usage.completion_tokens,
            'total_tokens': response.usage.total_tokens
        }
    )
    return content

trace = lf.trace(name='test-trace')
result = traced_llm_call(trace, 'What is the capital of France?')
print('Result:', result)

Filtraggio delle esecuzioni per errore e latenza

Utilizzi il client di LangSmith per trovare programmaticamente le esecuzioni problematiche. Filtri per stato di errore, soglia di latenza o tag specifici per concentrare le attività di debug.

from langsmith import Client
from datetime import datetime, timedelta

client = Client(api_key='ls__your-key')

def find_slow_runs(project: str, latency_threshold_ms: int = 10000):
    runs = list(client.list_runs(
        project_name=project,
        execution_order=1,
        start_time=datetime.utcnow() - timedelta(hours=24)
    ))
    
    slow_runs = []
    for run in runs:
        if run.end_time and run.start_time:
            duration_ms = (run.end_time - run.start_time).total_seconds() * 1000
            if duration_ms > latency_threshold_ms:
                slow_runs.append({
                    'id': str(run.id),
                    'name': run.name,
                    'duration_ms': round(duration_ms),
                    'tags': run.tags
                })
    
    slow_runs.sort(key=lambda x: x['duration_ms'], reverse=True)
    return slow_runs

print('Find slow runs function defined')
print('Usage: find_slow_runs("my-agent-project", latency_threshold_ms=5000)')

Confronto delle esecuzioni

LangSmith consente di confrontare due esecuzioni nella sua interfaccia utente per vedere cosa è cambiato. A livello programmatico, può confrontare gli output delle esecuzioni, l'utilizzo dei token e la latenza per rilevare regressioni dopo modifiche al modello o al prompt.

from langsmith import Client

client = Client(api_key='ls__your-key')

def compare_runs(run_id_1: str, run_id_2: str) -> dict:
    run1 = client.read_run(run_id_1)
    run2 = client.read_run(run_id_2)
    
    def get_tokens(run):
        if run.total_tokens:
            return run.total_tokens
        return 0
    
    def get_latency_ms(run):
        if run.end_time and run.start_time:
            return (run.end_time - run.start_time).total_seconds() * 1000
        return 0
    
    return {
        'run1': {'id': run_id_1, 'tokens': get_tokens(run1), 'latency_ms': get_latency_ms(run1), 'status': run1.status},
        'run2': {'id': run_id_2, 'tokens': get_tokens(run2), 'latency_ms': get_latency_ms(run2), 'status': run2.status},
        'token_delta': get_tokens(run2) - get_tokens(run1),
        'latency_delta_ms': get_latency_ms(run2) - get_latency_ms(run1)
    }

print('Run comparison function defined')

Aggiunta di punteggi e feedback

Dopo aver valutato un'esecuzione dell'agente, manualmente o automaticamente, aggiunga un punteggio o un feedback alla traccia. In questo modo crea un dataset per il fine-tuning o per valutare le modifiche ai prompt.

from langsmith import Client

client = Client(api_key='ls__your-key')

def score_run(run_id: str, score: float, reasoning: str = ''):
    # score: 0.0 (bad) to 1.0 (perfect)
    client.create_feedback(
        run_id=run_id,
        key='quality',
        score=score,
        comment=reasoning
    )

def auto_evaluate_run(run_id: str, expected_output: str, actual_output: str) -> float:
    # Simple heuristic: check if key terms from expected output are present
    expected_terms = set(expected_output.lower().split())
    actual_terms = set(actual_output.lower().split())
    overlap = len(expected_terms & actual_terms) / max(len(expected_terms), 1)
    score = min(1.0, overlap * 1.5)  # Normalize
    score_run(run_id, score, f'Term overlap: {overlap:.2f}')
    return score

print('Scoring functions defined')
print('Example: score_run("run-id-abc", 0.85, "Good answer but missing one detail")')

Contesto strutturato delle tracce

Alleghi alle tracce un contesto significativo: ID della sessione, ID dell'utente, versione dell'agente e feature flag. In questo modo è facile segmentare le tracce e confrontare le prestazioni tra configurazioni diverse.

import os
from langsmith import traceable
from langchain_core.runnables import RunnableConfig

def build_trace_config(user_id: str, session_id: str, version: str) -> dict:
    return {
        'metadata': {
            'user_id': user_id,
            'session_id': session_id,
            'agent_version': version,
            'environment': os.environ.get('ENV', 'development')
        },
        'tags': [version, os.environ.get('ENV', 'development')],
        'run_name': f'agent-{user_id[:8]}'
    }

@traceable
def run_agent_with_context(question: str, user_id: str, session_id: str):
    config = build_trace_config(user_id, session_id, 'v2.3')
    # Pass config to any LangChain component
    # llm.invoke([HumanMessage(content=question)], config=config)
    print(f'Running agent for user {user_id}, session {session_id}')
    return 'Answer here'

result = run_agent_with_context('Question', 'user-001', 'sess-xyz')
print(result)

Configurazione degli avvisi

Monitori lo stato dell'agente configurando avvisi in LangSmith o Langfuse. Generi un avviso quando il tasso di errore supera una soglia, quando la latenza P99 aumenta improvvisamente o quando un passaggio specifico fallisce sistematicamente.

from langsmith import Client
from datetime import datetime, timedelta

client = Client(api_key='ls__your-key')

def check_error_rate(project: str, window_minutes: int = 60, threshold: float = 0.05) -> dict:
    runs = list(client.list_runs(
        project_name=project,
        execution_order=1,
        start_time=datetime.utcnow() - timedelta(minutes=window_minutes)
    ))
    
    if not runs:
        return {'error_rate': 0.0, 'alert': False}
    
    error_count = sum(1 for r in runs if r.status == 'error')
    error_rate = error_count / len(runs)
    
    if error_rate > threshold:
        print(f'ALERT: Error rate {error_rate:.1%} exceeds threshold {threshold:.1%}')
        # Send to Slack/PagerDuty here
    
    return {
        'total_runs': len(runs),
        'error_count': error_count,
        'error_rate': round(error_rate, 4),
        'alert': error_rate > threshold
    }

print('Error rate monitor defined')

Verifica delle conoscenze: tracing

Verifichi la Sua comprensione del tracing degli agenti con LangSmith e Langfuse.

Riepilogo del tracing

LangSmith e Langfuse sono strumenti complementari: LangSmith si integra strettamente con LangChain e richiede una configurazione minima, mentre Langfuse funziona con qualsiasi framework e offre un maggiore controllo. Entrambi registrano input, output, utilizzo dei token, latenza ed errori per ogni passaggio dell'agente. Utilizzi filtri, punteggi e avvisi per mantenere la qualità dell'agente in produzione.

Domande Frequenti

La lezione «Analisi delle tracce con LangSmith e Langfuse» è gratuita?

Sì — il testo completo di «Analisi delle tracce con LangSmith e Langfuse» è 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 Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Analisi delle tracce con LangSmith e Langfuse»?

Lettura delle tracce: identificazione degli strumenti lenti, delle decisioni errate e dei modelli di errore. Eserciti AI Agents 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 Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Analisi delle tracce con LangSmith e Langfuse»?

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 Agents?

Sì. Ogni lezione AI Agents 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

  1. Analisi delle tracce con LangSmith e Langfuse
  2. Profilazione di token e costi per passaggio
  3. Identificazione dei passaggi lenti e costosi
  4. Analisi delle cause principali dei malfunzionamenti degli agenti
← Torna a AI Agents