Skip to content
leeyc blog Search
← Back to blog

LangSmith

1. LangSmith란?

LangSmith는 LangChain 팀이 개발한 LLM 애플리케이션 개발 및 운영 플랫폼입니다.
LLM 기반 앱을 디버깅하고, 테스트하고, 평가하고, 모니터링하는 데 필요한 모든 도구를 제공합니다.

한 줄 요약: “LLM 앱을 위한 개발자 도구 + 관측 가능성(Observability) 플랫폼”

LangSmith가 필요한 이유

LLM 앱 개발에서 흔히 겪는 문제들:

LangSmith는 이 모든 문제를 해결해 줍니다.


2. 핵심 기능

기능설명
TracingLLM 호출, 체인, 에이전트의 모든 실행 흐름을 시각적으로 추적
Evaluation데이터셋 기반으로 모델/프롬프트 품질을 자동 평가
Prompt Hub프롬프트를 버전 관리하고 팀과 공유
Datasets테스트용 입출력 예제 데이터셋 관리
Monitoring프로덕션 환경의 레이턴시, 비용, 에러율 실시간 모니터링
Playground프롬프트를 브라우저에서 바로 테스트

3. 시작하기

3-1. 계정 생성 및 API 키 발급

  1. smith.langchain.com 접속
  2. 회원가입 (GitHub/Google 계정 사용 가능)
  3. Settings → API Keys → Create API Key 클릭
  4. 발급된 키를 안전하게 보관

3-2. 패키지 설치

pip install langsmith
# LangChain과 함께 사용 시
pip install langchain langchain-openai

3-3. 환경 변수 설정

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT="my-project"

.env 파일로 관리하는 경우:

LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=ls__xxxxxxxxxxxxxxxx
LANGCHAIN_PROJECT=my-awesome-project
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
from dotenv import load_dotenv
load_dotenv()

4. Tracing (추적)

Tracing은 LangSmith의 핵심 기능입니다.
LLM 호출의 입력/출력, 소요 시간, 토큰 수, 비용 등을 자동으로 기록합니다.

4-1. LangChain 자동 추적

환경 변수만 설정하면 LangChain 코드가 자동으로 추적됩니다.

import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "ls__..."

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

llm = ChatOpenAI(model="gpt-4o")
response = llm.invoke([HumanMessage(content="서울의 인구는?")])
print(response.content)
# LangSmith 대시보드에서 이 호출을 즉시 확인 가능

4-2. @traceable 데코레이터 (순수 Python 함수)

LangChain 없이 일반 함수도 추적할 수 있습니다.

from langsmith import traceable
from openai import OpenAI

client = OpenAI()

@traceable
def call_openai(prompt: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

@traceable
def rag_pipeline(question: str) -> str:
    docs = retrieve_documents(question)
    context = "\n".join(docs)
    return call_openai(f"Context: {context}\n\nQuestion: {question}")

result = rag_pipeline("LangSmith의 주요 기능은?")

4-3. 추적 데이터 확인

LangSmith 대시보드 → Projects → 프로젝트 선택 → 실행 목록

각 실행에서 볼 수 있는 정보:


5. Evaluation (평가)

5-1. 데이터셋 생성

from langsmith import Client

client = Client()

examples = [
    {"input": {"question": "파이썬이란?"},
     "output": {"answer": "파이썬은 범용 프로그래밍 언어입니다."}},
    {"input": {"question": "LangChain이란?"},
     "output": {"answer": "LLM 앱 개발 프레임워크입니다."}},
]

dataset = client.create_dataset(
    dataset_name="qa-test-set",
    description="QA 파이프라인 테스트용 데이터셋"
)

for ex in examples:
    client.create_example(
        inputs=ex["input"],
        outputs=ex["output"],
        dataset_id=dataset.id
    )

5-2. 평가 실행

from langsmith.evaluation import evaluate

def my_qa_app(inputs: dict) -> dict:
    return {"answer": call_openai(inputs["question"])}

def correctness_evaluator(run, example) -> dict:
    predicted = run.outputs.get("answer", "")
    expected = example.outputs.get("answer", "")
    score = 1.0 if expected.split()[0] in predicted else 0.0
    return {"key": "correctness", "score": score}

results = evaluate(
    my_qa_app,
    data="qa-test-set",
    evaluators=[correctness_evaluator],
    experiment_prefix="gpt4o-baseline"
)

5-3. LLM-as-Judge

from langsmith.evaluation import LangChainStringEvaluator

qa_evaluator = LangChainStringEvaluator(
    "qa",
    config={"llm": ChatOpenAI(model="gpt-4o")}
)

results = evaluate(
    my_qa_app,
    data="qa-test-set",
    evaluators=[qa_evaluator],
    experiment_prefix="gpt4o-llm-judge"
)

6. Prompt Hub

팀 전체가 프롬프트를 버전 관리하고 공유할 수 있는 저장소입니다.

6-1. 프롬프트 push (업로드)

from langchain_core.prompts import ChatPromptTemplate
from langsmith import Client

client = Client()

prompt = ChatPromptTemplate.from_messages([
    ("system", "당신은 {role} 전문가입니다. 친절하고 명확하게 답변하세요."),
    ("human", "{question}")
])

client.push_prompt("my-expert-prompt", object=prompt)

6-2. 프롬프트 pull (다운로드)

from langsmith import Client

client = Client()

# 최신 버전
prompt = client.pull_prompt("my-expert-prompt")

# 특정 버전 고정
prompt = client.pull_prompt("my-expert-prompt:abc123de")

chain = prompt | ChatOpenAI(model="gpt-4o")
response = chain.invoke({"role": "Python", "question": "데코레이터란?"})

7. Monitoring (모니터링)

대시보드 주요 지표

사용자 피드백 수집

from langsmith import Client
from langsmith.run_helpers import get_current_run_tree

client = Client()

@traceable
def my_app(question: str) -> str:
    run = get_current_run_tree()
    answer = call_openai(question)

    client.create_feedback(
        run.id,
        key="user_rating",
        score=1,       # 1: 긍정, 0: 부정
        comment="좋은 답변이에요!"
    )
    return answer

8. 실전 예제 — RAG 파이프라인 전체 추적

import os
from langsmith import traceable
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "ls__..."
os.environ["LANGCHAIN_PROJECT"] = "rag-demo"

embeddings = OpenAIEmbeddings()
llm = ChatOpenAI(model="gpt-4o")

vectorstore = FAISS.from_texts(
    ["LangSmith는 LLM 앱 관측 플랫폼입니다.",
     "LangChain은 LLM 앱 개발 프레임워크입니다."],
    embedding=embeddings
)

prompt = ChatPromptTemplate.from_template("""
다음 컨텍스트를 바탕으로 질문에 답하세요.

컨텍스트:
{context}

질문: {question}
""")

@traceable(name="RAG Pipeline")
def rag_answer(question: str) -> str:
    docs = vectorstore.similarity_search(question, k=3)
    context = "\n".join([d.page_content for d in docs])
    chain = prompt | llm
    response = chain.invoke({"context": context, "question": question})
    return response.content

answer = rag_answer("LangSmith가 뭔가요?")
print(answer)

9. 요금제

플랜가격특징
Developer (Free)무료월 5,000 트레이스, 1명
Plus$39/월월 50,000 트레이스, 협업 기능
Enterprise문의무제한, SSO, 전용 지원

💡 개인 프로젝트나 학습 목적이라면 무료 플랜으로 충분합니다.


참고 링크



← Previous LangGraph Next → Multi-Agent & Workflow