0Pricing
AI Engineering Academy · Lektion

Tracing mit LangSmith

Instrumentieren Sie Ihre LangChain-Anwendung mit LangSmith Tracing, um jeden Chain-Schritt, jeden LLM-Aufruf, die Token-Anzahl und die Latenz in einem durchsuchbaren Trace-Explorer zu erfassen.

Tracing mit LangSmith ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist LangSmith?

LangSmith ist eine speziell für LLM-Anwendungen entwickelte Observability-Plattform. Sie erfasst automatisch Traces jedes LangChain-Laufs – jeden Kettenschritt, LLM-Aufruf, Tool-Aufruf, Retrieval-Schritt und Output-Parser – und zeigt sie in einem durchsuchbaren, hierarchischen Trace-Explorer an. Sie können Traces nach Latenz, Kosten, Fehlerstatus oder benutzerdefinierten Metadaten filtern und jeden Trace zur Fehleranalyse erneut ausführen.

# 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 agent

Automatisches Tracing ohne Codeänderungen

Die überzeugendste Funktion von LangSmith besteht darin, dass nach dem Setzen der drei Umgebungsvariablen jede LangChain-Operation automatisch getraced wird, ohne dass zusätzlicher Code erforderlich ist. Jede LCEL-Kette, jeder ChatOpenAI-Aufruf, jeder Retriever-Aufruf und jede Tool-Ausführung wird mit Eingaben, Ausgaben, Zeitangaben und Tokenanzahlen erfasst. Sie können das LangSmith-Tracing mit einer einzigen Änderung an einer Umgebungsvariablen in der Produktion einsetzen.

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)

RAG-Pipelines tracen

Für RAG-Anwendungen sind LangSmith-Traces besonders wertvoll, da sie die gesamte Pipeline aus Retrieval und anschließender Generierung erfassen. Sie sehen, welche Dokumente abgerufen wurden, wie hoch deren Ähnlichkeitswerte waren, wie der Kontext im Prompt formatiert wurde und was das LLM generiert hat. Dadurch wird sofort ersichtlich, ob eine falsche Antwort durch fehlerhaftes Retrieval oder eine mangelhafte Generierung verursacht wurde.

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?')

Metadaten zu Traces hinzufügen

Standardmäßig enthalten LangSmith-Traces die Eingaben und Ausgaben jedes Schritts. Sie können Traces mit benutzerdefinierten Metadaten-Tags anreichern: Benutzer-ID, Session-ID, Werte von Feature-Flags, A/B-Testvariante oder jeden anderen Kontext, der Sie beim Filtern und Analysieren von Traces in der Benutzeroberfläche unterstützt. Verwenden Sie RunnableConfig, um Metadaten zu übergeben, die in jedem Trace dieser Anfrage erscheinen.

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'

Manuelle Spans erstellen

Für Code, der nicht über LangChain läuft (benutzerdefinierte API-Aufrufe, Datenbankabfragen und Vorverarbeitungsschritte), können Sie direkt mit dem LangSmith-Client manuelle Spans erstellen. Dadurch werden Ihre Schritte außerhalb von LangChain im selben Trace wie die LangChain-Schritte erfasst, sodass Sie ein vollständiges Bild des Ausführungspfads jeder Anfrage erhalten.

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

Traces in LangSmith evaluieren

LangSmith enthält ein Evaluierungs-Framework, mit dem Sie Evaluatoren auf Ihrem Trace-Datensatz ausführen können. Sie können eine Gruppe getraceter Beispiele auswählen, automatisierte Evaluatoren ausführen (einschließlich LLM-as-judge-Bewertern für Korrektheit und Relevanz) und die Ergebnisse verschiedener Pipeline-Versionen vergleichen. So werden Ihre Produktions-Traces zu einer Feedbackschleife für die Verbesserung Ihrer Anwendung.

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')

Testdatensätze aus Traces erstellen

Eine der leistungsstärksten Funktionen von LangSmith ist die Möglichkeit, Testdatensätze direkt aus Produktions-Traces zu erstellen. Wenn Sie auf einen interessanten Trace stoßen (einen Fehler, einen Grenzfall oder ein besonders gutes Beispiel), können Sie ihn mit nur einem Klick zu einem Datensatz hinzufügen. Mit der Zeit bauen Sie so aus echten Benutzeranfragen statt aus synthetischen Beispielen eine umfassende Regressionstestsuite auf.

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')

Traces filtern und durchsuchen

In der Produktion werden Sie Tausende von Traces haben. Die Benutzeroberfläche und die API von LangSmith unterstützen umfangreiche Filter- und Suchfunktionen: Sie können Traces mit einer Latenz oberhalb eines Schwellenwerts, einem bestimmten Fehlertyp, von einem bestimmten Benutzer, mit einem bestimmten Schlüsselwort in der Ausgabe oder mit einer Anzahl von Completion-Tokens oberhalb eines Limits finden. Dadurch lassen sich bestimmte Fehlerkategorien gezielt untersuchen oder das Verhalten bestimmter Benutzer überwachen.

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}')

Experimente in LangSmith vergleichen

LangSmith unterstützt den Vergleich von Experimenten: Führen Sie denselben Testdatensatz durch zwei Versionen Ihrer Pipeline (z. B. mit einer Chunk-Größe von 500 gegenüber einer Chunk-Größe von 1000) und vergleichen Sie diese nebeneinander anhand von Latenz-, Kosten- und Qualitätsmetriken. So können Sie vor der Bereitstellung in der Produktion einfach überprüfen, ob eine Änderung an der Pipeline tatsächlich eine Verbesserung und keine Verschlechterung darstellt.

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 der Produktion

LangSmith ist als gehostete SaaS-Lösung unter smith.langchain.com sowie als selbst gehostete Option verfügbar. In der Produktion kann das Tracing asynchron (nicht blockierend) ausgeführt werden, damit der kritische Ausführungspfad nicht zusätzlich verlangsamt wird. Sie können Traces außerdem stichprobenartig erfassen (z. B. in einer stark ausgelasteten Produktionsumgebung nur 10 % der Anfragen), um die Kosten zu kontrollieren und gleichzeitig den Überblick zu behalten. Das Dashboard zeigt Echtzeitdiagramme für Anfragevolumen, Latenz, Kosten und Fehlerrate.

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 im Vergleich zu benutzerdefiniertem Logging

Sie könnten Ihr eigenes System zur Protokollierung von Traces entwickeln; für manche Anwendungsfälle ist das auch die richtige Wahl. Die Vorteile von LangSmith gegenüber benutzerdefiniertem Logging sind: codefreie Integration mit LangChain, eine speziell für die Untersuchung von LLM-Traces entwickelte Benutzeroberfläche (statt allgemeiner Kibana-/Grafana-Dashboards), native Unterstützung für Evaluierung und Experimentvergleich sowie automatische Erfassung von Tokenanzahl und Kosten. Der Nachteil sind die Abhängigkeit vom Anbieter und die Kosten bei einer großen Skalierung.

Kurze Überprüfung

Testen Sie in dieser Lektion Ihr Verständnis des Tracings mit LangSmith.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: LangSmith ermöglicht durch das Setzen von drei Umgebungsvariablen ein automatisches End-to-End-Tracing von LangChain-Anwendungen ohne Codeänderungen; der Decorator @traceable erweitert das Tracing auf Schritte außerhalb von LangChain, etwa Datenbankaufrufe und die Vorverarbeitung; und der Experimentvergleich ermöglicht es, Verbesserungen an der Pipeline anhand eines Testdatensatzes zu validieren, bevor sie bereitgestellt werden. Als Nächstes sehen wir uns Langfuse als modellagnostische Observability-Alternative an.

Häufig gestellte Fragen

Ist die Lektion „Tracing mit LangSmith“ kostenlos?

Ja — der vollständige Text von „Tracing mit LangSmith“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Tracing mit LangSmith“?

Instrumentieren Sie Ihre LangChain-Anwendung mit LangSmith Tracing, um jeden Chain-Schritt, jeden LLM-Aufruf, die Token-Anzahl und die Latenz in einem durchsuchbaren Trace-Explorer zu erfassen. Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Engineering Academy zu starten?

Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Tracing mit LangSmith“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?

Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Warum sich LLM-Anwendungen schwer debuggen lassen
  2. Tracing mit LangSmith
  3. Langfuse für modellunabhängige Observability
  4. Alarme bei Latenz, Kosten und Qualitätsverlust
← Zurück zu AI Engineering Academy