실모델 프로브에서 인용 검증만으로는 못 잡는 실패 모드가 드러났다. ## 형식 예시 반향(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.
61 lines
2.3 KiB
Text
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
|