0Pricing
AI Engineering Academy · 강의

LangSmith를 활용한 추적

LangSmith 추적 기능으로 LangChain 애플리케이션을 계측하여 모든 체인 단계, LLM 호출, 토큰 수, 지연 시간을 검색 가능한 추적 탐색기에 기록합니다.

LangSmith를 활용한 추적은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

LangSmith란 무엇인가요?

LangSmith는 LLM 애플리케이션을 위해 특별히 구축된 관측성 플랫폼입니다. 모든 LangChain 실행, 즉 모든 연쇄 단계, LLM 호출, 도구 실행, 검색, 출력 구문 분석기의 추적을 자동으로 수집하고 검색 가능한 계층형 추적 탐색기에 표시합니다. 지연 시간, 비용, 오류 상태, 사용자 지정 메타데이터를 기준으로 추적을 필터링할 수 있으며, 실패를 디버깅하기 위해 어떤 추적이든 재생할 수 있습니다.

# 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

코드 변경 없이 자동 추적하기

LangSmith의 가장 매력적인 기능은 환경 변수 세 개를 설정하기만 하면 추가 코드 없이 모든 LangChain 작업이 자동으로 추적된다는 점입니다. 모든 LCEL 연쇄 과정, 모든 ChatOpenAI 호출, 모든 검색기 호출, 모든 도구 실행이 입력, 출력, 시간 측정값, 토큰 수와 함께 수집됩니다. 환경 변수 하나만 변경하여 운영 환경에 LangSmith 추적을 배포할 수 있습니다.

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 처리 과정 추적하기

RAG 애플리케이션에서는 전체 검색 후 생성 처리 과정을 수집하므로 LangSmith 추적이 특히 유용합니다. 어떤 문서를 검색했는지, 문서의 유사도 점수가 얼마였는지, 프롬프트에서 맥락이 어떻게 구성되었는지, LLM이 무엇을 생성했는지를 확인할 수 있습니다. 따라서 잘못된 답변이 부정확한 검색 때문인지 부실한 생성 때문인지 즉시 알 수 있습니다.

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

추적에 메타데이터 추가하기

기본적으로 LangSmith 추적에는 각 단계의 입력과 출력이 포함됩니다. 사용자 ID, 세션 ID, 기능 플래그 값, A/B 시험 변형 또는 UI에서 추적을 필터링하고 분석하는 데 도움이 되는 다른 맥락을 사용자 지정 메타데이터 태그로 추가하여 추적을 보강할 수 있습니다. RunnableConfig를 사용하여 해당 요청에서 발생하는 모든 추적에 표시될 메타데이터를 전달하십시오.

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'

수동 구간 만들기

LangChain을 거치지 않는 코드(사용자 지정 API 호출, 데이터베이스 질의, 전처리 단계)의 경우 LangSmith 클라이언트를 직접 사용하여 수동 구간을 만들 수 있습니다. 이렇게 하면 LangChain을 사용하지 않는 단계도 LangChain 단계와 동일한 추적에 수집되어 각 요청의 실행 경로를 완전히 파악할 수 있습니다.

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

LangSmith에서 추적 평가하기

LangSmith에는 추적 데이터 세트에 평가기를 실행할 수 있는 평가 프레임워크가 포함되어 있습니다. 추적된 예시 집합을 선택하고, 자동 평가기(정확성과 관련성을 평가하는 LLM-as-judge 점수 매기기 포함)를 실행한 다음, 서로 다른 처리 과정 버전의 결과를 비교할 수 있습니다. 이를 통해 운영 환경의 추적을 애플리케이션 개선을 위한 피드백 순환으로 활용할 수 있습니다.

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

추적에서 시험 데이터 세트 만들기

LangSmith의 가장 강력한 기능 중 하나는 운영 환경의 추적에서 직접 시험 데이터 세트를 만들 수 있다는 점입니다. 흥미로운 추적(실패, 경계 사례 또는 훌륭한 예시)을 발견하면 한 번의 클릭으로 데이터 세트에 추가할 수 있습니다. 시간이 지나면 인공적으로 만든 예시가 아니라 실제 사용자 질의로 구성된 포괄적인 회귀 시험 모음을 구축할 수 있습니다.

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

추적 필터링 및 검색하기

운영 환경에서는 수천 개의 추적이 쌓이게 됩니다. LangSmith의 UI와 API는 강력한 필터링 및 검색을 지원합니다. 기준값을 초과하는 지연 시간이 있는 추적, 특정 오류 유형이 있는 추적, 특정 사용자의 추적, 출력에 특정 키워드가 포함된 추적, 또는 완성 토큰 수가 한도를 초과하는 추적을 찾을 수 있습니다. 따라서 특정 실패 범주를 조사하거나 특정 사용자의 동작을 모니터링하기가 쉬워집니다.

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

LangSmith에서 실험 비교하기

LangSmith는 실험 비교를 지원합니다. 동일한 시험 데이터 세트를 처리 과정의 두 버전(예: 청크 크기 500과 청크 크기 1000)에 각각 실행하고, 지연 시간, 비용, 품질 지표를 나란히 비교할 수 있습니다. 이를 통해 처리 과정의 변경 사항이 운영 환경에 배포하기 전에 성능 저하가 아니라 개선인지 쉽게 검증할 수 있습니다.

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

LangSmith는 smith.langchain.com에서 호스팅형 SaaS로 제공되며 자체 호스팅 옵션도 있습니다. 운영 환경에서는 핵심 경로에 지연 시간이 추가되지 않도록 추적을 비동기 방식(비차단)으로 설정할 수 있습니다. 또한 비용을 제어하면서 가시성을 유지하기 위해 추적을 표본 추출할 수도 있습니다(예: 트래픽이 많은 운영 환경에서 요청의 10%만 추적). 대시보드에는 요청량, 지연 시간, 비용, 오류율의 실시간 그래프가 표시됩니다.

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와 사용자 지정 로그 기록 비교

직접 추적 로깅 시스템을 구축할 수도 있으며, 일부 사용 사례에서는 이것이 올바른 선택입니다. 맞춤형 로깅과 비교한 LangSmith의 장점은 다음과 같습니다. LangChain과 코드 수정 없이 통합할 수 있고, 일반적인 Kibana/Grafana 대시보드가 아닌 LLM 추적을 탐색하는 데 특화된 UI를 제공하며, 평가와 실험 비교를 기본적으로 지원하고, 토큰 수와 비용을 자동으로 추적합니다. 그 대신 공급업체 종속성이 생기고 규모가 커지면 비용이 발생합니다.

빠른 확인

이 강의에서 배운 LangSmith를 사용한 추적에 대한 이해도를 확인해 보세요.

강의 요약

이 강의에서는 다음을 배웠습니다. LangSmith는 코드 변경 없이 환경 변수 세 개를 설정하는 것만으로 LangChain 애플리케이션을 종단 간 자동 추적할 수 있게 하며, @traceable 데코레이터를 사용하면 데이터베이스 호출이나 전처리처럼 LangChain 외부의 단계까지 추적할 수 있습니다. 또한 실험 비교를 통해 배포 전에 테스트 데이터 세트를 기준으로 파이프라인 개선 사항을 검증할 수 있습니다. 다음 강의에서는 모델에 종속되지 않는 관측 가능성 도구인 Langfuse를 살펴보겠습니다.

자주 묻는 질문

“LangSmith를 활용한 추적” 강의는 무료인가요?

네 — “LangSmith를 활용한 추적” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“LangSmith를 활용한 추적”에서 뭘 배우나요?

LangSmith 추적 기능으로 LangChain 애플리케이션을 계측하여 모든 체인 단계, LLM 호출, 토큰 수, 지연 시간을 검색 가능한 추적 탐색기에 기록합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“LangSmith를 활용한 추적” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. LLM 애플리케이션을 디버깅하기 어려운 이유
  2. LangSmith를 활용한 추적
  3. 모델에 구애받지 않는 관측성을 위한 Langfuse
  4. 지연 시간, 비용, 품질 저하 알림
← AI Engineering Academy(으)로 돌아가기