RAG2026-5일34차시 · RAG 평가 개요16 / 18← 이전목차다음 →MetaContents

34차시. RAG 평가 개요

퀴즈 2 — 정답 순위로 MRR 계산하기

(검색된 조각 id 목록, 정답 id) 묶음의 목록을 받아 MRR을 계산하세요. 정답이 n번째면 1/n점, 없으면 0점입니다.

빈칸 코드에서 시작합니다.

Python
def mrr(results):
    pass
결과 보기 (예시 풀이)
Python
# results: (검색된 조각 id 목록, 정답 조각 id) 묶음의 목록
def reciprocal_rank(retrieved, answer_id):
    # 정답이 n번째(1부터 셈)에 있으면 1/n점입니다.
    for rank, doc_id in enumerate(retrieved, start=1):
        if doc_id == answer_id:
            return 1 / rank
    # 끝까지 없으면 0점입니다.
    return 0.0

def mrr(results):
    if not results:
        return 0.0
    # 질문마다 점수를 매겨 평균을 냅니다.
    scores = [reciprocal_rank(retrieved, answer_id) for retrieved, answer_id in results]
    return round(sum(scores) / len(scores), 2)

# 수업 자료의 계산 예시(질문 4개)를 그대로 만들어 봅니다.
results = [
    (["A", "x", "y"], "A"),            # Q1: 1위 -> 1.00
    (["x", "y", "B", "z"], "B"),       # Q2: 3위 -> 0.33
    (["x", "C", "y"], "C"),            # Q3: 2위 -> 0.50
    (["x", "y", "z"], "D"),            # Q4: 없음 -> 0.00
]
for retrieved, answer_id in results:
    print(answer_id, "점수:", round(reciprocal_rank(retrieved, answer_id), 2))

# 1) 평균이 0.46으로 나와야 합니다.
print("MRR:", mrr(results))

# 2) 모든 질문에서 정답이 1위면 1.0이어야 합니다.
print("모두 1위:", mrr([(["A"], "A"), (["B", "x"], "B")]))

실행 결과

출력
A 점수: 1.0
B 점수: 0.33
C 점수: 0.5
D 점수: 0.0
MRR: 0.46
모두 1위: 1.0

채점 기준: 순위를 1부터 세고, 정답이 없는 질문도 0점으로 평균에 넣으면 정답이다.

관련 교안: 34차시 「4. 순위를 반영하는 지표」 › 4-2) MRR (Mean Reciprocal Rank)

← 이전 절34차시 · 퀴즈 1 — Precision@k와 Recall@k 계산하기다음 절 →34차시 · 정리