Skip to main content
LangSmith는 LLM 애플리케이션 구축을 위한 인기 있는 오픈소스 프레임워크인 LangChain(Python 및 JavaScript)과 원활하게 통합됩니다.

설치

Python과 JS용 코어 라이브러리와 OpenAI 통합을 설치하세요(아래 코드 스니펫에서는 OpenAI 통합을 사용합니다). 사용 가능한 전체 패키지 목록은 LangChain Python 문서LangChain JS 문서를 참조하세요.
pip install langchain_openai langchain_core

빠른 시작

1. 환경 구성하기

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
# 이 예제는 OpenAI를 사용하지만, 원하는 LLM 제공자를 사용할 수 있습니다
export OPENAI_API_KEY=<your-openai-api-key>
# 여러 워크스페이스에 연결된 LangSmith API 키의 경우, 사용할 워크스페이스를 지정하기 위해 LANGSMITH_WORKSPACE_ID 환경 변수를 설정하세요.
export LANGSMITH_WORKSPACE_ID=<your-workspace-id>
LangSmith와 함께 LangChain.js를 사용하고 서버리스 환경이 아닌 경우, 지연 시간을 줄이기 위해 다음을 명시적으로 설정하는 것을 권장합니다:export LANGCHAIN_CALLBACKS_BACKGROUND=true서버리스 환경에서는 함수가 종료되기 전에 추적이 완료될 수 있도록 다음과 같이 설정하는 것을 권장합니다:export LANGCHAIN_CALLBACKS_BACKGROUND=false자세한 내용은 이 LangChain.js 가이드를 참조하세요.

2. 추적 로그 남기기

LangSmith에 추적을 기록하기 위해 추가 코드가 필요하지 않습니다. 평소처럼 LangChain 코드를 실행하기만 하면 됩니다.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant. Please respond to the user's request only based on the given context."),
    ("user", "Question: {question}\nContext: {context}")
])

model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()
chain = prompt | model | output_parser

question = "Can you summarize this morning's meetings?"
context = "During this morning's meeting, we solved all world conflict."

chain.invoke({"question": question, "context": context})

3. 추적 보기

기본적으로 추적은 default라는 이름의 프로젝트에 기록됩니다. 위 코드를 사용하여 기록된 추적의 예시는 공개되어 있으며 여기에서 볼 수 있습니다.

선택적으로 추적하기

이전 섹션에서는 단일 환경 변수를 설정하여 애플리케이션 내 모든 LangChain runnable 호출을 추적하는 방법을 보여드렸습니다. 이는 시작하기에 편리한 방법이지만, 특정 호출이나 애플리케이션의 일부만 추적하고 싶을 수 있습니다. Python에서는 두 가지 방법으로 이를 수행할 수 있습니다: LangChainTracer(참조 문서) 인스턴스를 콜백으로 수동으로 전달하거나, tracing_context 컨텍스트 매니저(참조 문서)를 사용하는 방법입니다. JS/TS에서는 LangChainTracer(참조 문서) 인스턴스를 콜백으로 전달할 수 있습니다.
# 특정 호출을 선택적으로 추적할 수 있습니다..
import langsmith as ls

with ls.tracing_context(enabled=True):
    chain.invoke({"question": "Am I using a callback?", "context": "I'm using a callback"})

# 이것은 추적되지 않습니다 (LANGSMITH_TRACING이 설정되지 않았다고 가정)
chain.invoke({"question": "Am I being traced?", "context": "I'm not being traced"})

# 이것은 LANGSMITH_TRACING=true일 때도 추적되지 않습니다
with ls.tracing_context(enabled=False):
    chain.invoke({"question": "Am I being traced?", "context": "I'm not being traced"})

특정 프로젝트에 로그 남기기

정적으로

추적 개념 가이드에서 언급했듯이, LangSmith는 추적을 그룹화하기 위해 프로젝트라는 개념을 사용합니다. 지정하지 않으면 추적 프로젝트는 default로 설정됩니다. 전체 애플리케이션 실행에 대한 사용자 정의 프로젝트 이름을 구성하려면 LANGSMITH_PROJECT 환경 변수를 설정할 수 있습니다. 이는 애플리케이션을 실행하기 전에 수행해야 합니다.
export LANGSMITH_PROJECT=my-project
LANGSMITH_PROJECT 플래그는 JS SDK 버전 >= 0.2.16에서만 지원됩니다. 이전 버전을 사용하는 경우 대신 LANGCHAIN_PROJECT를 사용하세요.

동적으로

이는 주로 이전 섹션을 기반으로 하며, Python에서 특정 LangChainTracer 인스턴스에 대한 프로젝트 이름을 설정하거나 tracing_context 컨텍스트 매니저의 매개변수로 설정할 수 있습니다.
# project_name 매개변수를 사용하여 프로젝트 이름을 설정할 수 있습니다.
import langsmith as ls

with ls.tracing_context(project_name="My Project", enabled=True):
    chain.invoke({"question": "Am I using a context manager?", "context": "I'm using a context manager"})

추적에 메타데이터 및 태그 추가하기

RunnableConfig에 제공하여 임의의 메타데이터 및 태그로 추적에 주석을 달 수 있습니다. 이는 실행된 환경이나 추적을 시작한 사용자와 같은 추가 정보를 추적과 연결하는 데 유용합니다. 메타데이터와 태그로 추적 및 실행을 쿼리하는 방법에 대한 정보는 이 가이드를 참조하세요.
runnable에 메타데이터나 태그를 연결하면(RunnableConfig를 통해 또는 호출 매개변수를 사용하여 런타임에), 해당 runnable의 모든 하위 runnable에 상속됩니다.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful AI."),
    ("user", "{input}")
])

# "model-tag" 태그와 메타데이터 {"model-key": "model-value"}는 ChatOpenAI 실행에만 연결됩니다
chat_model = ChatOpenAI().with_config({"tags": ["model-tag"], "metadata": {"model-key": "model-value"}})
output_parser = StrOutputParser()

# 태그와 메타데이터는 RunnableConfig로 구성할 수 있습니다
chain = (prompt | chat_model | output_parser).with_config({"tags": ["config-tag"], "metadata": {"config-key": "config-value"}})

# 태그와 메타데이터는 런타임에도 전달할 수 있습니다
chain.invoke({"input": "What is the meaning of life?"}, {"tags": ["invoke-tag"], "metadata": {"invoke-key": "invoke-value"}})

실행 이름 사용자 정의하기

LangChain 코드를 호출하거나 스트리밍할 때 Config에 제공하여 특정 실행의 이름을 사용자 정의할 수 있습니다. 이 이름은 LangSmith에서 실행을 식별하는 데 사용되며 실행을 필터링하고 그룹화하는 데 사용할 수 있습니다. 이름은 LangSmith UI에서 실행의 제목으로도 사용됩니다. 생성 시 RunnableConfig 객체에 run_name을 설정하거나 JS/TS에서 호출 매개변수에 run_name을 전달하여 수행할 수 있습니다.
# LangChain 내에서 추적할 때 실행 이름은 기본적으로 추적된 객체의 클래스 이름(예: 'ChatOpenAI')으로 설정됩니다.
configured_chain = chain.with_config({"run_name": "MyCustomChain"})
configured_chain.invoke({"input": "What is the meaning of life?"})

# 아래와 같이 호출 시점에 실행 이름을 구성할 수도 있습니다
chain.invoke({"input": "What is the meaning of life?"}, {"run_name": "MyCustomChain"})
run_name 매개변수는 호출하는 runnable(예: 체인, 함수)의 이름만 변경합니다. ChatOpenAI(gpt-4o-mini)와 같은 LLM 객체를 호출할 때 자동으로 생성되는 중첩된 실행의 이름은 변경하지 않습니다. 예제에서 상위 실행은 LangSmith에 MyCustomChain으로 표시되지만, 중첩된 LLM 실행은 여전히 모델의 기본 이름을 표시합니다.LLM 실행에 더 의미 있는 이름을 지정하려면 다음 중 하나를 수행할 수 있습니다:
  • 모델을 다른 runnable로 래핑하고 해당 단계에 run_name을 할당합니다.
  • 추적 데코레이터나 헬퍼(예: Python의 @traceable 또는 JS/TS의 langsmithtraceable)를 사용하여 모델 호출 주위에 사용자 정의 실행을 생성합니다.

실행 ID 사용자 정의하기

LangChain 코드를 호출하거나 스트리밍할 때 Config에 제공하여 특정 실행의 ID를 사용자 정의할 수 있습니다. 이 ID는 LangSmith에서 실행을 고유하게 식별하는 데 사용되며 특정 실행을 쿼리하는 데 사용할 수 있습니다. ID는 서로 다른 시스템 간에 실행을 연결하거나 사용자 정의 추적 로직을 구현하는 데 유용할 수 있습니다. 생성 시 RunnableConfig 객체에 run_id를 설정하거나 호출 매개변수에 run_id를 전달하여 수행할 수 있습니다.
이 기능은 현재 LLM 객체에 대해 직접 지원되지 않습니다.
import uuid

my_uuid = uuid.uuid4()

# 호출 시점에 실행 ID를 구성할 수 있습니다:
chain.invoke({"input": "What is the meaning of life?"}, {"run_id": my_uuid})
추적의 루트(즉, 최상위 실행)에서 이를 수행하면 해당 실행 ID가 trace_id로 사용됩니다.

LangChain 호출에 대한 실행(스팬) ID 액세스하기

LangChain 객체를 호출할 때 호출의 실행 ID를 수동으로 지정할 수 있습니다. 이 실행 ID는 LangSmith에서 실행을 쿼리하는 데 사용할 수 있습니다. JS/TS에서는 RunCollectorCallbackHandler 인스턴스를 사용하여 실행 ID에 액세스할 수 있습니다.
import uuid

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant. Please respond to the user's request only based on the given context."),
    ("user", "Question: {question}\n\nContext: {context}")
])
model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

question = "Can you summarize this morning's meetings?"
context = "During this morning's meeting, we solved all world conflict."
my_uuid = uuid.uuid4()
result = chain.invoke({"question": question, "context": context}, {"run_id": my_uuid})
print(my_uuid)

종료하기 전에 모든 추적이 제출되도록 보장하기

LangChain Python에서 LangSmith의 추적은 프로덕션 애플리케이션을 방해하지 않도록 백그라운드 스레드에서 수행됩니다. 이는 모든 추적이 LangSmith에 성공적으로 게시되기 전에 프로세스가 종료될 수 있음을 의미합니다. 이는 체인이나 에이전트가 완료되는 즉시 VM이 종료될 수 있는 서버리스 환경에서 특히 일반적입니다. LANGCHAIN_CALLBACKS_BACKGROUND 환경 변수를 "false"로 설정하여 콜백을 동기식으로 만들 수 있습니다. 두 언어 모두에서 LangChain은 애플리케이션을 종료하기 전에 추적이 제출될 때까지 대기하는 메서드를 제공합니다. 아래는 예시입니다:
from langchain_openai import ChatOpenAI
from langchain_core.tracers.langchain import wait_for_all_tracers

llm = ChatOpenAI()

try:
  llm.invoke("Hello, World!")
finally:
  wait_for_all_tracers()

환경 변수를 설정하지 않고 추적하기

다른 가이드에서 언급했듯이, 다음 환경 변수를 사용하면 추적 활성화, API 엔드포인트, API 키 및 추적 프로젝트를 구성할 수 있습니다:
  • LANGSMITH_TRACING
  • LANGSMITH_API_KEY
  • LANGSMITH_ENDPOINT
  • LANGSMITH_PROJECT
그러나 일부 환경에서는 환경 변수를 설정할 수 없습니다. 이러한 경우 프로그래밍 방식으로 추적 구성을 설정할 수 있습니다. 이는 주로 이전 섹션을 기반으로 합니다.
import langsmith as ls

# API 키와 API URL로 클라이언트 인스턴스를 생성할 수 있습니다
client = ls.Client(
    api_key="YOUR_API_KEY",  # 비밀 관리자에서 검색할 수 있습니다
    api_url="https://api.smith.langchain.com",  # 자체 호스팅 설치 또는 EU 지역에 맞게 적절히 업데이트하세요
)

# 클라이언트와 project_name을 tracing_context에 전달할 수 있습니다
with ls.tracing_context(client=client, project_name="test-no-env", enabled=True):
    chain.invoke({"question": "Am I using a callback?", "context": "I'm using a callback"})

LangChain(Python)을 사용한 분산 추적

LangSmith는 LangChain Python을 사용한 분산 추적을 지원합니다. 이를 통해 서로 다른 서비스와 애플리케이션 간에 실행(스팬)을 연결할 수 있습니다. 원칙은 LangSmith SDK용 분산 추적 가이드와 유사합니다.
import langsmith
from langchain_core.runnables import chain
from langsmith.run_helpers import get_current_run_tree

# -- 이 코드는 별도의 파일이나 서비스에 있어야 합니다 --
@chain
def child_chain(inputs):
    return inputs["test"] + 1

def child_wrapper(x, headers):
    with langsmith.tracing_context(parent=headers):
        child_chain.invoke({"test": x})

# -- 이 코드는 별도의 파일이나 서비스에 있어야 합니다 --
@chain
def parent_chain(inputs):
    rt = get_current_run_tree()
    headers = rt.to_headers()
    # ... 헤더와 함께 다른 서비스에 요청을 보냅니다
    # 헤더는 다른 서비스로 전달되어야 하며, 최종적으로 child_wrapper 함수로 전달됩니다

parent_chain.invoke({"test": 1})

LangChain(Python)과 LangSmith SDK 간의 상호 운용성

애플리케이션의 일부에서는 LangChain을 사용하고 다른 부분에서는 LangSmith SDK(이 가이드 참조)를 사용하는 경우에도 전체 애플리케이션을 원활하게 추적할 수 있습니다. LangChain 객체는 traceable 함수 내에서 호출될 때 추적되며 traceable 함수의 하위 실행으로 바인딩됩니다.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langsmith import traceable

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant. Please respond to the user's request only based on the given context."),
    ("user", "Question: {question}\nContext: {context}")
])

model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()
chain = prompt | model | output_parser

# 위의 체인은 traceable 함수의 하위 실행으로 추적됩니다
@traceable(
    tags=["openai", "chat"],
    metadata={"foo": "bar"}
)
def invoke_runnnable(question, context):
    result = chain.invoke({"question": question, "context": context})
    return "The response is: " + result

invoke_runnnable("Can you summarize this morning's meetings?", "During this morning's meeting, we solved all world conflict.")
이는 다음과 같은 추적 트리를 생성합니다:

LangChain.JS와 LangSmith SDK 간의 상호 운용성

traceable 내부에서 LangChain 객체 추적하기 (JS만 해당)

[email protected]부터 LangChain 객체는 @traceable 함수 내에서 사용될 때 자동으로 추적되며, traceable 함수의 클라이언트, 태그, 메타데이터 및 프로젝트 이름을 상속합니다. 0.2.x 이전 버전의 LangChain에서는 @traceable에서 찾은 추적 컨텍스트로부터 생성된 LangChainTracer 인스턴스를 수동으로 전달해야 합니다.
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { getLangchainCallbacks } from "langsmith/langchain";

const prompt = ChatPromptTemplate.fromMessages([
  [
    "system",
    "You are a helpful assistant. Please respond to the user's request only based on the given context.",
  ],
  ["user", "Question: {question}\nContext: {context}"],
]);

const model = new ChatOpenAI({ modelName: "gpt-4o-mini" });
const outputParser = new StringOutputParser();
const chain = prompt.pipe(model).pipe(outputParser);

const main = traceable(
  async (input: { question: string; context: string }) => {
    const callbacks = await getLangchainCallbacks();
    const response = await chain.invoke(input, { callbacks });
    return response;
  },
  { name: "main" }
);

traceable / RunTree API를 통해 LangChain 하위 실행 추적하기 (JS만 해당)

traceable과 LangChain 간의 상호 운용성을 개선하고 있습니다. LangChain과 traceable을 결합할 때 다음과 같은 제한 사항이 있습니다:
  1. RunnableLambda 컨텍스트의 getCurrentRunTree()에서 얻은 RunTree를 변경하면 작동하지 않습니다.
  2. RunnableLambda를 통해 getCurrentRunTree()에서 얻은 RunTree를 순회하는 것은 모든 RunTree 노드를 포함하지 않을 수 있으므로 권장하지 않습니다.
  3. 서로 다른 하위 실행이 동일한 execution_orderchild_execution_order 값을 가질 수 있습니다. 따라서 극단적인 경우 일부 실행이 start_time에 따라 다른 순서로 끝날 수 있습니다.
일부 사용 사례에서는 traceable 함수를 RunnableSequence의 일부로 실행하거나 RunTree API를 통해 LangChain 실행의 하위 실행을 명령적으로 추적하고 싶을 수 있습니다. LangSmith 0.1.39 및 @langchain/core 0.2.18부터 RunnableLambda 내에서 traceable로 래핑된 함수를 직접 호출할 수 있습니다.
import { traceable } from "langsmith/traceable";
import { RunnableLambda } from "@langchain/core/runnables";
import { RunnableConfig } from "@langchain/core/runnables";

const tracedChild = traceable((input: string) => `Child Run: ${input}`, {
  name: "Child Run",
});

const parrot = new RunnableLambda({
  func: async (input: { text: string }, config?: RunnableConfig) => {
    return await tracedChild(input.text);
  },
});
Trace Tree 또는 RunTree.fromRunnableConfig를 사용하여 LangChain의 RunnableConfig를 동등한 RunTree 객체로 변환하거나 RunnableConfigtraceable로 래핑된 함수의 첫 번째 인수로 전달할 수 있습니다.
import { traceable } from "langsmith/traceable";
import { RunnableLambda } from "@langchain/core/runnables";
import { RunnableConfig } from "@langchain/core/runnables";

const tracedChild = traceable((input: string) => `Child Run: ${input}`, {
  name: "Child Run",
});

const parrot = new RunnableLambda({
  func: async (input: { text: string }, config?: RunnableConfig) => {
    // 기존 traceable 함수에 config를 전달합니다
    await tracedChild(config, input.text);
    return input.text;
  },
});
비디오 튜토리얼을 선호하신다면 Introduction to LangSmith 과정의 Alternative Ways to Trace 비디오를 확인해보세요.
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I