From 216c1cf36100c08001cccb7dfeb8acdc48c468ca Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Thu, 25 Dec 2025 22:29:24 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20?= =?UTF-8?q?=EB=8F=99=EC=A0=81=20=EA=B4=80=EB=A6=AC=20=EA=B3=84=ED=9A=8D=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20-?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EC=8B=9C=20=EC=A3=BC=EC=9D=98=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DB 스키마: scope_id NULL 처리 및 병합 로직 명확화 - 캐싱 전략: Redis 선택 사항, 메모리 캐시로 시작 가능 - 변수 치환: 런타임 치환 방식 명시 - 폴백 전략: DB 조회 실패 시 하드코딩 프롬프트 사용 (필수) - 웹 검색 기반 재검토 결과 반영 --- ...251225_프롬프트_동적관리_계획.md | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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 조회 실패/타임아웃 시 하드코딩 프롬프트 사용 (기존 코드 유지) +- 점진적 마이그레이션으로 안전한 전환 보장 ## 참고 문서