Skip to main content
LangSmith는 기존 실험을 비교 방식으로 평가하는 것을 지원합니다. 한 번에 하나의 출력을 평가하는 대신, 여러 실험의 출력을 서로 비교하여 점수를 매길 수 있습니다. 이 가이드에서는 두 개의 기존 실험과 함께 evaluate()를 사용하여 평가자를 정의하고 쌍별 평가를 실행합니다. 마지막으로 LangSmith UI를 사용하여 쌍별 실험을 확인합니다.

사전 요구사항

  • 아직 비교할 실험을 생성하지 않은 경우, 빠른 시작 또는 사용 방법 가이드를 확인하여 평가를 시작하세요.
  • 이 가이드는 langsmith Python 버전 >=0.2.0 또는 JS 버전 >=0.2.9가 필요합니다.
두 개 이상의 기존 실험에서 evaluate_comparative()를 사용할 수도 있습니다.

evaluate() 비교 인수

가장 간단하게, evaluate / aevaluate 함수는 다음 인수를 받습니다:
인수설명
target서로 평가하고자 하는 두 개의 기존 실험 목록입니다. uuid 또는 실험 이름이 될 수 있습니다.
evaluators이 평가에 연결하려는 쌍별 평가자 목록입니다. 이를 정의하는 방법은 아래 섹션을 참조하세요.
이와 함께 다음의 선택적 인수를 전달할 수도 있습니다:
인수설명
randomize_order / randomizeOrder각 평가에 대해 출력 순서를 무작위로 지정할지 여부를 나타내는 선택적 불리언 값입니다. 이는 프롬프트에서 위치 편향을 최소화하기 위한 전략입니다. 종종 LLM은 순서에 따라 응답 중 하나에 편향되는 경향이 있습니다. 이는 주로 프롬프트 엔지니어링을 통해 해결해야 하지만, 이것은 또 다른 선택적 완화 방법입니다. 기본값은 False입니다.
experiment_prefix / experimentPrefix쌍별 실험 이름의 시작 부분에 붙일 접두사입니다. 기본값은 None입니다.
description쌍별 실험에 대한 설명입니다. 기본값은 None입니다.
max_concurrency / maxConcurrency실행할 최대 동시 평가 수입니다. 기본값은 5입니다.
client사용할 LangSmith 클라이언트입니다. 기본값은 None입니다.
metadata쌍별 실험에 첨부할 메타데이터입니다. 기본값은 None입니다.
load_nested / loadNested실험에 대한 모든 하위 실행을 로드할지 여부입니다. False인 경우, 루트 추적만 평가자에 전달됩니다. 기본값은 False입니다.

쌍별 평가자 정의

쌍별 평가자는 예상되는 시그니처를 가진 함수일 뿐입니다.

평가자 인수

사용자 정의 평가자 함수는 특정한 인수 이름을 가져야 합니다. 다음 인수의 하위 집합을 받을 수 있습니다:
  • inputs: dict: 데이터셋의 단일 예제에 해당하는 입력의 딕셔너리입니다.
  • outputs: list[dict]: 주어진 입력에 대해 각 실험이 생성한 딕셔너리 출력의 두 항목 목록입니다.
  • reference_outputs / referenceOutputs: dict: 사용 가능한 경우 예제와 연결된 참조 출력의 딕셔너리입니다.
  • runs: list[Run]: 주어진 예제에 대해 두 실험이 생성한 전체 Run 객체의 두 항목 목록입니다. 각 실행에 대한 중간 단계나 메타데이터에 액세스해야 하는 경우 사용하세요.
  • example: Example: 예제 입력, 출력(사용 가능한 경우), 메타데이터(사용 가능한 경우)를 포함한 전체 데이터셋 Example입니다.
대부분의 사용 사례에서는 inputs, outputs, reference_outputs / referenceOutputs만 필요합니다. runsexample은 애플리케이션의 실제 입력 및 출력 외부의 추가 추적 또는 예제 메타데이터가 필요한 경우에만 유용합니다.

평가자 출력

사용자 정의 평가자는 다음 유형 중 하나를 반환해야 합니다: Python 및 JS/TS
  • dict: 다음 키를 가진 딕셔너리:
    • key, 로그될 피드백 키를 나타냅니다
    • scores, 실행 ID에서 해당 실행의 점수로의 매핑입니다.
    • comment, 문자열입니다. 모델 추론에 가장 일반적으로 사용됩니다.
현재 Python만
  • list[int | float | bool]: 두 항목의 점수 목록입니다. 목록은 runs / outputs 평가자 인수와 동일한 순서를 가진다고 가정합니다. 평가자 함수 이름이 피드백 키로 사용됩니다.
실행의 표준 피드백과 구별되는 피드백 키를 선택해야 합니다. 쌍별 피드백 키에 pairwise_ 또는 ranked_ 접두사를 붙이는 것을 권장합니다.

쌍별 평가 실행

다음 예제는 두 AI 어시스턴트 응답 중 어느 것이 더 나은지 LLM에게 결정하도록 요청하는 프롬프트를 사용합니다. 구조화된 출력을 사용하여 AI의 응답(0, 1 또는 2)을 파싱합니다.
아래 Python 예제에서는 LangChain Hub에서 이 구조화된 프롬프트를 가져와 LangChain 채팅 모델 래퍼와 함께 사용하고 있습니다.LangChain 사용은 완전히 선택 사항입니다. 이 점을 설명하기 위해, TypeScript 예제에서는 OpenAI SDK를 직접 사용합니다.
  • Python: langsmith>=0.2.0 필요
  • TypeScript: langsmith>=0.2.9 필요
from langchain_classic import hub
from langchain.chat_models import init_chat_model
from langsmith import evaluate

# 프롬프트 참조: https://smith.langchain.com/hub/langchain-ai/pairwise-evaluation-2
prompt = hub.pull("langchain-ai/pairwise-evaluation-2")
model = init_chat_model("gpt-4o")
chain = prompt | model

def ranked_preference(inputs: dict, outputs: list[dict]) -> list:
    # 예제 입력에 'question' 키가 있고 실험
    # 출력에 'answer' 키가 있다고 가정합니다.
    response = chain.invoke({
        "question": inputs["question"],
        "answer_a": outputs[0].get("answer", "N/A"),
        "answer_b": outputs[1].get("answer", "N/A"),
    })
    if response["Preference"] == 1:
        scores = [1, 0]
    elif response["Preference"] == 2:
        scores = [0, 1]
    else:
        scores = [0, 0]
    return scores

evaluate(
    ("experiment-1", "experiment-2"),  # 실험의 이름/ID로 교체하세요
    evaluators=[ranked_preference],
    randomize_order=True,
    max_concurrency=4,
)

쌍별 실험 확인

데이터셋 페이지에서 “Pairwise Experiments” 탭으로 이동하세요: Pairwise Experiments Tab 검사하려는 쌍별 실험을 클릭하면 비교 뷰로 이동합니다: Pairwise Comparison View 테이블 헤더에서 엄지손가락 위/아래 버튼을 클릭하여 첫 번째 실험이 더 나은 경우 또는 그 반대의 경우로 실행을 필터링할 수 있습니다: Pairwise Filtering
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I