diff --git a/journey/plans/251225_프롬프트_동적관리_계획.md b/journey/plans/251225_프롬프트_동적관리_계획.md index 32e552d..27e17ac 100644 --- a/journey/plans/251225_프롬프트_동적관리_계획.md +++ b/journey/plans/251225_프롬프트_동적관리_계획.md @@ -49,6 +49,8 @@ CREATE TABLE prompt_templates ( ### 3. 병합 로직 Global → Robeing → User 순서로 조회, 상위에서 정의되면 하위가 상속, 하위에서 오버라이드 시 상위 우선순위 적용. +- 각 레벨별 개별 쿼리 후 애플리케이션에서 병합 (복잡한 JOIN 대신) +- Global scope는 scope_id=NULL로 조회 (PostgreSQL NULL은 UNIQUE 제약에서 제외) ## 관리 포인트 (10가지) @@ -79,12 +81,16 @@ Global → Robeing → User 순서로 조회, 상위에서 정의되면 하위 ### Phase 2: 핵심 프롬프트 DB화 - 시스템 프롬프트 (gemini_handler, openai_handler) - 작업 타입별 프롬프트 (chat, extract, calendar_confirm) -- 폴백 로직 (DB 조회 실패 시 하드코딩 사용) +- 폴백 로직 (DB 조회 실패 시 하드코딩 사용) - 필수 + - DB 조회 실패/타임아웃 시 기존 _get_system_prompt() 메서드 사용 + - 점진적 마이그레이션 가능, 안전한 전환 보장 ### Phase 3: 개인화 및 동적 프롬프트 - 사용자별 프롬프트 오버라이드 - 감정 기반 동적 프롬프트 조합 - 변수 치환 시스템 ({current_time}, {emotion_labels} 등) + - DB 저장 시 변수 플레이스홀더 유지 + - 조회 후 str.format() 또는 템플릿 엔진으로 런타임 치환 ### Phase 4: A/B 테스트 및 모니터링 - 프롬프트 버전 관리 @@ -96,6 +102,26 @@ Global → Robeing → User 순서로 조회, 상위에서 정의되면 하위 - Redis/Memory 캐시 (키: `prompt:{scope}:{type}:{version}`) - TTL 1시간, DB 변경 시 무효화 (웹훅/이벤트) - 캐시 히트율 99%+ 목표 (테스트 결과 99.8% 달성) +- Redis는 선택 사항: 메모리 캐시(ThreadDocCache 패턴)로 시작, 필요 시 Redis 전환 +- Redis 없이도 동작하도록 폴백 로직 구현 + +## 구현 시 주의사항 + +### DB 스키마 +- scope_id NULL 처리: Global scope는 scope_id=NULL로 조회 (PostgreSQL NULL은 UNIQUE 제약에서 제외되어 문제 없음) +- 각 레벨별 개별 쿼리 후 애플리케이션에서 병합 권장 (복잡한 JOIN 대신) + +### 캐싱 +- Redis는 선택 사항, 메모리 캐시로 시작 가능 +- Redis 없이도 동작하도록 폴백 로직 구현 필수 + +### 변수 치환 +- 템플릿 변수({current_time}, {emotion_labels})는 DB 저장 시 플레이스홀더로 유지 +- 조회 후 런타임에 str.format() 또는 템플릿 엔진으로 치환 + +### 폴백 전략 +- DB 조회 실패/타임아웃 시 하드코딩 프롬프트 사용 (기존 코드 유지) +- 점진적 마이그레이션으로 안전한 전환 보장 ## 참고 문서