37차시. 루브릭 설계
퀴즈 1 — 가중 총점과 Gate로 합격 판정하기
항목별 점수(0~2점) 딕셔너리를 받아 가중 총점과 합격 여부를 돌려주는 score_by_rubric(scores) 를 만드세요. 가중치는 정확성 0.35, 근거성 0.30, 완결성 0.20, 명료성 0.15 이고, 정확성과 근거성이 1점 미만이면 총점과 상관없이 불합격, 합격선은 1.2 입니다.
빈칸 코드에서 시작합니다.
WEIGHTS = {"accuracy": 0.35, "grounding": 0.30,
"completeness": 0.20, "clarity": 0.15}
GATES = {"accuracy": 1, "grounding": 1}
PASS_LINE = 1.2
def score_by_rubric(scores):
# 가중 총점을 구하고, Gate 와 합격선을 모두 넘었는지 봅니다
pass
결과 보기 (예시 풀이)
# 수업 자료의 RAG 답변 루브릭 가중치 (합이 1.0 이 되게 배분)
WEIGHTS = {"accuracy": 0.35, "grounding": 0.30,
"completeness": 0.20, "clarity": 0.15}
# Gate: 이 항목들은 총점과 상관없이 최소 점수를 넘어야 합니다
GATES = {"accuracy": 1, "grounding": 1}
PASS_LINE = 1.2 # 합격선
def score_by_rubric(scores):
"""항목별 점수(0~2) 딕셔너리로 가중 총점과 합격 여부를 돌려줍니다."""
# 가중 총점 = 항목 점수 × 가중치의 합. 만점은 2.0 입니다
total = round(sum(scores.get(k, 0) * w for k, w in WEIGHTS.items()), 2)
# Gate 를 하나라도 못 넘으면 총점이 높아도 불합격입니다
gate_ok = all(scores.get(k, 0) >= g for k, g in GATES.items())
passed = gate_ok and total >= PASS_LINE
return {"total": total, "gate_ok": gate_ok, "passed": passed}
# 예시 1: 핵심·조건·출처를 다 갖춘 답변 A → 2.00점, 합격
print("답변 A", score_by_rubric({"accuracy": 2, "grounding": 2, "completeness": 2, "clarity": 2}))
# 예시 2: 장황하고 근거 밖 추측이 섞인 답변 C → 0.75점, 근거성 Gate 에서 탈락
print("답변 C", score_by_rubric({"accuracy": 1, "grounding": 0, "completeness": 2, "clarity": 0}))
# 예시 3: 사실이 틀렸는데 나머지가 좋은 답변 → 1.30점으로 합격선은 넘지만 Gate 에서 불합격
print("틀린 답", score_by_rubric({"accuracy": 0, "grounding": 2, "completeness": 2, "clarity": 2}))
실행 결과
답변 A {'total': 2.0, 'gate_ok': True, 'passed': True}
답변 C {'total': 0.75, 'gate_ok': False, 'passed': False}
틀린 답 {'total': 1.3, 'gate_ok': False, 'passed': False}채점 기준: 가중 총점이 맞고, Gate 를 못 넘은 경우 총점이 합격선 이상이어도 불합격으로 나오면 정답입니다.