골든셋 200문항 제작
40문항 사람 라벨(검색 실험 골든셋 40문항)을 정답지로 삼아 라벨러 에이전트를 훈련시키려다 실패하고, 대신 라벨러 + 독립 검증자 2단계로 200문항을 만든 기록. 결과물은 VM 공유폴더
/srv/GPTPilot/goldenset/current. 버전 이력은 아래 §v3 → v4 · §v4 → v5 — 현행은 v5다.
| 문항 | 200 (단일세부 90 · 후속 30 · 탐색비교 25 · 직답 25 · 모른다 15 · 반문 15) |
| 정답 청크 | 310개 / 164문항 (v4 기준. v5에서 353개로 늘었다 — 아래 §v4 → v5) |
| 인덱스 | chroma_v2 (chunks 30,002 / 99문서) |
| 최대 성과 | 검증자 제거(오염) 0건 — 거짓 정답이 골든셋에 안 들어갔다 |
| 최대 미결 | 누락률 미검증 — 정답 6개 중 1개꼴로 빠져 있을 수 있다 |
왜 2단계로 갔나
원래 계획은 라벨러 스킬을 사람 라벨 40문항으로 채점해 합격시킨 뒤, 그 스킬로 200문항을 무인 라벨링하는 것이었다. 합격선은 8라운드째 열리지 않았다.
| 라운드 | 재현율 | 정밀도 | 완전+포함 | 판정 |
|---|---|---|---|---|
| r5 | 0.808 | 0.797 | 0.700 | 불합격 |
| r7 | 0.767 | 0.800 | 0.675 | 불합격 |
| r8 | 0.836 | 0.772 | 0.725 | 불합격 |
기준은 재현율 ≥0.90 · 정밀도 ≥0.80 · 완전+포함 ≥70% · 거짓판정 0 · 완전불일치 ≤2. 다섯 개 전부를 만족해야 한다.
r7이 r5보다 나빠진 이유 — 규칙 하나가 역효과를 냈다
r7에 새로 넣은 “질문이 묻지 않는 것은 사실 조각이 아니다” 규칙이 과잉 발동했다. 원래는 “1등급 7명·2등급 12명 … 총 23명”에서 총합만 걷어내려던 규칙인데, 라벨러가 기준답변의 절반을 “부연”이라며 버리는 데 썼다. 라벨러 자신의 note에 그대로 남아 있다.
기준답변 3문장(교과과정 개발~성적 이수, 확장성·유연성, 접근성·편의성)은 ‘연계 방식’을 묻는 질문의 부연으로 보아 조각에서 제외
이 한 문항에서만 정답 4개를 놓쳤다.
또 하나는 정답 상한 4개였다. 사람 라벨이 5개·6개인 문항이 있어 규칙상 만점이 불가능했다. 라벨러가 note로 직접 항의하기까지 했다.
R8 묶음이 5조각이라 ‘정답 최대 4개’ 상한과 충돌한다. 다섯 청크 중 어느 하나를 임의로 빼면 특정 분류의 건수를 말할 수 없게 되어…
r8에서 고친 것
- 사실 조각 분해의 기본값을 **“기준답변 전 문장이 조각”**으로 되돌리고, 버리는 예외를 다른 조각에서 합산·계산으로 유도되는 요약값 하나로 좁혔다
- 하드 상한 폐지. 5개를 넘기면 되물음 2가지(과분해인가 / 층 위반이 섞였나)만 통과하면 그대로 제출
재현율은 0.767 → 0.836으로 올랐지만 정밀도가 0.800 → 0.772로 내려가 여전히 불합격.
채택한 경로 — 라벨러 + 독립 검증자
게이트를 계속 두드리는 대신, 검증자를 붙여 라벨러의 결함을 사후에 잡는 쪽으로 갔다. 근거는 r8 실패의 성격이다 — 오염(초과 선택)이 아니라 누락이 지배적이었고, 누락은 검증자 2단계(빠뜨린 근거 찾기)가 정확히 겨냥하는 결함이다.
문항·기준답변 생성 (GEN_SPEC)
→ 후보 풀링 (dense top-20 ∪ BM25 top-20, 탐색비교는 문서별)
→ 라벨러 에이전트가 정답 청크 선정 (SKILL v8)
→ 기계검사 (지어낸 id·타 문서·스키마) — 프로그램이 한다
→ 독립 검증자가 청크 원문과 대조해 재판정 (VERIFY_SPEC)
검증자는 라벨러의 근거를 믿지 않는다. 청크 원문을 직접 읽고 판정하며, 제거·추가·보류에는 반드시 원문 인용을 붙여야 한다.
검증 결과
| 항목 | 파일럿 40 | 나머지 130 | 합계 |
|---|---|---|---|
| 통과 | 33 | 120 | 153 |
| 수정 | 7 | 10 | 17 |
| 재작업 | 0 | 0 | 0 |
| 제거(오염) | 0 | 0 | 0 |
| 추가(누락 발굴) | 1 | 4 | 5 |
| 보류 | 9 | 9 | 18 |
기계검사·인덱스 무결성 모두 0건이다. 인덱스에 없는 chunk_id 0 · 타 문서 청크 0 · 스키마 위반 0.
라벨링을 믿어도 되는가
정확성은 확인됐다. 검증자가 원문 대조로 제거한 게 0건이니 거짓 정답은 안 들어갔다. 골든셋에서 가장 무서운 사고(틀린 정답 1개 = 이후 모든 실험 비교가 흔들림)는 막았다.
완전성은 부족하다. 2026-07-29에 실측했다.
r8 라벨러 산출물에 검증자를 한 번 더 돌려(사람 정답지 접근 차단) 사람 라벨 40문항으로 채점했다.
| 재현율 | 정밀도 | |
|---|---|---|
| 라벨러 단독 (r8) | 0.836 | 0.772 |
| 라벨러 + 검증자 | 0.863 | 0.750 |
| 검증자 기여 | +0.027 | −0.022 |
누락 16.4% 중 검증자가 메운 건 2.7%p뿐이다. 사람 정답 73개 중 라벨러가 12개를 놓쳤고 검증자가 찾은 건 2개다.
이번 실행에서는 프롬프트에 “2단계 누락 검사가 이번 작업의 본체다”라고 못박고 누락 유형 4가지까지 나열해 줬다. 그런데도 결과가 같다 → 지시 부족이 아니라, 검증자가 미선택 후보 30~40개를 전수로 훑는 일을 실질적으로 못 한다. 제거 0건은 두 번 재현됐으므로 오염 차단 능력은 진짜다. 누락 발굴 능력이 없는 것이다.
v3에 대한 확정 판단
| 항목 | 값 |
|---|---|
| 오염 | 없음 (제거 0건, 2회 재현) |
| 누락 | 약 14% — 정답 청크 310개는 실제 필요량의 86% 수준. 50개쯤 빠져 있다 |
실용적 결론
| 용도 | 판단 |
|---|---|
| 변형 간 상대 비교 (A vs B, 리랭커 유무) | 문제없다. 누락은 모든 변형에 똑같이 작용한다 |
| 절대 수치 해석 (MRR 0.636 등) | 실제보다 낮게 나온 것으로 봐야 한다 |
| 라벨러 스킬의 무인 자동화 | 아직 이르다. 게이트 미통과 상태 |
그래도 다시 만들지 않는다. 오염이 0이라 “틀린 걸 맞다고 채점하는” 사고는 나지 않고, 누락 14%는 모든 변형에 균일하게 작용해 순위를 뒤집지 않는다. 대신 절대 수치는 “실측 하한”으로만 인용한다 — MRR 0.636을 “이 시스템의 성능은 0.636”이라고 외부에 말하지 않는다.
실측 (chroma_v2, gold 보유 164문항, LLM 호출 없음)
| 변형 | MRR@10 | nDCG@10 | Recall@5 | doc_hit@5 |
|---|---|---|---|---|
| A_dense | 0.636 | 0.604 | 0.608 | 1.000 |
| B_hybrid | 0.600 | 0.587 | 0.618 | 1.000 |
하이브리드는 Recall@5를 +0.010 올리는 대신 순위 품질을 −0.036 깎는다.
42문항 시절 hit@5가 1.000으로 포화돼 사라졌던 변별력이 200문항에서 복원됐다. 이게 골든셋을 키운 목적이었다. 다만 doc_hit@5는 200문항에서도 여전히 1.000이라 문서 단위 지표는 계속 무의미하다 — 청크 단위(MRR·nDCG)를 주 지표로 쓴다.
리랭커 변형(C·D)은 GPU가 필요해 VM에서 별도로 측정한다.
알려진 결함
| qid | 유형 | 문제 | 조치 |
|---|---|---|---|
g200:37cd7e06 | 후속 | 정답(Oracle·V2 Conference)이 시스템 구성도 이미지 안에만 있다. 이미지를 제외하는 v1에서는 어떤 검색으로도 못 맞힌다 | 지표에서 제외. v2에서 이미지 텍스트 병합 후 재라벨링 |
g200:9f071cc8 | 직답 | 기준답변 49,000,000원 vs 본문 “사업예산 50백만원” 불일치 | 공고금액과 본문 예산이 다른 항목일 수 있음. 출처 확인 필요 |
g200:3ce22756 | 단일세부 | 질문이 “총 몇 호”와 “월 몇 회” 둘을 묻는데 기준답변은 한쪽만 답한다 | 기준답변 보강 또는 질문 분리 |
gold가 빈 36문항은 결함이 아니다 — 모른다 15 · 반문 15는 빈 목록이 기대값이고, 직답 5는 값이 본문이 아니라 data_list.csv 메타에만 있어 doc_cards가 답할 몫이다.
후보 풀이 정답을 놓친 3문항
da888088(BIT 유형별 수량) · 0f11914c·99e335a4(요구사항 합계 건수)는 정답이 문서에 실재하는데 후보 풀에 없었다. 기본 풀이 문서 필터를 끄고 뽑기 때문이다(필터를 켜면 지표가 1.0으로 포화돼 변별력이 사라진다). 이 3건만 문서 필터를 켜고 k를 넓혀 인덱스 원문 대조로 직접 확정했다.
이건 문항 결함이 아니라 풀링 방식의 구조적 한계다. 같은 이유로 놓친 정답이 다른 문항에도 있을 수 있다.
부수적으로 잡은 버그
scripts/run_rerank_experiments.py가 target_doc_id를 문자열로 가정해, 탐색비교 문항이 들어오면 TypeError로 런 전체가 죽었다. 풀 생성기(make_rerank_labels.load_questions)는 이 필드를 리스트로 쓰는 게 계약이라 실제 데이터로도 터진다. 42문항 실험에는 이 유형이 안 걸려 드러나지 않았을 뿐이다. 리스트를 받도록 고쳤다(비교 문항은 한쪽 문서만 맞혀도 doc_hit 인정).
산출물
VM 공유폴더 (team2 rw, NDA — 반출 금지)
/srv/GPTPilot/goldenset/current -> v5/ (직전 v4_20260729)
goldenset.jsonl 200줄 question·기준답변·유형·대상_doc_id·선행_턴·qid
rerank_labels.jsonl 164줄 ★ 검색 실험용. gold 보유 문항만 (정답 청크 v4 310 → v5 353)
rerank_labels_full.jsonl 200줄 전건. gold 빈 36문항 포함, 참고용
SHA256SUMS
로컬 (gitignored)
data/goldenset_200.jsonl
data/goldenset_200_labels.jsonl
.harness-mem/goldenset-skill/held_for_review.json 보류 18건
.harness-mem/goldenset-skill/known_defects.json 결함 4건
gold_chunk_ids는 chroma_v2에 종속이다. 재인덱싱하면 통째로 무효가 된다.
v3 → v4 — 라벨은 하나도 안 바뀌었다
v4는 패키징 수정본이다. 성적에 영향이 없다
rerank_labels_full.jsonl(200줄)이 v3의 라벨과 완전히 동일하다. v4가 한 일은 gold가 빈 36문항(모른다 15 · 반문 15 · 직답 5)을 뺀 164줄짜리 파일을 분리한 것뿐이다.“v3에서 v4로 성적이 바뀌었나?”의 답은 아니오다. 채점에 쓰이던 문항 집합이 원래부터 164였고, 그걸 파일 이름으로 드러냈을 뿐이다. 로컬
data/rerank_labels_200.jsonl과 대조해 164문항 gold 청크 전부 일치를 확인했다(로컬에는유형필드만 없다). 즉 지금까지의 모든 실험 수치가 v4 기준이다.
gold 보유 164문항의 유형 분포는 전체 200 기준과 다르다.
| 단일세부 | 후속 | 탐색비교 | 직답 | 모른다 | 반문 | |
|---|---|---|---|---|---|---|
| 전체 200 | 90 | 30 | 25 | 25 | 15 | 15 |
| gold 보유 164 | 90 | 29 | 25 | 20 | — | — |
후속 1문항과 직답 5문항이 gold가 비어 빠진다.
v4 → v5 — 라벨이 늘었다 (전체 풀링)
v4까지가 “라벨을 손대지 않는다”였다면, v5는 의도적으로 라벨을 늘린 판이다. 정답지가 e5 후보로만 만들어져 새 임베딩을 구조적으로 과소평가했기 때문이다.
| v4 | v5 | |
|---|---|---|
| 정답 청크 (연인원) | 310 | 353 (+43) |
| 판정 풀 | 6,751 | 8,856 (문항당 41.2 → 54.0) |
| 상위10 미판정률 | M0 0.7% / M1 26.0% / M2 32.0% | 전 조합 0.0% |
세 임베딩의 dense_doc 후보를 합집합으로 묶어 2,105개를 증분 판정했고(신규 정답 42 = 2.0%),
독립 검증자 4명이 전건 재독해 추가 1 · 제거 0이었다. 보류 5건은 미반영.
v4 기준 성적과 v5 기준 성적을 섞어 비교하면 안 된다. 전 과정 → 검색 실험 결과 (4모델·BM25) §8
상태 — 고정 (2026-07-29)
이 골든셋은 v4_20260729로 고정했다 (이후 전체 풀링으로 v5가 됐다 — 위 절).
아래는 v4를 고정하던 시점의 기록이다. 라벨을 더 손대지 않는다. 이후 실험은 전부 이 정본을 기준으로 돌려 서로 비교 가능하게 유지한다.
고정하며 하지 않기로 한 것:
- 검증자 재현율 측정 — 상대 비교가 용도라 불필요하다고 판단
- 보류 18건 판정 — 정답에서 뺀 채로 둔다. 나중에 넣으면 이전 실험과 비교가 깨진다
남은 것 (골든셋 자체는 안 건드리는 작업):
- 리랭커 변형 C·D 측정 — VM GPU에서
- 결함 1건 제외 처리 —
g200:37cd7e06을 지표 산출에서 빼는 필터 추가 (라벨은 그대로 두고 집계에서만 뺀다)
라벨을 바꿔야 할 일이 생기면 새 버전을 만든다. 이전 버전은 수정하지 않는다 — 실제로 v5가 그렇게 나왔다.
검색 실험 골든셋 40문항 · 골든셋 · 검색 실험 설계 (4모델·BM25) · 검색 실험 결과 (4모델·BM25) · 인덱스 데이터 손상 진단