From 282bba9631d865ce7ed6fc0cc44d43ec9a70979d Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Tue, 3 Mar 2026 12:24:00 +0900 Subject: [PATCH] Strengthen prompt dynamic management plan with rollout, metrics, and guardrails --- ...251225_프롬프트_동적관리_계획.md | 251 +++++++++++++++--- 1 file changed, 210 insertions(+), 41 deletions(-) diff --git a/journey/plans/251225_프롬프트_동적관리_계획.md b/journey/plans/251225_프롬프트_동적관리_계획.md index 93d8ef4..e1cd0fd 100644 --- a/journey/plans/251225_프롬프트_동적관리_계획.md +++ b/journey/plans/251225_프롬프트_동적관리_계획.md @@ -1,72 +1,241 @@ # 프롬프트 동적 관리 시스템 계획 -**날짜**: 2025-12-25 -**작성자**: happybell80 -**상태**: 미구현 +**날짜**: 2025-12-25 +**최종 보강**: 2026-03-03 +**작성자**: happybell80, Claude +**상태**: 미구현 (실행 계획 보강) -**원칙 참조** (구현 전 필수 확인): -- `311_백엔드_구조_원칙.md`: 계층 분리, DB는 state 경유, 섹션 6-1 스키마 확인 -- `312_문서_작성_원칙.md`: 핵심만 간결, 파일명:줄번호 -- `315_테스트_원칙.md`: 테스트는 TDD로 진행 (Red → Green → Refactor) +**원칙 참조**: +- `book/300_architecture/311_백엔드_구조_원칙.md` (계층 분리, DB state 경유) +- `book/300_architecture/312_문서_작성_원칙.md` +- `book/300_architecture/315_테스트_원칙.md` (TDD) +- `book/300_architecture/313_Gemini_프롬프트_설계_원칙.md` --- -## 목표 +## 1. 목표 -프롬프트 DB화를 통한 동적 변경 및 개인화 구현 +하드코딩 프롬프트를 DB 정책으로 전환해 다음을 달성한다. +- 무중단 프롬프트 수정 +- 사용자/로빙/작업별 개인화 +- A/B 실험 기반 자동 개선 +- 안전한 자동 승격 + 즉시 롤백 --- -## DB 스키마 설계 +## 2. 현재 상태 요약 (2026-03-03 기준) -**테이블**: `prompt_templates` -- scope_level: 'global', 'robeing', 'user', 'task' -- scope_id: robeing_id, user_id, task_type 등 -- prompt_type: 'system', 'chat', 'extract', 'calendar_confirm', 'ir_analysis' 등 -- content: JSONB (템플릿 내용 + 변수 정의) -- version, is_active, created_at, updated_at +- rb8001 코드 하드코딩 프롬프트 템플릿: 약 40개 +- 사용자 핵심 UX 경로 프롬프트 유형: 약 8~10종 + - chat(감정 반영), summarize, analyze, extract, calendar_confirm 등 +- 현재 문제: + - 프롬프트 수정 시 코드 배포 필요 + - 버전/실험/성과 추적이 일관되지 않음 + - 회귀 시 신속 롤백이 어려움 --- -## 프롬프트 분류 기준 +## 3. 범위 -### 계층적 범위(Scope) -- Global: 모든 사용자 공통 기본 프롬프트 -- Robeing: 특정 로빙 공통 -- User: 사용자별 개인화 -- Task: 작업 타입별 +### 포함 +- `rb8001` LLM 경로의 시스템/작업별 프롬프트 +- 감정 기반 동적 규칙(톤/길이/금지 규칙) +- A/B 실험, 메트릭 수집, 자동 승격 정책 -### 병합 로직 -- Global → Robeing → User 순서로 조회 -- 각 레벨별 개별 쿼리 후 애플리케이션에서 병합 +### 제외 +- 모델 자체 교체/튜닝 +- 감정 분류기 모델 재학습 +- 인프라 토폴로지 변경 --- -## 구현 Phase +## 4. 데이터 모델 (최소 스키마) -### Phase 1: DB 스키마 및 기본 인프라 (TDD 진행) -- `rb8001/app/state/repositories/prompt_repository.py` (신규): prompt_templates 테이블 생성, PromptService 클래스 (조회, 병합, 캐싱) -- 기본 프롬프트 마이그레이션 (하드코딩 → DB) +### 4.1 `prompt_templates` +- purpose: 프롬프트 논리 단위(식별자) +- columns: + - `id`, `template_key` (unique) + - `prompt_type` (`system`, `chat`, `extract`, `calendar_confirm`, ...) + - `scope_level` (`global`, `robeing`, `task`, `user`) + - `scope_id` (nullable) + - `is_enabled` + - `created_at`, `updated_at` -### Phase 2: 핵심 프롬프트 DB화 -- `rb8001/app/services/llm/gemini_handler.py`, `rb8001/app/services/llm/llm_service.py`: 시스템 프롬프트 DB 조회로 변경 -- 작업 타입별 프롬프트 (chat, extract, calendar_confirm) DB화 -- 폴백 로직: DB 조회 실패 시 기존 `_get_system_prompt()` 메서드 사용 +### 4.2 `prompt_versions` +- purpose: 템플릿 버전 이력 +- columns: + - `id`, `template_id`, `version` + - `content` (TEXT/JSONB) + - `variables_schema` (JSONB) + - `status` (`draft`, `candidate`, `active`, `retired`) + - `created_by`, `change_reason`, `created_at` -### Phase 3: 개인화 및 동적 프롬프트 -- `rb8001/app/services/llm/prompt_service.py` (신규): 사용자별 프롬프트 오버라이드, 감정 기반 동적 프롬프트 조합, 변수 치환 시스템 +### 4.3 `prompt_experiments` +- purpose: 실험 라우팅 +- columns: + - `id`, `experiment_key`, `template_key` + - `control_version_id`, `treatment_version_id` + - `traffic_ratio` (예: 90:10) + - `guardrail_config` (JSONB) + - `status` (`running`, `paused`, `completed`) + - `started_at`, `ended_at` -### Phase 4: A/B 테스트 및 모니터링 -- 프롬프트 버전 관리, A/B 테스트 지원, 롤백 기능 +### 4.4 `prompt_events` +- purpose: 요청 단위 결과 로그 +- columns: + - `id`, `request_id`, `template_key`, `version_id`, `variant` + - `user_id`, `robeing_id`, `task_type` + - `latency_ms`, `tokens_in`, `tokens_out` + - `feedback_signal` (up/down/reask/abandon) + - `created_at` + +### 4.5 `prompt_metrics_daily` +- purpose: 일별 집계 +- columns: + - `date`, `template_key`, `version_id`, `variant` + - `success_rate`, `reask_rate`, `fallback_rate` + - `avg_latency_ms`, `avg_tokens`, `feedback_score` + +--- + +## 5. 런타임 병합 규칙 + +### 5.1 해석 순서 (낮음 → 높음 우선순위) +1. Global +2. Robeing +3. Task +4. User +5. Runtime modifier(감정/리스크 규칙) + +### 5.2 병합 원칙 +- 문자열 덮어쓰기 금지, 섹션 단위 병합(`role`, `constraints`, `output_format`) +- 금지 규칙(예: 민감 라벨 직접 노출 금지)은 항상 최종 승자 +- 해석 실패 시 즉시 fallback (최근 stable active 버전) + +--- + +## 6. 자동 개선 정책 + +### 6.1 실험 지표 +- 1차 품질 지표: + - `reask_rate` (낮을수록 좋음) + - `negative_feedback_rate` (낮을수록 좋음) + - `task_success_rate` (높을수록 좋음) +- 2차 비용/성능 지표: + - `avg_latency_ms` + - `avg_tokens` + - `fallback_rate` + +### 6.2 자동 승격 조건(예시) +- 최소 샘플 수 충족 (예: n >= 500) +- treatment가 control 대비: + - `reask_rate` 10% 이상 개선 + - `negative_feedback_rate` 악화 없음 + - `latency_ms` 15% 이상 악화 없음 +- guardrail 위반 0건 + +### 6.3 자동 롤백 조건 +- 15분 윈도우 기준 `fallback_rate` 급증 +- `negative_feedback_rate` 임계치 초과 +- 5xx/파싱 실패 연쇄 발생 + +### 6.4 운영 모드 +- 기본: **자동 제안 + 사람 승인 후 승격** +- 완전 자동 승격은 초기 1개월 관찰 후 제한 적용 + +--- + +## 7. 구현 단계 + +### Phase 1: 인벤토리/스키마/TDD +- 하드코딩 프롬프트 인벤토리 확정(파일/함수/용도) +- `prompt_templates`, `prompt_versions` 생성 +- Repository + Service 뼈대 구현 +- 테스트: + - 스키마 생성/마이그레이션 + - 버전 조회/활성 버전 선택 + +### Phase 2: 읽기 경로 전환 (safe fallback) +- `llm_service.py`, `gemini_handler.py`에 DB 조회 연결 +- 기존 하드코딩은 fallback로 유지 +- 테스트: + - DB 성공 시 DB 프롬프트 사용 + - DB 실패 시 하드코딩 fallback + +### Phase 3: 병합/개인화/감정 modifier +- scope 병합 및 변수 치환 +- 감정/리스크 modifier를 DB 규칙으로 부분 이관 +- 테스트: + - 병합 우선순위 + - 금지 규칙 우선 적용 + +### Phase 4: 실험/메트릭/자동 승격 +- `prompt_experiments`, `prompt_events`, `prompt_metrics_daily` 구현 +- 실험 라우터 + 승격/롤백 워커 구현 +- 테스트: + - 라우팅 결정 일관성 + - guardrail 위반 시 자동 중단/롤백 + +--- + +## 8. 수용 기준 (Definition of Done) + +- 하드코딩 의존 프롬프트 80% 이상 DB 전환 +- 핵심 UX 경로(chat/summarize/extract/calendar_confirm) DB 관리 +- 실험 대시보드에서 버전별 지표 확인 가능 +- 자동 롤백 시나리오 리허설 1회 이상 통과 +- 장애 시 서비스 무중단 fallback 확인 + +--- + +## 9. 위험과 대응 + +- 위험: 잘못된 프롬프트 배포로 UX 악화 + - 대응: candidate → canary → full 단계적 승격 +- 위험: 과도한 개인화로 톤 불안정 + - 대응: immutable safety constraints 최종 적용 +- 위험: 지표 왜곡/샘플 편향 + - 대응: 최소 샘플 수 + 시간/사용자 분산 조건 + +--- + +## 10. 체크리스트 (누락 방지) + +### 설계 +- [ ] 실제 하드코딩 인벤토리 목록화 완료 +- [ ] scope 우선순위 충돌 규칙 정의 +- [ ] 안전 제약(금지 규칙) 최종 우선순위 명시 + +### 구현 +- [ ] Repository/DDL/Service 동시 반영 +- [ ] fallback 경로(코드/DB) 모두 테스트 +- [ ] 실험 라우팅 deterministic 보장 + +### 운영 +- [ ] 승격/롤백 가드레일 임계값 합의 +- [ ] 대시보드/알람 연결 +- [ ] 장애 훈련(롤백 drill) 수행 + +--- + +## 11. 2회 점검 기록 (2026-03-03) + +### 1차 점검에서 추가한 누락 항목 +- 자동 승격 조건(샘플 수/가드레일) +- 자동 롤백 조건 +- 이벤트/메트릭 테이블 분리 +- 현재 하드코딩 인벤토리 규모 반영 + +### 2차 점검에서 확정한 항목 +- scope 병합 우선순위 명시 +- immutable safety constraints 최종 우선 적용 명시 +- DoD/운영 체크리스트/리허설 항목 추가 --- ## 참고 문서 - - `book/300_architecture/311_백엔드_구조_원칙.md` - `book/300_architecture/312_문서_작성_원칙.md` - `book/300_architecture/315_테스트_원칙.md` - `book/300_architecture/313_Gemini_프롬프트_설계_원칙.md` -- `../ideas/250828_dynamic_system_prompt_memory.md` -- `troubleshooting/250806_happybell80_동적프롬프트구현.md` - 동적 프롬프트 구현 기록 -- `book/300_architecture/311_백엔드_구조_원칙.md` - 계층 분리 원칙 +- `journey/troubleshooting/250806_happybell80_동적프롬프트구현.md`