34차시. RAG 평가 개요
퀴즈 2 — 정답 순위로 MRR 계산하기
(검색된 조각 id 목록, 정답 id) 묶음의 목록을 받아 MRR을 계산하세요. 정답이 n번째면 1/n점, 없으면 0점입니다.
빈칸 코드에서 시작합니다.
def mrr(results):
pass결과 보기 (예시 풀이)
# 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)