o2o-plagiarism-ai/docs/TEST_PLAN_2026_PHASE2.md
hbyang b2d02306b9 docs: record No.3/No.4 pre-measurement in the test plan
사전 측정값을 절차서에 반영한다. 메타 F1 0.8750(목표 83), 표절 정밀도
0.9840(목표 97) 로 두 항목은 시험 가능 상태다. 요약은 정답셋이 없어 미측정이다.

시험 환경표를 실제 시험 서버 사양으로 바꾼다. 계획서가 No.4 를 GPU 불필요로
규정하고, 동일 시험셋을 macOS 와 시험 서버에서 돌려 정밀도·재현율·혼동행렬이
완전히 일치함을 확인했으므로 GPU 사양은 결과에 영향을 주지 않는다. 다만 No.7 은
계획서가 A100 을 명시하므로 해당 항목만 별도 협의 대상으로 남긴다.

No.3 절을 새로 쓴다. 전 차수는 저장소의 요소 추출기가 아니라 KLUE NER 토큰
분류였고, support 62,760 이 성적서와 일치해 같은 측정임을 확인했다. bert-base
로도 0.8324 로 목표를 넘지만 여유가 0.24%p 라 재학습 시 미달할 수 있어
roberta-large 를 적용한다.

요약 항목에는 남은 위험을 명시한다. 계획서는 ROUGE recall 인데 전 차수 코드는
f1 을 반환했고, 로그의 optimal_60_modification / success_rate 0.15 는 목표치에
맞춰 요약문을 수정한 흔적으로 보여 그대로 승계하기 어렵다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 11:13:11 +09:00

323 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2-1년차 현장시험 및 검증 — 시험절차서 (초안)
> 작성: 에이아이오투오 / 초안 일자 2026-09-14 (사전 측정 반영 2026-09-15)
> 선행 시험: 구미전자정보기술원 `GERIR.CE.2511-02.009` (2025-11-19 시험, 3개 항목 PASS)
> 근거: (협약용) 연구개발계획서 PART 2, 2-4. 연구개발 성능지표 및 평가방법 (p.23~24)
---
## 1.0 일반사항
### 1.1 제품 정보
| 구분 | 내용 |
|---|---|
| 시 료 명 | 출판콘텐츠 분석 및 공유 기술용 AI 모델 |
| 모 델 명 | `ai_publish_o2o.v2` |
| 시 료 수 | 1 |
| 성적서 용도 | 솔루션 성능 결과 증빙용 |
### 1.2 시험 항목 — 3개 항목
전 차수와 동일한 3개 항목을 2-1년차 목표치로 재시험한다.
| No | 성능지표 | 단위 | 1-2년차 결과 | **2-1년차 목표** | 사전 측정 |
|---|---|---|---|---|---|
| 3 | 메타 데이터 추출 (F1-score) | % | 81 (PASS) | **83 이상** | **87.50** |
| 4 | 표절 여부 판별 정밀도 (Precision) | % | 95.2 (PASS) | **97** | **98.40** |
| 7 | 요약 성능 (N-gram ROUGE score) | % | 63 (PASS) | **65** | 미측정 |
> 사전 측정은 시험 신청 전 자체 검증값이다. No.3·No.4 는 목표치를 충족하였고,
> No.7 은 정답셋 미구축으로 측정하지 않았다(6.0 항 참조).
---
## 2.0 시험 방법
### 2.1 시험 규격
- 시험규격: 시험절차서 기준
- 시험항목: 시험절차서 3개 항목
### 2.2 시험 장비 정보
| 구분 | 사용 장비 | 용도 |
|---|---|---|
| 1 | 노트북 (시험관 지참) | 코드 시현 서버 접속용 |
| 2 | GPU server | 코드 시현용 |
### 2.3 시험 환경
#### 2.3.1 시험 구성
```
① 실제 솔루션에 활용되는 AI 모델들을 평가에 사용
② 시험용 PC 로 실제 AI 모델이 가동중인 GPU 서버에 접속
③ 성능 평가를 GPU 서버에서 진행
```
#### 2.3.2 시험 환경 상세 정보
| 구분 | 시스템 사양 | 운영 SW 및 시험도구 | 구현 모듈 |
|---|---|---|---|
| 시험 PC | 시험관 지참 노트북 | SSH 터미널 | 없음 |
| **GPU 서버** | GPU : NVIDIA RTX 3090 24G × 2<br>CPU : Intel i9-12900KS (24 core)<br>RAM : 125GB | Ubuntu 18.04.6 (호스트)<br>Docker 24.0.2<br>CUDA 12.2<br>**평가 컨테이너 : Python 3.9** | 메타 데이터 추출 모듈,<br>표절 여부 판별 모듈,<br>요약 모듈 |
> **평가환경에 관하여** — 계획서 p.24 는 No.3·No.4 를 `python 3.9`, No.7 을
> `A100 GPU / python 3.9 / pytorch 2.2.2+cu121 / transformers 4.39.3` 로 명시한다.
> 파이썬 버전은 **호스트와 무관하게 전용 컨테이너에서 고정**하여 충족한다
> (`Dockerfile.eval`, `Dockerfile.ner`).
>
> 시험 서버는 **실제 솔루션이 가동 중인 서버**로 한다. 표절 판별 모듈이 이 서버에서
> 운영 중이며(`o2o-plagiarism-api`), 계획서가 No.4 를 `GPU 불필요` 로 규정하므로
> GPU 사양은 결과에 영향을 주지 않는다. 실제로 동일 시험셋을 서로 다른 두 환경
> (macOS / 본 서버)에서 실행하여 **정밀도·재현율·TP/FP/TN/FN 이 완전히 일치**함을
> 확인하였다(3.1.6 항).
>
> 다만 **No.7 은 계획서가 A100 을 명시**하므로, 해당 항목의 시험 환경은 접수 시
> 시험기관과 별도 협의한다.
### 2.3.3 평가방법
| 순번 | 평가지표 (성능지표) | 평가방법 | 비고 |
|---|---|---|---|
| 1 | 메타 데이터 추출<br>(F1-score) | KLUE 데이터셋의 NER 데이터셋을 활용하여, 약 11,000개의 학습 데이터로 개발된 모델을 학습시키고, 2,000여개의 테스트 데이터를 활용하여 개발된 모델에 대한 상대 평가 진행 | 과제 성능지표 3번에 해당 |
| 2 | 표절 여부 판별 정밀도<br>(precision) | 자체 제작된 실제 표절 글과, 표절이 아닌 글을 Classification 하여, precision 계산 | 과제 성능지표 4번에 해당 |
| 3 | 요약 성능<br>(N-gram ROUGE score) | 자체 제작된 요약 데이터셋을, 요약 모델에 테스트하여 N-gram ROUGE score 계산 | 과제 성능지표 7번에 해당 |
---
## 3.0 시험 항목별 세부 절차
### 3.1 표절 여부 판별 정밀도 (성능지표 #4)
#### 3.1.1 시험방법
```
① 모델이 학습하지 않은, 자체 제작된 표절 글 데이터 준비
② 표절 판별 알고리즘에 대한 전처리 진행
③ 데이터 표절 여부의 precision 점수 계산
```
#### 3.1.2 시험 데이터 구성 — 총 1,000건
모델이 학습하지 않은 데이터임을 **작성자 단위 분리**로 보장한다.
```
전체 작성자 290명
├─ 203명 → 참조 코퍼스(검색 인덱스)에 적재
└─ 87명 → 시험 질의로만 사용 (인덱스에 미포함)
```
| 라벨 | 건수 | 구성 |
|---|---|---|
| 표절 | 500 | 참조 코퍼스의 글을 변형<br>완전복제 100 / 부분복제 100 / 문장재배열 100 / 어휘치환 150 / 축약 50 |
| 비표절 | 500 | 인덱스 미포함 작성자의 글 원문<br>**주제 근접 시료 150** + 일반 350 |
- **주제 근접 시료(하드 네거티브) 150건**: 참조 코퍼스와 어휘가 많이 겹치는 글.
실제 오탐이 발생하는 유형이므로 난이도 확보를 위해 의도적으로 포함한다.
- **대필(인칭 전환) 유형은 제외**: 같은 사건을 당사자와 대필자가 각각 기술한 글은
원문이 그대로 남으나, 표절 여부가 계약·동의로 갈려 텍스트만으로 판정할 수 없다.
- **재현성**: 구성 비율과 난수 시드를 `manifest.json` 에 사전 기록하여, 동일 시험셋을
재생성할 수 있다.
#### 3.1.3 판정 조건
| 조건 | 기준값 | |
|---|---|---|
| ① 결합유사도 | ≥ 0.65 | 어휘 0.45 + 표현 0.30 + 문자 0.15 + 모티프 0.10 |
| ② **최장 연속 일치** | **≥ 35자 (9어절)** | **필수 조건** |
| ③ 문서 단위 커버리지 | ≥ 0.30 | |
②를 필수로 둔다. 유사도만 높고 그대로 겹친 구간이 없는 후보는 채택하지 않는다.
같은 주제를 다룬 글은 의미 유사도가 함께 상승하기 때문이다.
**35자 산출 근거** — 어절 기준 3~9 스윕 및 문서쌍 148,240 쌍 전수 대조 결과,
4어절 이하는 임의 조합의 99% 이상에서 겹침이 발생하여 신호로 쓸 수 없고,
9어절부터 잔존하는 겹침은 실제 유사 원고로 확인되었다.
#### 3.1.4 시현 절차
```bash
# ① 시험셋 구성 확인
cat data/eval/testset_v2/manifest.json
wc -l data/eval/testset_v2/pairs.jsonl # 1000
# ② 판정 기준 확인
python -c "from app.core.config import Settings; s=Settings(); print(
s.persistent_similarity_threshold, s.persistent_min_exact_span,
s.persistent_min_coverage, s.require_exact_span_evidence)"
# ③ 평가 실행 (약 10분)
docker run --rm -v $PWD:/app -w /app o2o-plagia-eval:py39 \
python scripts/run_precision_eval.py --testset data/eval/testset_v2
```
산출물: `data/eval/testset_v2/result.json` (precision / recall / F1 / 변형 유형별 분해)
#### 3.1.5 사전 측정 결과 (자체 검증)
| 항목 | 수치 |
|---|---|
| 정밀도 (precision) | **0.9840** |
| 재현율 (recall) | 0.9860 |
| F1 | 0.9850 |
| TP / FP / TN / FN | 493 / 8 / 492 / 7 |
목표 0.97 대비 여유가 있으며, 오탐 8건 중 7건이 주제 근접 시료에서 발생하여
난이도가 실제 운영 조건을 반영하고 있음을 확인하였다.
#### 3.1.6 환경 간 재현성 확인
동일 시험셋을 서로 다른 두 환경에서 실행한 결과가 완전히 일치하였다.
| 환경 | precision | recall | TP / FP / TN / FN |
|---|---|---|---|
| 개발 PC (macOS, Python 3.14) | 0.9840 | 0.9860 | 493 / 8 / 492 / 7 |
| **시험 서버 (RTX 3090, Python 3.9 컨테이너)** | **0.9840** | **0.9860** | **493 / 8 / 492 / 7** |
변형 유형별 수치까지 동일하다. 시험셋 또한 난수 시드가 고정되어 있어 양쪽에서
같은 구성으로 재생성되었다(작성자 290명 → 참조 203 / 질의 87).
### 3.2 메타 데이터 추출 F1 (성능지표 #3)
#### 3.2.1 시험방법
```
① KLUE 데이터셋의 NER(개체명 인식) 데이터셋을 활용하여 학습 데이터로 모델을 학습
② 학습되지 않은 테스트 데이터를 활용하여 개발된 모델에 대한 상대 평가 진행
```
#### 3.2.2 모델 및 데이터
전 차수와 동일한 과제 설정이며, 사전학습 모델만 상위 모델로 교체하였다.
| 구분 | 1-2년차 | **2-1년차** |
|---|---|---|
| 사전학습 모델 | `klue/bert-base` | **`klue/roberta-large`** |
| 구조 | TokenClassification, 13 labels | 동일 |
| 태그 | DT / LC / OG / PS / QT / TI (BIO) | 동일 |
| 학습 데이터 | 약 11,000건 | **21,008건 (KLUE NER 전체 학습셋)** |
| 평가 데이터 | 2,000여건 | 5,000건 (KLUE NER validation) |
#### 3.2.3 시현 절차
```bash
# 학습 + 평가 (약 40분)
docker run --rm --gpus all -v $PWD:/w -w /w -e HF_HOME=/w/.cache/hf o2o-ner:latest \
python scripts/train_klue_ner.py --model klue/roberta-large \
--out-dir data/models/klue_ner_large --epochs 3 --batch-size 8 --lr 1e-5
# 학습 완료 모델로 평가만 재실행
docker run --rm --gpus all -v $PWD:/w -w /w o2o-ner:latest \
python scripts/train_klue_ner.py --eval-only --out-dir data/models/klue_ner_large
```
산출물: `data/models/klue_ner_large/result.json`
#### 3.2.4 사전 측정 결과 (자체 검증)
| 모델 | micro avg F1 | 비고 |
|---|---|---|
| 전 차수 (`klue/bert-base`, 학습 11,479건) | 0.8113 | 성적서 8p |
| `klue/bert-base` (학습 전체 21,008건) | 0.8324 | 구현 재현 확인 |
| **`klue/roberta-large`** | **0.8750** | **본 차수 적용** |
태그별 F1:
| 태그 | 전 차수 | **본 차수** | support |
|---|---|---|---|
| DT | 0.8459 | **0.9065** | 7,670 |
| LC | 0.7563 | **0.8209** | 6,997 |
| OG | 0.7862 | **0.8588** | 11,492 |
| PS | 0.8641 | **0.9105** | 12,397 |
| QT | 0.9882 | 0.9590 | 7,530 |
| TI | 0.7674 | **0.8308** | 16,674 |
> **구현 일치 확인** — `support` 합계 62,760 이 전 차수 성적서(8p)와 정확히 일치한다.
> 동일한 평가 데이터에 동일한 방식으로 측정하였음을 의미한다.
>
> `klue/bert-base` 로도 0.8324 로 목표를 충족하나 여유가 0.24%p 에 불과해 재학습 시
> 난수에 따라 미달할 수 있어, 4.5%p 여유가 확보되는 `roberta-large` 를 적용한다.
### 3.3 요약 성능 ROUGE (성능지표 #7)
#### 3.3.1 시험방법
```
① 자체 제작된 요약 데이터셋 준비
② 요약 모델에 학습되지 않은 데이터 1,000건에 대해 모델 요약 진행
③ 생성된 결과물에 대한 N-ROUGE score 측정
```
평가 스크립트 `scripts/eval_rouge.py`. ROUGE 는 **recall 기준**으로 계산한다
(수식 분모가 참조 n-gram 수). 다중 참조를 전제한다.
> **선행 과제** — 정답셋 본 구축 전, 파일럿 20건으로 사람 간 일치도(IAA)를 측정하여
> 사람 상한을 먼저 확인한다(`eval_rouge.py --iaa`). 상한이 목표 65 미만이면 규격
> 조정이 필요하며, 파일럿 단계에서의 조정은 추가 비용이 발생하지 않는다.
---
## 4.0 시험 데이터 게재에 관한 요청사항
전 차수 성적서에는 시험 데이터 원문 예시가 게재되었다(성적서 9p, 13p).
본 차수 표절 항목의 시험 데이터는 개인 자서전을 기반으로 하므로, **성적서 게재용
예시는 익명화가 완료된 생활수기 자료로 대체**하여 제출한다. 접수 시 시험기관에
함께 요청한다.
---
## 5.0 일정 (안)
| 단계 | 내용 | 비고 |
|---|---|---|
| 접수 | 시험 신청 및 시험절차서 제출 | |
| 사전 협의 | 시험 항목·환경·데이터 게재 범위 확정 | 4.0 항 포함 |
| 시험 | 3개 항목 현장 시험 (1일) | 에이아이오투오 판교 연구소 |
| 성적서 발행 | | 시험 후 약 5일 |
---
## 6.0 준비 현황
### 6.1 항목별 요약
| No | 지표 | 목표 | 사전 측정 | 상태 |
|---|---|---|---|---|
| 3 | 메타 데이터 추출 F1 | 83 | **87.50** | **시험 가능** |
| 4 | 표절 판별 정밀도 | 97 | **98.40** | **시험 가능** |
| 7 | 요약 ROUGE | 65 | 미측정 | **미준비** |
### 6.2 세부 현황
| 항목 | 상태 |
|---|---|
| **표절(No.4)** | |
| 시험셋 1,000건 | 완료 (`data/eval/testset_v2/`, 시드 고정) |
| 평가 스크립트 | 완료 (`scripts/run_precision_eval.py`) |
| 평가 컨테이너 (python 3.9) | 완료 (`Dockerfile.eval`) |
| 사전 측정 | 완료 (**0.9840**) |
| 환경 간 재현성 | 완료 (두 환경 결과 완전 일치) |
| **메타 추출(No.3)** | |
| 학습·평가 스크립트 | 완료 (`scripts/train_klue_ner.py`) |
| 학습 컨테이너 (GPU) | 완료 (`Dockerfile.ner`) |
| 전 차수 구현 재현 | 완료 (support 62,760 일치) |
| 사전 측정 | 완료 (**0.8750**) |
| 측정 주체 확인 | **미완** — 성과물 목록상 요소 추출이 오투오와 고려대 양쪽에 걸쳐 있어 컨소시엄 확인 필요 |
| **요약(No.7)** | |
| 평가 스크립트 | 완료 (`scripts/eval_rouge.py`) |
| 정답셋 파일럿 20건 | **미완** |
| 정답셋 본 구축 300건 | **미완** |
| 지표 정의 확인 | **미완** — 계획서는 ROUGE recall, 전 차수 코드는 f1 반환. 정의 일치 필요 |
| 전 차수 방식 검토 | **미완** — 전 차수 로그에 `optimal_60_modification` / `success_rate 0.15` 기록. 목표치에 맞춘 요약문 수정으로 보여 그대로 승계하기 어려움 |
| **공통** | |
| 시험 서버 확정 | 표절·메타는 본 서버로 가능. No.7 은 A100 명시로 별도 협의 |
### 6.3 다음 작업
1. **요약 파일럿 20건** — 사람 간 일치도(IAA)로 사람 상한을 먼저 측정한다.
상한이 65 미만이면 300건 구축 전에 규격 조정을 협의해야 한다.
2. **No.3 측정 주체 확인** — 컨소시엄 문의.
3. **No.7 시험 환경 협의** — A100 필요 여부 및 대체 가능성.