byteforce

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

프롬프트 평가

모델 기반 채점

Model based grading

파이프라인의 마지막 조각, 채점입니다. 채점기에는 code·model·human 세 종류가 있습니다. 이 레슨에선 Claude를 심판으로 쓰는 모델 기반 채점을 구현합니다 — 점수만 묻지 않고 근거까지 요구해 더 구체적인 점수를 끌어냅니다.

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

Stephen Grider · Anthropic 기술 스태프

평가 워크플로에 이제 채점 시스템을 넣습니다. grader는 모델의 출력을 받아 객관적 신호를 돌려줍니다. 숫자일 수도, 참/거짓일 수도 있지만, 흔히 1~10 사이 숫자를 씁니다 — 10이면 아주 높은 품질, 1이면 아주 낮은 품질이죠. 숫자가 필수는 아니지만 가장 흔한 관행입니다.

채점기에는 세 종류가 있습니다 — code, model, human. code 기반은 우리가 작성한 코드 조각에 출력을 넣어, 길이·특정 단어 포함 여부·JSON/코드 문법 검증·가독성 점수 같은 프로그램적 검사를 합니다. 어떤 신호(보통 1~10)를 돌려주기만 하면 됩니다. model 기반은 출력을 또 다른 모델 호출에 넣어 채점합니다 — 추가 API 요청이죠. 품질·지시 준수·완성도 등 유연하게 평가할 수 있습니다. human 기반은 사람이 직접 평가합니다 — 가장 유연하지만 시간이 많이 들고 지루합니다.

어떤 방식이든, 먼저 평가 기준을 정해야 합니다. 우리 사용 사례에선 세 가지로 잡았습니다. 첫째, 응답이 Python·JSON·정규식만 담고 부가 설명이 없는지(형식). 둘째, 그 코드의 문법이 유효한지(문법). 셋째, 사용자 과제를 분명히 해결했고 큰 오류 없이 대체로 정확한지(과제 수행). 앞의 둘은 code grader로, 셋째는 유연성이 필요하니 model grader로 다룹니다.

먼저 model grader부터 구현합니다 — 의외로 가장 쉽거든요. run_test_case의 TODO 바로 위에 grade_by_model 함수를 새로 만듭니다. test case 딕셔너리와 원래 모델 호출의 output을 인자로 받습니다. 안에서는 모델에 출력을 채점해 달라고 요청합니다. 이런 경우 보통 꽤 긴 프롬프트를 씁니다.

이 프롬프트는 역할을 설정하고, AI가 생성한 해법을 평가하라고 분명히 요청합니다. 그리고 task를 보여 주고, 생성된 해법을 나열한 뒤, 정확히 어떻게 응답할지 지시합니다. 여기선 강점·약점 목록과 그 근거, 그리고 실제 점수를 달라고 합니다. 점수만 달라고 할 수도 있지만, 그러면 모델이 "더 좋을 수도, 나쁠 수도 있지"라며 자꾸 6점 같은 어중간한 점수만 줍니다. 강점·약점·근거를 함께 요구하면 모델이 더 집중해 구체적인 점수를 정하게 됩니다.

프롬프트를 넣었으면 채점 모델을 호출합니다. messages 리스트를 만들고 user 메시지를 추가하고, JSON으로 돌려받아야 하니 또다시 prefill된 assistant 메시지(```json)와 stop sequence(```)로 깔끔하게 추출합니다. eval_text를 받아 json.loads로 파싱해 반환합니다. 이게 우리 model grader 전부입니다.

이제 grader를 실제로 호출하도록 연결합니다. run_test_case의 TODO 자리에서 score를 grade_by_model 결과로 바꿉니다. test case와 run_prompt의 output을 넘기고, 반환된 딕셔너리에서 score와 reasoning을 꺼내 최종 결과 딕셔너리에 담습니다. (strengths·weaknesses도 꺼낼 수 있지만 예시는 간결하게 둡니다.)

셀들을 다시 실행하고 평가를 돌리면 이번엔 약 22초 걸립니다. 결과를 출력하면 생성된 output, 모델이 매긴 점수, 그 점수의 근거가 보입니다 — 이 경우 8점, 다음 7점, 그다음 6점이 나왔습니다.

마지막으로 점수를 모아 평균을 내 출력합니다. run_eval에서 리스트 컴프리헨션으로 각 result의 score를 모아 statistics의 mean으로 평균을 구하고 출력합니다. 다시 실행하면 평균 7.33이 나옵니다. 모델 채점은 가끔 변덕스러울 수 있고 더 나은 채점 가이드를 줄 수도 있지만, 적어도 이제 올려 보려고 집중할 수 있는 객관적 지표가 생겼습니다.

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

약 7분
1

채점기 3종 — code · model · human

2

먼저 평가 기준을 정한다 — 형식·문법·과제 수행

3

형식·문법 → code, 과제 수행 → model

4

grade_by_model — 출력을 또 다른 모델 호출로 채점

5

점수만 X → 강점·약점·근거까지 요구해야 구체적 점수

6

statistics.mean으로 평균 → 7.33 객관적 지표

먼저 짚고 갈 용어
code grader (코드 채점)
출력을 우리가 쓴 코드에 넣어 프로그램적으로 검사(길이·단어·문법 등).
model grader (모델 채점)
출력을 또 다른 모델 호출에 넣어 품질·지시 준수 등을 유연하게 채점.
human grader (사람 채점)
사람이 직접 평가. 가장 유연하지만 느리고 지루하다.
evaluation criteria (평가 기준)
응답의 어떤 측면을 볼지 — 여기선 형식·문법·과제 수행.

채점기 3종

Code, model, human

grader는 출력을 받아 객관적 신호(보통 1~10)를 돌려줍니다. 신호를 만드는 방식에 따라 세 종류로 나뉩니다.

채점기 3종 · 카드를 눌러 비교

셋 다 공통 요구는 하나 — 쓸 수 있는 객관적 신호(흔히 1~10)를 돌려주는 것. 기준마다 알맞은 채점기가 다릅니다.

무엇을 평가할까

Evaluation criteria

어떤 채점기든 먼저 평가 기준을 정해야 합니다. 이 AWS 코드 도우미에는 세 가지를 잡았습니다.

기준 → 알맞은 채점기
  • 형식 — Python·JSON·정규식만, 부가 설명 없이 → code grader (ch19)
  • 문법 — 생성된 코드의 문법이 유효한가 → code grader (ch19)
  • 과제 수행 — 과제를 분명히 해결했고 큰 오류가 없는가 → model grader (유연성 필요, 이 레슨)

모델 grader 구현

grade_by_model

출력을 또 다른 모델 호출에 넣어 채점합니다. 긴 프롬프트로 역할을 정하고, 과제와 해법을 보여 준 뒤, 강점·약점·근거·점수를 JSON으로 달라고 합니다.

001_prompt_evals.ipynb · grade_by_model
def grade_by_model(test_case, output):
    prompt = f"""
You are an expert AWS code reviewer. Your task is to evaluate
the following AI-generated solution.

Original task:
{test_case["task"]}

Generated solution:
{output}

Provide your evaluation as a structured JSON object with the
following fields, in this specific order:
- "strengths": array of strings — what the solution does well
- "weaknesses": array of strings — what could be improved
- "reasoning": a string explaining the overall assessment
- "score": a number from 1 to 10
"""
    messages = []
    add_user_message(messages, prompt)
    add_assistant_message(messages, "```json")

    eval_text = chat(messages, stop_sequences=["```"])
    return json.loads(eval_text)

JSON 응답은 익숙한 패턴으로 받습니다 — assistant를 ```json으로 prefill, stop_sequences=["```"]로 끊고 json.loads.

왜 점수만 묻지 않나

점수만 달라고 하면 모델이 자꾸 6점 같은 어중간한 값을 줍니다. 강점·약점·근거를 함께 요구하면 모델이 집중해 더 구체적인 점수를 정합니다. 아래에서 비교해 보세요.

점수만 vs 점수+근거 · 모델 채점의 함정

연결 & 평균

Wire it up & average

이제 run_test_case의 TODO 자리에 grader를 연결하고, run_eval에서 점수를 평균냅니다.

run_test_case · grader 연결
def run_test_case(test_case):
    output = run_prompt(test_case)

    model_grade = grade_by_model(test_case, output)   # ← TODO 자리
    score = model_grade["score"]
    reasoning = model_grade["reasoning"]

    return {
        "output": output,
        "test_case": test_case,
        "score": score,
        "reasoning": reasoning,
    }
run_eval · 평균 계산
from statistics import mean

def run_eval(dataset):
    results = []
    for test_case in dataset:
        results.append(run_test_case(test_case))

    average_score = mean([result["score"] for result in results])
    print(f"Average score: {average_score}")
    return results
출력 · 평균 점수
Average score: 7.33
# 개별 점수 예: 8, 7, 6  →  평균 7.33 (객관적 지표)
드디어 지표

모델 채점은 가끔 변덕스럽고 가이드를 더 줄 수도 있지만, 이제 올려 보려고 집중할 수 있는 객관적 점수가 생겼습니다 — 7.33.

정리 & 점검

Recap & check
핵심 정리
  • 채점기 3종 — code·model·human. 공통 요구는 객관적 신호(보통 1~10).
  • 먼저 평가 기준을 정한다 — 형식·문법·과제 수행.
  • 모델 grader: 출력을 또 다른 모델로 채점. 강점·약점·근거까지 요구해야 구체적 점수.
  • JSON 응답은 prefill ```json + stop ``` + json.loads.
  • statistics.mean으로 평균 → 객관적 지표(7.33).

Q1모델 기반 채점(model grader)이란?

Q2모델에게 점수만 달라고 하면 흔히 생기는 문제는?

Q3형식·문법 검증에 더 알맞은 채점기는?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

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

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

등록하고 이어서 읽기

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