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분채점기 3종 — code · model · human
먼저 평가 기준을 정한다 — 형식·문법·과제 수행
형식·문법 → code, 과제 수행 → model
grade_by_model — 출력을 또 다른 모델 호출로 채점
점수만 X → 강점·약점·근거까지 요구해야 구체적 점수
statistics.mean으로 평균 → 7.33 객관적 지표
grader는 출력을 받아 객관적 신호(보통 1~10)를 돌려줍니다. 신호를 만드는 방식에 따라 세 종류로 나뉩니다.
셋 다 공통 요구는 하나 — 쓸 수 있는 객관적 신호(흔히 1~10)를 돌려주는 것. 기준마다 알맞은 채점기가 다릅니다.
어떤 채점기든 먼저 평가 기준을 정해야 합니다. 이 AWS 코드 도우미에는 세 가지를 잡았습니다.
출력을 또 다른 모델 호출에 넣어 채점합니다. 긴 프롬프트로 역할을 정하고, 과제와 해법을 보여 준 뒤, 강점·약점·근거·점수를 JSON으로 달라고 합니다.
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점 같은 어중간한 값을 줍니다. 강점·약점·근거를 함께 요구하면 모델이 집중해 더 구체적인 점수를 정합니다. 아래에서 비교해 보세요.
이제 run_test_case의 TODO 자리에 grader를 연결하고, run_eval에서 점수를 평균냅니다.
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, }
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.
json.loads.statistics.mean으로 평균 → 객관적 지표(7.33).Q1모델 기반 채점(model grader)이란?
모델 grader는 추가 API 호출로 Claude에게 채점을 맡깁니다 — 유연하지만 비용이 듭니다.
Q2모델에게 점수만 달라고 하면 흔히 생기는 문제는?
강점·약점·근거를 함께 요구하면 모델이 더 구체적으로 판단해 점수를 정합니다.
Q3형식·문법 검증에 더 알맞은 채점기는?
형식·문법은 코드로 결정적으로 검사할 수 있어 code grader가 적합합니다. 유연한 과제 수행 판단은 model grader.
유연한 모델 채점을 만들었습니다. 다음은 형식·문법처럼 정확히 따질 수 있는 부분을 코드로 채점하는 방법입니다. → 코드 기반 채점
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 76개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.