34차시. RAG 평가 개요
퀴즈 1 — Precision@k와 Recall@k 계산하기
검색된 조각 id 목록, 관련 조각 id 집합, k를 받아 Precision@k와 Recall@k를 소수 둘째 자리까지 돌려주세요.
빈칸 코드에서 시작합니다.
def precision_recall(retrieved, relevant, k):
pass결과 보기 (예시 풀이)
# retrieved: 검색 순서대로 나온 조각 id 목록
# relevant : 이 질문에 관련 있는 조각 id 집합(문서 전체 기준)
def precision_recall(retrieved, relevant, k):
# 상위 k개만 봅니다.
top = retrieved[:k]
# 가져온 것 중 관련 있는 것의 개수
hit = sum(1 for doc_id in top if doc_id in relevant)
# Precision: 가져온 것 중 관련 있는 비율. 분모는 가져온 개수입니다.
precision = hit / len(top) if top else 0.0
# Recall: 관련 있는 것 중 가져온 비율. 분모는 관련 조각 전체 개수입니다.
recall = hit / len(relevant) if relevant else 0.0
return round(precision, 2), round(recall, 2)
relevant = {"p4-1", "p4-2", "p5-1", "p9-3"} # 관련 조각 4개
retrieved = ["p4-1", "p2-7", "p4-2", "p5-1", "p8-2", "p1-1", "p9-3"]
# 1) 수업 자료의 예: k=5에서 관련 3개를 가져옴 -> (0.6, 0.75)
print("k=5:", precision_recall(retrieved, relevant, 5))
# 2) k를 줄이면 Precision은 오르고 Recall은 내려가는지 봅니다.
print("k=1:", precision_recall(retrieved, relevant, 1))
# 3) k를 늘리면 Recall은 오르고 Precision은 내려가는지 봅니다.
print("k=7:", precision_recall(retrieved, relevant, 7))
실행 결과
k=5: (0.6, 0.75)
k=1: (1.0, 0.25)
k=7: (0.57, 1.0)채점 기준: Precision의 분모를 가져온 개수로, Recall의 분모를 관련 조각 전체 개수로 두면 정답이다.