런타임 override 완성 (params 인자 + 내부 상수 교체): - gear_violation_g01_g06 (GEAR, tier 4) · G01~G06 점수 + signal_cycling(gap_min/min_count) · gear_drift_threshold_nm + fixed_gear_types + fishery_code_allowed_gear · _detect_signal_cycling_count 도입 (기존 _detect_signal_cycling 보존) 카탈로그 + 관찰 (DEFAULT_PARAMS 노출 + Adapter 집계, 런타임 교체는 후속 PR): - transshipment_5stage (TRANSSHIP, tier 4) — 5단계 필터 임계 - risk_composite (META, tier 3) — 경량+파이프라인 가중치 - pair_trawl_tier (GEAR, tier 4) — STRONG/PROBABLE/SUSPECT 임계 각 모델 공통: - prediction/algorithms/*.py: DEFAULT_PARAMS 상수 추가 - models_core/registered/*_model.py: BaseDetectionModel Adapter - models_core/seeds/v1_<model>.sql: DRAFT seed (호출자 트랜잭션 제어) - tests/test_<model>_params.py: Python ↔ 모듈 상수 ↔ seed SQL 정적 일치 검증 통합 seed: models_core/seeds/v1_phase2_all.sql (\i 로 5 모델 일괄 시드) 검증: - 30/30 테스트 통과 (Phase 1-2 15 + dark 5 + Phase 2 신규 10) - 운영 DB 5 모델 개별 + 일괄 seed dry-run 통과 (BEGIN/ROLLBACK 격리) - 5 모델 모두 tier/category 정렬 확인: dark_suspicion(3) / risk_composite(3) / gear_violation_g01_g06(4) / pair_trawl_tier(4) / transshipment_5stage(4) 후속: - transshipment/risk/pair_trawl 런타임 override 활성화 (헬퍼 params 전파) - Phase 3 백엔드 API (DetectionModelController + 승격 엔드포인트) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.4 KiB
4.4 KiB
Detection Model Seeds
Phase 2 PoC 모델을 V034 detection_models + detection_model_versions 에 seed 하는 SQL.
현재 seed 대상
| 파일 | 모델 | tier | 모드 |
|---|---|---|---|
v1_dark_suspicion.sql |
dark_suspicion (DARK_VESSEL) |
3 | 런타임 override 완성 |
v1_gear_violation.sql |
gear_violation_g01_g06 (GEAR) |
4 | 런타임 override 완성 |
v1_transshipment.sql |
transshipment_5stage (TRANSSHIP) |
4 | 카탈로그 + 관찰 |
v1_risk_composite.sql |
risk_composite (META) |
3 | 카탈로그 + 관찰 |
v1_pair_trawl.sql |
pair_trawl_tier (GEAR) |
4 | 카탈로그 + 관찰 |
v1_phase2_all.sql |
5 모델 일괄 | — | \i 로 위 5개 순차 실행 |
"런타임 override 완성" vs "카탈로그 + 관찰"
- 런타임 override 완성 (
dark_suspicion,gear_violation_g01_g06): 알고리즘 함수가params: dict | None = None인자를 받고, ACTIVE 버전의 JSONB 를 적용해 실제 가중치·임계값이 교체된다. 운영자가 version 을 ACTIVE 로 승격하면 다음 사이클 결과가 바뀐다. - 카탈로그 + 관찰 (
transshipment_5stage,risk_composite,pair_trawl_tier): 내부 헬퍼 함수들이 모듈 레벨 상수를 직접 참조하여 범위가 큰 리팩토링이 필요. 이번 단계에서는 DEFAULT_PARAMS 를 DB 카탈로그에 노출 + Adapter 로 결과 관찰 수집까지만. 런타임 실제 교체는 후속 리팩토링 PR 에서 헬퍼에 params 전파를 완성하면 활성화된다.
실행 방법
중요: 본 seed 파일들은 BEGIN/COMMIT 을 포함하지 않는다. 호출자가 트랜잭션을 관리한다.
(A) 운영 적용 — 단일 트랜잭션 자동 래핑
PGPASSWORD=... psql -h <host> -U kcg-app -d kcgaidb \
-v ON_ERROR_STOP=1 -1 \
-f prediction/models_core/seeds/v1_dark_suspicion.sql
-1 플래그가 파일 전체를 한 트랜잭션으로 묶어 어느 INSERT 실패 시 전부 롤백.
(B) Dry-run — 실제 반영 없이 SQL 검증
PGPASSWORD=... psql -h <host> -U kcg-app -d kcgaidb -v ON_ERROR_STOP=1 <<'SQL'
BEGIN;
\i prediction/models_core/seeds/v1_dark_suspicion.sql
SELECT version, status, params->'tier_thresholds'
FROM kcg.detection_model_versions WHERE model_id='dark_suspicion';
ROLLBACK;
SQL
⚠️ 사용 금지 패턴
# 절대 금지 — 각 -c/-f 가 별도 세션이라 실제로 INSERT 됨
psql -c 'BEGIN;' -f v1_dark_suspicion.sql -c 'ROLLBACK;'
운영자 승격 절차
- seed 결과는
status=DRAFT role=NULL→ prediction 은 참조하지 않음 (params_loader는WHERE status='ACTIVE' AND is_enabled=TRUE). - Phase 3 백엔드 API 배포 후 운영자가 다음 중 하나로 승격:
POST /api/ai/detection-models/{modelId}/versions/{versionId}/activate?role=SHADOW— 관찰 전용POST /api/ai/detection-models/{modelId}/versions/{versionId}/activate?role=PRIMARY— 운영 반영POST /api/ai/detection-models/{modelId}/versions/{versionId}/promote-primary— SHADOW→PRIMARY 승격 (기존 PRIMARY 자동 ARCHIVED)
- prediction 은 다음 사이클 시작 시
params_loaderTTL(5분) 만료 후 자동 적재. PREDICTION_USE_MODEL_REGISTRY=1환경변수로 재기동해야 실제 실행 (기본0은 구 경로 유지, Phase 2 diff=0 검증 전까지 안전).
동치성 검증
각 모델의 params JSONB 는 Python 소스의 *_DEFAULT_PARAMS 상수와 1:1 일치.
정적 검증은 prediction/tests/test_dark_suspicion_params.py::test_seed_sql_values_match_python_default 가 담당.
런타임 검증(신·구 경로 diff):
- 같은 모델에 v1.0.0 (DEFAULT) 를 PRIMARY 로 seed
- (선택) v1.0.0-shadow 를 동일 params 로 SHADOW 로 seed
PREDICTION_USE_MODEL_REGISTRY=1로 5분 사이클 1회 실행kcg.v_detection_model_comparison뷰에서 PRIMARY↔SHADOWoutputs비교 → 전 입력 동일이어야 함
롤백
-- 한 모델만
DELETE FROM kcg.detection_model_versions WHERE model_id = 'dark_suspicion';
DELETE FROM kcg.detection_models WHERE model_id = 'dark_suspicion';
-- Phase 2 전체 (후속 PR 반영 이후)
DELETE FROM kcg.detection_model_versions WHERE model_id IN (
'dark_suspicion', 'gear_violation_g01_g06', 'transshipment_5stage',
'risk_composite', 'pair_trawl_tier'
);
DELETE FROM kcg.detection_models WHERE model_id IN (
'dark_suspicion', 'gear_violation_g01_g06', 'transshipment_5stage',
'risk_composite', 'pair_trawl_tier'
);