123 lines
5.3 KiB
Markdown
123 lines
5.3 KiB
Markdown
# O2O 표절·AI 의심도·판례 위험도 운영 런북
|
|
|
|
## 안전한 제품 경계
|
|
|
|
세 결과는 서로 다른 증거를 사용하며 합쳐서 하나의 `침해 확정` 값으로 만들지 않는다.
|
|
|
|
1. **유사구간 검색**: 현재 등록 코퍼스 안에서 발견된 후보와 원문 위치
|
|
2. **AI 생성 의심도**: 원문 문체 특징에 대한 검토 우선순위(확정 판정 금지)
|
|
3. **법적 위험도**: 등록 판례와 판단 요소에 대한 검토 보조(법률 자문 아님)
|
|
|
|
후방 호환을 위해 `is_infringement` 필드는 유지하지만 실제 의미는 임계값을 넘은
|
|
`has_similarity_match`와 같다. 신규 연동은 `has_similarity_match`,
|
|
`corpus_scope_note`, `legal_risk`를 사용한다.
|
|
|
|
## 수령 데이터 실사 결과
|
|
|
|
- XLSX 본 데이터 34,105행, 원천 도서 79권
|
|
- 고유 에피소드 31,560개, 같은 책 내부 중복 추가 행 2,545개
|
|
- 고유 본문 약 2,946만 자
|
|
- 페이지/문단 원문 좌표 없음: XLSX 적재 결과는 `coordinate_scope=episode`
|
|
|
|
## King 서버 데이터 적재
|
|
|
|
원고 데이터와 학습 산출물은 Git에 커밋하지 않는다. `/app/data` Docker 볼륨 아래의
|
|
`runtime`, `models`, `input`을 사용한다.
|
|
|
|
```bash
|
|
python -m scripts.ingest_o2o_xlsx \
|
|
data/input/o2o_episodes.xlsx \
|
|
--database data/runtime/corpus.sqlite3
|
|
|
|
python -m scripts.build_persistent_index \
|
|
--database data/runtime/corpus.sqlite3 \
|
|
--index-dir data/runtime/index
|
|
```
|
|
|
|
같은 DB에 신규 세그먼트만 추가한 뒤 `build_persistent_index`를 다시 실행하면 결과의
|
|
`mode`가 `append`이며 기존 행을 다시 벡터화하지 않는다. 삭제 또는 본문 변경이
|
|
감지된 경우에만 `rebuild`한다.
|
|
|
|
`.env`에서 다음을 설정하고 재기동한다.
|
|
|
|
```dotenv
|
|
USE_PERSISTENT_INDEX=true
|
|
CORPUS_DB_PATH=/app/data/runtime/corpus.sqlite3
|
|
PERSISTENT_INDEX_DIR=/app/data/runtime/index
|
|
PERSISTENT_SIMILARITY_THRESHOLD=0.65
|
|
# 바이칼과 키 전달을 합의한 뒤 활성화
|
|
API_KEY=<secret-manager-or-protected-env-value>
|
|
```
|
|
|
|
`0.65`는 영속 문자 n-gram 후보 검색의 보수적인 시작값일 뿐 운영 확정값이 아니다.
|
|
삽입 복제 테스트와 79권 상호비교 오탐 분포를 측정한 뒤 버전별로 보정한다.
|
|
|
|
## PDF/DOCX 원문 위치 재구축
|
|
|
|
```bash
|
|
python -m scripts.extract_source_documents \
|
|
/mnt/data2/demo/ai_publish/data/combooks \
|
|
--database data/runtime/source_corpus.sqlite3 \
|
|
--chunk-size 1000 --stride 500
|
|
```
|
|
|
|
- PDF: 페이지 번호와 해당 페이지 추출 텍스트의 글자 offset 저장
|
|
- DOCX: 문단 번호와 문단 내부 글자 offset 저장
|
|
- 텍스트가 없는 PDF 페이지는 OCR 필요 경고
|
|
- 구형 `.doc`은 먼저 DOCX 또는 PDF로 변환 필요
|
|
|
|
96개 raw와 79개 처리 도서의 대응표를 검수한 후, 위치 정보가 더 정확한
|
|
`source_corpus.sqlite3`를 운영 코퍼스로 승격한다.
|
|
|
|
## AI 탐지 학습
|
|
|
|
XLSX의 `에피소드` 열은 원문이 사람 작성임이 계약·생성 이력으로 확인된 경우에만
|
|
human 라벨로 사용한다. AI 데이터는 모델·프롬프트·편집 유형별 provenance와
|
|
`source_group`을 가져야 한다. 학습/검증은 행이 아니라 book/source group으로 나눈다.
|
|
|
|
AI 모델 파일이 없거나 단일 클래스 데이터뿐이면 API는 실제 점수를 가장하지 않고
|
|
미학습 상태를 표시해야 한다. 완전 AI, 사람 편집 AI, AI 윤문, 혼합 문서를 각각
|
|
미학습 모델·미학습 도서로 평가한다.
|
|
|
|
## 판례 적재
|
|
|
|
`data/precedents/precedents.jsonl`에는 공식 HTTPS 출처와 사건번호가 확인된 레코드만
|
|
넣는다.
|
|
|
|
```bash
|
|
python -m scripts.validate_precedents data/precedents/precedents.jsonl
|
|
```
|
|
|
|
현재 저장소의 판례는 스키마 동작을 확인하기 위한 최소 시드다. 2,000건 적재 완료로
|
|
표현하면 안 된다. 재배포 허용 범위 확인과 저작권 전문가의 다음 항목 라벨링이 필요하다.
|
|
|
|
- 보호되는 표현 / 아이디어·사실·상투적 표현
|
|
- 의거관계 판단 근거
|
|
- 실질적 유사성 인정·부정 이유
|
|
- 저작물 유형과 결론
|
|
|
|
엔진은 등록된 사건번호만 반환하며 판례를 자유 생성하지 않는다.
|
|
|
|
## 검증 게이트
|
|
|
|
- 데이터: 79권/31,560 고유 XLSX 세그먼트 적재 수 일치
|
|
- 증분성: 신규 문서 추가 후 index sync `mode=append`
|
|
- 검색: 100/200/300/500자 복사·삽입 세트의 Recall@20 기록
|
|
- 근거 위치: 반환한 query/source offset으로 원문 substring이 정확히 복원됨
|
|
- 오탐: 책 단위 분리 및 자서전 공통표현 hard-negative 검수
|
|
- AI: unseen book/model의 AUROC뿐 아니라 FPR, AUPRC, 혼합·편집 유형별 결과 기록
|
|
- 법적 위험도: 미등록 사건번호 0건, 빠진 법적 사실을 항상 명시
|
|
- API: CPU 작업 중 `/v1/health` event loop가 응답 가능
|
|
|
|
## 배포/롤백
|
|
|
|
1. 테스트 통과 및 Git SHA 기록
|
|
2. King에서 `git pull --ff-only`
|
|
3. 데이터 적재/인덱싱/AI 학습은 호스트 또는 일회성 Compose 컨테이너에서 실행
|
|
4. `docker compose up -d --build`
|
|
5. `/v1/health`, `/v1/plagiarism/detect`, 코퍼스 수, 모델 준비 상태 확인
|
|
6. 문제 시 이전 Git SHA의 이미지를 다시 빌드하되 `data/runtime`은 보존
|
|
|
|
Ubuntu 18.04는 지원 종료 상태이므로 OS 업그레이드 전까지 외부 공개 범위를 최소화하고,
|
|
API 인증·방화벽·키 회전을 별도 운영 작업으로 완료해야 한다.
|