7

V3 자동 채점 하네스

골든 데이터셋과 검증

학습 목표
  • GD 를 자동 실행·비교·집계하는 채점기를 만든다
  • 채점 실패를 정당·부당으로 분류해 처리한다

V3 — 자동 채점 하네스: 검증을 습관으로

GD를 사람이 돌리면 한 번 하고 끝납니다. 채점기를 만들어 파이프라인에 겁니다.

import yaml
from neo4j import GraphDatabase

def grade(gd_file: str, uri: str, auth: tuple) -> dict:
    items = yaml.safe_load(open(gd_file, encoding="utf-8"))
    results = {"pass": 0, "fail": [], "by_hops": {}}
    with GraphDatabase.driver(uri, auth=auth) as drv, drv.session() as s:
        for it in items:
            got = s.run(it["gold_cypher"]).data()
            ok = compare(got, it["expected"])          # 유형별 비교(rowset/scalar/…)
            bucket = results["by_hops"].setdefault(it["hops"], {"pass": 0, "total": 0})
            bucket["total"] += 1
            if ok:
                results["pass"] += 1; bucket["pass"] += 1
            else:
                results["fail"].append({"id": it["id"], "got": got})
    return results

by_hops 집계에 주목하세요. 전체 정확도 하나가 아니라 난이도 구간별 성적표가 나옵니다. 이것이 코스 4 자연어 평가의 기준선(baseline)이 됩니다.

실행 규칙 두 가지

① 매 적재 후 (V1 감사와 함께) — 데이터 변경이 정답을 깨뜨렸는지 즉시 확인합니다.

여기서 판단이 갈립니다. 정답이 정당하게 변한 것이면 snapshot_ref를 갱신하고, 부당하게 변했으면 파이프라인 버그입니다. 이 둘을 구분하지 않고 정답을 계속 갱신하면 채점기가 아무것도 못 잡게 됩니다.

② 스키마 변경 전후 — 스펙 개정(코스 2에서 겪은 L1→L2 이관 같은)마다 GD 전 문항 통과가 병합 조건입니다.

소프트웨어의 CI(지속 통합)와 정확히 같은 규율을 그래프에 적용하는 것입니다.

실패 문항은 로그가 아니라 티켓입니다

원인을 넷으로 분류해 처리합니다 — 데이터 / 매핑 / 스키마 / 정답 자체.

그리고 "정답이 틀렸던" 문항의 교정 이력도 GD 파일에 남깁니다. 정답을 조용히 고치면, 다음에 같은 실수를 반복합니다.

에디터 로딩 중...
용어