골든셋
골든셋을 42 → 200문항으로 늘린다. 사람이 200번 라벨링할 수는 없으므로, 에이전트가 사람만큼 라벨링할 수 있는지 먼저 증명하고 그 다음에 맡긴다. 이 문서는 계획·라벨링 스킬(요지)·검증 이력을 한데 모은 통합본이다.
현재 상태 (2026-07-29 실측)
항목 상태 스킬 버전 v8 — 정본 GPTPilots_Project/.harness-mem/goldenset-skill/rounds/r8/SKILL.md200문항 생성 완료 — generated/goldenset_200.jsonl200줄최고 성적 v8 평균 0.8375 / 재현율 0.836 — 합격선 미달 200문항 라벨링·검증 완료 — 170문항 검증 데이터셋 버전 v5 (직전 v4_20260729) — 아래데이터셋 v5 — 정답지가 e5 후보로만 만들어져 새 임베딩을 과소평가하던 것을 전체 풀링으로 걷어낸 판이다.
v4 v5 정답 청크 (연인원) 310 353 판정 풀 6,751 8,856 (문항당 41.2 → 54.0) 세 임베딩의 후보를 합집합으로 묶어 2,105개를 증분 판정(신규 정답 42 = 2.0%), 라벨러 4 + 독립 검증자 4로 전건 재독해 추가 1 · 제거 0. 전 과정 → 검색 실험 결과 (4모델·BM25) §8 · v5는 아직 로컬 산출물이고 VM
current는v4_20260729를 가리킨다.주의 — 이 문서의 v1~v8은 라벨링 스킬 버전이고, 위 v4·v5는 데이터셋 버전이다. 서로 다른 축이다.
사람이 라벨링한 40문항 → 검색 실험 골든셋 40문항 · 쓰일 곳 → 검색 실험 설계 (4모델·BM25)
1. 왜 — 42→200 확장과 에이전트 관문
사람이 40문항을 라벨링하는 데 실제로 오래 걸렸고, 사람도 2건을 틀렸다. 200문항은 사람이 못 한다. 그렇다고 에이전트에게 그냥 맡기면 골든셋이 오염되고, 오염된 골든셋으로 잰 실험 결과는 전부 무효가 된다.
그래서 검증 가능한 관문을 만든다. 사람이 이미 라벨링한 40문항이 정답지다. 에이전트가 그 정답지를 못 보고 라벨링해서 사람과 일치하면, 나머지 160문항도 맡길 수 있다.
사람 라벨 40문항 (정답지)
↓ 숨김
블라인드 에이전트 ──라벨링──> 자동 채점 ──> 심사위원 3인
↑ │
└──── 스킬 개정 ←── 불합격 ────────────┘
합격 → 200문항 착수
| 목표 | 200문항 + 정답 청크 라벨 |
| 방법 | 스킬을 만들어 에이전트에게 맡김 |
| 관문 | 블라인드 라벨링이 사람 라벨과 일치해야 통과 |
| 심사 | 까다로운 심사위원 3인 전원 통과 필요 |
| 산출 | 확정 스킬 + 200문항 → VM 공유 폴더 |
2. 설계 — 시나리오·채점 기준·심사위원·블라인드
시나리오 구성 — 기존 보고서를 따른다
goldenset_scenario_report.html의 4시나리오 · 6유형 스키마를 그대로 쓴다.
| 시나리오 | 유형 | 현재 42 | 목표 200 |
|---|---|---|---|
| S01 문서 세부·후속 대화 | 단일세부 · 후속 | 25 | 90 + 30 |
| S02 여러 사업 탐색·비교 | 탐색비교 | 4 | 25 |
| S03 공고 메타데이터 직답 | 직답 | 5 | 25 |
| S04 안전한 미확인·모호성 | 모른다 · 반문 | 8 | 15 + 15 |
스키마 특성:
후속은선행_턴에 앞 질문 배열을 갖는다 (대명사 해소 필요)탐색비교는대상_doc_id가 리스트다 (문서 2개 이상)모른다·반문은대상_doc_id가null— 정답 청크가 없는 게 정상
정답 청크 라벨링이 필요한 건 S01~S03의 약 170문항이다. S04는 빈 목록이 기대값이다.
채점 기준표
에이전트가 고른 청크 집합 A, 사람이 고른 집합 H.
| 판정 | 조건 | 점수 |
|---|---|---|
| 완전일치 | A = H | 1.0 |
| 포함 | H ⊆ A, 여분 1개 이하 | 0.9 |
| 핵심일치 | H ⊆ A, 여분 2개 이상 | 0.7 |
| 부분일치 | Jaccard ≥ 0.5 | 0.5 |
| 불일치 | Jaccard < 0.5 | 0.2 |
| 완전불일치 | 교집합 없음 | 0.0 |
| 공백일치 | 양쪽 다 정답 없음 | 1.0 |
| 거짓양성 | 정답 없는데 있다고 함 | −1.0 |
| 거짓음성 | 정답 있는데 없다고 함 | −1.0 |
거짓 판정에 음수를 주는 이유 — 골든셋에 틀린 정답이 들어가면 이후 모든 측정이 오염된다. “근거가 없는데 있다고 우기는 것”은 부분 감점이 아니라 결함이다.
합격선 — 다섯 개 전부 만족
| 기준 | 이유 | |
|---|---|---|
| 1 | 정답 재현율 ≥ 0.90 | 골든셋은 “검색이 찾아야 할 목록”이라 빠뜨리는 쪽이 해롭다 |
| 2 | 정답 정밀도 ≥ 0.80 | 낮으면 오염 |
| 3 | 완전+포함 ≥ 70% | |
| 4 | 거짓양성 + 거짓음성 = 0건 | 유무 판정을 틀리면 안 된다 |
| 5 | 완전불일치 ≤ 2건 |
수치 합격은 필요조건일 뿐이다. 심사위원이 최종 결정한다.
심사위원 3인 — 각각 다른 것을 본다
전원 통과여야 스킬이 확정된다. 서로의 의견을 보지 않고 독립 심사한다.
1. 재현성 심사관 — “이 점수가 운인가 실력인가”
- 맞힌 문항이 쉬운 것(정답 1개·명백)에 몰려 있지 않은가
- 정답 2개 이상 / 표 정답 / 어휘형처럼 어려운 갈래에서도 성적이 유지되는가
- 스킬이 이 40문항에 과적합한 규칙을 담고 있지 않은가 (개별 사례 하드코딩)
- 200문항에서 무너질 지점을 최소 하나 지목해야 한다
2. 오염 위험 심사관 — “이 골든셋을 믿고 실험해도 되는가”
- 틀린 정답 1개 = 놓친 정답 3개로 계산한다
- 타 문서 청크가 섞이지 않았는가 (
doc_id ≠ target_doc_id) - 기준답변에 없는 내용을 정답이라 우기지 않았는가
- 에이전트가 댄 근거가 청크 원문에 실제로 있는가, 지어낸 것은 아닌가
3. 규칙 명확성 심사관 — “다른 에이전트도 같은 판단을 내리는가”
- 성적이 좋아도 규칙이 모호하면 낙제시킨다. 이 스킬은 앞으로 사람 없이 돌아야 한다
- “적절히”, “관련 있으면”, “충분히” 같은 판단 불가 표현을 전부 지목
- 경계 사례 지시가 있는가 — 표/줄글 분산, 인접 청크, 중복 청크, 단위 표기 차이
- 실패 사례를 규칙으로 일반화했는가, 사례 나열에 그쳤는가
블라인드 보장 — 세 겹
에이전트가 사람 라벨을 훔쳐보면 검증이 무의미하다.
- 입력 분리 —
blind/q01.json~q40.json에 질문·기준답변·후보만 담는다. 정답 필드 없음 - 후보 순서 셔플 — 고정 시드로 섞어 위치 편향 제거 (사람이 본 순서와 다르다)
- 파일 접근 금지 —
data/rerank_labels.jsonl열람 금지를 프롬프트에 명시
진행 상황
✅ 채점 기준표·채점 스크립트
✅ 블라인드 입력 40문항 후보 1,438개, 셔플됨
✅ 스킬 v1 → v8 8회 개정 (v5에서 답 누출 제거)
✅ 블라인드 라벨링 라운드 반복 v8까지 진행
✅ 심사위원 3인 (v4) 전원 불통과 → v5 전면 재작성
✅ 탐색비교 유형 첫 검증 풀링 버그 발견·수정
✅ 골든셋 오류 2건 수정
✅ 파이프라인 코드 버그 4건 수정 f610f2f · 1406222 (462테스트)
✅ 200문항 생성 generated/goldenset_200.jsonl (200줄)
□ 합격선 통과 v8 최고 성적도 미달 (아래 §4)
□ 200문항 라벨링·검증 완료 확인
□ VM 공유 폴더 업로드
3. 라벨링 스킬 — 설계 요지 + 정본 위치
이 절은 요약본이다 — 전문은 정본을 볼 것
정본:
GPTPilots_Project/.harness-mem/goldenset-skill/rounds/r8/SKILL.md(현행 v8)볼트에 있던 지시서 전문 사본(구
골든셋 라벨링 스킬.md)은 v5에서 갱신이 멈췄고 v6~v8 개정이 빠져 있었다. 매 버전 전문을 볼트로 복사·동기화하는 방식은 이미 한 번 실패했으므로, 여기에는 버전이 바뀌어도 유지되는 설계 요지만 남긴다. 지시서 원문이 필요하면 위 경로를 보라.
하는 일 — 질문마다 후보 청크 30~40개와 기준답변이 주어지고, 기준답변의 근거가 되는
청크를 chunk_id 목록으로 낸다. 근거가 없으면 빈 목록(실패가 아니라 정답일 수 있다).
산출물은 독립 검증자가 원문과 대조한다.
판별의 유일한 기준 — 모든 규칙이 이 한 문장의 상황별 적용이다:
이 청크만 검색 결과로 받은 사람이, 기준답변의 그 사실을 말할 수 있는가?
“관련 정보를 얻는다”·“주제가 같다”는 부족하다. “그 사실을 말할 수 있다”여야 정답이다. 용도(검색 엔진 성능 측정 — “검색이 찾아냈어야 할 청크 목록”)를 스킬 안에 명시해 경계 사례를 에이전트가 스스로 판단하게 한다.
규칙 우선순위 (v5 기준) — 충돌 시 위쪽이 이기고 예외가 없다:
R1 (타 문서 배제) > R11 (질문이 묻는 층) > R2-1 (사실 진술 여부)
> R2 (진술하면 절 무관 포함) > R8 (쪼개진 짝) > R5 (부분 커버) > R10 (여분 내용 무관)
이 순서인 이유: v4에서 포함 규칙 R2(“어느 절이든 진술하면 정답”)가 만능 열쇠로 배제 규칙을 매번 뚫었고, 오염 3건 중 2건이 그 누수였다. 배제(R1·R11·R2-1)를 포함(R2)보다 위에 둬서 강한 포함 문장이 배제를 무효화하지 못하게 막았다. 충돌은 예외 조항이 아니라 순서로 푼다.
절차 4단계:
- 기준답변을 사실 조각으로 분해 — 한 조각 = 독립적으로 참·거짓을 물을 수 있는 최소 단위. 열거는 한 조각으로 묶고, 5조각 초과는 과분해
- 후보를 처음부터 끝까지 훑으며 사실별로 진술 청크를 전부 기록
- 우선순위 순으로 배제 → 남은 것에 포함 규칙 적용 (정답 상한 4개)
- 자가 점검표 통과 — id 실재 확인, doc_id 정규화 대조, 층 일치, 문서 단위 일관성 점검 등
출력 스키마 — 문항마다 JSONL 한 줄:
{"qid":"...", "gold_chunk_ids":[...], "facts":[...], "applied":["R11","R2-1"],
"reason":"...", "uncovered":[...], "confidence":"높음|보통|낮음", "note":"..."}탐색비교는 문서별 결과 gold_by_doc을 추가한다. confidence는 재량이 아니라
기계 규칙이다(uncovered 있으면 낮음, note 있으면 높음 금지).
그 외 전문에 있는 것: 표기 정규화(R6, 40,000천원=4천만원), 깨진 서식 판독(R7), 거의 동일한 청크의 식별자 특정(R9), 유형별 지침(후속·탐색비교·모른다·반문) 등.
4. 검증 이력 — 라운드별 성적과 실패 원인
성적표 (이 문서가 정본)
| 라운드 | 평균 | 재현율 | 정밀도 | 완전+포함 | 거짓 | 완전불일치 | 결과 |
|---|---|---|---|---|---|---|---|
| v1 | 0.613 | 0.542 | 0.780 | 45% | 1 | 1 | 🔴 최소집합 오지시 |
| v2 | 0.762 | 0.865 | 0.610 | 57.5% | 1 | 0 | 🔴 진자 반대로 튐 |
| v3 | 0.795 | 0.811 | 0.714 | 67.5% | 0 ✅ | 0 ✅ | 🔴 2/5 통과 |
| v4 | 0.843 | 0.892 | 0.710 | 70% ✅ | 0 ✅ | 0 ✅ | 🔴 답 누출 — 점수 무효, 심사위원 3인 전원 불통과 |
| v5 | 0.8125 | 0.808 | 0.797 | 70.0% | 0 ✅ | 0 ✅ | 🔴 누출 제거본 |
| v6 | — | — | — | — | — | — | score.json 없음, 값 확인 불가 |
| v7 | 0.8050 | 0.767 | 0.800 | 67.5% | 🔴 후퇴 | ||
| v8 | 0.8375 | 0.836 | 0.772 | 72.5% | 🔴 최고 성적, 여전히 합격선 미달 | ||
| 기준 | ≥0.90 | ≥0.80 | ≥70% | 0 | ≤2 |
(v5~v8은 rounds/rN/score.json 실측값. v7에서 한 번 내려갔다가 v8에서 회복했다.)
답을 지웠는데 완전일치가 20(v4) → 22(v5)로 올랐다. 규칙이 예시 암기가 아니라 일반화됐다는 신호다.
라운드 기록은 .harness-mem/goldenset-skill/rounds/rN/에 스킬·라벨·채점·심사 3건으로 남긴다.
라운드 1 — v1 불합격: 스킬이 반대로 지시했다
평균 0.613 | 40문항
완전일치 14 · 부분일치 10 · 불일치 9 · 공백일치 4 · 완전불일치 1 · 핵심일치 1 · 거짓양성 1
❌ 재현율 0.542 ❌ 정밀도 0.780 ❌ 완전+포함 45% ❌ 거짓판정 1건 ✅ 완전불일치 1건
실패가 한 방향으로 쏠렸다:
| 관계 | 문항 |
|---|---|
| 에이전트 ⊂ 사람 (덜 고름) | 16 |
| 사람 ⊂ 에이전트 | 2 |
| 동일 | 14 |
| 엇갈림 | 4 |
평균 선택 개수 사람 1.80 vs 에이전트 1.25. 에이전트가 틀린 걸 고른 게 아니라 맞는 걸 덜 골랐다.
원인은 v1 3단계의 오지시 — “모든 사실을 덮는 가장 작은 청크 조합을 고른다. 같은 사실을 담은 청크가 둘이면 더 완전한 쪽 하나만.” 사람은 근거 청크를 전부 넣었는데 스킬은 최소 집합을 지시했다. RFP는 같은 사실을 구조적으로 반복 기재하므로 (사업개요↔제안요청개요, 총괄표↔상세표 등) 이 오지시가 16문항에서 터졌다.
블라인드 라벨러 4명이 전원 같은 지점을 독립적으로 지적했다:
| 라벨러 | 지적 |
|---|---|
| 1 | 개요 청크와 본문 청크가 글자까지 같을 때 타이브레이커가 없다 |
| 2 | 동일 문장 중복이 담당 10문항에서 3회 발생, 어느 절을 우선할지 규칙 없음 |
| 4 | 요구사항 총괄표↔상세표 이중 기재는 RFP에 거의 항상 있다. 결정 불가 |
같은 실패를 4명이 같은 이유로 지목한 것은 개인 역량이 아니라 명세 결함이라는 증거다.
부수 발견 — 사람 라벨 오류: 한국한의학연구원 — 새로 구축해야 하는 업무 영역 문항.
사람은 [](검색 미검출)로 판정했으나 후보 안(::0006 IRB 업무프로세스, ::0007 동물실험계획)에
기준답변 세 사실 중 둘의 근거가 있었다. 사람이 사업범위 표만 찾다가 그게 후보 밖이라는 이유로
넘긴 것. 수정: [] → [::0006, ::0007]. 검색 미검출 4→3건, 측정 대상 35→36문항,
정답 청크 72→74개. 검증 루프가 골든셋 자체의 버그를 잡은 첫 사례다.
정답 집합이 유일하지 않은 유형도 드러났다: 도시계획위원회 발주 기관은? —
사람은 ::0225·::0235(“시행하는”), 에이전트는 ::0239(“발주하는”). 질문 문구로는 에이전트가 더 맞다.
발주기관·사업명은 계약 서식에 열 군데씩 반복돼 “전부 고르기”를 적용하면 폭주한다.
v1 → v2
| v1 | v2 | |
|---|---|---|
| 핵심 정책 | 최소 집합 | 근거를 담은 청크 전부 (R2) |
| 서식 반복 | 규칙 없음 | 상한 3개, 질문 문구에 가까운 순 (R4) |
| 사실 일부만 커버 | 규칙 없음 | 있는 것만 고르고 uncovered에 명시 (R5) |
| 표가 5조각 이상 | 규칙 없음 | 사실을 담은 조각만 (R8) |
| 출력 | — | uncovered 필드 추가 |
v2에는 “이 골든셋이 쓰이는 곳” 절을 신설 — 판단 기준선을 “이 청크만 읽고 답을 쓸 수 있나”에서 “검색이 이 청크를 가져왔다면 답변에 도움이 됐을까”로. R2와 R3(개수 채우기 금지)의 긴장에는 경계선을 명시했다 — “검색 결과로 받은 사람이 ‘이건 답이 아니네’라고 할 것 같으면 빼라.”
라운드 2 — v2 불합격: 진자가 반대로 갔다
평균 0.762 | 완전일치 16 · 핵심일치 9 · 부분일치 4 · 포함 4 · 불일치 3 · 공백일치 3 · 거짓양성 1
❌ 재현율 0.865 (0.542에서 개선) ❌ 정밀도 0.610 (0.780에서 후퇴) ❌ 완전+포함 57.5% ❌ 거짓판정 1건 ✅ 완전불일치 0건
| 사람 | 라운드1 | 라운드2 | |
|---|---|---|---|
| 문항당 평균 선택 | 1.85 | 1.25 | 2.62 |
| 2개 이상 초과선택 문항 | — | 2 | 11 |
과잉이 특정 패턴에 몰렸다:
| 문항 | 사람 | 에이전트 | 더 넣은 것 |
|---|---|---|---|
| SFR 목록에 뭐가 있나 | 2 | 11 | 개별 요구사항 상세 9건 |
| 분류별 항목 수·총합 | 1 | 5 | 표 5조각 전부 |
| CMS 위원회 개선 | 2 | 5 | 관련 문장 있는 청크들 |
원인은 R2가 “같은 사실”을 정의하지 않은 것. “SFR 목록”을 묻는데 개별 SFR 상세를 넣은 것은
중복이 아니라 다른 입도다. 거짓양성 1건도 같은 뿌리 — BIT 유형별 수량에 총계 130대 청크를
넣었다. 총계는 유형별 내역이 아니다.
v2 → v3
| v2 | v3 | |
|---|---|---|
| ”같은 사실”의 정의 | 없음 | R2-1 신설 — 총계≠내역, 목록≠상세, 상위개념≠구체값 |
| 선택 개수 | 상한 없음 | R2-2 원칙 4개 이하, 5개 이상이면 재검토 |
| 부분 커버 조건 | 느슨 | R5 엄격화 — 사실 조각 하나를 온전히 담아야 |
| 질문 입도 | 없음 | R11 신설 — 목록 질문↔목록 청크, 상세 질문↔상세 청크 |
R2-1의 판별법을 한 문장으로 못 박았다: “그 청크만 검색 결과로 받은 사람이 기준답변의 그 사실을 말할 수 있는가.”
라운드 3 — v3 불합격, 그러나 두 기준 첫 통과
평균 0.795 | 완전일치 17 · 포함 6 · 부분일치 6 · 불일치 5 · 공백일치 4 · 핵심일치 2
❌ 재현율 0.811 ❌ 정밀도 0.714 ❌ 완전+포함 67.5% (2.5%p 차) ✅ 거짓판정 0건 (처음) ✅ 완전불일치 0건
정답 유무 판정은 이제 틀리지 않는다. 두 모집단이 다르다는 것도 드러났다:
| 문항 | 사람 평균 | 에이전트 평균 | 완전일치 | |
|---|---|---|---|---|
| 어휘형 | 10 | 1.10 | 1.30 | 70% |
| 기존 | 30 | 2.10 | 2.37 | 47% |
v3가 놓친 14건은 전부 같은 유형 — 다른 절에서 같은 사실을 다시 진술한 청크. v3의 예시(“SFR 목록” vs 개별 SFR 세부 요구내용 → 다른 사실)를 에이전트가 “절이 다르면 다른 사실”로 잘못 일반화해, SFR-002가 연계 요구를 그대로 진술하는데도 뺐다.
v3 → v4 — 배제 판정의 축을 바꿨다
v3: 어느 절에 있나 → 다르면 배제
v4: 그 사실을 진술하는가 → 안 하면 배제
배제 목록에 배경·목적·필요성과 식별자만 있는 조각을 명시(v3 초과 24건의 대부분). R2-2 상한 4→6개 완화(사람 최대가 6개라 4개로는 통합연계시스템 문항을 구조적으로 못 맞춤).
라운드 4 — 수치는 최고, 심사위원 3인 전원 불통과
평균 0.843 | 재현율 0.892 · 정밀도 0.710 · 완전+포함 70% · 거짓판정 0 · 완전불일치 0
5기준 중 3개 통과. 그런데 심사에서 점수 자체가 무효 판정.
심사위원 1 (재현성) — 스킬에 시험 답이 박제됐다. v4 SKILL.md에 채점 대상 문항의 질문문과 정답 청크 번호가 그대로 들어 있었다. 라운드마다 실패를 고치며 실제 문항의 청크 번호를 예시로 박아 넣은 결과다.
| 지목 | 내용 |
|---|---|
| R2-1 예시 | 문항 87406ff0의 질문문 그대로 + 정답 청크 ::0009·::0015·::0019 |
| R4 예시 | 문항 2ab112a3의 후보 청크 번호·원문 |
| R8 예시 | 문항 376d8c5a의 정답 ::0034 |
| R7·R9 예시 | 울산 BIT 문서의 사양표 원문 |
| 출력 예시 | 실제 시험 문항의 qid·정답·기준답변 |
에이전트 하나가 reason에 **“R8 예시와 동일한 케이스”**라고 적었다 — 규칙 적용이 아니라
예시를 알아본 것. 문서에 청크 번호 15건, 실제 qid·고유명사 4건.
난이도별로 보면 성적이 무너진다:
| 정답 개수 | 문항 | 평균 | 완전+포함 |
|---|---|---|---|
| 0 (공백) | 4 | 1.000 | 100% |
| 1개 | 12 | 0.958 | 92% |
| 2개 | 15 | 0.827 | 67% |
| 3개 이상 | 9 | 0.644 | 33% |
완전일치 20건 중 18건이 정답 2개 이하, 4개 이상 문항은 완전일치 0건. “완전+포함 70%“는 빈 목록 4문항의 무상 점수로만 닿았다 — 실제 선택 36문항에서는 66.7%.
심사위원 2 (오염) — 정밀도는 에이전트가 아니라 정답지를 재고 있었다. 초과 26건을 원문 대조로 건건이 판정:
| 판정 | 건수 |
|---|---|
| 정당 (사람이 빠뜨린 정답) | 19 |
| 애매 | 4 |
| 오염 (진짜 오답) | 3 |
정당 19 + 애매 4 인정 시 보정 정밀도는 0.94. 0.717이라는 숫자는 에이전트 품질이 아니라 사람 정답지의 누락률을 재고 있다.
타 문서 오염 0건, 근거 조작 0건. 사람이 3건 냈던 R1 위반을 에이전트는 내지 않았다. 그럼에도 오염 3건은 실재한다 (200문항 환산 ~15건):
| 오염 | 성질 |
|---|---|
후보에 없는 ::0023 | ID 오기. 내용은 정확, 번호만 틀림. 자가점검표에 이미 있는 항목을 confidence ‘높음’으로 통과 |
| 제안서 평가 배점표 | R2-1이 R3·R11을 뚫음 |
| 선행 연구 목적 서술 | ”확신 보통”이라 적어놓고 그래도 넣음 |
심사위원 3 (명확성) — 문서가 오답을 지시했다.
R4 예시는
::0239를 1순위로 지목한다. 사람 정답은::0225·::0235이고::0239는 정답이 아니다. 문서가 오답을 지시했고 에이전트는 규칙을 지켜서 틀렸다.
R2-1 워크드 예시도 사람 정답과 어긋났다(::0051을 ✅로 표시). R2-1은 reason 40건 중
31회 인용된 최다 규칙인데 그 유일한 예시가 오염돼 있었다. 경계 사례 9종이 아예 없었고,
그중 doc_id 정규화는 R1이 정반대로 지시 — “정확히 같은지 확인하라”고 했는데
이 프로젝트는 직접 비교 시 매칭 0건이 되는 함정이 기록돼 있다.
사람 라벨의 비일관성 — 일치율에 천장이 있다
::0045(SFR-02 GIS)를 한 문항에서는 정답에 넣고 다른 문항에서는 뺐다.
재현율 0.90 / 정밀도 0.80이 도달 불가능한 목표일 수 있다. 남은 불일치가 에이전트 오류인지
골든셋 편차인지는 심사위원 2(오염 위험)가 판정한다. 수치가 근접했는데도 못 넘으면
기준을 낮추는 게 아니라 잔여 불일치를 건건이 심사하는 쪽으로 간다.
v4 → v5 — 패치가 아니라 재작성
| v4 | v5 | |
|---|---|---|
| 답 누출 | 청크번호 15건·qid 4건 | 0건 |
| 규칙 충돌 | 우선순위 없음 | R1 > R11 > R2-1 > R2 > R8 > R5 > R10 명시 |
| 사실 분해 입도 | 규칙 없음 (문서 최대 결함) | 1단계에 신설 — 열거는 한 조각, 5조각 초과는 과분해 |
| 배경·목적 배제 | 무조건 | 조건부 — 질문이 목적·효과를 물으면 그 절이 정답 층 |
| 개수 상한 | 6개 (완화했다가 폭주) | 하드 4개 + 과분해 재검토 지시 |
confidence | 재량 (35/40이 “높음”, 노이즈) | 기계 규칙 — uncovered 있으면 낮음, note 있으면 높음 금지 |
| 경계 사례 | 9종 누락 | 동일성 주장·열거형·참조 안내문·doc_id 정규화 등 추가 |
| 탐색비교 | 한 줄 | gold_by_doc 스키마 + 문서별 상한·미커버 |
핵심 구조 변경: v4는 R2가 만능 열쇠로 배제 규칙을 뚫었다(오염 3건 중 2건). v5는 우선순위로 R2가 R11·R2-1을 무효화하지 못하게 막았다.
200문항 착수 전 반드시 고칠 것 (라운드 3 라벨러 발견 → 수정 완료)
블라인드 입력에 선행_턴 필드가 없었다. rerank_pool.jsonl 자체에 누락.
이번 40문항은 후속이 4개뿐이고 expected가 자기완결적이라 문제가 안 됐지만,
200문항에는 후속이 30개라 대명사 해소가 불가능해진다. 풀 생성 코드에서 수정됨(아래 버그 목록).
부수 성과 — 검증 루프가 골든셋과 도구의 버그를 잡았다
사람 라벨 오류 2건 (원문 대조로 확정, 수정 완료)
| 문항 | 오류 | 수정 |
|---|---|---|
| 한의학연구원 업무영역 | 후보 안에 근거가 있는데 []로 판정 | → [::0006, ::0007] |
| DDoS CC인증 등급 | ::0074는 방화벽 행(30Gbps/300,000)인데 정답에 포함 | → 제거 |
채점기 결함 1건 (자작 코드)
실제: 66/93 = 0.7097
채점기: 66/92 = 0.7174 ← 후보 밖 id를 분모에서 조용히 제외
오염을 재야 할 지표가 오염을 면제해주고 있었다. 5라운드 동안 몰랐다. 수정 완료.
코드 버그 4건 (200문항 착수 뒤에 터졌으면 55문항이 통째로 망가졌다)
| 버그 | 영향 |
|---|---|
탐색비교가 검색 대상 유형에서 제외 | 25문항 풀 생성 안 됨 |
target = target[0] (다중 문서 절단) | 탐색비교 두 번째 문서의 정답이 후보에서 누락 |
선행_턴 필드 부재 | 후속 30문항 대명사 해소 불가 |
| 비교 질문에서 한 문서가 후보 독식 | 탐색비교 4문항 전부에서 한쪽 근거가 후보 밖으로 밀림 (후보 37개 중 31개를 한 문서가 차지, 상대 문서는 2개) |
→ f610f2f · 1406222, 462테스트 통과.
5. 배운 것
명세 결함은 다수가 같은 곳에서 넘어질 때 드러난다. 라벨러 4명이 독립적으로 같은 지점을 지적한 것이 결정적 신호였다. 한 명만 틀렸으면 그 에이전트를 의심했을 것이다.
실패의 방향을 봐야 원인이 보인다. 재현율 0.542 / 정밀도 0.780이라는 비대칭이 “에이전트가 못한다”가 아니라 “지시가 반대였다”를 가리켰다. 평균 점수만 봤으면 못 잡았다.
검증 루프는 양방향이다. 사람 라벨을 정답지로 놓고 에이전트를 재는 구조였는데, 실제로는 사람 라벨의 오류가 먼저 나왔다. 정답지도 가설이다.
규칙을 반전하면 진자가 반대편으로 간다. v1의 “최소 집합”을 v2에서 “전부 고르기”로 뒤집었더니 재현율 0.54→0.87, 정밀도 0.78→0.61. 한쪽 실패를 보고 규칙을 뒤집으면 반대쪽에서 같은 크기로 터진다. 경계를 함께 정의해야 한다 — v3은 반전이 아니라 “전부 고르되, 같은 사실이란 무엇인가”를 정의하는 방향으로 갔다.
추상적 지시는 실행되지 않는다. “관련 있는 것만”은 지시가 아니다. R2-1이 효과를 낸다면 그건 판별을 한 문장의 테스트로 환원했기 때문이다 — “그 청크만 보고 이 사실을 말할 수 있는가.”
실패를 보고 규칙을 고치면 답을 베끼게 된다. 라운드마다 틀린 문항을 열어보고 규칙을 추가했더니, 그 규칙의 예시가 그 문항의 정답 청크 번호가 됐다. 0.613 → 0.843의 상당 부분이 개선이 아니라 누출이었다. 예시는 반드시 익명화하고, 실제 데이터의 식별자를 문서에 넣지 마라.
규칙에 우선순위가 없으면 규칙이 아니다. v4는 배제 규칙 4개와 포함 규칙 3개가 서로를 무효화할 수 있는 상태였고, 강한 문장 하나(R2)가 만능 열쇠로 쓰였다. 충돌은 예외 조항이 아니라 순서로 해결해야 한다.
지표가 자기가 재야 할 것을 면제해주지 않는지 확인하라. 오염을 측정하는 채점기가 오염 1건을 분모에서 빼고 있었다. 내가 만든 코드였고 5라운드 동안 몰랐다.
검증 세트는 소모품이다. 같은 40문항으로 여러 번 돌면서 답을 봤으니 이제 이 세트로는 아무것도 증명할 수 없다. 처음부터 홀드아웃을 떼어놨어야 했다.
전문 사본 동기화는 실패한다. 스킬 전문을 볼트로 복사해 두는 방식은 v5에서 정지해 정본(v8)과 세 버전 어긋났다. 살아 움직이는 문서는 요지 + 정본 경로 포인터로 가리키는 게 낫다.
관련
검색 실험 골든셋 40문항 · 검색 실험 설계 (4모델·BM25) · 검색 실험 결과 (4모델·BM25) · 인덱스 데이터 손상 진단