Śledzenie za pomocą LangSmith
Dodaj do aplikacji LangChain instrumentację śledzenia LangSmith, aby rejestrować każdy krok łańcucha, wywołanie LLM, liczbę tokenów i opóźnienie w przeszukiwalnym eksploratorze śladów.
Śledzenie za pomocą LangSmith to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Czym jest LangSmith?
LangSmith to platforma obserwowalności stworzona specjalnie dla aplikacji LLM. Automatycznie przechwytuje ślady każdego uruchomienia LangChain — każdego etapu łańcucha, wywołania LLM, wykonania narzędzia, pobrania danych i parsera wyniku — oraz wyświetla je w przeszukiwalnym, hierarchicznym eksploratorze śladów. Można filtrować ślady według opóźnienia, kosztu, statusu błędu lub własnych metadanych, a także ponownie uruchomić dowolny ślad, aby debugować błędy.
# 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 agentAutomatyczne śledzenie bez zmian w kodzie
Najbardziej przekonującą funkcją LangSmith jest to, że po ustawieniu trzech zmiennych środowiskowych każda operacja LangChain jest automatycznie śledzona, bez dodatkowego kodu. Każdy łańcuch LCEL, każde wywołanie ChatOpenAI, każde wywołanie mechanizmu pobierania i każde wykonanie narzędzia jest przechwytywane wraz z danymi wejściowymi, wynikami, czasem wykonania i liczbą tokenów. Śledzenie LangSmith można wdrożyć na produkcji, zmieniając tylko jedną zmienną środowiskową.
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)Śledzenie potoków RAG
W przypadku aplikacji RAG ślady LangSmith są szczególnie wartościowe, ponieważ przechwytują cały potok pobierania, a następnie generowania. Można zobaczyć: które dokumenty zostały pobrane, jakie miały wyniki podobieństwa, jak kontekst został sformatowany w promptcie oraz co wygenerował LLM. Dzięki temu od razu widać, czy niepoprawna odpowiedź była spowodowana błędnym pobieraniem danych, czy nieudanym generowaniem.
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?')Dodawanie metadanych do śladów
Domyślnie ślady LangSmith zawierają dane wejściowe i wyniki każdego etapu. Można je wzbogacić o własne znaczniki metadanych: identyfikator użytkownika, identyfikator sesji, wartości przełączników funkcji, wariant testu A/B lub dowolny inny kontekst ułatwiający filtrowanie i analizowanie śladów w interfejsie. Użyj RunnableConfig, aby przekazać metadane, które pojawią się na każdym śladzie z danego żądania.
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'Ręczne tworzenie spanów
W przypadku kodu, który nie korzysta z LangChain (własnych wywołań API, zapytań do baz danych czy kroków wstępnego przetwarzania), można tworzyć ręczne spany bezpośrednio za pomocą klienta LangSmith. Dzięki temu kroki spoza LangChain zostaną przechwycone w tym samym śladzie co kroki LangChain, zapewniając pełny obraz ścieżki wykonania każdego żądania.
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 resultEwaluacja śladów w LangSmith
LangSmith zawiera framework ewaluacyjny, który umożliwia uruchamianie ewaluatorów na zbiorze danych śladów. Można wybrać zestaw prześledzonych przykładów, uruchomić automatyczne ewaluatory (w tym oceniające LLM jako sędziego pod kątem poprawności i trafności) oraz porównać wyniki różnych wersji potoku. Dzięki temu ślady produkcyjne stają się pętlą informacji zwrotnych służącą do ulepszania aplikacji.
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')Tworzenie zbiorów testowych ze śladów
Jedną z najpotężniejszych funkcji LangSmith jest możliwość tworzenia zbiorów testowych bezpośrednio ze śladów produkcyjnych. Gdy znajdziesz interesujący ślad (błąd, przypadek brzegowy lub świetny przykład), możesz jednym kliknięciem dodać go do zbioru danych. Z czasem utworzysz kompleksowy zestaw testów regresji oparty na rzeczywistych zapytaniach użytkowników, a nie na przykładach syntetycznych.
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')Filtrowanie i wyszukiwanie śladów
W środowisku produkcyjnym będziesz mieć tysiące śladów. Interfejs i API LangSmith obsługują zaawansowane filtrowanie i wyszukiwanie: można znaleźć ślady z opóźnieniem przekraczającym określony próg, konkretnym typem błędu, pochodzące od konkretnego użytkownika, zawierające określone słowo kluczowe w wyniku lub mające liczbę tokenów uzupełnienia przekraczającą limit. Dzięki temu można praktycznie badać konkretne kategorie błędów lub monitorować zachowanie wybranych użytkowników.
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}')Porównywanie eksperymentów w LangSmith
LangSmith obsługuje porównywanie eksperymentów: uruchom ten sam zbiór testowy na dwóch wersjach potoku (np. z rozmiarem fragmentu 500 i 1000), a następnie porównaj je obok siebie pod względem opóźnienia, kosztu i metryk jakości. Ułatwia to sprawdzenie przed wdrożeniem na produkcji, czy zmiana w potoku jest ulepszeniem, a nie regresją.
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 na produkcji
LangSmith jest dostępny jako hostowana usługa SaaS pod adresem smith.langchain.com oraz jako opcja do samodzielnego hostowania. Na produkcji śledzenie można wykonywać asynchronicznie (nieblokująco), aby nie zwiększać opóźnienia na ścieżce krytycznej. Można również próbkować ślady (np. śledzić tylko 10% żądań w produkcji o dużym ruchu), aby kontrolować koszty i zachować widoczność. Pulpit nawigacyjny pokazuje wykresy w czasie rzeczywistym dotyczące liczby żądań, opóźnienia, kosztu i współczynnika błędów.
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 a własne logowanie
Mogą Państwo zbudować własny system logowania śladów, a w niektórych przypadkach jest to właściwy wybór. Przewagi LangSmith nad niestandardowym logowaniem to: integracja z LangChain bez konieczności pisania kodu, interfejs zaprojektowany specjalnie do analizowania śladów LLM (a nie ogólne pulpity Kibana/Grafana), natywna obsługa ewaluacji i porównywania eksperymentów oraz automatyczne śledzenie liczby tokenów i kosztów. Kompromisem jest zależność od dostawcy i koszt przy dużej skali.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat śledzenia za pomocą LangSmith z tego modułu.
Podsumowanie modułu
W tym module dowiedzieli się Państwo, że: LangSmith umożliwia automatyczne śledzenie od początku do końca aplikacji LangChain po ustawieniu trzech zmiennych środowiskowych, bez zmian w kodzie; dekorator @traceable rozszerza śledzenie na kroki spoza LangChain, takie jak wywołania baz danych i wstępne przetwarzanie; a porównywanie eksperymentów pozwala zweryfikować ulepszenia potoku na testowym zbiorze danych przed wdrożeniem. Następnie omówimy Langfuse jako niezależną od modelu alternatywę do obserwowalności.
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Śledzenie za pomocą LangSmith” jest bezpłatna?
Tak — pełny tekst „Śledzenie za pomocą LangSmith” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Śledzenie za pomocą LangSmith”?
Dodaj do aplikacji LangChain instrumentację śledzenia LangSmith, aby rejestrować każdy krok łańcucha, wywołanie LLM, liczbę tokenów i opóźnienie w przeszukiwalnym eksploratorze śladów. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Śledzenie za pomocą LangSmith”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego aplikacje LLM trudno debugować
- Śledzenie za pomocą LangSmith
- Langfuse do obserwowalności niezależnej od modelu
- Alerty dotyczące opóźnień, kosztów i spadku jakości