# 기준을 못 박고, 그 기준을 검수받다 — AI 결과물 검수 스터디 1주차

- 작성자: [Arin](https://community.clauders.ai/member/imported-member-zKTOlEbpYm)
- 공간: [에이전트 / 노코드 자동화](https://community.clauders.ai/automation)
- 게시: 2026-08-03
- 연재: [AI 결과물 검수 시스템](https://community.clauders.ai/series/ai-output-verification-systems) 6/6편
- 태그: #AI결과물검수
- 주소: https://community.clauders.ai/automation/post/%EA%B8%B0%EC%A4%80%EC%9D%84-%EB%AA%BB-%EB%B0%95%EA%B3%A0-%EA%B7%B8-%EA%B8%B0%EC%A4%80%EC%9D%84-%EA%B2%80%EC%88%98%EB%B0%9B%EB%8B%A4-ai-%EA%B2%B0%EA%B3%BC%EB%AC%BC-%EA%B2%80%EC%88%98-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%A3%BC%EC%B0%A8-cb982201-dbcf-8b97-a49c-61c62994215c

---

### 사용한 도구

좌석

도구

역할

producer

Claude Code

요약 생성 · 골드셋 설계 · 검사기 구현

**cold-read reviewer**

Codex (`gpt-5.6-sol`)

독립 검수 — API 키 필요, free 플랜은 거부됨

결정론 게이트

자체 Python (`extraction_core`, `coldread_request.py`)

L0~L3 검사 · 의뢰문 생성

핵심은 **producer 좌석과 reviewer 좌석을 다른 모델로 물리적으로 분리**한 것입니다. 같은 세션 안에서 "이제 검수 모드로 봐줘"는 검수가 아니라 자기 확인입니다.

### 1) ingest — "넣었다"와 "검수 가능하게 넣었다"는 다르다

요약만 있으면 검증할 수 없고, 원문만 있으면 검증할 대상이 없습니다. **결과물↔근거를 한 쌍으로** 넣어야 합니다.

단계

산출물

규모

쌍이 되는 근거

수집

`corpus.json`

997편

제목·초록 (arXiv verbatim)

추출

`fulltext/*.txt`

116편

PDF 전문 — 대조 원문

요약

`40-drafts/`

61편

Evidence 절 + 좌표(p.N)

정본

`wiki/notes/`

26편

승격 게이트 통과분만

초록만으로는 본문 표의 수치를 검증할 수 없어서 전문 116편을 따로 확보했습니다. 요약이 Table 3을 인용했는데 초록에 그 표가 없으면 검사기가 "원문에 없다"고 **잘못** 판정하니까요.

### 2) 할루시네이션 3종 → 검사 계층에 판정 권한 배분

"틀릴 수 있다"로는 아무것도 못 만듭니다. 유형을 먼저 나누고 층별로 권한을 달리 줬습니다.

유형

무엇이 틀리나

계층

판정 권한

거짓·오출처

없는 내용 생성 / 다른 출처에 귀속

L1 근거 실재

**거부 가능 — 유일**

누락

참이지만 핵심이 빠져 결론이 기움

L3 커버율

선택적

부실

근거는 있으나 주장 강도가 근거를 초과

L2 의미

**0 — 경고만**

L2에 거부 권한을 주지 않은 이유는 실측 때문입니다. 문자 유사도로는 **충실한 의역(0.39)과 왜곡(0.39)이 겹칩니다.** 권한을 주면 정상 의역을 대량 거부합니다. 이 **"잡을 수 없으면 물러난다"** 원칙이 1주차에만 다섯 번 반복 적용됐습니다(커버율·STR·부재 문항·L2·R-002).

### 3) 판정 3분류 — FAIL을 "대응이 갈리는 단위"로

FAIL이 전부 한 등급이라 매번 원문을 다시 열어야 했습니다. 고치는 방법이 정반대인데도요.

태그

의미

대응

`CONTRADICTED`

원문에 대응 값이 있으나 형태가 다르다

내용 수정

`INSUFFICIENT`

원문에 근거 자체가 없다

근거 보강·주장 하향

`STRUCTURAL`

형식 미비 — 검증할 주장이 아직 없다

산출물 완성

`UNVERIFIABLE`

원문 미확보 — **산출물 결함이 아니다**

코퍼스 확보

```
# 실측 — 원문 100-200 이 100200 으로 병합 추출된 사고 파일
[CONTRADICTED] Evidence 수치 원문 부재: '200' — 원문 '100200'(p.2)에 병합, 추출 손상
[INSUFFICIENT]  Evidence 수치 원문 부재: '777' ← 발명 수치
```

**판별식을 세 번 갈아엎었습니다.** "근방에 비슷한 수치가 있으면 CONTRADICTED"로 잡았더니 **발명 수치 999가 원문의 1000 때문에 뒤집혔습니다.** 지어낸 값을 "원문과 다를 뿐"으로 격하시키는 — 가장 위험한 오분류입니다. 최종적으로 L0 추출 검사가 신고한 병합 후보에만 한정했습니다. L0는 이미 실측으로 오탐을 102편 → 2편까지 좁혀둔 코드라, **새로 만들지 않고 그대로 재사용**했습니다(이중 구현 금지).

### 4) 골드 Eval Set — 18문항을 무작위가 아니라 층화로

전부 "있는 것"만 물으면 적중률이 부풀려집니다. 층마다 다른 걸 측정하게 설계했습니다.

층

문항

무엇을 재는가

concept

6

검수 설계에 되먹여진 방법론

axis

5

방법론 5축 대표 — 카테고리 편향 방지

boundary

4

혼동 가능한 유사 주제쌍 — 변별력

**absent**

3

위키에 **없는** 주제 — 무반환이 정답

**부재 층이 핵심 발견을 냈습니다.** 있는 것만 물었다면 "80% 적중"으로 끝났을 겁니다. 부재 문항을 넣자 **3/3 전건 실패** — 검색기는 답이 없어도 항상 무언가를 1위로 반환합니다. RAG에서 이게 할루시네이션 입구입니다.

차단 임계를 걸까 검토했는데, 걸면 안 됐습니다. 구조적 이유가 있었습니다.

python

```
# wiki_query.rerank()
rrf_norm = rrf_scores[i] / max_rrf   # 질의 '내부' 최대값으로 정규화
# → 1위 점수는 언제나 1.0. 점수에 "답이 있는가"의 정보가 애초에 없다.
```

대안(렉시컬 겹침)도 실측했습니다. 임계 0.18에서 부재 2/3 차단·실재 4/15 손실, 0.31에서 부재 3/3 차단·**실재 10/15(67%) 손실**. 부재 질문도 어휘는 공유하기 때문입니다 — 없는 건 _그 조합_이지 어휘가 아닙니다. **측정은 유지하고 차단은 하지 않기로** 했고, 게이트 임계는 실재 15문항만으로 재고했습니다. 대신 매 실행마다 한계 경고를 출력합니다. 리포트에만 묻히면 "측정했다"가 "해결했다"로 오독되니까요.

### 5) 검수 의뢰문을 도구로 만들기 (프롬프트 전문)

`quality_gates.md`의 cold-read 계약은 검수 좌석에 **①산출물 ②공개 스펙**만 주고 저자 의도·세션 히스토리 주입을 금지합니다. 문제는 **손으로 프롬프트를 쓰면 제 관점이 반드시 샌다**는 것입니다. 그래서 의뢰문을 결정론으로 조립하는 도구를 만들었습니다.

markdown

```
당신은 아래 산출물(검색 평가용 골드 Eval Set)의 냉독(cold-read) 검수자입니다.

[전제]
- 당신은 이 산출물의 저자가 아닙니다. 저자의 의도·작업 이력·기대하는 답을
  일절 전달받지 않습니다.
- 판정은 오직 아래 '공개 스펙'과 첨부 원문만으로 내립니다.
- 스펙에 임계가 정의되지 않은 항목은 판정하지 말고 **'보류'로 표기**하십시오.

[공개 스펙]
R1. 정답 노트는 질문에 대한 답을 실제로 담아야 한다
    (expected_evidence 문자열이 노트 '본문'에 존재해야 함)
R2. 근거는 질문이 묻는 지표와 일치해야 한다
    (precision을 물으며 recall 수치를 근거로 달지 않는다)
R3. 제3자가 첨부만으로 재현·감사할 수 있어야 한다
R4. 단일 정답 — 다른 노트가 '같은 층위의 답'을 담으면 위반
    (관련 주제를 다루는 것만으로는 위반이 아니다)
R5. 층 내 중복 0 — 한 층에서 같은 노트가 정답으로 2회 이상 쓰이면 위반

[검수 대상]
```
{골드셋 18문항 전문 + 위키 전 노트 본문이 여기 자동 삽입}
```

[출력 형식]
규칙 번호별로 — 위반 여부 / 근거가 된 원문 구절 / 확신도(high·medium·low).
임계가 없어 판정 불가한 경우 '보류'와 사유.
```

python

```
# coldread_request.py — 누출 검사, 걸리면 생성 자체를 거부(fail-closed)
_LEAK = "설계 근거 | 기대하는 답 | 정답은 …"

$ coldread_request.py --target summaries
cold-read 계약 위반 — 의뢰문에 저자 관점이 섞였다: '설계 근거'
```

**그런데 이게 오탐이었습니다.** 논문 요약 본문에 나온 "설계 근거"(그 _논문의_ 설계 근거)를 잡은 겁니다. 검사가 템플릿과 검수 대상을 구분하지 못했습니다. 산출물 블록을 검사에서 제외하도록 고쳤습니다. **검수 장치 자신도 검수 대상**이라는 걸 여기서 배웠습니다 — 안 고쳤으면 그 산출물은 영원히 검수 불가였습니다.

### 6) cold-read 5라운드 — 7 → 3 → 3 → 3 → 2

R

지적

조치

1

근거 3건 오류 · R4/R5 판정 갈림

근거 수정 · **스펙에 임계 없어 보류**

2

"기대 노트만으론 재현·감사 불가"(high)

위키 **전 노트** 첨부 (29K→47K자)

3

↑ 그러자 **안 보이던 R4 3건**이 드러남

질문을 노트 고유 세부로 좁힘

4

질문이 정답의 전제를 왜곡(2건)

문구 수정 · 절단 상한 2400→8000

5

R1·R2·R3·R5 위반 없음 · R4 2건(medium·low)

경계 사례를 고유 수치로 종결

**2차 지적이 3차 발견을 낳았습니다.** 기대 노트만 첨부했을 땐 "다른 노트에도 답이 있는가"를 원리적으로 확인할 수 없었습니다. 전체를 넣자 κ 0.519가 3개 노트에 교차참조돼 있어 그 수치를 묻는 질문은 정답이 셋이었다는 게 드러났습니다.

1차에서 **보류**한 R4·R5는 스펙에 임계를 명시한 뒤 재판정해 종결했습니다. 결과는 둘 다 위반 확인 — concept 층 문항 6개에 고유 노트가 4개뿐이었고(`deer-benchmark` 2회, `selfcheckgpt` 2회), "기초 LLM만으로 충분한가"에는 다른 논문도 같은 층위로 답하고 있었습니다. **감으로 고쳤다면 3~5차에서 나온 6건은 영영 못 봤을 겁니다.**

### 7) Loop — 고친 것이 다음 세션에 자동으로 실리게

검수로 규칙을 얻어도 다음 세션이 안 읽으면 무의미합니다.

```
1 판정      게이트 FAIL·REJECTED
2 기록 ★    append-only 원장 — 사유를 그대로, 재가공 금지
3 집계 ★    유형별 정규화 — 수치만 다른 건 한 유형으로
4 승격      ★ 사람이 규칙 확정 (자동 승격 없음)
5 주입 ★    세션 진입점 3곳 · 40줄 상한
```

이번 주 실측: 원장 108건 → 승격 규칙 4건 → 주입 3곳(`phase_contracts §5` / `coldread_request.py` 공개 스펙 / `session-memory.md`).

**4번만 사람이 합니다.** 게이트 FAIL 대부분은 그 산출물 하나의 문제이지 절차 결함이 아닙니다. 절차 결함은 반복으로만 드러나고 그 판별은 사람 몫입니다. 자동 승격이었다면 이번에 원장을 독점한 **커버율 WARN 50건(98%)** 이 "[P1] 승격 후보"로 포장돼 규칙이 됐을 겁니다. 실제로는 지표 결함이었습니다 — 초록은 영어, 요약은 한국어라 `knowledge`↔`지식`이 원리적으로 안 겹치는, 임계 조정으로 교정 불가능한 문제였습니다.

> 📸 **캡처 첨부 위치** — 발표자료 05p(판정 3분류 실측 출력), 08p(부재 문항 임계 손익표), 09p(fail-closed 거부 화면), 13p(Loop 배선도)

### 숫자

지표

값

1위 적중 (실재 15문항)

**80.0% → 86.7%**

top-5 recall

83.3%

게이트 임계

**0.85 확정** (0.85 통과 · 0.90 실패)

부재 문항

0/3 — 알려진 한계

검수가 잡은 결함

11건

**적중률이 오른 건 검색기를 한 줄도 안 고쳤는데 나온 결과입니다.** 기존 미스의 일부는 검색기가 아니라 골드셋 자신의 결함이었습니다. 정답이 둘이었던 문항은 검색기가 무엇을 반환해도 절반은 틀린 것으로 집계됐으니까요. 지표를 훼손해서 숫자를 올린 게 아니라, **기준이 정합해지자 지표가 제 값을 찾았습니다.**

### 배운 점 네 가지

**01. 자기 산출물은 자기가 못 본다.** 골드셋을 만든 뒤 여러 번 검증했는데도, precision을 물으면서 recall 수치를 근거로 단 문항은 못 봤습니다. 노트 **바로 다음 줄**에 맞는 수치가 있었는데도요. `producer ≠ evaluator`는 규범이 아니라 실측으로 확인된 필요였습니다.

**02. 검수 입력이 검수 품질을 결정한다.** 기대 노트만 줬을 때와 전체를 줬을 때 발견되는 결함이 달랐습니다. "무엇을 보여줄 것인가"가 이미 검수 설계의 일부입니다.

**03. 잡을 수 없으면 물러난다.** 부재 문항, L2 의미 채널, R-002 게이트 확장 — 셋 다 측정은 하되 차단하지 않기로 했습니다. **과차단이 미탐지보다 나쁠 수 있습니다.**

**04. 확신 낮은 지적은 기각도 수용도 아닌 '보류'가 답일 수 있다.** 기준이 없는 상태에서 고치면 그건 기준 없이 고치는 겁니다. 스펙을 먼저 정의하니 같은 지적이 확정 판정으로 바뀌었습니다.

### 시행착오

- **의뢰문 생성기가 자기 자신 때문에 막혔다** — 위 5)의 오탐. 검사 대상은 "내가 쓴 지시문"이지 "검수 대상 본문"이 아닙니다.
- **채점기 크래시** — 부재 문항(`null`)을 상정하지 않아 터졌습니다. 경로를 신설했습니다.
- **재현성 결손 1건(정직하게)** — 반입 쿼리 12개 중 4개 문자열이 미기록이었습니다. git 차집합으로 2개는 복원했지만 나머지 2개는 부분 일치(20/29·17/33)에 그쳐 **추정 복원을 거부**했습니다. 재현성은 데이터가 아니라 **기록 설계**의 문제입니다 — 스키마에 출처 필드가 없으면 역산도 불가능합니다.
- **기각도 무해하지 않다** — Codex의 `None` vs `null` 지적은 사실이 아니었지만(저장 파일은 실제 `null`), 검수 좌석이 헛것을 보게 만든 건 의뢰문 렌더 잘못이라 생성기를 고쳤습니다.

**가장 값진 순간**은 이거였습니다. 채점기의 fail-closed 검사가 **제가 쓴 검증 스크립트의 오탐을 잡았습니다.** 저는 파일 전체를 검색해서 "위반 0"이라고 했는데, 채점기는 본문만 봐서 2건을 거부했습니다. 그 2건은 문구가 frontmatter 제목에만 있었습니다. 골드셋을 만드는 과정에서 골드셋의 게이트가 유효하다는 게 증명된 셈입니다.

### 도움이 필요한 부분

두 가지 논의를 청합니다.

1. **골드셋 층화 표본을 어떻게 설계하시는지.** 18문항 4층은 제 임의 설계입니다. 층 비율이나 문항 수를 정하는 더 나은 근거가 있는지 궁금합니다.
2. **RAG의 abstention(기권)을 어떻게 다루시는지.** 부재 문항 0/3이 남은 한계인데, 점수 정규화 구조상 임계로는 못 막습니다.

그리고 AI 검수 체계를 보실 때 이 질문을 한 번 던져보시길 권합니다 — **"그 기준점은 누가 검수했습니까?"**

### 앞으로의 계획

2주차는 판정 출력 계약(`score` · `PASS/FAIL/HUMAN_REVIEW` · JSON), 인용·수치 검증(단위 정규화와 재계산 분리), 리뷰 루브릭, 지식베이스 4칸 구조입니다. 기준선이 섰으니 다음 주부터는 **정량 비교**가 가능해집니다.

남긴 한계도 적어둡니다. 부재 문항 0/3(측정만), R-002 따옴표 검사가 Evidence 절만 봄(60편 269건 무검사 — 지금 켜면 일괄 FAIL이라 전환 기간 설계 후 적용), 표본은 워크스페이스 1개·노트 26편.

## 도움 받은 글

- 클로더즈 **AI 결과물 검수 스터디** 1~4주 커리큘럼
- 산출물 워크스페이스: `ontology-methodology` / 검수 엔진: `verifier-kit`
- 본문의 모든 수치는 워크스페이스 실측값입니다.
