byteforce

CPN 한국어 자습서 · 러닝패스 2 / 4 — Building with the Claude API

프롬프트 평가

평가 실행하기

Running the eval

데이터셋이 준비됐으니, 각 레코드(=test case)를 프롬프트에 합쳐 Claude에 보내고 결과를 모읍니다. run_prompt · run_test_case · run_eval 세 함수로 평가 파이프라인의 뼈대를 세웁니다 — 채점만 빼고 거의 다 완성됩니다.

전체 내레이션영상 나레이션 한국어 번역 (전체)

Stephen Grider · Anthropic 기술 스태프

데이터셋 생성을 마쳤으니, 이제 데이터셋의 각 레코드 — 이걸 test case라고 부르겠습니다 — 를 프롬프트에 합칩니다. 그 결과를 Claude에 보내고, 출력이 다 모이면 grader에 통과시킵니다. grader는 아직 다루지 않았지만, 곧 나옵니다.

시간을 아끼려고 이 다음 단계를 안내할 코드를 미리 써 뒀습니다. 함수 세 개를 만들고, 각각이 무엇을 하는지 주석으로 명확히 달았습니다. 가장 이해하기 쉬운 첫 번째는 run_prompt 함수입니다. test case 하나를 받습니다. 방금 생성한 JSON 객체들이 각각 하나의 test case이고, 하나씩 run_prompt로 흘러 들어갑니다.

이 함수의 목표는, 생성한 task를 프롬프트에 합치고, Claude로 텍스트를 생성해, 그 결과를 반환하는 것입니다. v1 프롬프트를 넣습니다 — 아주 단순하게 "다음 작업을 풀어라"라고 하고, f-string으로 test case의 task를 끼워 넣습니다. 그다음 messages 리스트를 만들고 user 메시지를 추가해 chat을 호출하고, 결과 텍스트(output)를 받아 반환합니다. 지금은 형식 지시가 전혀 없어서, 요청한 것보다 훨씬 많은 출력이 돌아올 겁니다 — 나중에 분명히 개선해야 합니다.

다음은 run_test_case입니다. 개별 case를 받아 run_prompt를 호출해 output을 얻고, 결과를 채점한 뒤, 그 과정을 요약한 딕셔너리를 반환합니다. 복잡해 보이지만 실제론 놀랄 만큼 간단합니다. run_prompt로 output을 얻고, 채점은 — 일단 TODO로 두고 점수 10을 하드코딩합니다. 그리고 맨 아래에서 output·test_case·score를 담은 딕셔너리를 반환합니다.

마지막은 run_eval입니다. 데이터셋을 불러오거나 인자로 받아, 순회하며 각 test case마다 run_test_case를 호출하고 결과를 전부 모읍니다. results를 빈 리스트로 시작해, 데이터셋의 모든 test case에 대해 결과를 얻어 리스트에 추가하고, results를 반환합니다.

믿기 어렵겠지만, 이게 평가 파이프라인의 대부분입니다 — 채점이라는 명백한 예외만 빼고요. 코드가 그리 많지 않죠. 이제 테스트해 봅시다. 다음 셀에서 dataset.json을 열어 JSON으로 파싱하고, 그 전체 데이터셋으로 run_eval을 호출해 결과를 results에 담습니다.

위 셀들을 다시 실행한 뒤 이 셀을 돌리면 — 처음엔 시간이 꽤 걸립니다. Haiku로도 저는 약 31초 걸렸습니다. 나중에 실행 시간을 줄이는 기법을 보여 드리지만, 지금은 조금 더 걸리게 둡니다. results를 보기 좋게 json.dumps에 indent=2로 출력하면, 객체 배열이 나옵니다. 각 객체는 개별 test case의 출력입니다 — Claude가 만든 output, 기반이 된 test case, 그리고 지금은 10으로 하드코딩된 score. 이게 반복됩니다.

이제 데이터셋과 프롬프트를 합쳐 Claude의 출력을 얻고, 전부 한데 모았습니다. 남은 단 하나는, 입력과 Claude의 결과를 grader에 넣는 것입니다. 드디어 grader를 배울 차례입니다 — 다음 영상에서 시작합니다.

이 장에서 배우는 것What you'll learn

약 5분
1

run_prompt — 프롬프트+test case → Claude output

2

run_test_case — run_prompt + 채점 + 결과 dict

3

run_eval — 데이터셋 전체 순회 → 결과 리스트

4

지금 score는 10으로 하드코딩 (TODO)

5

dataset.json 로드 → run_eval → 결과 배열

6

파이프라인은 거의 완성 — 채점만 남았다

먼저 짚고 갈 용어
test case (테스트 케이스)
데이터셋의 레코드 하나. 여기선 task 속성을 가진 객체.
run_prompt
프롬프트에 test case를 합쳐 Claude에 보내고 output을 반환.
run_test_case
run_prompt 호출 + 채점 + output·test_case·score dict 반환.
run_eval
데이터셋 전체를 돌려 결과 리스트를 모음.

run_prompt — 프롬프트 실행

Merge & call Claude

데이터셋의 각 객체가 하나의 test case입니다. run_prompt는 test case의 task를 프롬프트 v1에 끼워 Claude에 보내고 output을 반환합니다.

001_prompt_evals.ipynb · run_prompt
def run_prompt(test_case):
    """프롬프트와 test case를 합쳐 Claude의 output을 반환"""
    prompt = f"""
Please solve the following task:

{test_case["task"]}
"""
    messages = []
    add_user_message(messages, prompt)
    output = chat(messages)
    return output
아직 미완

지금 프롬프트엔 형식 지시가 없어, 요청한 Python·JSON·정규식보다 훨씬 많은 설명이 붙어 옵니다. 나중에 프롬프트를 개선할 지점입니다.

run_test_case · run_eval

Grade & loop

run_test_case는 run_prompt로 output을 얻고 채점한 뒤 결과 dict를 돌려줍니다. 채점은 일단 10으로 하드코딩(TODO)합니다. run_eval은 데이터셋 전체를 순회하며 이걸 반복합니다.

run_test_case
def run_test_case(test_case):
    """run_prompt를 호출하고 결과를 채점"""
    output = run_prompt(test_case)

    # 채점 (Grading)
    score = 10   # TODO: 실제 채점은 다음 레슨에서

    return {
        "output": output,
        "test_case": test_case,
        "score": score,
    }
run_eval
def run_eval(dataset):
    """데이터셋을 순회하며 각 test case를 처리해 결과를 모음"""
    results = []
    for test_case in dataset:
        result = run_test_case(test_case)
        results.append(result)
    return results
평가 파이프라인의 함수 구조 · 눌러서 역할 보기
run_eval(dataset)데이터셋 전체 반복
run_test_case(case)채점 = 10 (TODO)
run_prompt(case)프롬프트+입력 → Claude
Claude → output

세 함수가 안쪽으로 겹쳐 호출됩니다. 채점(score = 10)만 비어 있고, 그게 다음 레슨들의 주제 — model 기반·code 기반 채점입니다.

실행 & 결과

Run it

저장해 둔 dataset.json을 불러와 run_eval에 넣고 실행합니다. (Haiku로도 처음엔 30초 안팎 걸립니다 — 속도 개선은 뒤에서.)

dataset.json 로드 → run_eval
with open("dataset.json", "r") as f:
    dataset = json.load(f)

results = run_eval(dataset)
print(json.dumps(results, indent=2))
출력 · 결과 배열 (요약)
[
  {
    "output": "Here is a Python function that lists all S3 buckets...",  # 설명까지 잔뜩
    "test_case": { "task": "Write a Python function that lists all S3 buckets using boto3" },
    "score": 10   # ← 하드코딩
  },
  … (test case 수만큼 반복) …
]
현재 상태

데이터셋 × 프롬프트로 Claude 출력을 얻어 한데 모았습니다. 남은 단 하나는 입력·출력을 grader에 넣어 점수로 바꾸는 것 — 다음 레슨에서 시작합니다.

정리 & 점검

Recap & check
핵심 정리
  • run_promptrun_test_caserun_eval 세 함수가 파이프라인의 뼈대.
  • 각 결과는 output·test_case·score dict.
  • 지금 score는 10으로 하드코딩 — 진짜 채점은 다음 레슨.
  • 채점만 빼면 평가 파이프라인은 거의 완성이다.

Q1run_eval이 하는 일은?

Q2지금 run_test_case의 점수(score)는?

Q3현재 평가 파이프라인에서 아직 비어 있는 핵심 조각은?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

여기부터는 등록한 분에게 열립니다.

전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 76개 레슨을 끝까지 읽을 수 있습니다.

등록하고 이어서 읽기

이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.