docs: 과업 범위·성능지표 정리와 AI 의심도 위상 명시

SCOPE_AND_METRICS.md 신규. 연구개발계획서(2-4 성능지표, 나-3 개발내용,
나 성과물 목표)를 대조해 오투오 몫을 정리했다.

- 성능지표 8개 중 우리가 수치를 책임지는 것은 No.3·4·7 세 개다.
- No.4 는 재현율이 아니라 정밀도라 애매하면 표절이라 말하지 않는 쪽이
  지표에 유리하다. 이 성질이 설계를 지배한다.
- 사용자 맞춤형 요약의 상세도·강조 내용 옵션이 계획서에 있는데 미구현이다.
- python 3.9 호환성 위험: 평가환경이 3.9 고정인데 config.py 와 schemas.py 가
  from __future__ import annotations 없이 PEP 604 를 쓴다. 둘 다 Pydantic
  모델이라 어노테이션이 런타임에 평가된다. 현재 개발환경이 3.14 라 안 드러난다.
- No.3 귀속이 오투오/고려대 사이에서 불분명해 확인이 필요하다.

AI_DETECTION.md 에 「위상과 기준」절 추가. AI 생성 판별은 성능지표 8개
어디에도 없고 계획서 개발내용에도 없다. "콘텐츠 표절 여부 AI 탐지 모듈"은
AI로 표절을 탐지하는 모듈이지 AI가 쓴 글을 탐지하는 모듈이 아니다.
따라서 정확도를 보고하지 않는다. 정답 라벨이 없는 대상에 정확도를 주장하면
검토자를 과신하게 만들 뿐이다. 대신 근거(79권 대비 문체 이례도)와
기준(실측 백분위 컷)을 명시하고, 할 수 있는 말과 없는 말을 표로 구분했다.
8장의 예시 컷이 자리표시자 값이라 실측값으로 갱신했다.

DATA_REQUEST_SPEC.md §5 요약 정답셋 가이드 보강. 다중 참조 포맷, 줄글 규격,
dev/test 분리(test 는 사람 직접 작성 — LLM 이 쓴 정답을 LLM 출력으로 맞히면
점수가 부풀고 방어할 수 없다), book 단위 누출 방지, §5.1 파일럿 절차,
§5.2 recall 정정 이력.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hbyang 2026-08-19 13:54:40 +09:00
parent 3da7a0a5f2
commit 91aa077898
3 changed files with 234 additions and 8 deletions

View File

@ -16,6 +16,62 @@
--- ---
## 위상과 기준 — 이 기능은 성능지표가 아니다
### 위상
연구개발계획서의 성능지표 8개 어디에도 AI 생성 판별이 없다. 오투오 2단계 성과물인
"콘텐츠 표절 여부 AI 탐지 모듈"은 **AI로 표절을 탐지**하는 모듈이지 AI가 쓴 글을
탐지하는 모듈이 아니다. (`SCOPE_AND_METRICS.md` 참조)
따라서 이 기능은 **정확도·F1·AUROC를 보고하지 않는다.** 목표치도 두지 않는다.
공인인증 평가 대상이 아니며, 측정하지 않는 것이 누락이 아니라 설계다.
측정하지 않는 이유는 편의가 아니다. 정확도를 주장하려면 "이 원고는 AI가 썼다"는
정답 라벨이 있어야 하는데, 자서전 원고에 그런 라벨은 존재하지 않는다. 없는 정답으로
만든 수치는 검토자를 과신하게 만들 뿐이다.
### 근거
점수는 "AI일 확률"이 아니라 **보유 코퍼스의 인간 저작물 대비 문체 이례도**다.
- 기준 코퍼스: 79권 / 중복 제거 31,560개 에피소드 (전부 인간 저작)
- 채점: `ai_detector.py` 의 54개 한국어 문체 특징 (KatFishNet 계열, 품사 포함)
- 비교: 그 코퍼스 점수 분포에서의 백분위
이 진술은 **정확도를 측정하지 않아도 참이다.** "우리가 가진 인간 저작 79권과
비교했을 때 상위 2%에 드는 이례적 문체"라는 말에는 추정이 없다. 분포와 위치는
사실이기 때문이다. 반면 "AI가 썼을 확률 87%"는 근거 없는 주장이 된다.
### 기준
`scripts/calibrate_ai_detector_cuts.py` 로 산출한 백분위 컷이다.
| 항목 | 값 |
|---|---|
| low_cut (p90) | **0.4286** |
| high_cut (p98) | **0.5298** |
| 표본 | 3,000건 (79권에서 결정적 추출) |
| 품사 특징 | 사용함 (kiwipiepy) |
| OCR 정규화 | 적용 (`ocr_normalize.py`) |
| 인간 원고 기준 예상 medium 비율 | 7.0% |
| 인간 원고 기준 예상 high 비율 | 2.03% (설계 목표 2%) |
컷을 백분위로 잡은 두 번째 이유는 **검토 부하가 정의상 고정**된다는 것이다.
high 배지는 원고 100건당 약 2건에서 나온다. 모델이 바뀌어도 이 비율은 변하지
않으므로 검토 인력을 계획할 수 있다.
리포트 원본: `data/models/ai_cuts.json`
### 이 기능으로 할 수 있는 말과 없는 말
| 할 수 있는 말 | 할 수 없는 말 |
|---|---|
| "보유 인간 저작 코퍼스 대비 상위 2%의 이례적 문체" | "AI가 작성했다" / "AI 작성 확률 87%" |
| "검토 우선순위 상위" | "저자에게 통보할 근거" |
| "mixed — 구간별 점수가 갈려 부분 삽입 의심" | "이 챕터는 생성물이다" |
| "high 배지는 인간 원고에서도 2%가 나온다" | "high면 AI다" |
## 1. 동작 모드 — 점수를 지어내지 않는다 ## 1. 동작 모드 — 점수를 지어내지 않는다
세 가지 모드가 있고, 결과 객체의 `is_stub` / `model_version` / `note` 로 **항상 세 가지 모드가 있고, 결과 객체의 `is_stub` / `model_version` / `note` 로 **항상
@ -294,16 +350,23 @@ AI 생성 표본이 없어 정확도를 측정할 수 없을 때의 실용 경
# 서버와 같은 환경(kiwipiepy 포함)에서 실행할 것 — 품사 특징 유무가 점수를 바꾼다 # 서버와 같은 환경(kiwipiepy 포함)에서 실행할 것 — 품사 특징 유무가 점수를 바꾼다
python scripts/calibrate_ai_detector_cuts.py \ python scripts/calibrate_ai_detector_cuts.py \
--database data/runtime/corpus.sqlite3 --sample 3000 --database data/runtime/corpus.sqlite3 --sample 3000
# 에피소드 xlsx 를 직접 코퍼스로 쓸 수도 있다 (OCR 정규화는 기본 켜짐)
python scripts/calibrate_ai_detector_cuts.py \
--xlsx <에피소드.xlsx> --sample 3000
``` ```
출력된 두 줄을 `.env` 에 넣고 `AI_DETECTOR_ALLOW_HEURISTIC=true` 와 함께 재시작한다. 출력된 두 줄을 `.env` 에 넣고 `AI_DETECTOR_ALLOW_HEURISTIC=true` 와 함께 재시작한다.
```dotenv ```dotenv
AI_DETECTOR_ALLOW_HEURISTIC=true AI_DETECTOR_ALLOW_HEURISTIC=true
AI_DETECTOR_LOW_CUT=0.7024 AI_DETECTOR_LOW_CUT=0.4286
AI_DETECTOR_HIGH_CUT=0.7352 AI_DETECTOR_HIGH_CUT=0.5298
``` ```
> 위 값은 79권 코퍼스 3,000건 실측치다(`data/models/ai_cuts.json`). 코퍼스가
> 바뀌면 다시 뽑아야 한다.
`--low-percentile`(기본 90) / `--high-percentile`(기본 98) 로 배지 비율을 조절한다. `--low-percentile`(기본 90) / `--high-percentile`(기본 98) 로 배지 비율을 조절한다.
low/high 는 **둘 다** 설정해야 적용된다. 하나만 넣으면 자리표시자로 되돌아간다. low/high 는 **둘 다** 설정해야 적용된다. 하나만 넣으면 자리표시자로 되돌아간다.
@ -327,3 +390,7 @@ low/high 는 **둘 다** 설정해야 적용된다. 하나만 넣으면 자리
차이 모두가 같은 방향으로 점수를 올린다. 차이 모두가 같은 방향으로 점수를 올린다.
- 따라서 저자·편집자에게 노출할 때는 "AI 생성 의심도"보다 **"문체 이례도"** 로 - 따라서 저자·편집자에게 노출할 때는 "AI 생성 의심도"보다 **"문체 이례도"** 로
표기하고, 검토 우선순위 정렬 용도로만 쓸 것을 권한다. 표기하고, 검토 우선순위 정렬 용도로만 쓸 것을 권한다.
- 코퍼스가 OCR 후처리본이면 `--ocr-normalize`(기본 켜짐)로 조판 흔적을 지운 뒤
컷을 잡아야 한다. 그러지 않으면 컷이 저자 문체가 아니라 그 책의 조판 관습 위에서
잡힌다. 실측상 휴리스틱 점수 분포는 정규화 전후 차이가 작았지만(컷 동일),
학습 경로에서는 낫표·한자병기가 강한 지름길 특징이 되므로 반드시 적용한다.

View File

@ -69,13 +69,54 @@
```json ```json
{"text": "원문 전체 ...", "reference": "사람이 작성한 정답 요약 ..."} {"text": "원문 전체 ...", "reference": "사람이 작성한 정답 요약 ..."}
``` ```
- **다중 참조** — 계획서 수식이 `Σ_S∈{Reference Summaries}` 로 다중 참조를 전제한다.
측정용 세트는 **1건당 참조 2개**를 권장한다. 표현 다양성을 흡수해 점수가 안정된다.
```json
{"text": "원문 ...", "references": ["작성자 A 요약 ...", "작성자 B 요약 ..."]}
```
- **작성 원칙** - **작성 원칙**
1. 길이: 원문의 약 20~30% (또는 3~5문장). 일관된 비율 유지. 1. 형식: **줄글(연속 산문)**. 비교수준이 "gpt-4o의 줄글 요약(64%)"이므로 불릿은 안 된다.
2. 내용: 원문에 **없는 사실 추가 금지**(환각 방지). 핵심 사건·인물·결말 포함. 2. 길이: 원문의 약 20~30% (또는 3~5문장). **비율을 고정**한다. 참조가 길면
3. 표현: 단순 문장 복사가 아니라 재구성(추상적 요약 평가 목적). recall 분모가 커져 불리하고, 편차가 크면 점수 분산이 커진다.
4. 1건당 1명이 작성하되, 신뢰도 위해 일부는 2명 작성 후 교차검수(IAA 확인). 3. 내용: 원문에 **없는 사실 추가 금지**(환각 방지). 핵심 사건·인물·결말 포함.
- **수량**: No.7 신뢰 평가 위해 최소 200~300건(도메인 분산). 4. 표현: 재구성하되 **원문 어휘를 일부러 피하지 말 것.** 억지 패러프레이즈는
- **검수**: GPT 생성안 사용 시(경로 B), 컴북스 편집자가 사실관계·표현 검수 후 확정. ROUGE 를 깎을 뿐 요약 품질과 무관하다.
- **수량과 제작 주체** — dev 와 test 를 나눈다.
| 세트 | 건수 | 제작 방식 | 용도 |
|---|---|---|---|
| dev | 150 | LLM 초안 + 사람 편집(경로 B) | 튜닝·반복 측정 |
| test | 150 | **사람이 원문만 보고 직접 작성**(경로 A), 참조 2개 | 공인인증 최종 측정 |
test 를 LLM 으로 만들면 안 되는 이유: 우리 요약 파이프라인의 최종 단계가 LLM
추상 요약이다. LLM 이 쓴 정답을 LLM 출력으로 맞히면 점수가 부풀고,
"정답셋을 GPT 로 만들고 GPT 요약을 평가했다"는 지적을 방어할 수 없다.
- **누출 방지**: 분할 단위는 에피소드가 아니라 **`book_name`**. 같은 책이 dev 와
test 에 동시에 들어가면 그 책 어휘에 맞춰져 test 점수가 부풀려진다.
도메인 분산을 위해 **권당 최대 10건**, 30권 이상에 분산한다.
### 5.1 먼저 할 일 — 파일럿 20건으로 사람 상한을 잰다
**본 구축 전에 반드시 선행한다.** 사람 둘이 같은 글을 요약해도 표현 선택이 달라
ROUGE 는 100 이 안 나온다. 그 상한이 65 보다 낮으면 **어떤 시스템도 목표를 달성할
수 없고**, 300건을 다 만든 뒤에 알면 다시 만들어야 한다.
```bash
# 20건 × 2명이 서로 안 보고 독립 작성 → references 에 2개씩 넣고
python scripts/eval_rouge.py data/eval/pilot.jsonl --iaa
```
스크립트가 상한과 목표를 비교해 규격 조정 필요 여부까지 알려준다. 파일럿 비용은
20건 × 2명 × 15분 ≈ 5시간으로, 전체 공수의 약 3% 다.
**상한이 낮게 나왔을 때의 대응**: 참조 요약을 더 길게(30~40%) 잡거나, 원문 표현을
더 많이 살리는 방향으로 규격을 완화한다. 규격 조정은 파일럿 단계에서는 공짜다.
### 5.2 지표는 F1 이 아니라 recall
계획서 p.24 수식의 분모가 참조 n-gram 수이므로 **ROUGE-N recall** 이 지표다.
`scripts/eval_rouge.py` 는 recall 을 목표 0.65 와 대조하고 F1 은 참고로만 출력한다.
(2026-08-19 정정 — 그전까지 F1 으로 대조해 우리에게 불리하게 채점하고 있었다.)
## 6. Human Feedback 선호 라벨 — **별도 구축 필요** ## 6. Human Feedback 선호 라벨 — **별도 구축 필요**

118
docs/SCOPE_AND_METRICS.md Normal file
View File

@ -0,0 +1,118 @@
# 오투오 과업 범위와 성능지표 — 무엇을 개발하고 무엇을 측정하는가
> 출처: `data/(협약용) 연구개발계획서 PART 2.pdf` (2024 문체부 연구개발사업)
> — 2-4. 연구개발 성능지표 및 평가방법(p.23~24), 나-3. 2단계 개발내용 ㄷ.오투오(p.21),
> 나. 성과물 목표(p.25). 현재 2단계(2-1년차) 목표치 기준.
## 1. 성능지표 8개 중 오투오 몫
전체 8개 중 **우리가 수치를 책임지는 것은 3개**다. 나머지는 컨소시엄 다른 기관 몫이며,
우리 코드가 관여하더라도 측정 주체가 아니다.
| No | 지표 | 2-1년 목표 | 비교수준 | 가중치 | 담당 |
|---|---|---|---|---|---|
| **3** | 메타데이터 추출 F1 | **83 이상** | KLUE NER Leaderboard top5 이내 | 10 | 오투오(요소 분석 모듈) |
| **4** | 표절 여부 판별 **정밀도(precision)** | **97%** | — | 10 | **오투오** |
| **7** | 요약 성능 (N-gram ROUGE) | **65** | gpt-4o 줄글 요약(64%) | 10 | **오투오** |
| 1 | sLLM 환각방지 (Ko-TruthfulQA) | 85 | HF ko LLM 상위10 평균(84.047) | 15 | 고려대 |
| 2 | sLLM 상식생성 (Ko-CommonGen v2) | 55 | (53.095) | 15 | 고려대 |
| 5 | 콘텐츠 요소 추천 NDCG | 80 | — | 10 | 바이칼AI |
| 6 | 메타기반 교정/교열 정확도 | 90 | 구글·MS 맞춤법(92%) | 10 | 바이칼AI |
| 8 | 정량 사용성(UX) 평가 | 85점 | — | 20 | 외부기관 |
> ⚠️ **No.3의 귀속은 확인이 필요하다.** 성과물 목록상 오투오는 "콘텐츠 요소 분석 AI
> 서비스 모듈", 고려대는 "출판콘텐츠추출모델(sLLM)"이라 요소 추출이 양쪽에 걸친다.
> 측정 주체를 컨소시엄에 확인하고 이 문서를 갱신할 것.
**No.4가 재현율이 아니라 정밀도라는 점이 설계를 지배한다.** 놓치는 것보다 잘못
지목하는 것이 감점이므로, 애매하면 표절이라고 말하지 않는 쪽이 지표에 유리하다.
## 2. 오투오 2단계 성과물
- 콘텐츠 요소 분석 AI 서비스 모듈 1식 (고도화)
- 콘텐츠 표절 여부 AI 탐지 모듈 1식 (고도화)
- SW 저작권 등록 1건
> "콘텐츠 표절 여부 **AI 탐지** 모듈"은 *AI로 표절을 탐지하는* 모듈이다.
> *AI가 쓴 글을 탐지하는* 모듈이 아니다. 5장 참조.
## 3. 계획서가 명시한 개발내용과 현재 상태
### 가. 스토리 요약/분석 기술 고도화
| 계획서 항목 | 상태 | 남은 일 |
|---|---|---|
| 데이터 수집·전처리 (도메인별 데이터셋 구축) | ⬜ 미착수 | 컴북스 데이터 수령 후 |
| 고도화 요약 모델 (문맥 기반 문장 추출, 키워드·문장 관계 분석) | ✅ `summarizer.py` TextRank | 실데이터 튜닝 |
| 통합 요약 시스템 (추출적+추상적 하이브리드) | ✅ 구현 | LLM 키 연결 시 동작 |
| **사용자 맞춤형 요약 (길이·상세도·강조 내용 옵션)** | ⚠️ **부분** | **상세도·강조 내용 옵션 미구현** |
`SummaryRequest`에 있는 것은 `ratio`(길이), `max_sentences`, `use_abstractive`뿐이다.
계획서가 명시한 **상세도(detail)****강조 내용(emphasis)** 옵션이 없다. 지표에는
안 잡히지만 성과물 명세에 적힌 기능이므로 개발이 필요하다.
### 나. 표절 검출 기술 고도화
| 계획서 항목 | 상태 | 남은 일 |
|---|---|---|
| 군집화 기반 부분 표절 수치화 (요소 교체형) | ✅ `clustering.py``partial_signal` | 실데이터 임계값 튜닝 |
| **Human Feedback Preference Optimization으로 sLLM 고도화** | ⚠️ **골격만** | **사람 선호 라벨 + GPU 학습** |
| 점검: 자체 구축 데이터셋으로 판별 수치 정의 | ✅ 하니스 | 자서전 표절 샘플 필요 |
## 4. 측정 계획 — 지표별 평가환경
계획서가 평가환경까지 못박아 두었다. **측정은 이 환경에서 해야 인정된다.**
| No | 평가방법 | 평가환경 |
|---|---|---|
| 3 | KLUE NER 학습 11,000건 / 테스트 2,000건, Leaderboard baseline 10여 개와 상대 비교 | **python 3.9** |
| 4 | 자체 제작 실제 표절 글 vs 비표절 글을 classification 하여 precision 계산 | **Ubuntu 22.04, python 3.9**, 자체 test script (GPU 불필요) |
| 7 | 요약 데이터셋 구축 후 n-gram ROUGE **recall** 계산 (수식 분모가 참조 n-gram 수). 다중 참조 전제 | **A100 GPU, python 3.9, pytorch 2.2.2+cu121, transformers 4.39.3** |
### ⚠️ python 3.9 호환성 위험 (확인 필요)
평가환경이 **python 3.9 고정**인데, 현재 코드 일부가 3.9에서 임포트 단계에 실패할
가능성이 있다.
- `app/core/config.py`, `app/api/schemas.py``from __future__ import annotations`
없이 `float | None` (PEP 604) 문법을 쓴다.
- 두 파일 모두 Pydantic 모델이라 어노테이션이 **런타임에 평가**된다. python 3.9에는
`X | Y` 연산자가 없어 `TypeError` 가 난다.
- 현재 개발 환경은 python 3.14 라 이 문제가 드러나지 않는다.
**해야 할 일**: python 3.9 컨테이너에서 임포트 스모크 테스트를 돌려 실제로 깨지는지
확인하고, 깨지면 `Optional[float]` 로 바꾸거나 평가 스크립트를 본체와 분리한다.
No.4 측정 직전에 발견하면 일정이 밀린다.
## 5. AI 생성 의심도의 위상 — 지표가 아니다
**성능지표 8개 어디에도 없고, 계획서 개발내용에도 없다.** 오투오 성과물인
"콘텐츠 표절 여부 AI 탐지 모듈"은 AI로 표절을 탐지하는 것이지 AI 생성물을
탐지하는 것이 아니다.
따라서 이 기능은 **성능을 측정하지 않는다.** 정확도·F1·AUROC 를 보고하지 않으며,
목표치도 두지 않는다. 대신 **근거와 기준을 설명할 수 있어야** 한다. 자세한 내용은
`AI_DETECTION.md` 의 "위상과 기준" 절에 있다.
## 6. 요약 — 남은 일
### 더 개발해야 하는 것
1. **사용자 맞춤형 요약 옵션** — 상세도, 강조 내용 (계획서 명시, 현재 없음)
2. **Human Feedback Preference Optimization** — 현재 골격만. 선호 라벨 + GPU 필요
3. **도메인별 요약 데이터셋 구축** — 컴북스 데이터 수령 후
4. **python 3.9 호환성 정리** — 평가환경 대비
### 측정해야 하는 것 (전부 데이터 대기)
1. **No.4 표절 정밀도 97%** — 자체 제작 표절/비표절 글 필요. 정밀도 지표이므로
임계값은 재현율을 희생해서라도 오탐을 줄이는 쪽으로 잡는다
2. **No.7 요약 ROUGE 65** — 요약 정답셋 300건 별도 구축 필요 (컴북스 미보유).
**본 구축 전 파일럿 20건으로 사람 상한을 먼저 측정할 것**
(`eval_rouge.py --iaa`). 상한이 65 미만이면 규격부터 조정해야 한다.
구축 가이드는 `DATA_REQUEST_SPEC.md` §5
3. **No.3 메타 추출 F1 83** — KLUE NER 로 측정 가능. 귀속 확인 후 진행
### 데이터와 무관하게 지금 가능한 것
- SW 저작권 등록 1건 (서류 제출)
- 사용자 맞춤형 요약 옵션 개발
- python 3.9 호환성 확인
- 바이칼/컴북스 E2E 통합