Skip to main content
이 가이드는 LangSmith SDK를 사용하여 LLM 애플리케이션에 대한 평가를 실행하는 방법을 보여줍니다. 이 가이드에서는 LangSmith SDK의 evaluate() 메서드를 사용하여 애플리케이션을 평가하는 방법을 다룹니다.
Python에서 대규모 평가 작업을 실행할 때는 evaluate()의 비동기 버전인 aevaluate() 사용을 권장합니다. 두 메서드는 동일한 인터페이스를 가지고 있으므로, 비동기로 평가 실행하기 가이드를 읽기 전에 이 가이드를 먼저 읽는 것이 좋습니다.JS/TS에서는 evaluate()가 이미 비동기이므로 별도의 메서드가 필요하지 않습니다.또한 대규모 작업을 실행할 때는 max_concurrency/maxConcurrency 인수를 설정하는 것이 중요합니다. 이는 데이터셋을 스레드로 분할하여 평가를 병렬화합니다.

애플리케이션 정의하기

먼저 평가할 애플리케이션이 필요합니다. 이 예제에서는 간단한 독성 분류기를 만들어 보겠습니다.
from langsmith import traceable, wrappers
from openai import OpenAI

# 선택사항: 모든 모델 호출을 추적하기 위해 OpenAI 클라이언트를 래핑합니다.
oai_client = wrappers.wrap_openai(OpenAI())

# 선택사항: 이 함수의 입력/출력을 추적하기 위해 'traceable' 데코레이터를 추가합니다.
@traceable
def toxicity_classifier(inputs: dict) -> dict:
    instructions = (
      "Please review the user query below and determine if it contains any form of toxic behavior, "
      "such as insults, threats, or highly negative comments. Respond with 'Toxic' if it does "
      "and 'Not toxic' if it doesn't."
    )
    messages = [
        {"role": "system", "content": instructions},
        {"role": "user", "content": inputs["text"]},
    ]
    result = oai_client.chat.completions.create(
        messages=messages, model="gpt-4o-mini", temperature=0
    )
    return {"class": result.choices[0].message.content}
파이프라인의 각 단계에서 입력과 출력을 캡처하기 위해 선택적으로 추적을 활성화했습니다. 추적을 위해 코드에 주석을 다는 방법을 이해하려면 이 가이드를 참조하세요.

데이터셋 생성 또는 선택하기

애플리케이션을 평가하기 위한 데이터셋이 필요합니다. 우리의 데이터셋에는 독성 텍스트와 비독성 텍스트의 레이블이 지정된 예제가 포함됩니다. langsmith>=0.3.13 필요
from langsmith import Client
ls_client = Client()

examples = [
  {
    "inputs": {"text": "Shut up, idiot"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "You're a wonderful person"},
    "outputs": {"label": "Not toxic"},
  },
  {
    "inputs": {"text": "This is the worst thing ever"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "I had a great day today"},
    "outputs": {"label": "Not toxic"},
  },
  {
    "inputs": {"text": "Nobody likes you"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "This is unacceptable. I want to speak to the manager."},
    "outputs": {"label": "Not toxic"},
  },
]

dataset = ls_client.create_dataset(dataset_name="Toxic Queries")
ls_client.create_examples(
  dataset_id=dataset.id,
  examples=examples,
)
데이터셋에 대한 자세한 내용은 데이터셋 관리 페이지를 참조하세요.

평가자 정의하기

일반적인 사전 구축된 평가자를 확인하려면 LangChain의 오픈 소스 평가 패키지인 openevals도 확인해 보세요.
평가자는 애플리케이션의 출력을 점수화하는 함수입니다. 평가자는 예제 입력, 실제 출력, 그리고 존재하는 경우 참조 출력을 받습니다. 이 작업에는 레이블이 있으므로, 평가자는 실제 출력이 참조 출력과 일치하는지 직접 확인할 수 있습니다.
  • Python: langsmith>=0.3.13 필요
  • TypeScript: langsmith>=0.2.9 필요
def correct(inputs: dict, outputs: dict, reference_outputs: dict) -> bool:
    return outputs["class"] == reference_outputs["label"]

평가 실행하기

평가를 실행하기 위해 evaluate() / aevaluate() 메서드를 사용합니다. 주요 인수는 다음과 같습니다:
  • 입력 딕셔너리를 받아 출력 딕셔너리를 반환하는 타겟 함수. 각 예제example.inputs 필드가 타겟 함수에 전달됩니다. 이 경우 toxicity_classifier는 이미 예제 입력을 받도록 설정되어 있으므로 직접 사용할 수 있습니다.
  • data - 평가할 LangSmith 데이터셋의 이름 또는 UUID, 또는 예제의 이터레이터
  • evaluators - 함수의 출력을 점수화할 평가자 목록
Python: langsmith>=0.3.13 필요
# 'evaluate' 함수를 직접 사용할 수도 있습니다:
# from langsmith import evaluate; evaluate(...)
results = ls_client.evaluate(
    toxicity_classifier,
    data=dataset.name,
    evaluators=[correct],
    experiment_prefix="gpt-4o-mini, baseline",  # 선택사항, 실험 이름 접두사
    description="Testing the baseline system.",  # 선택사항, 실험 설명
    max_concurrency=4, # 선택사항, 동시성 추가
)

결과 탐색하기

evaluate()의 각 호출은 실험을 생성하며, LangSmith UI에서 확인하거나 SDK를 통해 쿼리할 수 있습니다. 평가 점수는 각 실제 출력에 대한 피드백으로 저장됩니다. 추적을 위해 코드에 주석을 달았다면, 각 행의 추적을 사이드 패널 뷰에서 열 수 있습니다.

참조 코드

from langsmith import Client, traceable, wrappers
from openai import OpenAI

# 단계 1. 애플리케이션 정의하기
oai_client = wrappers.wrap_openai(OpenAI())

@traceable
def toxicity_classifier(inputs: dict) -> str:
    system = (
      "Please review the user query below and determine if it contains any form of toxic behavior, "
      "such as insults, threats, or highly negative comments. Respond with 'Toxic' if it does "
      "and 'Not toxic' if it doesn't."
    )
    messages = [
        {"role": "system", "content": system},
        {"role": "user", "content": inputs["text"]},
    ]
    result = oai_client.chat.completions.create(
        messages=messages, model="gpt-4o-mini", temperature=0
    )
    return result.choices[0].message.content

# 단계 2. 데이터셋 생성하기
ls_client = Client()
dataset = ls_client.create_dataset(dataset_name="Toxic Queries")
examples = [
  {
    "inputs": {"text": "Shut up, idiot"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "You're a wonderful person"},
    "outputs": {"label": "Not toxic"},
  },
  {
    "inputs": {"text": "This is the worst thing ever"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "I had a great day today"},
    "outputs": {"label": "Not toxic"},
  },
  {
    "inputs": {"text": "Nobody likes you"},
    "outputs": {"label": "Toxic"},
  },
  {
    "inputs": {"text": "This is unacceptable. I want to speak to the manager."},
    "outputs": {"label": "Not toxic"},
  },
]
ls_client.create_examples(
  dataset_id=dataset.id,
  examples=examples,
)

# 단계 3. 평가자 정의하기
def correct(inputs: dict, outputs: dict, reference_outputs: dict) -> bool:
    return outputs["output"] == reference_outputs["label"]

# 단계 4. 평가 실행하기
# Client.evaluate()와 evaluate()는 동일하게 동작합니다.
results = ls_client.evaluate(
    toxicity_classifier,
    data=dataset.name,
    evaluators=[correct],
    experiment_prefix="gpt-4o-mini, simple",  # 선택사항, 실험 이름 접두사
    description="Testing the baseline system.",  # 선택사항, 실험 설명
    max_concurrency=4,  # 선택사항, 동시성 추가
)

관련 자료


Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I