POSA_Copyrighter/.env.example
changukyu 6bbaaf6e23 fix: 형식 예시 반향 차단, 기본 모델을 실측으로 qwen2.5:7b 로 확정
실모델 프로브에서 인용 검증만으로는 못 잡는 실패 모드가 드러났다.

## 형식 예시 반향(template echo)

qwen2.5:0.5b 는 프롬프트의 형식 예시를 그대로 돌려주면서(claim text 가
"<한국어 문장>") 실제 라벨 12개를 전부 인용했다. 집합 포함 검사는 이것을
완벽히 통과시킨다 — 인용은 전부 진짜이기 때문이다. 결과적으로 완전히 비어
있는 출력이 "근거 있음" 판정을 받았다.

그라운딩 검증은 "인용이 진짜인가"와 "내용이 진짜인가"를 둘 다 봐야 한다.
형식 예시 문자열을 llm_prompts 의 상수로 두고 그 반향을 거부한다. 앵글
브래킷으로 감싼 다른 스탠드인도 같은 실패로 취급한다.

가짜 transport 테스트로는 이 결함을 잡을 수 없었다 — 스크립트된 응답은
언제나 잘 만들어진 JSON 이기 때문이다.

## 기본 모델

저장된 실제 증거(제출물 #3, 54행 중 12행 선별, 프롬프트 1,507자)로 GPU
타깃에서 측정:

  qwen2.5:0.5b-instruct  55.7s  형식 예시 반향, 계약 위반
  qwen2.5:7b              8.8s  계약 준수, claim 2 + 확인필요 1   <- 채택
  qwen3:8b               35.7s  계약 준수, thinking 모델이라 4배 느림

3b 는 빌드 머신에 없고 7b 는 이미 있어 에어갭 반입 비용이 0 이다. 브레인스토밍
문서의 "7B 는 인터랙티브 불가" 는 CPU 전제였고 이 배포에는 해당하지 않는다.

pytest 517 passed.
2026-07-25 23:48:23 +09:00

61 lines
2.3 KiB
Text

# Shared bearer token for the operator server's data routes (/api, media).
# Unset = open access (single-host dev only). Set for any networked deployment.
COPYRIGHTER_AUTH_TOKEN=
# Face-crop (biometric) retention in days; expired crops are purged with an
# audit event. 0 = keep indefinitely.
COPYRIGHTER_FACE_CROP_RETENTION_DAYS=90
NAVER_CLIENT_ID=
NAVER_CLIENT_SECRET=
NAVER_SEARCH_DISPLAY=10
NAVER_SEARCH_PAGES=1
NAVER_SEARCH_SORT=sim
NAVER_BLOG_SEARCH_DISPLAY=3
NAVER_BLOG_SEARCH_PAGES=1
NAVER_BLOG_SEARCH_SORT=sim
NAVER_WEB_SEARCH_DISPLAY=3
NAVER_WEB_SEARCH_PAGES=1
GOOGLE_CLOUD_VISION_API_KEY=
GOOGLE_CLOUD_VISION_PARENT=
COPYRIGHTER_GOOGLE_FACE_CROP_SEARCH=false
GOOGLE_CUSTOM_SEARCH_API_KEY=
GOOGLE_CUSTOM_SEARCH_CX=
GOOGLE_CUSTOM_SEARCH_IMAGE_RESULTS=3
GOOGLE_CUSTOM_SEARCH_IMAGE_PAGES=1
GOOGLE_CUSTOM_SEARCH_WEB_RESULTS=3
GOOGLE_CUSTOM_SEARCH_WEB_PAGES=1
COPYRIGHTER_AUTO_NAVER_QUERY_LIMIT=3
COPYRIGHTER_AUTO_NAVER_BLOG_QUERY_LIMIT=1
COPYRIGHTER_AUTO_NAVER_WEB_QUERY_LIMIT=1
COPYRIGHTER_AUTO_GOOGLE_CUSTOM_QUERY_LIMIT=2
COPYRIGHTER_SEARCH_RESULT_COMPARE_LIMIT=3
COPYRIGHTER_SEARCH_RESULT_PAGE_IMAGE_LIMIT=3
COPYRIGHTER_SEARCH_RESULT_SIMILARITY_THRESHOLD=0.9
COPYRIGHTER_COVERAGE_GOOD_THRESHOLD=70
COPYRIGHTER_COVERAGE_WARN_THRESHOLD=40
COPYRIGHTER_QUERY_COVERAGE_GOOD_THRESHOLD=70
COPYRIGHTER_QUERY_COVERAGE_WARN_THRESHOLD=40
COPYRIGHTER_NAVER_DAILY_LIMIT=100
COPYRIGHTER_GOOGLE_DAILY_LIMIT=100
COPYRIGHTER_GOOGLE_CUSTOM_SEARCH_DAILY_LIMIT=100
COPYRIGHTER_LLM_DAILY_LIMIT=100
OLLAMA_BASE_URL=http://localhost:11434
# Measured against real stored evidence on the GPU target:
# qwen2.5:0.5b-instruct 55.7s — returned the prompt's shape example verbatim
# qwen2.5:7b 8.8s — held the contract <- default
# qwen3:8b 35.7s — held the contract, 4x slower (thinking model)
# Pull on the build machine: `ollama pull qwen2.5:7b`.
OLLAMA_MODEL=qwen2.5:7b
# Context window. Ollama defaults to a couple of thousand tokens and silently
# truncates past it — the summary would then cite evidence the model never read.
OLLAMA_NUM_CTX=8192
OLLAMA_NUM_PREDICT=512
# Seconds. Structured output on a 3B model needs more headroom than the old 30s.
OLLAMA_TIMEOUT=120
# Keep weights resident between cases so a batch does not reload per case.
OLLAMA_KEEP_ALIVE=10m