RAG2026-5일35차시 · 평가 데이터셋 구축15 / 18← 이전목차다음 →MetaContents

35차시. 평가 데이터셋 구축

퀴즈 1 — 데이터셋 구성·누락·중복 점검하기

평가 데이터셋(딕셔너리 리스트)을 받아 유형별 개수, 부재 질문 비율(%), 문항별로 빠진 필드, 중복된 질문 문장을 딕셔너리로 돌려주는 check_dataset(data) 를 만드세요. 필수 필드는 라벨 항목 8개입니다.

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

Python
REQUIRED = ["id", "question", "type", "difficulty",
            "answerable", "gold_answer", "gold_pages", "keywords"]

def check_dataset(data):
    # 유형 분포, 부재 비율, 누락 필드, 중복 질문을 계산합니다
    pass
결과 보기 (예시 풀이)
Python
from collections import Counter

# 라벨 항목 8개. 하나라도 빠지면 채점에 쓸 수 없습니다.
REQUIRED = ["id", "question", "type", "difficulty",
            "answerable", "gold_answer", "gold_pages", "keywords"]

def check_dataset(data):
    """데이터셋의 구성, 필드 누락, 중복 질문을 점검해 딕셔너리로 돌려줍니다."""
    n = len(data)

    # ① 구성: 유형별 개수와 부재 질문 비율
    types = Counter(d.get("type", "?") for d in data)
    absent = sum(1 for d in data if d.get("answerable") is False)
    absent_ratio = absent / n * 100 if n else 0

    # ② 필드 누락: 문항마다 빠진 필드 이름을 모읍니다
    missing = {}
    for d in data:
        lack = [f for f in REQUIRED if f not in d]
        if lack:
            missing[d.get("id", "?")] = lack

    # ③ 중복: 같은 질문 문장이 두 번 이상 나오면 골라냅니다
    dup = [q for q, c in Counter(d.get("question") for d in data).items() if c > 1]

    return {"total": n, "types": dict(types),
            "absent_ratio": round(absent_ratio),
            "missing": missing, "duplicates": dup}

def make(i, q, t, ans=True):
    """예시용 문항 하나를 만듭니다. 라벨 8개를 모두 채웁니다."""
    return {"id": f"Q{i:03d}", "question": q, "type": t, "difficulty": "easy",
            "answerable": ans, "gold_answer": "...", "gold_pages": [4] if ans else [],
            "keywords": ["7일"]}

# 예시 1: 깨끗한 데이터셋 (부재 질문 1개, 누락·중복 없음)
good = [make(1, "환불은 며칠 이내인가요?", "fact"),
        make(2, "물건이 고장 나서 왔는데 바꿀 수 있나요?", "variant"),
        make(3, "대표이사 성함이 어떻게 되나요?", "absent", ans=False)]
print(check_dataset(good))

# 예시 2: gold_pages 가 빠진 문항과 중복 질문이 섞인 데이터셋
bad = [make(1, "환불은 며칠 이내인가요?", "fact"),
       make(2, "환불은 며칠 이내인가요?", "fact"),
       {"id": "Q003", "question": "오늘 날씨는?", "type": "out_of_scope",
        "difficulty": "easy", "answerable": False,
        "gold_answer": "자료에서 확인할 수 없습니다.", "keywords": []}]
result = check_dataset(bad)
print("누락:", result["missing"])     # Q003 의 gold_pages 가 잡혀야 합니다
print("중복:", result["duplicates"])  # 같은 질문 하나가 잡혀야 합니다
print("부재 비율:", result["absent_ratio"], "%")

실행 결과

출력
{'total': 3, 'types': {'fact': 1, 'variant': 1, 'absent': 1}, 'absent_ratio': 33, 'missing': {}, 'duplicates': []}
누락: {'Q003': ['gold_pages']}
중복: ['환불은 며칠 이내인가요?']
부재 비율: 33 %

채점 기준: 누락 필드와 중복 질문을 정확히 골라내고, 부재 비율을 answerable 이 False 인 문항으로 계산하면 정답입니다.

관련 교안: 35차시 「6. 실습 ③ — 데이터셋 검증」

← 이전 절35차시 · 실습 1 — 평가 데이터셋 구축 실습 따라 하기다음 절 →35차시 · 퀴즈 2 — 유형별로 Dev와 Holdout 나누기