o2o-plagiarism-ai/docs/CASE_MATCHING_API.md
hbyang b73d27a850 feat: split author/admin detect views and add case matching KPI basis
월례회의 자료(2026-09-18) p.7 파이프라인의 3단계 「저자 화면에는 케이스 코드를
노출하지 않는다」를 구현하고, 후속 합의에 필요한 문서를 함께 남긴다.

- DetectOptions.audience(admin 기본 / author). author 직렬화에서 case_id,
  case_candidates, tags, legal_risk, is_infringement 을 제외하고 ccl_basis 를
  코드 없는 문장으로 대체한다. 일치 위치와 점수는 유지한다.
- is_infringement 는 필수 bool 로 둔다. run_precision_eval.py 등 소비자가 bool
  로 읽으므로 선택 필드로 두면 None 이 조용히 흘러간다. 제외는 직렬화에서만 한다.
- publication_verdict 필드 추가. 컴북스 코드표 미확보이므로 39건 전부 null 이며
  null 을 출간 허용으로 해석하지 않는다. enum 과 대표값 선정은 코드표 수령 후.
- request_id / taxonomy_version 을 응답에 싣는다. 관리자 확정 로그와 연결된다.
- engine_version 기본값을 2.2.1-cases-v1.3 으로 맞춘다. 직전 값(2.0.1)이 King
  운영값 2.2.0-persistent-cpu 보다 낮아 성적서 대조 시 뒤집혀 보였다.

케이스 정의는 39건(A 27건)을 유지한다. 회의 자료의 40건(A 28건)과 1건 차이가
있으나 아카이빙 DB v2.3 원본을 받기 전까지 추측해 채우지 않는다.

7,786편 운영 재검사는 모집단 불일치(현재 6,343건)로 중단했고 부분 실행은 집계하지
않는다. 별도 평가셋 재측정은 기존 testset_v2 수치(precision 98.4032%)를 그대로
재현했으며 새 독립 시험 결과가 아니다. 상세는 reports/CASE_MATCHING_EVAL_*.json.

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

3.2 KiB

케이스 매칭 응답 계약 (2026-09-18)

표시 대상

POST /v1/plagiarism/detectPOST /v1/plagiarism/batch의 options에 "audience": "author"를 지정하면 저자용 JSON으로 직렬화한다. 생략 시 admin이며 기존 케이스 후보·판례·법률 검토 응답이 유지된다. 허용하지 않은 audience 값은 422다. 이 선택은 권한 인증을 대신하지 않는다.

{
  "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를 추가했다고 구현되는 기능이 아니며 바이칼 저장 계층에서 별도 구현해야 한다.