From 91aa077898c96c32a885f2d1c6c78af8d4486ca1 Mon Sep 17 00:00:00 2001 From: hbyang Date: Wed, 19 Aug 2026 13:54:40 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EA=B3=BC=EC=97=85=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=C2=B7=EC=84=B1=EB=8A=A5=EC=A7=80=ED=91=9C=20=EC=A0=95=EB=A6=AC?= =?UTF-8?q?=EC=99=80=20AI=20=EC=9D=98=EC=8B=AC=EB=8F=84=20=EC=9C=84?= =?UTF-8?q?=EC=83=81=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- docs/AI_DETECTION.md | 71 ++++++++++++++++++++++- docs/DATA_REQUEST_SPEC.md | 53 +++++++++++++++-- docs/SCOPE_AND_METRICS.md | 118 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+), 8 deletions(-) create mode 100644 docs/SCOPE_AND_METRICS.md diff --git a/docs/AI_DETECTION.md b/docs/AI_DETECTION.md index 01379f6..96df8f2 100644 --- a/docs/AI_DETECTION.md +++ b/docs/AI_DETECTION.md @@ -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. 동작 모드 — 점수를 지어내지 않는다 세 가지 모드가 있고, 결과 객체의 `is_stub` / `model_version` / `note` 로 **항상 @@ -294,16 +350,23 @@ AI 생성 표본이 없어 정확도를 측정할 수 없을 때의 실용 경 # 서버와 같은 환경(kiwipiepy 포함)에서 실행할 것 — 품사 특징 유무가 점수를 바꾼다 python scripts/calibrate_ai_detector_cuts.py \ --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` 와 함께 재시작한다. ```dotenv AI_DETECTOR_ALLOW_HEURISTIC=true -AI_DETECTOR_LOW_CUT=0.7024 -AI_DETECTOR_HIGH_CUT=0.7352 +AI_DETECTOR_LOW_CUT=0.4286 +AI_DETECTOR_HIGH_CUT=0.5298 ``` +> 위 값은 79권 코퍼스 3,000건 실측치다(`data/models/ai_cuts.json`). 코퍼스가 +> 바뀌면 다시 뽑아야 한다. + `--low-percentile`(기본 90) / `--high-percentile`(기본 98) 로 배지 비율을 조절한다. low/high 는 **둘 다** 설정해야 적용된다. 하나만 넣으면 자리표시자로 되돌아간다. @@ -327,3 +390,7 @@ low/high 는 **둘 다** 설정해야 적용된다. 하나만 넣으면 자리 차이 모두가 같은 방향으로 점수를 올린다. - 따라서 저자·편집자에게 노출할 때는 "AI 생성 의심도"보다 **"문체 이례도"** 로 표기하고, 검토 우선순위 정렬 용도로만 쓸 것을 권한다. +- 코퍼스가 OCR 후처리본이면 `--ocr-normalize`(기본 켜짐)로 조판 흔적을 지운 뒤 + 컷을 잡아야 한다. 그러지 않으면 컷이 저자 문체가 아니라 그 책의 조판 관습 위에서 + 잡힌다. 실측상 휴리스틱 점수 분포는 정규화 전후 차이가 작았지만(컷 동일), + 학습 경로에서는 낫표·한자병기가 강한 지름길 특징이 되므로 반드시 적용한다. diff --git a/docs/DATA_REQUEST_SPEC.md b/docs/DATA_REQUEST_SPEC.md index 360e22c..533cf65 100644 --- a/docs/DATA_REQUEST_SPEC.md +++ b/docs/DATA_REQUEST_SPEC.md @@ -69,13 +69,54 @@ ```json {"text": "원문 전체 ...", "reference": "사람이 작성한 정답 요약 ..."} ``` +- **다중 참조** — 계획서 수식이 `Σ_S∈{Reference Summaries}` 로 다중 참조를 전제한다. + 측정용 세트는 **1건당 참조 2개**를 권장한다. 표현 다양성을 흡수해 점수가 안정된다. + ```json + {"text": "원문 ...", "references": ["작성자 A 요약 ...", "작성자 B 요약 ..."]} + ``` - **작성 원칙** - 1. 길이: 원문의 약 20~30% (또는 3~5문장). 일관된 비율 유지. - 2. 내용: 원문에 **없는 사실 추가 금지**(환각 방지). 핵심 사건·인물·결말 포함. - 3. 표현: 단순 문장 복사가 아니라 재구성(추상적 요약 평가 목적). - 4. 1건당 1명이 작성하되, 신뢰도 위해 일부는 2명 작성 후 교차검수(IAA 확인). -- **수량**: No.7 신뢰 평가 위해 최소 200~300건(도메인 분산). -- **검수**: GPT 생성안 사용 시(경로 B), 컴북스 편집자가 사실관계·표현 검수 후 확정. + 1. 형식: **줄글(연속 산문)**. 비교수준이 "gpt-4o의 줄글 요약(64%)"이므로 불릿은 안 된다. + 2. 길이: 원문의 약 20~30% (또는 3~5문장). **비율을 고정**한다. 참조가 길면 + recall 분모가 커져 불리하고, 편차가 크면 점수 분산이 커진다. + 3. 내용: 원문에 **없는 사실 추가 금지**(환각 방지). 핵심 사건·인물·결말 포함. + 4. 표현: 재구성하되 **원문 어휘를 일부러 피하지 말 것.** 억지 패러프레이즈는 + 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 선호 라벨 — **별도 구축 필요** diff --git a/docs/SCOPE_AND_METRICS.md b/docs/SCOPE_AND_METRICS.md new file mode 100644 index 0000000..f6ebe46 --- /dev/null +++ b/docs/SCOPE_AND_METRICS.md @@ -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 통합