골든셋 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라운드째 열리지 않았다.

라운드재현율정밀도완전+포함판정
r50.8080.7970.700불합격
r70.7670.8000.675불합격
r80.8360.7720.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에서 고친 것

  1. 사실 조각 분해의 기본값을 **“기준답변 전 문장이 조각”**으로 되돌리고, 버리는 예외를 다른 조각에서 합산·계산으로 유도되는 요약값 하나로 좁혔다
  2. 하드 상한 폐지. 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합계
통과33120153
수정71017
재작업000
제거(오염)000
추가(누락 발굴)145
보류9918

기계검사·인덱스 무결성 모두 0건이다. 인덱스에 없는 chunk_id 0 · 타 문서 청크 0 · 스키마 위반 0.


라벨링을 믿어도 되는가

정확성은 확인됐다. 검증자가 원문 대조로 제거한 게 0건이니 거짓 정답은 안 들어갔다. 골든셋에서 가장 무서운 사고(틀린 정답 1개 = 이후 모든 실험 비교가 흔들림)는 막았다.

완전성은 부족하다. 2026-07-29에 실측했다.

r8 라벨러 산출물에 검증자를 한 번 더 돌려(사람 정답지 접근 차단) 사람 라벨 40문항으로 채점했다.

재현율정밀도
라벨러 단독 (r8)0.8360.772
라벨러 + 검증자0.8630.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@10nDCG@10Recall@5doc_hit@5
A_dense0.6360.6040.6081.000
B_hybrid0.6000.5870.6181.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.pytarget_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_idschroma_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 기준과 다르다.

단일세부후속탐색비교직답모른다반문
전체 200903025251515
gold 보유 16490292520

후속 1문항과 직답 5문항이 gold가 비어 빠진다.


v4 → v5 — 라벨이 늘었다 (전체 풀링)

v4까지가 “라벨을 손대지 않는다”였다면, v5는 의도적으로 라벨을 늘린 판이다. 정답지가 e5 후보로만 만들어져 새 임베딩을 구조적으로 과소평가했기 때문이다.

v4v5
정답 청크 (연인원)310353 (+43)
판정 풀6,7518,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건 판정 — 정답에서 뺀 채로 둔다. 나중에 넣으면 이전 실험과 비교가 깨진다

남은 것 (골든셋 자체는 안 건드리는 작업):

  1. 리랭커 변형 C·D 측정 — VM GPU에서
  2. 결함 1건 제외 처리g200:37cd7e06을 지표 산출에서 빼는 필터 추가 (라벨은 그대로 두고 집계에서만 뺀다)

라벨을 바꿔야 할 일이 생기면 새 버전을 만든다. 이전 버전은 수정하지 않는다 — 실제로 v5가 그렇게 나왔다.


검색 실험 골든셋 40문항 · 골든셋 · 검색 실험 설계 (4모델·BM25) · 검색 실험 결과 (4모델·BM25) · 인덱스 데이터 손상 진단