chore: prune docs to score-evidence set and drop sweep intermediates

docs 24 -> 12. 성적 수치 문서와 운영에 필요한 문서만 남긴다. 삭제분은 git
이력에 남아 있으므로 필요하면 되살린다.

남김: TEST_PLAN_2026_PHASE2, PERF_EVIDENCE_CAPTURE_2026, PRECISION_TEST_
PROCEDURE, SCOPE_AND_METRICS, AI_TRAINING_RESULT x2, CASE_MATCHING_KPI
(성적 수치) / IMPLEMENTATION_RUNBOOK(King 배포 절차), API_SPEC_BAIKAL(바이칼
연동), AI_DETECTION·PRECEDENT_LISTUP(코드가 참조), COMBOOKS 회신(미발송).

지우면 끊어질 내용은 버리지 않고 합쳤다.
- CASE_MATCHING_API.md -> API_SPEC_BAIKAL.md 7절
- PRECEDENT_SOURCE_GAP.md 의 출처 미확보 14건 표 -> COMBOOKS 회신 2절
남은 문서 6곳과 analyze_case_coverage.py 의 끊어진 링크도 함께 정리했다.

reports: 파라미터 스윕 중간본 4개(batch_*.jsonl, 42MB)를 삭제한다. 참조가 없고
xlsx 짝도 없는 탐색용 산출물이다. 날짜가 붙은 실측 배치(infringement_batch_*)는
xlsx 와 함께 증빙으로 유지한다.

진행 중인 요약(No.7) 작업 파일은 건드리지 않았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hbyang 2026-09-28 09:55:02 +09:00
parent b73d27a850
commit bbdda66934
24 changed files with 84 additions and 27323 deletions

View File

@ -309,7 +309,7 @@ ai_result = get_ai_detector().detect(text)
### 6.4 바이칼 연동 문서
`docs/API_SPEC_BAIKAL.md` / `docs/API_GUIDE_BAIKAL.md`도 미학습 시 `unknown/null`을
`docs/API_SPEC_BAIKAL.md`도 미학습 시 `unknown/null`을
반환하도록 갱신했습니다. **`is_stub=false`여도 확정 판정은 아닙니다.**
---

View File

@ -1,295 +0,0 @@
# 저작권 탭 API 연동 가이드
## 1. 연동 요약
저작권 탭은 아래 API를 한 번 호출해 렌더링한다.
```text
POST https://plagiarism.o2o.kr/v1/plagiarism/review
```
이 API는 내부적으로 표절 탐지, AI 생성 의심도 산출, 판례 비교를 수행하지만 앱에는
화면에 필요한 요약값만 반환한다. 상세 탐지 API의 `matches`, `evidence_spans`,
`extracted_elements`, `score_semantics`, 모델 정보 등은 응답하지 않는다.
## 2. 공통 규격
| 항목 | 값 |
|---|---|
| Base URL | `https://plagiarism.o2o.kr` |
| Method | `POST` |
| Path | `/v1/plagiarism/review` |
| Content-Type | `application/json; charset=utf-8` |
| 인증 | 운영에서 설정된 경우 `X-API-Key` 헤더 사용 |
| 시간 | ISO 8601 UTC |
## 3. 요청
### 최소 요청
```json
{
"doc_id": "episode-001",
"text": "창밖으로 보이는 숲은 오늘따라 유난히 푸르게 보였다."
}
```
### 전체 요청
```json
{
"doc_id": "episode-001",
"text": "검사할 에피소드 본문 전체",
"metadata": {
"title": "에피소드 1",
"author": "홍길동",
"genre": "자서전"
},
"options": {
"threshold": null,
"top_k": 5,
"autobiography_mode": null
},
"legal_context": {
"work_type": "literary",
"access_evidence": null,
"protected_expression_reviewed": false,
"rights_verified": false
}
}
```
| 필드 | 타입 | 필수 | 설명 |
|---|---|---:|---|
| `doc_id` | string | O | 호출 측 문서 또는 에피소드 ID |
| `text` | string | O | 검사할 본문, 1자 이상 |
| `metadata` | object | X | 제목, 저자, 장르 등 표시·추적용 메타데이터 |
| `options.threshold` | number/null | X | 탐지 임계값. 미지정 시 서버 기본값 |
| `options.top_k` | integer | X | 내부 비교 후보 수, 기본 5 |
| `options.autobiography_mode` | boolean/null | X | 자서전 특화 전처리 사용 여부 |
| `legal_context` | object | X | 사람이 확인한 접근 가능성·권리관계 등의 법적 맥락 |
일반적인 저작권 탭 연동에서는 `doc_id`, `text`만 전달하면 된다.
## 4. 응답
### 침해 의심이 낮은 예시
```json
{
"doc_id": "episode-001",
"copyright": {
"originality_percent": 98,
"similarity_percent": 2,
"compared_count": 37891,
"has_suspicion": false,
"description": "등록 원문 검색 세그먼트 37,891건과 대조한 결과 표절 의심 구간이 없습니다."
},
"similar_sentences": {
"count": 0,
"label": "0건"
},
"ai_generation_suspicion": {
"level": "low",
"label": "낮음"
},
"legal_judgment": {
"status": "low",
"label": "등록 판례 기준 침해 의심 낮음",
"summary": "등록 코퍼스에서 일치 증거가 확인되지 않아 판례 기반 침해 의심을 제시하지 않습니다. 다만 미매칭은 비침해 확정이 아닙니다.",
"precedent_ids": []
},
"analyzed_at": "2026-08-18T03:00:00Z"
}
```
### 판례에 따른 침해 의심 예시
```json
{
"doc_id": "episode-002",
"copyright": {
"originality_percent": 10,
"similarity_percent": 90,
"compared_count": 37891,
"has_suspicion": true,
"description": "등록 원문 검색 세그먼트 37,891건과 대조한 결과 표절 의심 구간이 확인되었습니다."
},
"similar_sentences": {
"count": 5,
"label": "5건"
},
"ai_generation_suspicion": {
"level": "unknown",
"label": "확인 불가"
},
"legal_judgment": {
"status": "suspected",
"label": "판례에 비추어 저작권 침해 의심",
"summary": "2011고단6934, 2013노232 판례의 판단 기준과 탐지 증거를 비교한 결과, 표현 일치 범위가 커 저작권 침해가 의심되어 추가 검토가 필요합니다.",
"precedent_ids": ["2011고단6934", "2013노232"]
},
"analyzed_at": "2026-08-18T03:01:00Z"
}
```
## 5. 화면 매핑
| 화면 항목 | 응답 경로 | 표시 방법 |
|---|---|---|
| 독창성 98% | `copyright.originality_percent` | 숫자 뒤 `%` |
| 저작권 · 유사도 2% | `copyright.similarity_percent` | 숫자 뒤 `%` |
| 대조 결과 설명 | `copyright.description` | 문자열 그대로 표시 |
| 유사 문장 0건 | `similar_sentences.label` | 문자열 그대로 표시 |
| AI 생성 의심도 낮음 | `ai_generation_suspicion.label` | 문자열 그대로 표시 |
| 판례 판단 제목 | `legal_judgment.label` | 의심 또는 검토 필요 시 표시 |
| 판례 판단 근거 | `legal_judgment.summary` | 제목 아래 설명으로 표시 |
| 근거 판례 | `legal_judgment.precedent_ids[]` | 사건번호 배지로 표시 |
`compared_count`는 현재 등록된 검색 세그먼트 수다. 원천 PDF 파일 수 또는 외부 공개
문서 전체 건수로 바꾸어 표기하지 않는다.
## 6. 상태값
### `legal_judgment.status`
| 값 | 의미 | 권장 UI |
|---|---|---|
| `suspected` | 판례와 탐지 증거에 비추어 침해 의심 | 빨간색 또는 주의 표시 |
| `low` | 현재 증거에서 침해 의심 낮음 | 기본 또는 정상 표시 |
| `review_required` | 관련 판례에 따른 추가 확인 필요 | 노란색 검토 표시 |
| `unavailable` | 등록 판례가 없어 비교 불가 | 회색 안내 표시 |
### `ai_generation_suspicion.level`
| 값 | 한글 라벨 |
|---|---|
| `low` | 낮음 |
| `medium` | 중간 |
| `high` | 높음 |
| `unknown` | 확인 불가 |
`unknown`을 임의로 `low`로 바꾸지 않는다. 학습 모델이 없거나 채점할 수 없는 경우다.
현재 운영 서버에는 한국어 자서전 대조 데이터로 학습한 모델이 적재되어 있어 정상적인
본문에는 `low`, `medium`, `high` 중 하나가 반환된다. 이 값은 AI 작성 확정 판정이 아니라
사람 검토 우선순위를 위한 보조 신호다.
## 7. 호출 예시
```bash
curl -X POST 'https://plagiarism.o2o.kr/v1/plagiarism/review' \
-H 'Content-Type: application/json' \
-d '{
"doc_id": "episode-001",
"text": "검사할 에피소드 본문"
}'
```
```javascript
const response = await fetch(
"https://plagiarism.o2o.kr/v1/plagiarism/review",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ doc_id: episodeId, text: episodeText })
}
);
if (!response.ok) throw new Error(`저작권 검사 실패: ${response.status}`);
const result = await response.json();
originality.textContent = `${result.copyright.originality_percent}%`;
copyrightDescription.textContent = result.copyright.description;
similarSentenceCount.textContent = result.similar_sentences.label;
aiSuspicion.textContent = result.ai_generation_suspicion.label;
legalTitle.textContent = result.legal_judgment.label;
legalDescription.textContent = result.legal_judgment.summary;
```
## 8. 오류 처리
| HTTP | 의미 | 처리 |
|---|---|---|
| `200` | 검사 완료 | 응답으로 화면 갱신 |
| `401` | API 키 누락 또는 불일치 | 인증 설정 확인 |
| `422` | 요청 형식 오류 또는 빈 본문 | 입력값 확인 |
| `503` | 탐지 또는 판례 검토 기능 사용 불가 | 잠시 후 재시도 |
| `500` | 서버 내부 오류 | 오류 로그와 `doc_id` 전달 |
앱은 검사 중 로딩 상태를 표시하고, 실패하면 직전 성공 결과를 새 결과처럼 표시하지 않는다.
## 9. 상세 API
관리자 화면에서 일치 원문, 좌표, 점수 구성 등 상세 증거가 필요할 때만
`POST /v1/plagiarism/detect`를 사용한다. 모바일 저작권 탭은 응답 크기가 작은
`POST /v1/plagiarism/review`를 사용한다.
이 결과는 등록 코퍼스와 판례에 기반한 검토 보조 의견이며 법률상 침해 확정이 아니다.
상세 응답에는 기존 필드 외에 다음 정보가 추가되었다. 모두 추가 필드이므로 기존
`/v1/plagiarism/review` 연동에는 영향이 없다.
| 응답 필드 | 설명 |
|---|---|
| `ai_generation` | 모델 버전, 점수, 구간별 의심도와 주의사항 |
| `legal_risk` | 판례 기반 검토 상태, 인용 사건번호와 A/B/C 검토 등급 |
| `score_semantics` | 검색 점수와 임계값의 의미, 일치 범위 |
| `has_similarity_match` | 등록 코퍼스에서 유사 원문이 확인됐는지 여부 |
| `corpus_scope_note` | 검색 대상 코퍼스 범위 안내 |
| `matches[].source_*` | 일치 원문의 문서·세그먼트·페이지·문자 좌표 |
## 10. 판례 조회 API
관리 화면에서 엔진에 적재된 판례를 검색할 때 사용한다. 판례 545건 전체가 검색·인용
후보이며, A/B/C는 제외 기준이 아니라 검토 품질과 직접성을 나타내는 우선순위다.
```text
GET /v1/precedents?q=어문저작물&grade=A&work_type=literary&offset=0&limit=25
```
| 쿼리 | 설명 |
|---|---|
| `q` | 사건번호·제목·판단 요지 검색 |
| `grade` | `A`, `B`, `C`, `unreviewed` 중 하나 |
| `work_type` | 저작물 유형 필터 |
| `offset`, `limit` | 페이지 위치와 개수. `limit` 최대 100 |
응답의 `loaded_total`은 전체 적재 판례 수, `graded_total`은 사람이 A/B/C 검토를 마친
판례 수다. 각 항목에는 `case_id`, `title`, `source_url`, `grade`, `holding_excerpt` 등이
포함된다.
## 11. 맞춤 요약 API
```text
POST /v1/summary
```
```json
{
"text": "요약할 자서전 본문",
"detail": "standard",
"emphasis": ["가족", "창업"],
"max_sentences": 5,
"use_abstractive": false
}
```
| 필드 | 설명 |
|---|---|
| `detail` | `brief`, `standard`, `detailed`. 기본 `standard` |
| `emphasis` | 우선 반영할 주제·키워드, 최대 10개 |
| `ratio` | 직접 지정할 요약 비율. 지정하면 `detail`보다 우선 |
| `max_sentences` | 최대 요약 문장 수 |
| `use_abstractive` | LLM 사용 요청. 사용할 수 없으면 추출 요약으로 폴백 |
## 12. 상태 확인 API
`GET /v1/health`에서 기존 상태값과 함께 다음 필드를 확인할 수 있다.
| 필드 | 설명 |
|---|---|
| `corpus_size` | 검색 가능한 전체 세그먼트 수 |
| `corpus_documents` | 적재된 원문 문서 수 |
| `index_backend` | 현재 검색 인덱스 구현 |
| `ai_model_ready` | 학습된 AI 의심도 모델 준비 여부 |
| `precedent_count` | 엔진에 적재된 판례 수 |

View File

@ -44,7 +44,7 @@
모바일 저작권 탭은 이 API를 사용한다. 내부 상세 탐지 결과 중 화면에 필요한
독창성, 유사도, 대조 건수, 유사 문장 수, AI 의심도, 판례 판단만 반환한다.
요청 형식은 기존 `POST /v1/plagiarism/detect`와 동일하며 응답 계약은
`docs/API_GUIDE_BAIKAL.md`를 따른다.
본 문서를 따른다.
## 3. 상세 표절 탐지 — `POST /v1/plagiarism/detect`
@ -177,7 +177,7 @@
| `matches[].case_candidates[]` | array | 태그 동점 케이스 **전부**. 태그만으로는 1:1로 좁혀지지 않으므로(A1·A2·A3·A4·A5·A6·A15 는 태그가 동일) 원본의 종류로 사람이 확정한다 |
| `matches[].case_candidates[].handling` | string | `technical_detection`(v1.3 ●) / `terms_or_report`(○) |
| `matches[].case_candidates[].representative_precedents[]` | array | v1.3 IX장 총괄표의 대표판례 사건번호 |
| `matches[].case_candidates[].precedents_without_source[]` | array | 대표판례이나 적재본에 없어 출처 제시 불가. `docs/PRECEDENT_SOURCE_GAP.md` 참조 |
| `matches[].case_candidates[].precedents_without_source[]` | array | 대표판례이나 적재본에 없어 출처 제시 불가. 목록은 `docs/COMBOOKS_CASE_MATCHING_REPLY_20260918.md` 2절 |
| `matches[].evidence_spans[]` | array | 본문 내 일치 구간 `{start, end, matched}` — 하이라이트용 |
| `matches[].partial_signal` | object | 군집화 기반 부분 표절(인물만 교체 등) 분해 — 침해요소 DB 적재용 |
| `ccl_basis` | string\|null | 사람이 읽는 판정 근거 문장 |
@ -247,3 +247,61 @@ FastAPI 표준. HTTP 상태코드 + `detail`.
4. `compared_count` 는 현재 로딩된 검색 세그먼트 수다. 문서 수와 혼동하지 않는다.
5. 현재 운영 코퍼스는 612개 문서, 37,891개 세그먼트이며 판례는 545건이다. 데이터
증분 적재 시 수치는 달라질 수 있으므로 화면에서는 API 반환값을 그대로 사용한다.
---
## 7. 케이스 매칭 응답 계약 (2026-09-18)
### 7-1. 표시 대상
`POST /v1/plagiarism/detect`와 `POST /v1/plagiarism/batch`의 options에
`"audience": "author"`를 지정하면 저자용 JSON으로 직렬화한다.
생략 시 `admin`이며 기존 케이스 후보·판례·법률 검토 응답이 유지된다.
허용하지 않은 audience 값은 422다. 이 선택은 권한 인증을 대신하지 않는다.
```json
{
"doc_id": "manuscript-123",
"text": "검사할 원고 본문",
"options": {"audience": "author", "return_evidence": true}
}
```
저자용 응답은 `legal_risk`, `is_infringement`를 생략한다. matches 각각에서
`case_id`, `case_title`, `case_candidates`, `tags`, `infringement_type`,
`publication_verdict`, `publication_verdict_status`를 생략한다(빈 값 반환이 아닌 키 생략).
일치 원천·좌표·증거 구간·점수·match_reasons는 유지한다. `return_evidence=false`이면
기존처럼 evidence_spans는 빈 목록이다. 자유형 `ccl_basis`는 다음 고정 문장을 사용한다.
- 매칭 있음: `확인이 필요한 부분이 있습니다.`
- 매칭 없음: `등록된 비교 자료에서 일치 구간을 찾지 못했습니다.`
매칭 없음은 비침해/출간 가능 판정이 아니다.
배치에서는 항목별 결과에 동일 규칙이 적용된다. 경량 `/v1/plagiarism/review`도
같은 옵션을 받고 legal_judgment의 판례 ID를 비우고 코드 없는 검토 문장을 제공한다.
기존 review 응답의 필드 구성은 유지한다.
### 7-2. 출간 판정
taxonomy 케이스와 관리자용 case_candidates 각각에 `publication_verdict`를 제공한다.
현재 값은 전부 null이다. 컴북스 코드표와 케이스 대응표가 없기 때문이다.
null은 출간 허용·불가 중 어느 쪽도 의미하지 않는다.
관리자용 match의 `publication_verdict`는 대표값이고, 아직 null이다.
`publication_verdict_status=source_pending`은 후보 판정 자료 미확보다.
일부 후보에 판정이 들어왔어도 우선순위 규칙을 확보하기 전에는 대표값을 만들지 않고
`review_required`를 반환한다. 코드표와 보수적 순서가 확정되면 이를 검증하는
회귀 테스트와 함께 대표 선정 로직을 추가한다. 후보별 판정은 삭제하지 않는다.
현재 스키마의 문자열은 연결 지점이며 공식 9종 enum 정의가 아니다.
### 7-3. 감사 기록 연결
상세 detect와 배치 항목에 `request_id`(매 호출별 UUID), `engine_version`,
`taxonomy_version`, `analyzed_at`이 들어간다. 같은 doc_id로 재검사하면 request_id는 달라진다.
새 기본 엔진 버전은 `o2o-plagiarism-2.2.1-cases-v1.3`이다. 환경변수로 버전을
덮어쓰는 운영 환경은 배포 시 같은 값을 반영해야 한다.
바이칼은 관리자용 원본 응답을 보관하고 요청/원천 ID와 연결해 최종 확정·수정 이유·
검토자·시각을 기록한다. 저자용 JSON에는 관리자의 확정에 필요한 후보가 없으므로
그것만 보관하면 케이스 정확도 평가를 할 수 없다. 감사 로그 5년 저장은 API UUID를
추가했다고 구현되는 기능이 아니며 바이칼 저장 계층에서 별도 구현해야 한다.

View File

@ -1,49 +0,0 @@
# 39개 침해 케이스 커버리지 갭 분석
- 전체 케이스: 39
- 엔진 탐지 대상: 10
- 평가 샘플 보유(covered): 0
- 탐지 대상이나 데이터 없음(요청 대상): 10
- 커버리지: 0.0%
| case_id | subgroup | actor | 탐지대상 | 샘플수 | 상태 |
|---|---|---|---|---|---|
| A1 | A-1 외부 텍스트 인용·수록 | 저자(가해) | O | 0 | detectable_no_data |
| A2 | A-1 외부 텍스트 인용·수록 | 저자(가해) | O | 0 | detectable_no_data |
| A3 | A-1 외부 텍스트 인용·수록 | 저자(가해) | O | 0 | detectable_no_data |
| A4 | A-1 외부 텍스트 인용·수록 | 저자(가해) | O | 0 | detectable_no_data |
| A5 | A-1 외부 텍스트 인용·수록 | 저자(가해) | O | 0 | detectable_no_data |
| A6 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A7 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A8 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A9 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A10 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A11 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A12 | A-2 타인 자서전·회고 | 저자(가해) | - | 0 | out_of_engine_scope |
| A13 | A-3 구술·강연·녹음 | 저자(가해) | - | 0 | out_of_engine_scope |
| A14 | A-4 학술·교육 자료 | 저자(가해) | - | 0 | out_of_engine_scope |
| A15 | A-4 학술·교육 자료 | 저자(가해) | - | 0 | out_of_engine_scope |
| A16 | A-5 번역물 | 저자(가해) | - | 0 | out_of_engine_scope |
| A17 | A-6 이미지·시각 자산 | 저자(가해) | - | 0 | out_of_engine_scope |
| A18 | A-6 이미지·시각 자산 | 저자(가해) | - | 0 | out_of_engine_scope |
| A19 | A-6 이미지·시각 자산 | 저자(가해) | - | 0 | out_of_engine_scope |
| A20 | A-6 이미지·시각 자산 | 저자(가해) | - | 0 | out_of_engine_scope |
| A21 | A-7 음원·영상 | 저자(가해) | - | 0 | out_of_engine_scope |
| A22 | A-8 디지털 사적 통신 | 저자(가해) | - | 0 | out_of_engine_scope |
| A23 | A-9 사후·고인 자료 | 저자(가해) | - | 0 | out_of_engine_scope |
| A24 | A-10 AI 도구 사용 | 저자(가해, 비의도) | O | 0 | detectable_no_data |
| A25 | A-10 AI 도구 사용 | 저자(가해, 비의도) | O | 0 | detectable_no_data |
| A26 | A-10 AI 도구 사용 | 저자(가해) | - | 0 | out_of_engine_scope |
| A27 | A-11 대필 | 저자·플랫폼 | - | 0 | out_of_engine_scope |
| B1 | B 저자(피해) | 저자(피해) | O | 0 | detectable_no_data |
| B2 | B 저자(피해) | 저자(피해) | O | 0 | detectable_no_data |
| B3 | B 저자(피해) | 저자(피해) | - | 0 | out_of_engine_scope |
| B4 | B 저자(피해) | 저자(피해) | - | 0 | out_of_engine_scope |
| C1 | C 플랫폼 | 플랫폼 | - | 0 | out_of_engine_scope |
| C2 | C 플랫폼 | 저자·플랫폼 | - | 0 | out_of_engine_scope |
| C3 | C 플랫폼 | 플랫폼 | - | 0 | out_of_engine_scope |
| D1 | D 다른 사용자 | 다른 사용자 | O | 0 | detectable_no_data |
| E1 | E 유족 | 유족 | - | 0 | out_of_engine_scope |
| E2 | E 유족 | 유족 | - | 0 | out_of_engine_scope |
| X1 | X 분류체계 외 | 저자(가해) | - | 0 | out_of_engine_scope |
| X2 | X 분류체계 외 | 저자(가해) | - | 0 | out_of_engine_scope |

View File

@ -1,55 +0,0 @@
# 케이스 매칭 응답 계약 (2026-09-18)
## 표시 대상
`POST /v1/plagiarism/detect`와 `POST /v1/plagiarism/batch`의 options에
`"audience": "author"`를 지정하면 저자용 JSON으로 직렬화한다.
생략 시 `admin`이며 기존 케이스 후보·판례·법률 검토 응답이 유지된다.
허용하지 않은 audience 값은 422다. 이 선택은 권한 인증을 대신하지 않는다.
```json
{
"doc_id": "manuscript-123",
"text": "검사할 원고 본문",
"options": {"audience": "author", "return_evidence": true}
}
```
저자용 응답은 `legal_risk`, `is_infringement`를 생략한다. matches 각각에서
`case_id`, `case_title`, `case_candidates`, `tags`, `infringement_type`,
`publication_verdict`, `publication_verdict_status`를 생략한다(빈 값 반환이 아닌 키 생략).
일치 원천·좌표·증거 구간·점수·match_reasons는 유지한다. `return_evidence=false`이면
기존처럼 evidence_spans는 빈 목록이다. 자유형 `ccl_basis`는 다음 고정 문장을 사용한다.
- 매칭 있음: `확인이 필요한 부분이 있습니다.`
- 매칭 없음: `등록된 비교 자료에서 일치 구간을 찾지 못했습니다.`
매칭 없음은 비침해/출간 가능 판정이 아니다.
배치에서는 항목별 결과에 동일 규칙이 적용된다. 경량 `/v1/plagiarism/review`도
같은 옵션을 받고 legal_judgment의 판례 ID를 비우고 코드 없는 검토 문장을 제공한다.
기존 review 응답의 필드 구성은 유지한다.
## 출간 판정
taxonomy 케이스와 관리자용 case_candidates 각각에 `publication_verdict`를 제공한다.
현재 값은 전부 null이다. 컴북스 코드표와 케이스 대응표가 없기 때문이다.
null은 출간 허용·불가 중 어느 쪽도 의미하지 않는다.
관리자용 match의 `publication_verdict`는 대표값이고, 아직 null이다.
`publication_verdict_status=source_pending`은 후보 판정 자료 미확보다.
일부 후보에 판정이 들어왔어도 우선순위 규칙을 확보하기 전에는 대표값을 만들지 않고
`review_required`를 반환한다. 코드표와 보수적 순서가 확정되면 이를 검증하는
회귀 테스트와 함께 대표 선정 로직을 추가한다. 후보별 판정은 삭제하지 않는다.
현재 스키마의 문자열은 연결 지점이며 공식 9종 enum 정의가 아니다.
## 감사 기록 연결
상세 detect와 배치 항목에 `request_id`(매 호출별 UUID), `engine_version`,
`taxonomy_version`, `analyzed_at`이 들어간다. 같은 doc_id로 재검사하면 request_id는 달라진다.
새 기본 엔진 버전은 `o2o-plagiarism-2.2.1-cases-v1.3`이다. 환경변수로 버전을
덮어쓰는 운영 환경은 배포 시 같은 값을 반영해야 한다.
바이칼은 관리자용 원본 응답을 보관하고 요청/원천 ID와 연결해 최종 확정·수정 이유·
검토자·시각을 기록한다. 저자용 JSON에는 관리자의 확정에 필요한 후보가 없으므로
그것만 보관하면 케이스 정확도 평가를 할 수 없다. 감사 로그 5년 저장은 API UUID를
추가했다고 구현되는 기능이 아니며 바이칼 저장 계층에서 별도 구현해야 한다.

View File

@ -24,7 +24,25 @@ King 52a0fdc 운영 엔진의 연속 일치 필수 게이트(true), 최소 35자
| 관리자 최종 확정 로그 스키마 및 케이스/출간 판정 합의 | CASE_MATCHING_KPI.md 산식 확정 |
현재 39건(A 27건)과 판례 545건을 유지한다. 39/27 고정 테스트를 느슨하게 바꾸지 않는다.
대표판례 출처 공백 14건은 PRECEDENT_SOURCE_GAP.md 참조. 신규 97건에 포함된다고 단정하지 않는다.
대표판례로 지정됐으나 운영 적재본 545건에 없어 출처를 제시할 수 없는 14건은 아래와 같다.
신규 97건에 포함된다고 단정하지 않는다. 요청 내용은 판결문 원문 또는 검증 가능한 공식 출처 URL이다.
| 사건번호 | 영향받는 침해 케이스 |
|---|---|
| 2006가합8583 | A21 |
| 2006나16757 | A6, A7, B2 |
| 2007가합16095 | A17, A18, A19 |
| 2007가합43936 | A16 |
| 2007다354 | A19, A3 |
| 2008다53812 | B3 |
| 2010도4468 | A8, A9 |
| 2012도13718 | X2 |
| 2013나2004096 | A23, E2 |
| 2016고정432 | A14 |
| 2017도19025 | B3 |
| 2019가단31377 | A26 |
| 2019가단5207564 | A17 |
| 2021가합588060 | A1 |
## 3. 전용 방지 장치 공백 7건에 대한 기술 회신
@ -69,7 +87,7 @@ TP 493 / FP 8 / TN 492 / FN 7, precision **98.4032%**, recall **98.60%**다.
- 성적서: [CASE_MATCHING_PRECISION_SCORECARD_20260918.json](../reports/CASE_MATCHING_PRECISION_SCORECARD_20260918.json)
- 입력 해시·환경·혼동행렬·검사 상태: [CASE_MATCHING_EVAL_20260918.json](../reports/CASE_MATCHING_EVAL_20260918.json)
- 연동 계약: [CASE_MATCHING_API.md](CASE_MATCHING_API.md)
- 연동 계약: [API_SPEC_BAIKAL.md 7절](API_SPEC_BAIKAL.md)
- 합의할 KPI: [CASE_MATCHING_KPI.md](CASE_MATCHING_KPI.md)
평가 프로세스 시작 시 코드 기본 버전 문자열은 2.0.0-pdf-v1.2였으므로 성적서도 해당

View File

@ -1,144 +0,0 @@
# 컴북스 요청 데이터 스펙 & 요약 정답셋 작성 가이드
> 오투오 과제2(콘텐츠 표절 탐지 / 요소 분석) 2단계 고도화에 필요한 데이터 스펙.
> 데이터 수령 즉시 학습·검증에 투입할 수 있도록, 포맷을 본 문서로 사전 고정한다.
> 관련 평가 스크립트: `scripts/eval_rouge.py`, `scripts/eval_metadata_f1.py`,
> `scripts/analyze_case_coverage.py`
## 0. 요약 — 무엇을, 왜, 어떤 포맷으로
| # | 데이터 | 용도(성능지표) | 제공 주체 | 비고 |
|---|---|---|---|---|
| 1 | 표절/비표절 샘플 글 | 표절 정밀도 97% (No.4) | 컴북스 | 39 케이스·자서전 도메인 커버 |
| 2 | article 본문 3만건 + 저작권 확보분 | 요소 추출·군집화 코퍼스 | 컴북스 | 1단계 계획 수량 |
| 3 | 도메인별 텍스트 | 요약 모델 범용성 (No.7) | 컴북스+공개 | 장르 다양성 |
| 4 | 콘텐츠 요소(메타) 정답 라벨 | 메타 추출 F1 83 (No.3) | 컴북스 1단계분 | KLUE NER 공개로 보완 |
| 5 | **요약 정답셋(reference summary)** | 요약 ROUGE 65 (No.7) | **별도 구축** | 컴북스 미보유 → 역할분담 |
| 6 | **Human Feedback 선호 라벨** | 표절검출 HF 고도화 | **별도 구축** | 라벨링 공수 필요 |
→ #1~#4 는 컴북스 직접 제공, **#5·#6 은 컴북스가 줄 수 없는 데이터**로 제작 주체를 먼저 합의해야 한다.
---
## 1. 표절/비표절 샘플 글 (정밀도 97% 평가)
- **포맷 (JSONL)**: 표절 페어 단위
```json
{"pair_id": "A1-001", "source_text": "원본 ...", "suspect_text": "검사 대상 ...",
"is_plagiarism": true, "case_id": "A1", "note": "시·노래 가사 무단 인용"}
```
- **필수 커버리지**: 자동 탐지 대상 케이스(`detectable_internal=True`, 현재 10종)를
**모두** 포함. 케이스별 최소 30건 이상 권장(정밀도 0.97 신뢰구간 확보).
- 현재 요청 대상 케이스 목록은 `python -m scripts.analyze_case_coverage` 로 산출.
- **도메인**: 출판 콘텐츠뿐 아니라 **자서전 도메인** 표절/비표절을 별도 분리 제공.
(현 평가셋 999쌍은 출판 콘텐츠 기준 → 자서전 도메인 정밀도 미검증)
- **균형**: 표절:비표절 ≈ 1:1. 비표절에는 '합법적 인용·정상 2차 창작'을 포함해
과탐(FP)을 줄이는 hard-negative 로 활용.
## 2. article 본문 데이터 (요소 추출·군집화 코퍼스)
- **포맷**: `data/reference/` 와 동일한 `.txt` 또는 JSONL `{"doc_id","title","text"}`
- **수량**: 계획서 기준 3만건. 우선 1.5천~3천건 표본 선제공 가능하면 군집화·요소
추출 튜닝을 조기 착수.
- **저작권**: 학습/평가 사용 가능 범위(CCL 또는 계약)를 메타로 명시 → `license` 필드.
## 3. 도메인별 텍스트 (요약 범용성)
- 장르 다양성 확보용(소설/에세이/자서전/실용 등). 요약 모델의 도메인 편향 방지.
- 포맷은 #2 와 동일. `genre` 필드 권장.
## 4. 콘텐츠 요소(메타) 정답 라벨 (메타 F1)
- **포맷 (JSONL)** — `scripts/eval_metadata_f1.py` 입력과 동일:
```json
{"text": "원문 ...", "characters": ["홍길동"], "motifs": ["복수"],
"keywords": ["활빈당","탐관오리"], "genre": "역사"}
```
- 컴북스 1단계 '콘텐츠 구성요소 정의' 라벨을 article 단위로 제공.
- 공개 보완: KLUE NER(`--klue`)로 인물(PS) 추출 F1 을 즉시 측정 가능.
---
## 5. 요약 정답셋(reference summary) 작성 가이드 — **별도 구축 필요**
> 컴북스 데이터에는 '본문'만 있고 '요약 정답'이 없다. ROUGE(No.7) 평가는 정답
> 요약이 전제이므로 아래 가이드에 따라 별도 구축한다. **제작 주체 합의 필요**:
> (A) 컴북스가 작성 / (B) 오투오가 GPT 생성 후 컴북스 검수 / (C) 혼합.
- **포맷 (JSONL)** — `scripts/eval_rouge.py` 입력과 동일:
```json
{"text": "원문 전체 ...", "reference": "사람이 작성한 정답 요약 ..."}
```
- **다중 참조** — 계획서 수식이 `Σ_S∈{Reference Summaries}` 로 다중 참조를 전제한다.
측정용 세트는 **1건당 참조 2개**를 권장한다. 표현 다양성을 흡수해 점수가 안정된다.
```json
{"text": "원문 ...", "references": ["작성자 A 요약 ...", "작성자 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 선호 라벨 — **별도 구축 필요**
> 표절 검출 HF Preference Optimization(계획서 p.22)용. '표절 글을 비선호'로 학습.
> 단순 표절/비표절 데이터가 아니라 **사람의 선호 판단 라벨**이 필요(라벨링 공수).
- **파이프라인**: `scripts/build_preference_dataset.py`
1. `template` — 후보쌍(원본+글A+글B) → 라벨링 템플릿 생성
2. (사람) 각 행에 `chosen`/`rejected` 확정, `label_status="labeled"`
3. `convert` — 라벨 완료 파일 → DPO 학습셋(JSONL) + 검증/통계
- **라벨링 형식 (JSONL)**:
```json
{"pair_id":"p1","prompt":"...[원문]...","candidate_a":"정상 변형글",
"candidate_b":"표절글","label_status":"labeled",
"chosen":"정상 변형글","rejected":"표절글"}
```
- **수량**: 선호학습 최소 500쌍 이상 권장.
---
## 7. 공통 — 납기 명시 요청
정밀도 97%·요약 ROUGE 65 는 위 데이터가 전제이므로, **각 항목 제공 시점**을
함께 확정한다(연말 인수시험 역산). 부분 표본 선제공이 가능하면 군집화/요소추출
튜닝을 데이터 도착 전 표본으로 조기 착수한다.

View File

@ -201,7 +201,7 @@ provisional 플래그로만 알린다.
**추론하지 않으며**, 미제공 시 `legal_risk.missing_factors` 에 그대로 남는다.
GPT 판례 재판단을 활성화하는 방법과 응답 필드는
[`LLM_LEGAL_JUDGE.md`](LLM_LEGAL_JUDGE.md)를 따른다. 기본값은 비활성이며,
`USE_LLM_LEGAL_JUDGE` 환경변수로 제어한다. 기본값은 비활성이며,
원고 증거 구간의 외부 API 전송이 승인된 환경에서만 활성화한다.
```json

View File

@ -1,71 +0,0 @@
# 2단계 통합 인터페이스 명세 (오투오 ↔ 바이칼/컴북스)
> 계획서 마일스톤 2.4(요소 추출+표절 검출 고도화 통합), 3.x(침해요소 DB 공유),
> 5.x(공유서비스 고도화) 연동을 위한 API 계약. 데이터 수령 전 사전 확정용.
## 1. 오투오가 제공하는 API (현행)
| Method | Path | 용도 | 비고 |
|---|---|---|---|
| POST | `/v1/plagiarism/detect` | 단건 표절 탐지 | 군집 부분표절 신호 포함 |
| POST | `/v1/plagiarism/batch` | 배치(≤500) | 비동기 잡 |
| POST | `/v1/summary` | 스토리 요약 | 신규(과제2 ②) |
| GET | `/v1/taxonomy` | 10태그·39케이스 | 컴북스/바이칼 라벨 공유 |
| GET | `/v1/health` | 엔진 상태 | |
## 2. detect 응답 — 2단계 신규 필드 `partial_signal`
군집화 기반 요소별 부분 표절 분해. 바이칼 침해요소 DB 에 '무엇을 바꿔치기했는지'를
구조화해 적재할 수 있도록 제공.
```json
{
"matches": [{
"source_doc": "ref-0003",
"similarity": 0.88,
"tags": [{"tag": "reproduction", "role": "primary", "label_ko": "복제권"}],
"case_id": "A1",
"partial_signal": {
"cluster_id": 2,
"verdict": "element_swap_plagiarism",
"signature_score": 0.74,
"per_element": {"lemmas": 0.92, "keywords": 0.88, "characters": 0.0, "motifs": 0.1},
"retained_elements": ["lemmas", "keywords"],
"changed_elements": ["characters", "motifs"]
}
}]
}
```
- `verdict`: `near_duplicate` | `element_swap_plagiarism` | `weak` | `none`
- `element_swap_plagiarism` = 본문(lemma/키워드) 유지 + 인물/모티프만 교체한 표절.
## 3. 바이칼 침해요소 DB 연동 (계획서 3.x)
- 오투오 detect 결과 → 바이칼 침해요소 케이스 DB 적재 매핑:
- `case_id`, `tags[]`, `partial_signal.verdict`, `score_breakdown` → DB 컬럼.
- 분류체계 버전 동기화: `GET /v1/taxonomy` 의 `cases_version`/`meta_tags_version`.
- 합의 필요: ① DB 스키마(필드/타입), ② 적재 방식(API push vs 배치 export),
③ 침해요소 식별자 체계(컴북스 콘텐츠>제품>아티클 식별코드와 매핑).
## 4. 공유서비스 / 저작권 자동 분석 경계
- 저작권 침해 **자동 분석 모듈**(1차/2차 침해 자동 판단, 권한 기반 적용범위 계산)은
계획서상 **바이칼** 담당(p.22). 오투오는 표절 '유사도/태그/케이스' 신호까지 제공,
권한·계약 기반 침해 '확정' 판단은 바이칼 모듈로 위임.
- 경계 인터페이스: 오투오 `MatchResult` → 바이칼 침해 판단 입력. 본 매핑 표를
통합 설계 회의에서 확정.
## 5. 인증/배포
- 현재 API Key 인증(`app/core/auth.py`). 공유서비스 통합 시 OAuth2(계획서 p.18)와의
연동 방식 협의.
- 상용 데이터 구간 암호화(AES256-CBC)·키 배포는 바이칼 공유서비스 아키텍처 기준 적용.
## 6. 통합 테스트 항목(연말 인수시험 역산)
- [ ] taxonomy 버전 동기화 라운드트립
- [ ] detect → 바이칼 DB 적재 E2E
- [ ] partial_signal 필드 계약 테스트
- [ ] summary 엔드포인트 통합
- [ ] 배치 처리 성공률 95%(마일스톤 점검기준)

View File

@ -1,75 +0,0 @@
# GPT 판례 판단 연동
## 동작 구조
`POST /v1/plagiarism/detect`는 다음 순서로 법적 검토 보조 신호를 만든다.
1. 등록 코퍼스에서 유사 문서와 증거 구간을 찾는다.
2. `LegalRiskEngine`이 저작물 유형과 법적 태그로 등록 판례 Top 5를 고른다.
3. GPT Judge가 탐지 증거와 Top 5 판례만 비교한다.
4. 서버가 Structured Outputs 스키마와 판례 ID를 검증하고, 사람 검토가 해제되지 않도록 `review_required=true`를 강제한다.
5. 호출 실패·형식 오류·미등록 판례 ID가 있으면 규칙 기반 결과로 복귀한다.
GPT는 전체 판례 545건을 한 번에 받지 않으며 법률상 침해를 확정하지 않는다.
## 설정
기본값은 비활성이다. 원고의 증거 구간이 외부 API로 전송되는 것을 승인한 환경에서만
다음 값을 설정한다.
```dotenv
OPENAI_API_KEY=...
USE_LLM_LEGAL_JUDGE=true
OPENAI_JUDGE_MODEL=gpt-4o-mini
LLM_JUDGE_TIMEOUT_SECONDS=20
LLM_JUDGE_MAX_EVIDENCE_CHARS=4000
```
OpenAI 응답 저장은 `store=false`로 요청한다. 전송되는 원고 인용문의 총 길이는
`LLM_JUDGE_MAX_EVIDENCE_CHARS`로 제한된다. API 키가 없으면 판례 Judge는 활성화되지 않는다.
## 응답 필드
```json
{
"legal_risk": {
"status": "review_required",
"judgment_method": "llm",
"llm_verdict": "likely",
"llm_confidence": 0.82,
"llm_review_required": true,
"precedent_ids": ["2012다73493"],
"llm_matched_precedent_ids": ["2012다73493"],
"supporting_reasons": ["..."],
"counter_reasons": ["..."],
"missing_factors": ["..."],
"judge_model": "gpt-4o-mini",
"judge_prompt_version": "legal-judge-v2",
"judgment_summary": "2012다73493 판례의 판단 기준과 탐지 증거를 비교한 결과, 표현 일치 범위가 크다는 사유로 저작권 침해가 의심되어 추가 검토가 필요합니다."
}
}
```
- `judgment_method=llm`: GPT 판단과 서버 검증이 완료됨
- `judgment_method=rule_based`: 기능이 비활성 또는 판단할 매칭·판례가 없음
- `judgment_method=rule_fallback`: GPT 호출 또는 검증 실패로 규칙 결과 사용
- `precedent_ids`: 규칙 엔진이 검색한 판례 Top 5
- `llm_matched_precedent_ids`: GPT가 실제 근거로 선택한 판례. Top 5 밖의 ID는 거부됨
- `llm_verdict`: `likely`, `unlikely`, `insufficient_evidence` 중 하나
- `judgment_summary`: 검증된 사건번호와 핵심 사유를 결합한 사용자 표시용 판례 의견
사용자 화면에는 모델명이나 `judgment_method`를 주 문구로 표시하지 않는다. 먼저
`judgment_summary`를 보여주고 관련 사건번호, 지지·반대 근거, 추가 확인사항을 함께 표시한다.
`llm_confidence`는 GPT 응답의 자기평가 값이며 법적 침해 확률이나 통계적으로 보정된
확률이 아니다. 운영 감사 시에는 모델명, 프롬프트 버전, 입력 판례 ID와 결과를 함께
보관해야 한다.
## 검증
```bash
python3 -m pytest tests/test_legal_risk.py -q
```
실제 OpenAI 호출은 테스트에서 수행하지 않는다. 운영 전 별도 검증 세트에서 모델별
일치율, `insufficient_evidence` 비율, 사람 검토자와의 불일치를 측정한다.

View File

@ -1,54 +0,0 @@
# 오투오 2단계 진행 현황 (2026-08-20 데이터 수령 반영)
> 컴북스가 제공한 실제 사람 작성 자서전 에피소드를 익명 human 코퍼스로
> 적재하는 기능과 AI 대조문 생성·그룹 분할 파이프라인을 구현했다.
## 1. 한눈에 보기
| 남은 작업(계획서 2단계) | 선행 구현 상태 | 데이터 도착 후 할 일 |
|---|---|---|
| 표절 검출 고도화 — 군집화 | ✅ `engine/clustering.py` 구현·테스트 | 실데이터로 임계값 튜닝 |
| 표절 검출 고도화 — Human Feedback | ✅ 선호데이터 파이프라인 골격 | 사람 라벨 → DPO 학습 |
| 스토리 요약 모듈 | ✅ 추출적 요약+통합 골격+API | 추상적(sLLM) 연결, 정답셋 평가 |
| 메타 추출 F1(No.3) | ✅ 평가 하니스(KLUE NER 호환) | 정답 라벨로 정식 측정·향상 |
| 표절 정밀도 97%(No.4) | ✅ 케이스 갭 분석으로 요청목록 산출 | 자서전 도메인 샘플로 달성 |
| 요약 ROUGE 65(No.7) | ✅ ROUGE 평가 모듈·CLI | 요약 정답셋으로 정식 측정 |
| SW 저작권 등록 | ✅ 등록 준비 문서 | 서류 제출 |
| 2단계 통합 | ✅ 통합 인터페이스 명세 | 바이칼/컴북스 E2E |
| 도메인 데이터 적재 | ✅ 533문서·6,331에피소드 드라이런 | 운영 코퍼스 반영 |
| 사용자 맞춤형 요약 | ✅ 상세도·강조 옵션 | 요약 정답셋 튜닝 |
| AI 대조문·부가 의심도 | ✅ Qwen 5,600건 생성·모델 배포 | 미학습 생성기 외부검증 |
| ROUGE 라벨링 | ✅ 300건·2인 검수 패킷 생성 | 사람 요약 입력·검수 |
## 2. 구현 산출물
### 코드 모듈 (테스트 포함)
- `app/engine/clustering.py` — 군집화 기반 부분 표절(요소 교체) 판별. detect 응답에
`partial_signal` 필드로 노출. (`tests/test_clustering.py`)
- `app/engine/summarizer.py` — 추출적(TextRank)+통합 요약. `/v1/summary` 엔드포인트.
외부 의존 0으로 동작, LLM 키 있으면 추상적 단계 결합. (`tests/test_summarizer.py`)
- `app/engine/rouge.py` — ROUGE-1/2/L 자체 구현 (성능지표 No.7). (`tests/test_rouge.py`)
- `app/engine/metadata_eval.py` — 요소 추출 F1(성능지표 No.3). (`tests/test_metadata_eval.py`)
- `app/engine/case_coverage.py` — 39 케이스 커버리지 갭 분석. (`tests/test_case_coverage.py`)
- `app/engine/preference.py` — HF 선호학습 데이터 골격. (`tests/test_preference.py`)
### 평가/유틸 스크립트 (데이터 도착 시 즉시 사용)
- `scripts/eval_rouge.py` — 요약 ROUGE 평가 (dry-run 내장)
- `scripts/eval_metadata_f1.py` — 메타 추출 F1 (KLUE NER `--klue` 지원)
- `scripts/analyze_case_coverage.py` — 케이스 갭 → 데이터 요청 목록
- `scripts/build_preference_dataset.py` — 선호데이터 template/convert
### 문서
- `docs/DATA_REQUEST_SPEC.md` — 컴북스 요청 데이터 스펙 + 요약 정답셋 가이드
- `docs/INTEGRATION_INTERFACE.md` — 2단계 통합 인터페이스
- `docs/SW_COPYRIGHT_REGISTRATION.md` — SW 저작권 등록 준비
## 3. 추가 데이터·라벨에 묶여 남는 것
- 표절 **정밀도 97% 최종 달성** — 자서전 도메인 표절 샘플 필요
- 요약 **ROUGE 65 학습·최종 평가** — 요약 정답셋 필요
- HF **실제 선호학습 수행** — 사람 선호 라벨 필요
- sLLM **학습 실행** — A100급 GPU 인프라 필요
## 4. 평가환경 (계획서 p.24 기준)
- 공인인증 평가환경: A100 GPU / Python 3.9 / transformers 4.39.3
- 본 저장소 평가 스크립트는 위 환경에서 정답셋만 연결하면 동작하도록 작성됨.

View File

@ -1,245 +0,0 @@
# 프로젝트 판례 데이터 정리
이 문서는 저장소에서 실제 판례로 보관·인용되는 데이터를 한곳에서 찾기 위한 인벤토리다. 작성 기준은 현재 작업 트리이며, 법률 의견서가 아니라 데이터 현황 문서다.
## 한눈에 보기
| 구분 | 규모 | 실제 사용 범위 |
|---|---:|---|
| 운영 적재본 | 545건 | API의 법적 위험도 엔진이 직접 로드 |
| v1.3 대표·참고 판례 | 29건 | 39개 침해 시나리오의 분류·매핑 근거 |
| 원천 판례 목록 | 182행 / 사건번호 142개 | 대표판례 선별의 원천 자료 |
| 한국저작권위원회 공식 목록 | 2,085건 | 프로젝트 범위 후보 탐색 및 공식 출처 확인 |
- 원천 182행은 세 목록의 행 수 합계다: 어문저작물 36건, 저작권·명예훼손 58건, 저작인격권 88건.
- 사건번호 기준으로 합치면 142개다. 목록 사이 중복 39행과 `저작인격권` 목록 내부의 `92다31309` 중복 1행이 제거된다.
- 원천 142개 중 판시사항이 하나 이상의 목록에 있는 사건은 96개, 모든 목록에서 비어 있는 사건은 46개다.
- `A1`~`X2`는 법원 사건번호가 아니라 프로젝트의 침해 시나리오 ID다. 테스트의 `case-1`, `2020다1`, `2019다2`, `2018다3`도 가상 데이터이므로 실제 판례 집계에서 제외했다.
## 데이터 계층과 사용 위치
1. 운영 엔진은 [`data/precedents/precedents.jsonl`](../data/precedents/precedents.jsonl)의 545건을 읽는다. 경로 기본값은 `app/core/config.py`, 로딩·검증은 `app/engine/legal_risk.py`에 있다.
2. [`나누구_저작권침해_아카이빙_실무방안(판례통합)_v1.3.docx`](<../data/출판과제 판례 데이터(컴북스)/나누구_저작권침해_아카이빙_실무방안(판례통합)_v1.3.docx>)는 원천 세 목록에서 29건을 선별해 분류체계와 39개 시나리오의 실증 근거로 사용한다. 판례는 신규 검출 대상이 아니라 분류·매핑 근거로만 편입한다는 원칙을 명시한다.
3. 아래 세 `.xlsx`는 원천 목록이다. 같은 이름의 `.xls`는 저장소에 함께 있는 레거시 형식이며, 이 문서의 집계는 읽기 가능한 `.xlsx`를 기준으로 했다.
- **L** — [어문저작물 침해_판례목록202505.xlsx](<../data/출판과제 판례 데이터(컴북스)/어문저작물 침해_판례목록202505.xlsx>): 36행, 사건번호 36개
- **D** — [저작권 명예훼손 판례목록.xlsx](<../data/출판과제 판례 데이터(컴북스)/저작권 명예훼손 판례목록.xlsx>): 58행, 사건번호 58개
- **M** — [저작인격권_판례목록.xlsx](<../data/출판과제 판례 데이터(컴북스)/저작인격권_판례목록.xlsx>): 88행, 사건번호 87개
## 운영 적재 판례
2026-08-18에 한국저작권위원회 공식 목록 2,085건을 확인해 제목 후보 702건을 상세
검토하고, 국내 사건번호 기준 중복을 제거했다. 기존 엑셀 142개 사건번호도 공식
사이트에서 역검색했다. 병합 전 후보 679건 중 엔진 매칭에 필요한 저작물 유형·판단
기준 또는 법적 태그가 부족한 134건을 제외하여 545건을 운영 JSONL에 적재했다.
- 사건번호는 상세 본문 첫머리 또는 첨부 판결문 파일명에서 확인한다.
- 출처는 개별 한국저작권위원회 HTTPS 상세 페이지다.
- 엑셀과 공식 수집본에서 중복 확인된 사건은 라벨 필터 전 39개이며, 운영 545건에는 31개가 남았다.
- 엑셀 142개 중 공식 상세 페이지를 찾지 못한 103개는 출처를 임의 생성하지 않고 제외했다.
- 전체 집계와 제외 사건번호는 [`selection_audit.json`](../data/precedents/selection_audit.json)에 있다.
- `2012다73493`을 포함한 기존 시드는 공식 상세 페이지의 판시사항으로 갱신됐다.
이 데이터는 검증 및 관련 판례 검색용 자동 라벨이다. 법률 전문가가 사건별 라벨과
결론을 확정했다는 의미는 아니다.
## v1.3에서 선별 사용한 대표·참고 판례 29건
| 사건번호 | 선고일 | 원천 표제 | 사용 주제 |
|---|---|---|---|
| 2012다73493 | 2014. 1. 29. | 손해배상(기)·손해배상(기) | 실질적 유사성·의거성 |
| 2006나16757 | 2007. 7. 13. | 손해배상(지) | 실질적 유사성·의거성 |
| 2010다70520 | 2012. 8. 30. | 손해배상(지)·손해배상(지) | 실질적 유사성·의거성 |
| 2017다212095 | 2019. 6. 27. | 저작권침해금지등청구의소 | 실질적 유사성·의거성 |
| 2011도3599 | 2013. 8. 22. | 저작권법 위반 | 2차적저작물(번역·요약) |
| 2007가합43936 | 2008. 6. 20. | 저작권침해금지등 | 2차적저작물(번역·요약) |
| 2010도4468 | 2010. 9. 9. | 저작권법위반 | 성명표시·전시·공표 |
| 2021가합25193 | 2024. 7. 11. | 저작권침해금지등청구의소 | 성명표시·전시·공표 |
| 2019가단31377 | 2020. 12. 18. | 손해배상(저) | 성명표시·전시·공표 |
| 2010다79923 | 2013. 4. 26. | 저작인격권 침해 정지 | 동일성유지·출판계약 |
| 2011다101148 | 2015. 4. 9. | 손해배상 | 동일성유지·출판계약 |
| 2012다109798 | 2015. 4. 9. | 손해배상금 | 동일성유지·출판계약 |
| 96다273 | 1996. 8. 23. | 상표권사용금지가처분 | 제호 |
| 2023카합21631 | 2024. 3. 14. | 출판물판매금지등가처분 | 제호 |
| 2021가합588060 | 2023. 12. 15. | 손해배상(기) | 인용·공정이용 |
| 2007가합16095 | 2007. 6. 21. | 손해배상(기) | 사진·이미지 |
| 2019가단5207564 | 2021. 4. 9. | 손해배상(저) | 사진·이미지 |
| 2013나2004096 | 2013. 6. 13. | 손해배상(기)·손해배상(기) | 사자·유족 |
| 2012다204587 | 2015. 8. 27. | 손해배상 | 사자·유족 |
| 2011가합60365 | 2012. 5. 25. | 손해배상(기)등 | 명예훼손·무단수록 |
| 2012도13718 | 2014. 9. 4. | 명예훼손(일부예비적죄명:모욕)·저작권법위반 | 명예훼손·무단수록 |
| 2007다354 | 2009. 5. 28. | 저작권침해금지등 | 명예훼손·무단수록 |
| 2017도19025 | 2021. 9. 9. | 저작권법위반방조[저작재산권자의 이용허락 없이 전송되는 공중송신권 침해 게시물로 연결되는 링크를 이른바 ‘다시보기’ 링크 사이트 등에서 공중의 구성원에게 제공하는 행위가 공중송신권 침해의 방조가 되는지 여부가 문제된 사건] | 플랫폼 책임(OSP) |
| 2008카합968 | 2008. 8. 5. | 저작권침해금지등가처분 | 플랫폼 책임(OSP) |
| 2008다53812 | 2009. 4. 16. | 손해배상(기)등 | 플랫폼 책임(OSP) |
| 2020도10180 | 2023. 11. 30. | 저작권법위반[저작인격권 침해로 인한 저작권법위반죄 해당 여부가 문제된 사건] | 형사·친고죄 |
| 2016고정432 | 2016. 8. 18. | 저작권법위반 | 형사·친고죄 |
| 2006가합8583 | 2006. 10. 20. | 손해배상(기) | 시나리오 참고 |
| 98나23616 | 1999. 4. 7. | 저작권침해금지가처분 | 시나리오 참고 |
대표판례의 시나리오 매핑에서 명시된 핵심 예외·보조 용도는 다음과 같다.
- `2021가합588060`: 인용·공정이용에 해당하면 침해로 라벨링하지 않는 예외 근거.
- `2010도4468`: 어문저작물 전시권 제외 및 공표권 관련 법리 근거. `data/taxonomy/meta_tags_v1.0.json`에도 제외 사유로 직접 인용된다.
- `2020도10180`: 저작인격권 침해의 형사처벌 및 사회적 명예 판단 근거.
- `2006나16757`, `2010다70520`: 아이디어/표현 구분과 실용·학술 저작물의 제한된 창작성을 근거로 오탐 억제 로직을 설명.
- `2012다73493`: 기술은 후보를 추출하고 인간이 의거성과 실질적 유사성을 최종 판단해야 한다는 기준.
- `2006가합8583`, `98나23616`은 각각 음원과 폰트 시나리오의 참고 판례로만 표시된다.
v1.3의 39개 시나리오 중 사건번호가 직접 기재된 것은 29개이며, 나머지 10개는 확립 판례 없음, 일반 법리, 계약·상표·개인정보 등 저작권 밖 처리로 표시된다. 같은 판례가 여러 시나리오에 반복 매핑되므로 고유 대표·참고 판례 수도 29개다.
## 원천 판례 전체 목록: 고유 사건번호 142개
표의 `출처`는 위 원천 파일 약어다. `판시사항`은 같은 사건의 중복 행 중 하나라도 값이 있으면 `있음`으로 표시했다. 세부 판시사항·참조조문은 원천 파일에서 확인한다.
| 사건번호 | 선고일 | 표제 | 출처 | 판시사항 |
|---|---|---|---|---|
| 2023다233895 | 2025. 2. 27. | 손해배상(기) | M | 있음 |
| 2021가합25193 | 2024. 7. 11. | 저작권침해금지등청구의소 | L·M | 있음 |
| 2023카합21631 | 2024. 3. 14. | 출판물판매금지등가처분 | L·M | 있음 |
| 2021가합588060 | 2023. 12. 15. | 손해배상(기) | L | 있음 |
| 2020도10180 | 2023. 11. 30. | 저작권법위반[저작인격권 침해로 인한 저작권법위반죄 해당 여부가 문제된 사건] | D·M | 있음 |
| 2021누52572 | 2022. 10. 12. | 시정명령등취소 | D | 없음 |
| 2022노288 | 2022. 7. 22. | 특정범죄가중처벌등에관한법률위반(보복협박등)(일부인정된죄명협박)·정보통신망이용촉진및정보보호등에관한법률위반(명예훼손)·성폭력범죄의처벌등에관한특례법위반(카메라등이용촬영·반포등)·성폭력범죄의처벌등에관한특례법위반(카메라등이용촬영물소지등) | D | 없음 |
| 2020다240304 | 2022. 5. 12. | 손해배상(기) | M | 있음 |
| 2019가합548861 | 2022. 5. 12. | 손해배상(지) | M | 있음 |
| 2017도19025 | 2021. 9. 9. | 저작권법위반방조[저작재산권자의 이용허락 없이 전송되는 공중송신권 침해 게시물로 연결되는 링크를 이른바 ‘다시보기’ 링크 사이트 등에서 공중의 구성원에게 제공하는 행위가 공중송신권 침해의 방조가 되는지 여부가 문제된 사건] | D | 있음 |
| 2020나2045644 | 2021. 8. 19. | 손해배상(지) | L | 없음 |
| 2019가단5207564 | 2021. 4. 9. | 손해배상(저) | M | 있음 |
| 2019나28156 | 2021. 1. 22. | 손해배상(지)·손해배상(지) | L·D·M | 없음 |
| 2019가단31377 | 2020. 12. 18. | 손해배상(저) | M | 있음 |
| 2019노3475 | 2020. 7. 9. | 저작권법위반 | L·D·M | 없음 |
| 2019가합540744 | 2020. 6. 19. | 저작권침해중지등청구의소 | M | 있음 |
| 2018나2068927 | 2020. 5. 28. | 손해배상청구의소 | D | 있음 |
| 2019노442 | 2020. 5. 8. | 저작권법위반 | M | 없음 |
| 2017고합1008 | 2020. 2. 7. | 특정범죄가중처벌등에관한법률위반(국고등손실)[일부 예비적 죄명 특정경제범죄가중처벌등에관한법률위반(횡령), 업무상횡령, 업무상배임, 일부 인정된 죄명 업무상횡령]ㆍ위증ㆍ국가정보원법위반ㆍ업무방해ㆍ노동조합및노동관계조정법위반ㆍ업무상횡령ㆍ뇌물공여ㆍ허위공문서작성ㆍ허위작성공문서행사ㆍ정보통신망이용촉진및정보보호등에관한법률위반(명예훼손) | D | 없음 |
| 2019고단1486 | 2019. 10. 31. | 저작권법위반 | L·D·M | 없음 |
| 2019나2012846 | 2019. 10. 17. | 매매대금·기타(금전) | D | 없음 |
| 2019나2007790 | 2019. 8. 29. | 저작권침해등 | M | 없음 |
| 2017다212095 | 2019. 6. 27. | 저작권침해금지등청구의소 | L | 있음 |
| 2017가합590127 | 2019. 5. 24. | 저작권침해금지등청구의소 | M | 없음 |
| 2017가합576442 | 2019. 1. 25. | 저작권침해정지등청구의소 | M | 없음 |
| 서울고등법원-2018-누-51760 | 2019. 1. 11. | 특수관계법인에게 저작권수입의 무상 양도는 부당행위계산에 해당함 | M | 있음 |
| 2018도2844 | 2018. 5. 11. | 업무상과실치사ㆍ업무상비밀누설ㆍ의료법위반(의사의 과실 존부와 의료법상 사망한 자의 비밀도 보호되는지 여부에 관한 사건) | D·M | 있음 |
| 2017노1269 | 2017. 9. 14. | 저작권법위반·업무방해·위계공무집행방해 | M | 없음 |
| 2016나2073109 | 2017. 8. 24. | 손해배상(기) | M | 없음 |
| 2016나2027557 | 2017. 8. 17. | 약정금 | D·M | 없음 |
| 2017카합81063 | 2017. 8. 14. | 영화상영금지등가처분 | D | 있음 |
| 2017고합77 | 2017. 7. 27. | 직권남용권리행사방해·강요·국회에서의증언·감정등에관한법률위반 | D | 없음 |
| 2015고단4722 | 2017. 4. 28. | 저작권법위반·업무방해·위계공무집행방해 | M | 없음 |
| 2016나2087313 | 2017. 3. 30. | 손해배상(기) | M | 있음 |
| 2015나2049406 | 2016. 11. 3. | 손해배상(기) | D | 없음 |
| 서울행정법원-2016-구합-54602 | 2016. 10. 13. | 제3자의 재산(저작권)을 압류하였다고 볼 수 없음 | M | 있음 |
| 2016가합502994 | 2016. 9. 29. | 손해배상(기) | M | 없음 |
| 2016고정432 | 2016. 8. 18. | 저작권법위반 | L | 있음 |
| 2015가단232254 | 2016. 4. 6. | 손해배상(기) | D | 있음 |
| 2015노2954 | 2016. 1. 15. | 공갈·공갈미수·무고·사문서부정행사(피고인2(대판:피고인1)에대하여인정된죄명사문서위조및위조사문서행사) | D | 없음 |
| 2012다204587 | 2015. 8. 27. | 손해배상 | D·M | 있음 |
| 2012다109798 | 2015. 4. 9. | 손해배상금 | L·M | 있음 |
| 2011다101148 | 2015. 4. 9. | 손해배상 | L·M | 있음 |
| 2012도13718 | 2014. 9. 4. | 명예훼손(일부예비적죄명:모욕)·저작권법위반 | D | 있음 |
| 2013가합32048 | 2014. 7. 24. | 손해배상청구 | D | 있음 |
| 2013나54972 | 2014. 7. 3. | 손해배상 | M | 없음 |
| 2011가합125231 | 2014. 5. 16. | 손해배상등 | M | 없음 |
| 2012다73493 | 2014. 1. 29. | 손해배상(기)·손해배상(기) | D | 있음 |
| 2011가합18452 | 2013. 8. 30. | 손해배상 | M | 없음 |
| 2011도3599 | 2013. 8. 22. | 저작권법 위반 | L | 있음 |
| 2013다22775 | 2013. 7. 12. | 저작권 침해 금지등 | M | 있음 |
| 2013나2004096 | 2013. 6. 13. | 손해배상(기)·손해배상(기) | D·M | 있음 |
| 2012가합512054 | 2013. 5. 23. | 손해배상(기) | L | 없음 |
| 2010다79923 | 2013. 4. 26. | 저작인격권 침해 정지 | M | 있음 |
| 2012나24622 | 2013. 1. 23. | 저작권 침해금지등 | L | 없음 |
| 2012나31842 | 2012. 11. 29. | 손해배상 | D·M | 없음 |
| 2012노566 | 2012. 10. 18. | 명예훼손(일부예비적죄명모욕)·저작권법위반 | D | 없음 |
| 2010다70520 | 2012. 8. 30. | 손해배상(지)·손해배상(지) | L | 있음 |
| 2011가합83573 | 2012. 8. 16. | 계약무효확인 | D | 있음 |
| 2012카합710 | 2012. 7. 13. | 서적인쇄·판매금지가처분 | M | 있음 |
| 2010다1272 | 2012. 7. 12. | 저작권사용료 | M | 있음 |
| 서울행정법원-2011-구합-31796 | 2012. 7. 6. | 국내사업장이 없는 외국법인에게 출판권 사용료를 지급한 경우 부가가치세를 대리납부할 의무가 있음 | L | 있음 |
| 2010가합104084 | 2012. 6. 8. | 손해배상 | D | 있음 |
| 2011가합60365 | 2012. 5. 25. | 손해배상(기)등 | L·D·M | 있음 |
| 2011가합49085 | 2012. 3. 20. | 손해배상 | M | 없음 |
| 2011나6870 | 2011. 10. 27. | 손해배상 | M | 없음 |
| 2010가합14594 | 2010. 11. 30. | 손해배상 | M | 없음 |
| 2010나2696 | 2010. 11. 11. | 손해배상(기) | M | 없음 |
| 2010도4468 | 2010. 9. 9. | 저작권법위반 | L | 있음 |
| 2009나92144 | 2010. 8. 25. | 저작인격권침해정지 | M | 없음 |
| 2008나68090 | 2010. 7. 1. | 저작권 침해금지등 | L | 없음 |
| 2009나82215 | 2010. 6. 24. | 손해배상 | M | 없음 |
| 2009나4116 | 2010. 1. 14. | 손해배상(기) | L | 없음 |
| 2008나66254 | 2009. 12. 10. | 저작권사용료 | M | 없음 |
| 2007다354 | 2009. 5. 28. | 저작권침해금지등 | D·M | 있음 |
| 2008다53812 | 2009. 4. 16. | 손해배상(기)등 | D | 있음 |
| 2007가합5940 | 2008. 12. 30. | 손해배상(기) | M | 있음 |
| 2008노760 | 2008. 12. 16. | 저작권법위반 | L | 없음 |
| 2007다27670 | 2008. 11. 20. | 유체인도등 | D·M | 있음 |
| 2008나35779 | 2008. 11. 19. | 손해배상(지) | M | 없음 |
| 2008라618 | 2008. 9. 23. | 가처분이의 | M | 없음 |
| 2007나70720 | 2008. 9. 23. | 손해배상(기) | D·M | 있음 |
| 2008카합968 | 2008. 8. 5. | 저작권침해금지등가처분 | D | 있음 |
| 2007나60990 | 2008. 7. 2. | 손해배상(기)등 | D | 없음 |
| 2007가합43936 | 2008. 6. 20. | 저작권침해금지등 | L | 있음 |
| 서울고등법원-2007-누-13106 | 2007. 10. 31. | 임차인이 건물 조기명도 요구를 받고 보상금을 받는 경우 기타소득의 범위 | D | 있음 |
| 2006나16757 | 2007. 7. 13. | 손해배상(지) | L·M | 있음 |
| 2006가합22413 | 2007. 7. 6. | 정보게시금지등[로마켓 변호사 승소율 제공 사건] | D | 있음 |
| 2007가합16095 | 2007. 6. 21. | 손해배상(기) | L | 있음 |
| 2006노1392 | 2007. 2. 15. | 저작권법위반 | D | 없음 |
| 서울행정법원-2002-구합-37402 | 2007. 1. 23. | 특수관계자의 광고용역을 무상 ? 저가수행하였는지 여부 등 | L | 있음 |
| 2006가합6780 | 2006. 12. 21. | 손해배상(기)등 | D·M | 있음 |
| 2005노3002 | 2006. 11. 1. | 부정경쟁방지및영업비밀보호에관한법률위반·절도 | M | 없음 |
| 2006가합8583 | 2006. 10. 20. | 손해배상(기) | L·M | 있음 |
| 2004가합76058 | 2006. 7. 21. | 손해배상(기) | L | 있음 |
| 2005나55161 | 2006. 7. 13. | 물품대금등 | D | 없음 |
| 2005가단197078 | 2006. 6. 30. | 손해배상(지) | L·M | 있음 |
| 2004가합67627 | 2006. 5. 10. | 손해배상(기) | D·M | 있음 |
| 2004가합4676 | 2006. 3. 17. | 손해배상(지)등 | D·M | 있음 |
| 2002구합29395 | 2006. 2. 16. | 법인세등부과처분취소 | L | 없음 |
| 2005도6402 | 2005. 12. 23. | 저작권법위반 | L | 있음 |
| 2003노2711 | 2005. 8. 19. | 저작권법위반 | L | 없음 |
| 2003노4296 | 2005. 1. 12. | 저작권법위반 | D | 없음 |
| 2000나36738 | 2001. 10. 11. | 손해배상(기) | M | 있음 |
| 97후860 | 2000. 4. 21. | 상표등록무효 | D·M | 있음 |
| 98다41216 | 1999. 5. 25. | 손해배상(지) | M | 있음 |
| 98나23616 | 1999. 4. 7. | 저작권침해금지가처분 | L | 있음 |
| 97다37210 | 1998. 2. 13. | 손해배상(기) | D | 있음 |
| 96나52092 | 1997. 12. 9. | 손해배상(기) | D | 있음 |
| 97카합2072 | 1997. 11. 5. | 저작권침해금지가처분 | M | 있음 |
| 97카합2923 | 1997. 10. 10. | 인쇄물발행판매배포등금지가처분 | M | 있음 |
| 96가합42432 | 1997. 2. 21. | 저작권침해금지 | D·M | 있음 |
| 95가합72771 | 1996. 9. 6. | 손해배상(기) | D·M | 있음 |
| 96다273 | 1996. 8. 23. | 상표권사용금지가처분 | L | 있음 |
| 95나41279 | 1996. 7. 12. | 손해배상(지) | M | 있음 |
| 94나9186 | 1995. 12. 5. | 손해배상(기) | M | 있음 |
| 95나18736 | 1995. 10. 19. | 손해배상(기) | L·M | 있음 |
| 94마2217 | 1995. 10. 2. | 서적출판.인쇄.발매및배포금지가처분 | M | 있음 |
| 95카합3438 | 1995. 9. 27. | 서적제작판매반포금지가처분 | D | 있음 |
| 94카합9230 | 1995. 6. 23. | 출판등금지가처분 | D | 있음 |
| 94나6668 | 1995. 3. 21. | 손해배상(기) | M | 있음 |
| 93가합48477 | 1995. 1. 27. | 저작권침해금지등 | M | 있음 |
| 94다7980 | 1994. 9. 30. | 손해배상(지) | M | 있음 |
| 92나35846 | 1994. 9. 27. | 사죄광고 | L·D·M | 있음 |
| 94카합3724 | 1994. 6. 1. | 가처분이의신청사건 | M | 있음 |
| 93다3073 | 1993. 6. 8. | 위자료,손해배상등 | L·D·M | 있음 |
| 92다31309 | 1992. 12. 24. | 가처분이의 | M | 있음 |
| 90가합1404 | 1992. 5. 14. | 사죄광고 | M | 있음 |
| 89도702 | 1991. 8. 27. | 저작권법 위반 | M | 있음 |
| 90카98799 | 1991. 4. 26. | 가처분이의 | M | 있음 |
| 90가합15896 | 1991. 1. 17. | 사죄광고청구사건 | D | 있음 |
| 90다카8845 | 1990. 10. 23. | 손해배상(기) | D·M | 있음 |
| 89가합62247 | 1990. 9. 20. | 손해배상(지) | M | 있음 |
| 89라55 | 1990. 6. 25. | 저작물사용금지가처분청구사건 | M | 있음 |
| 89가합39285 | 1990. 4. 19. | 손해배상(기) | D | 있음 |
| 89나32908 | 1990. 2. 13. | 손해배상(기) | D·M | 있음 |
| 89다카12824 | 1989. 10. 24. | 위자료 | D·M | 있음 |
| 88가합51561 | 1989. 5. 23. | 저작권침해행위금지등 | M | 있음 |
| 87도2604 | 1989. 1. 17. | 배임,저작권법위반 | D | 있음 |
| 86가단440 | 1986. 11. 12. | 부당이득금반환청구사건 | M | 있음 |
| 83나4449 | 1984. 11. 28. | 손해배상청구사건 | D·M | 있음 |
| 64다515 | 1964. 9. 22. | 출판물발매배포금지등 | D | 있음 |
## 해석 및 유지보수 주의사항
- 원천 엑셀에 있다는 사실만으로 운영 API가 해당 판례를 인용하지 않는다. 공식 HTTPS 상세 출처와 엔진 라벨이 확인되어 JSONL에 등록된 545건만 반환 대상이다.
- 대표판례 문서는 사건번호 검색용 외부 경로로 대법원 종합법률정보를 제시하지만, 원천 엑셀 자체에는 사건별 URL이 없다. 따라서 운영 적재 전에 공식 원문과 사건 메타데이터를 다시 검증해야 한다.
- 판시사항이 비어 있는 46개 사건은 제목·선고일·참조조문만으로 법리를 추론하지 않는다.
- 문서와 데이터가 갱신되면 `python3 -m scripts.validate_precedents data/precedents/precedents.jsonl`로 운영 적재본의 스키마·중복·HTTPS 출처를 검증한다.

View File

@ -236,7 +236,6 @@
- 원본 표(CSV): `data/precedents/precedent_listup.csv`
- 운영 적재본 545건: `data/precedents/precedents.jsonl`
- 수집·제외 통계: `data/precedents/selection_audit.json`
- 데이터 계층 전체 인벤토리: `docs/PRECEDENT_DATA.md`
- 각 사건의 링크는 한국저작권위원회 공식 상세 페이지다. 판결 원문은 대법원 종합법률정보에서
사건번호로 다시 확인해야 한다.

View File

@ -1,25 +0,0 @@
# 대표판례 출처 미확보 목록 — 컴북스 요청 대상
v1.3 IX장 총괄표가 지목한 대표판례 중 운영 적재본(`data/precedents/precedents.jsonl`, 545건)에
없어 결과에 출처를 제시할 수 없는 사건번호 **14건**이다.
대부분 `selection_audit.json`의 `excel_without_official_detail_case_ids`(103건)에 속한다 —
한국저작권위원회 공식 상세 페이지를 찾지 못해 출처를 임의 생성하지 않고 제외한 건들이다.
요청 내용: 판결문 원문 또는 검증 가능한 공식 출처 URL.
| 사건번호 | 영향받는 침해 케이스 |
|---|---|
| 2006가합8583 | A21 |
| 2006나16757 | A6, A7, B2 |
| 2007가합16095 | A17, A18, A19 |
| 2007가합43936 | A16 |
| 2007다354 | A19, A3 |
| 2008다53812 | B3 |
| 2010도4468 | A8, A9 |
| 2012도13718 | X2 |
| 2013나2004096 | A23, E2 |
| 2016고정432 | A14 |
| 2017도19025 | B3 |
| 2019가단31377 | A26 |
| 2019가단5207564 | A17 |
| 2021가합588060 | A1 |

View File

@ -1,71 +0,0 @@
# 컴북스 수령 데이터 처리 및 AI 대조문 구축
## 1. 2026-08-20 수령 현황
| 파일 | 확인 내용 | 현재 쓰임 |
|---|---|---|
| `자서전.net-에피소드.xlsx` | 실제 사람 작성, 6,651건의 본문 | human 정답 코퍼스, AI 의심도 비교 기준, 요약·표절 튜닝 |
| `한국인 생활 수기집 _ 파일 목록.xlsx` | 30건의 원본 파일/링크 목록 | 수령 provenance 목록. 본문 파일 확보·OCR 후 코퍼스 적재 |
자서전 원고는 `combooks_confirmed_human`, `human_verified=true`,
`ai_assistance=false`로 기록한다. 두 번째 파일은 본문이 아니므로 목록만으로
학습·탐지에 쓰지 않는다.
> 운영 정책: 목록에 있는 Google Drive·공개 웹 링크에 자동 접속하지
> 않는다. 컴북스가 실제로 다운로드해 전달한 로컬 원본만 OCR·적재한다.
## 2. 익명화와 누출 방지
- `id`(이메일)는 운영 비밀 salt로 HMAC 가명화한다. 원본 ID는 DB와 학습셋에 저장하지 않는다.
- 같은 작성자의 에피소드는 같은 `source_group`으로 묶어 train/val/test 누출을 막는다.
- 본문의 이메일·휴대전화·주민번호 형식은 적재 전 치환한다.
- AI 대조문 생성기는 본문 컬럼을 프롬프트로 지정하면 실패한다. 제목·키워드 컬럼만 허용한다.
- `DATA_ANONYMIZATION_SALT`는 코드·문서·산출물에 넣지 않는다.
## 3. 검증된 실행 결과
2026-08-20 원본 XLSX 로컬 드라이런 결과:
- 운영 코퍼스 적재: 533문서, 6,331개 익명 에피소드, 5,048,397자
- 학습 적합 human 표본: 200자 이상 6,139건 → 중복 560건 제거 → 5,579건
- 작성자 그룹: 290개, train/val/test 그룹 교차 0건
- 분할: train 3,946 / val 729 / test 904
- 길이: 평균 847.1자; AI 생성 목표는 human 길이 분포에서 표본화
human 데이터만으로는 이진 AI 생성 판별기를 학습할 수 없다. 순수 AI 대조문을
생성하되 최종 일반화 평가는 적어도 2개 이상의 생성 모델과 독립된 human 검토용
세트로 수행한다.
2026-08-21에 King GPU의 Qwen3.8-27B로 5,600건을 생성했고 5,598건을 human과
결합해 길이 특징 제외 모델을 학습·배포했다. 세부 결과는
`AI_TRAINING_RESULT_20260821.md`에 있다. 복수 생성기 일반화 검증은 아직 남아 있다.
2026-08-25에는 원문을 외부로 보내지 않고 익명 제목 메타데이터만 사용해
`gpt-4.1-mini`와 `gpt-4o-mini` 대조문 2,018건을 추가했다. Qwen·GPT 결합 모델의
세부 지표와 생성기별 검증 결과는 `AI_TRAINING_RESULT_20260825.md`에 있다.
## 4. 실행 순서
```bash
export DATA_ANONYMIZATION_SALT='<운영 비밀값>'
python scripts/ingest_o2o_xlsx.py '자서전.net-에피소드.xlsx' \
--database data/runtime/corpus.sqlite3 \
--book-column '자서전 제목' --text-column '에피소드 본문' \
--author-column id --episode-title-column '에피소드 제목' --anonymize
python scripts/generate_ai_samples.py \
--xlsx '자서전.net-에피소드.xlsx' --text-column '에피소드 본문' \
--meta-column '자서전 제목' --meta-column '에피소드 제목' --group-column id \
--model '<생성모델-1>' --model '<생성모델-2>' \
--limit 5600 --out data/training/ai_samples.jsonl
python scripts/build_ai_training_dataset.py \
--xlsx '자서전.net-에피소드.xlsx' --text-column '에피소드 본문' \
--book-column '자서전 제목' --id-column id --group-column id --anonymize \
--ai-jsonl data/training/ai_samples.jsonl --ai-group-field source_group \
--out data/training/ai_dataset.jsonl
```
AI 대조문은 AI 의심도 부가 기능을 개선하기 위한 것이다. 과업 공식 성능지표인
`표절 정밀도 97%`는 AI 대조문이 아니라 별도의 실제 표절/비표절 정답쌍으로 평가한다.

View File

@ -123,7 +123,7 @@ future 임포트가 있는지 AST 로 검사한다. 3.14 에서도 회귀를 잡
2. **No.7 요약 ROUGE 65** — 요약 정답셋 300건 별도 구축 필요 (컴북스 미보유).
**본 구축 전 파일럿 20건으로 사람 상한을 먼저 측정할 것**
(`eval_rouge.py --iaa`). 상한이 65 미만이면 규격부터 조정해야 한다.
구축 가이드는 `DATA_REQUEST_SPEC.md` §5
구축 가이드는 본 문서 §5
3. **No.3 메타 추출 F1 83** — KLUE NER 로 측정 가능. 귀속 확인 후 진행
### 데이터와 무관하게 지금 가능한 것

View File

@ -1,43 +0,0 @@
# SW 저작권 등록 준비 자료 (오투오 2단계 산출물 1건)
> 계획서 2단계 오투오 산출물: **SW 저작권 등록 1건**. 데이터 무관하게 지금 진행 가능.
> 등록 대상: 콘텐츠 표절 여부 AI 탐지 모듈(+요소 분석/요약).
## 1. 등록 대상 소프트웨어
- **명칭(안)**: O2O 콘텐츠 표절 탐지 및 요소 분석 엔진 (o2o-plagiarism-api)
- **버전**: `app/core/config.py` 의 `engine_version` (예: `o2o-plagiarism-2.x`)
- **언어/환경**: Python 3.13, FastAPI, scikit-learn, kiwipiepy, sentence-transformers
- **구성**: REST API 서버 + 탐지 엔진(삼중 유사도+군집화) + 요약 + 분류체계
## 2. 핵심 모듈(창작성 소명 포인트)
| 파일 | 기능 | 창작적 요소 |
|---|---|---|
| `app/engine/similarity.py` | 삼중 유사도 | text·lemma·element 가중 결합 알고리즘 |
| `app/engine/structural.py` | 형태소 lemma 교집합 | query 기준 다중집합 비율(어미변경 표절 탐지) |
| `app/engine/clustering.py` | 군집화 부분표절 | 요소 시그니처 군집 + 요소교체 표절 분해 |
| `app/engine/taxonomy.py` | 법령 10태그·39케이스 | 분류체계 매핑 규칙 |
| `app/engine/summarizer.py` | 스토리 요약 | TextRank 추출+통합 요약 |
| `app/engine/autobiography_filter.py` | 자서전 특화 전처리 | 공통표현 제거+NER 마스킹 |
## 3. 등록 제출물 체크리스트 (한국저작권위원회 SW 등록)
- [ ] 신청서(저작자/창작일/공표 여부)
- [ ] 소스코드 명세서 — 전체 또는 처음·마지막 30면(영업비밀 보호 시 일부 마스킹)
- [ ] 소프트웨어 설명서 — 본 저장소 `README.md` 기반 기능 명세
- [ ] 창작 사실 소명 — 본 문서 §2 모듈별 창작 요소
- [ ] 저작권 귀속 확인 — 오투오 사내 규정/과제 협약(지식재산 귀속 조항) 확인
## 4. 사전 준비 액션 (지금 가능)
1. `engine_version` 최종 고정 후 git 태그(`vX.Y.Z`)로 창작 시점 고정.
2. 소스코드 명세서용 PDF 산출(주석 포함). 의존성 코드 제외, 자체 작성분만.
3. 제3자 라이브러리 라이선스 정리(`requirements.txt` 각 패키지 라이선스 호환 확인).
4. 과제 협약서의 IP 귀속 조항 확인 → 단독/공동 저작 여부 결정(컴북스 주관과 협의).
## 5. 유의
- 2단계 산출물은 '고도화' 1건. 1단계 등록분이 있으면 **변경/추가 등록**으로 진행
(군집화·요약·partial_signal 등 신규 창작분 반영).
- 등록 전 외부 공개·배포 이력 정리(공표일 산정에 영향).

View File

@ -1,123 +0,0 @@
@page {
size: A4;
margin: 15mm 14mm 17mm;
}
:root {
color: #1f2937;
font-family: -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Noto Sans KR",
"Malgun Gothic", sans-serif;
font-size: 10.2pt;
line-height: 1.55;
}
body {
max-width: 180mm;
margin: 0 auto;
overflow-wrap: anywhere;
}
h1, h2, h3 {
color: #172033;
break-after: avoid-page;
}
h1 {
margin: 0 0 8mm;
padding-bottom: 4mm;
border-bottom: 2px solid #2563eb;
font-size: 23pt;
line-height: 1.25;
}
h2 {
margin: 8mm 0 3mm;
padding-bottom: 1.5mm;
border-bottom: 1px solid #cbd5e1;
font-size: 16pt;
}
h3 {
margin: 6mm 0 2mm;
color: #1d4ed8;
font-size: 12.5pt;
}
p, ul, ol, blockquote {
margin: 2.2mm 0;
}
blockquote {
padding: 3mm 4mm;
border-left: 3px solid #f59e0b;
background: #fffbeb;
color: #713f12;
}
table {
width: 100%;
margin: 3mm 0 5mm;
border-collapse: collapse;
table-layout: auto;
font-size: 8.4pt;
break-inside: auto;
}
thead {
display: table-header-group;
background: #eff6ff;
}
tr {
break-inside: avoid-page;
}
th, td {
padding: 1.7mm 2mm;
border: 1px solid #cbd5e1;
vertical-align: top;
text-align: left;
}
th {
color: #1e3a8a;
font-weight: 700;
}
pre {
margin: 3mm 0 5mm;
padding: 3mm;
border: 1px solid #dbe3ee;
border-radius: 2mm;
background: #f8fafc;
white-space: pre-wrap;
overflow-wrap: anywhere;
font-size: 7.8pt;
line-height: 1.42;
break-inside: avoid-page;
}
code {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
color: #7c2d12;
font-size: 0.92em;
}
pre code {
color: #172033;
}
a {
color: #1d4ed8;
text-decoration: none;
}
hr {
margin: 7mm 0;
border: 0;
border-top: 1px solid #cbd5e1;
}
strong {
color: #111827;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@
사용:
python -m scripts.analyze_case_coverage
python -m scripts.analyze_case_coverage --samples data/eval/case_counts.json
python -m scripts.analyze_case_coverage --md > docs/CASE_COVERAGE.md
python -m scripts.analyze_case_coverage --md
"""
from __future__ import annotations