o2o-plagiarism-ai/docs/LLM_LEGAL_JUDGE.md

76 lines
3.2 KiB
Markdown

# 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` 비율, 사람 검토자와의 불일치를 측정한다.