joungmin
d2e78b0363
feat(verify): #322 LLM 검증으로 잘못된/프랜차이즈 식당 자동 숨김
DB 마이그레이션 (운영 ATP에 사전 실행 완료):
- restaurants.hidden NUMBER(1) DEFAULT 0 NOT NULL
- restaurants.hidden_reason VARCHAR2(120)
- restaurants.verified_at TIMESTAMP
- idx_restaurants_hidden 인덱스
코드:
- Restaurant 도메인에 hidden/hiddenReason/verifiedAt 필드 추가
- RestaurantMapper.xml resultMap 갱신 + findAll에 hidden=0 조건 (includeHidden=true 시 제외)
- RestaurantMapper에 updateVerification/clearHidden/findUnverified/countUnverified 추가
- RestaurantService.findAll() includeHidden 오버로드 + 검증 헬퍼 메서드
- RestaurantVerifyService 신규 (verify, verifyAsync, verifyAll, buildPrompt, parseVerifyResponse)
- LLM 응답이 JSON 아닐 때 안전 기본값(valid=true) → hidden 유지
- 백필은 식당당 200ms sleep으로 LLM rate 보호
- PipelineService.processExtract 끝에 verifyAsync(restId) 호출 (신규 등록 자동 검증)
- AdminRestaurantController 신규 — requireAdmin 필수:
- GET /api/admin/restaurants/verify/pending
- POST /api/admin/restaurants/verify/all?batchSize=10
- POST /api/admin/restaurants/{id}/verify
- PATCH /api/admin/restaurants/{id}/hidden {hidden, reason}
프롬프트:
- 식당명, 주소, 지역, cuisine, foods를 OCI GenAI로 보내 valid/is_franchise/reason 판정
- 보수적 가이드 (모호하면 valid=true)
설계서: docs/design/322-restaurant-llm-verify/README.md (Approved 대기)
Refs: #322
2026-06-15 13:04:23 +09:00
..
2026-06-15 11:08:18 +09:00
2026-06-15 11:17:48 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 11:08:18 +09:00
2026-06-15 12:07:47 +09:00
2026-06-15 13:04:23 +09:00
2026-06-15 10:20:50 +09:00
2026-06-15 10:20:50 +09:00