메인 콘텐츠로 건너뛰기
이 문서는 대화형 노트북입니다. 로컬에서 실행하거나 아래 링크를 사용할 수 있습니다:

리더보드 퀵스타트

이 퀵스타트에서는 W&B Weave 리더보드를 사용해 여러 데이터셋과 점수화 함수에 걸쳐 모델 성능을 비교하는 방법을 설명합니다. 이 과정을 마치면 공통 Evaluation 세트를 기준으로 여러 모델의 순위를 매긴 리더보드를 게시할 수 있습니다. 그런 다음 각 metric에서 어떤 모델이 가장 뛰어난 성능을 보이는지 파악할 수 있습니다. 이 가이드는 Weave Evaluation 실행에 익숙하고 결과를 나란히 비교하려는 개발자를 위한 것입니다. 구체적으로 다음을 수행합니다:
  1. 가상의 우편번호 데이터셋을 생성합니다.
  2. 몇 가지 점수화 함수를 작성하고 기준선 모델을 평가합니다.
  3. 이러한 기법을 사용해 모델과 평가 조합의 매트릭스를 평가합니다.
  4. Weave UI에서 리더보드를 검토합니다.

Step 1: 가짜 우편번호 데이터셋 생성

먼저 가짜 우편번호 데이터 목록을 생성하는 함수 generate_dataset_rows를 만듭니다. 이 합성 데이터셋은 각 모델을 평가할 때 리더보드에 일관된 입력값과 기대값을 제공합니다.
import json

from openai import OpenAI
from pydantic import BaseModel

class Row(BaseModel):
    zip_code: str
    city: str
    state: str
    avg_temp_f: float
    population: int
    median_income: int
    known_for: str

class Rows(BaseModel):
    rows: list[Row]

def generate_dataset_rows(
    location: str = "United States", count: int = 5, year: int = 2022
):
    client = OpenAI()

    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {
                "role": "user",
                "content": f"Please generate {count} rows of data for random zip codes in {location} for the year {year}.",
            },
        ],
        response_format={
            "type": "json_schema",
            "json_schema": {
                "name": "response_format",
                "schema": Rows.model_json_schema(),
            },
        },
    )

    return json.loads(completion.choices[0].message.content)["rows"]
python
import weave

weave.init("leaderboard-demo")

Step 2: 점수화 함수 작성

다음으로 점수화 함수 3개를 작성합니다. 각 Scorer는 모델 출력의 서로 다른 측면을 평가하므로, 리더보드에서 품질의 다양한 차원을 기준으로 모델을 순위화할 수 있습니다:
  1. check_concrete_fields: 모델 출력이 예상한 도시와 주에 일치하는지 확인합니다.
  2. check_value_fields: 모델 출력이 예상한 인구수와 중위 소득의 10% 이내인지 확인합니다.
  3. check_subjective_fields: LLM을 사용해 모델 출력이 예상한 “known for” 필드와 일치하는지 확인합니다.
@weave.op
def check_concrete_fields(city: str, state: str, output: dict):
    return {
        "city_match": city == output["city"],
        "state_match": state == output["state"],
    }

@weave.op
def check_value_fields(
    avg_temp_f: float, population: int, median_income: int, output: dict
):
    return {
        "avg_temp_f_err": abs(avg_temp_f - output["avg_temp_f"]) / avg_temp_f,
        "population_err": abs(population - output["population"]) / population,
        "median_income_err": abs(median_income - output["median_income"])
        / median_income,
    }

@weave.op
def check_subjective_fields(zip_code: str, known_for: str, output: dict):
    client = OpenAI()

    class Response(BaseModel):
        correct_known_for: bool

    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {
                "role": "user",
                "content": f"My student was asked what the zip code {zip_code} is best known best for. The right answer is '{known_for}', and they said '{output['known_for']}'. Is their answer correct?",
            },
        ],
        response_format={
            "type": "json_schema",
            "json_schema": {
                "name": "response_format",
                "schema": Response.model_json_schema(),
            },
        },
    )

    return json.loads(completion.choices[0].message.content)

Step 3: Evaluation 만들기

다음으로 가짜 데이터와 채점 함수를 사용해 Evaluation을 정의합니다. Evaluation 객체는 데이터셋을 Scorer와 연결하므로, 동일한 벤치마크를 기준으로 어떤 모델이든 실행할 수 있습니다.
rows = generate_dataset_rows()
evaluation = weave.Evaluation(
    name="United States - 2022",
    dataset=rows,
    scorers=[
        check_concrete_fields,
        check_value_fields,
        check_subjective_fields,
    ],
)

Step 4: 기준선 모델 Evaluate

이제 정적 응답을 반환하는 기준선 모델을 Evaluate합니다. 기준선을 설정하면 리더보드에서 기준점이 생기므로, 이후의 각 모델이 정적 구현보다 얼마나 개선되는지 측정할 수 있습니다.
@weave.op
def baseline_model(zip_code: str):
    return {
        "city": "New York",
        "state": "NY",
        "avg_temp_f": 50.0,
        "population": 1000000,
        "median_income": 100000,
        "known_for": "The Big Apple",
    }

await evaluation.evaluate(baseline_model)

Step 5: 모델 더 만들기

이제 기준선 모델과 비교할 모델 두 개를 더 만드세요. 한 모델은 추가 프롬프트 없이 우편번호만 받고, 다른 모델은 구조화된 프롬프트를 받습니다. 리더보드에서 둘을 비교하면 프롬프트 컨텍스트가 답변 품질에 미치는 영향을 확인할 수 있습니다.
@weave.op
def gpt_4o_mini_no_context(zip_code: str):
    client = OpenAI()

    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": f"""Zip code {zip_code}"""}],
        response_format={
            "type": "json_schema",
            "json_schema": {
                "name": "response_format",
                "schema": Row.model_json_schema(),
            },
        },
    )

    return json.loads(completion.choices[0].message.content)

await evaluation.evaluate(gpt_4o_mini_no_context)
python
@weave.op
def gpt_4o_mini_with_context(zip_code: str):
    client = OpenAI()

    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {
                "role": "user",
                "content": f"""Please answer the following questions about the zip code {zip_code}:
                   1. What is the city?
                   2. What is the state?
                   3. What is the average temperature in Fahrenheit?
                   4. What is the population?
                   5. What is the median income?
                   6. What is the most well known thing about this zip code?
                   """,
            }
        ],
        response_format={
            "type": "json_schema",
            "json_schema": {
                "name": "response_format",
                "schema": Row.model_json_schema(),
            },
        },
    )

    return json.loads(completion.choices[0].message.content)

await evaluation.evaluate(gpt_4o_mini_with_context)

Step 6: 더 많은 Evaluation 만들기

이제 모델과 Evaluation 조합으로 이루어진 행렬을 평가하세요. 여러 데이터셋(서로 다른 지역과 연도)에 대해 모든 모델을 실행하면, 리더보드가 여러 조건에서 모델의 순위를 매기는 데 필요한 데이터가 생성됩니다.
scorers = [
    check_concrete_fields,
    check_value_fields,
    check_subjective_fields,
]
evaluations = [
    weave.Evaluation(
        name="United States - 2022",
        dataset=weave.Dataset(
            name="United States - 2022",
            rows=generate_dataset_rows("United States", 5, 2022),
        ),
        scorers=scorers,
    ),
    weave.Evaluation(
        name="California - 2022",
        dataset=weave.Dataset(
            name="California - 2022", rows=generate_dataset_rows("California", 5, 2022)
        ),
        scorers=scorers,
    ),
    weave.Evaluation(
        name="United States - 2000",
        dataset=weave.Dataset(
            name="United States - 2000",
            rows=generate_dataset_rows("United States", 5, 2000),
        ),
        scorers=scorers,
    ),
]
models = [
    baseline_model,
    gpt_4o_mini_no_context,
    gpt_4o_mini_with_context,
]

for evaluation in evaluations:
    for model in models:
        await evaluation.evaluate(
            model, __weave={"display_name": evaluation.name + ":" + model.__name__}
        )

7단계: 리더보드 검토

평가 결과가 게시되었으므로, 이제 이를 나란히 비교할 수 있도록 리더보드로 구성할 수 있습니다. UI에서 리더보드 탭으로 이동한 다음 Create Leaderboard를 클릭하여 새 리더보드를 만들 수 있습니다. Python에서 직접 리더보드를 생성할 수도 있습니다:
from weave.flow import leaderboard
from weave.trace.ref_util import get_ref

spec = leaderboard.Leaderboard(
    name="Zip Code World Knowledge",
    description="""
This leaderboard compares the performance of models in terms of world knowledge about zip codes.

### Columns

1. **State Match against `United States - 2022`**: The fraction of zip codes that the model correctly identified the state for.
2. **Avg Temp F Error against `California - 2022`**: The mean absolute error of the model's average temperature prediction.
3. **Correct Known For against `United States - 2000`**: The fraction of zip codes that the model correctly identified the most well known thing about the zip code.
""",
    columns=[
        leaderboard.LeaderboardColumn(
            evaluation_object_ref=get_ref(evaluations[0]).uri(),
            scorer_name="check_concrete_fields",
            summary_metric_path="state_match.true_fraction",
        ),
        leaderboard.LeaderboardColumn(
            evaluation_object_ref=get_ref(evaluations[1]).uri(),
            scorer_name="check_value_fields",
            should_minimize=True,
            summary_metric_path="avg_temp_f_err.mean",
        ),
        leaderboard.LeaderboardColumn(
            evaluation_object_ref=get_ref(evaluations[2]).uri(),
            scorer_name="check_subjective_fields",
            summary_metric_path="correct_known_for.true_fraction",
        ),
    ],
)

ref = weave.publish(spec)
이제 Weave에 게시된 리더보드가 생성되었으며, 여기서 정의한 세 가지 evaluation과 점수화 메트릭을 기준으로 각 모델의 순위를 확인할 수 있습니다. Weave UI에서 모델별 점수를 확인하고, 개별 evaluation run을 자세히 살펴보며, 향후 모델 버전을 동일한 기준선과 비교할 수 있습니다.