AI 생성 표본이 없어 정확도를 측정할 수 없는 상태에서, 규칙 기반 휴리스틱을 실제로 쓸 수 있게 만든다. 점수의 의미를 "AI일 확률"에서 "등록 코퍼스의 인간 저작물 대비 문체 이례도"로 재정의해, 라벨 없이도 참인 진술이 되도록 했다. 덤으로 high 배지 비율이 정의상 고정되어 검토 부하가 예측 가능해진다. - ai_detector: low_cut/high_cut 주입 지원. 둘 다 주어질 때만 적용하고, 적용되면 model_version 에 +corpus-percentile 을 붙여 컷 출처를 드러낸다. is_stub 은 여전히 true — 컷을 맞췄을 뿐 학습된 모델이 아니다. - calibrate_cuts/percentile/score_text_heuristic 순수 함수 추가. - scripts/calibrate_ai_detector_cuts.py: 코퍼스 표본의 점수 분포에서 백분위 컷을 산출하고 .env 두 줄을 출력한다. - 규칙 점수가 상단에서 clip 되어 p90=p98 이 되면 그 컷은 high 배지를 영원히 0건으로 만든다. 이 경우 .env 를 출력하지 않고 exit 3 으로 중단하며 saturated_share/distinct_scores 진단을 남긴다. 유효 표본 100건 미만은 exit 2. - kiwipiepy 유무가 점수를 바꾸므로 실제 사용 여부를 리포트에 기록하고 경고한다. 기본값은 그대로 비활성(AI_DETECTOR_ALLOW_HEURISTIC=false)이라 켜지 않으면 동작이 바뀌지 않는다. 컷 미설정 시에는 자리표시자임을 note 로 경고한다. 테스트 180건 통과 (신규 13건). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
72 lines
2.7 KiB
Plaintext
72 lines
2.7 KiB
Plaintext
# 서버 바인딩 (uvicorn) - python -m app.main 실행 시 사용됨
|
|
HOST=0.0.0.0
|
|
PORT=8000
|
|
LOG_LEVEL=info
|
|
RELOAD=false
|
|
# 리버스 프록시 sub-path 배포 시. 예: /plagiarism (Apache가 /plagiarism → 컨테이너 매핑할 때)
|
|
ROOT_PATH=
|
|
# 설정하면 /v1/health를 제외한 API 요청에 X-API-Key가 필요합니다.
|
|
API_KEY=
|
|
# 운영 fail-closed. true인데 API_KEY가 비면 앱이 기동에 실패합니다.
|
|
# ⚠️ King 실제 활성화는 바이칼 측 키 전달 후 진행 (docs/AI_DETECTION.md 참조).
|
|
REQUIRE_API_KEY=false
|
|
# 인증 없이 열어둘 경로 제어
|
|
PUBLIC_HEALTH=true
|
|
PUBLIC_DOCS=true
|
|
|
|
ENGINE_VERSION=o2o-plagiarism-2.1.0-kosimcse
|
|
REFERENCE_CORPUS_DIR=./data/reference
|
|
TAXONOMY_DIR=./data/taxonomy
|
|
AUTOBIOGRAPHY_PATTERNS_PATH=./data/autobiography/common_patterns.txt
|
|
|
|
# 3.5만 에피소드용 SQLite provenance + 증분 영속 인덱스.
|
|
# 서버에서 ingest/build 완료 후 true로 전환합니다.
|
|
USE_PERSISTENT_INDEX=false
|
|
CORPUS_DB_PATH=./data/runtime/corpus.sqlite3
|
|
PERSISTENT_INDEX_DIR=./data/runtime/index
|
|
PERSISTENT_SIMILARITY_THRESHOLD=0.65
|
|
PERSISTENT_MIN_EXACT_SPAN=80
|
|
PERSISTENT_MIN_COVERAGE=0.30
|
|
PERSISTENT_RERANK_TOP_K=20
|
|
PRECEDENTS_PATH=./data/precedents/precedents.jsonl
|
|
AI_DETECTOR_MODEL_PATH=./data/models/ai_detector.joblib
|
|
# 학습 모델이 없을 때 규칙 기반 점수를 낼지. true 면 is_stub=true 로 노출된다.
|
|
AI_DETECTOR_ALLOW_HEURISTIC=false
|
|
# 휴리스틱 컷. scripts/calibrate_ai_detector_cuts.py 출력값을 넣는다.
|
|
# 비워두면 근거 없는 자리표시자(0.40/0.70)가 쓰이므로 배지가 무의미해진다.
|
|
# 값이 없으면 아래 두 줄은 주석 처리한 채로 둘 것 (빈 값은 파싱 오류).
|
|
#AI_DETECTOR_LOW_CUT=
|
|
#AI_DETECTOR_HIGH_CUT=
|
|
AI_DETECTOR_USE_POS=true
|
|
|
|
# PDF VII-4 권장 보수적 임계값 (정밀도 우선)
|
|
SIMILARITY_THRESHOLD=0.85
|
|
|
|
# KoSimCSE / KoSBERT (PDF VII-3 권장 - 한국어 오픈소스 임베딩, 자체 산출물)
|
|
# CPU 기본 이미지는 torch를 포함하지 않습니다. 레거시 KoSimCSE를 별도 설치한 경우만 true.
|
|
USE_KOSIMCSE=false
|
|
KOSIMCSE_MODEL=BM-K/KoSimCSE-roberta-multitask
|
|
KOSIMCSE_MAX_LENGTH=512
|
|
|
|
# OpenAI 연동 (옵션). KoSimCSE 있으면 임베딩은 비활성 권장.
|
|
OPENAI_API_KEY=
|
|
OPENAI_EXTRACTION_MODEL=gpt-4o-mini
|
|
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
|
|
USE_LLM_EXTRACTOR=false
|
|
USE_EMBEDDING_SIMILARITY=false
|
|
|
|
# 삼중 유사도 가중치 (합이 1.0)
|
|
WEIGHT_TEXT_SIM=0.30
|
|
WEIGHT_LEMMA_SIM=0.45
|
|
WEIGHT_CHAR_SIM=0.15
|
|
WEIGHT_MOTIF_SIM=0.10
|
|
|
|
# PDF VII-3 3단 캐스케이딩 - MinHash + LSH 1차 필터
|
|
USE_LSH_FILTER=true
|
|
LSH_THRESHOLD=0.3
|
|
LSH_TOP_K=50
|
|
|
|
# PDF VII-4 자서전 특화 모드 (공통 표현 제거 + NER 마스킹)
|
|
AUTOBIOGRAPHY_MODE=true
|
|
ENABLE_ENTITY_MASKING=true
|