RPT-024 위젯 생성 프롬프트 고도화 전략
작성: 우드(AIO) + CTL(개발팀장) | 2026-03-31 | T3 개발팀
1. 현황 분석
1.1 현재 워크플로우 AS-IS
사용자 입력 ("삼성전자 주가 대시")
│
▼
[Stage 1] 의도 파싱 (LLM) ─→ type: info, category: finance, features: [stock, price]
│
▼
[Stage 2] 질문 생성 (LLM) ─→ 2-3개 질문 + 선택지
│
▼
사용자 답변 수집 (텔레그램: 직접 / Creator: 자동 응답)
│
▼
[Stage 4-B] 위젯 HTML 생성 (LLM)
├── 시스템 프롬프트: widget_prompt.md (16,883자)
├── 유저 프롬프트: 사이즈 + 콘텐츠 가이드 + 의도 + 답변
└── 출력: JSON {html, reason, explanation}
│
▼
후처리: sanitize → wrap_full_page → playground 저장 → 스크린샷
1.2 현재 문제점
| 문제 | 원인 | 영향 |
| 컴포넌트 선택이 LLM 임의 | 사용자가 원하는 컴포넌트를 지정할 수 없음 | 차트가 없거나 불필요한 요소 포함 |
| 분야별 전문성 부족 | 모든 카테고리에 동일 프롬프트 사용 | 금융 위젯에 날씨 스타일, 건강 위젯에 금융 스타일 |
| 레이아웃 고정 | 사이즈별 1가지 레이아웃만 가이드 | 비주얼 다양성 부족 |
| Creator 자동 응답 | 질문 단계를 "자동"으로 건너뜀 | 텔레그램 대비 퀄리티 저하 |
| 데이터 현실성 부족 | LLM이 임의 숫자 생성 | "123", "78" 같은 의미없는 값 |
2. 유스케이스 분류 체계
2.1 1차 분류: 도메인 (8대 카테고리)
| 도메인 | 대표 유스케이스 | 핵심 컴포넌트 | 액센트 컬러 |
| 금융 (Finance) | 주가, 환율, 코인, 포트폴리오 | 라인 차트, 캔들스틱, 등락폭, 전일종가선 | #E53935 (상승) / #1A73E8 (하락) |
| 날씨 (Weather) | 현재 날씨, 주간 예보, 미세먼지 | 온도 커브, 날씨 아이콘(SVG), 습도 바, UV 인덱스 | #2196F3 |
| 건강 (Health) | 운동, 수면, 심박수, 칼로리 | 원형 프로그레스, 바 차트, 목표 달성률, 링 | #4CAF50 |
| 생산성 (Productivity) | 할일, 캘린더, 타이머, 메모 | 체크리스트, 프로그레스 바, 카운트다운, 태그 | #FF9500 |
| 교통 (Commute) | 지하철, 버스, 네비, 도착예정 | 타임라인, 경로 표시, 도착 카운트다운, 노선 컬러 | #9C27B0 |
| 미디어 (Media) | 음악, 팟캐스트, 뉴스, 영상 | 앨범아트(placeholder), 프로그레스 바, 웨이브폼 | #E040FB |
| 비즈니스 (Business) | 매출, 재고, 고객, 카페 메뉴 | 바 차트, 파이 차트, KPI 카드, 테이블 | #FF5722 |
| 라이프 (Lifestyle) | 취미, 반려동물, 요리, 독서 | 프로그레스 링, 카운터, AI 메시지, 일러스트 | #00BCD4 |
2.2 2차 분류: 컴포넌트 풀 (Component Pool)
| 컴포넌트 | 설명 | 적합 사이즈 | SVG 필요 |
| Area Chart | 베지어 커브 + 그래디언트 fill + 엔드포인트 | Medium, Large, XL | Yes |
| Line Chart | 스파크라인, 트렌드 표시 | Small 이상 | Yes |
| Bar Chart | 수직/수평 바, 비교 데이터 | Medium 이상 | Yes |
| Progress Ring | 원형 프로그레스 (달성률, 배터리) | Tiny 이상 | Yes |
| Progress Bar | 선형 프로그레스 | Widesmall 이상 | No |
| Detail Grid | 2-3열 데이터 카드 | Medium 이상 | No |
| Badge/Tag | 카테고리 식별 뱃지 | Medium 이상 | No |
| Icon Container | 28px 컬러 박스 + SVG 아이콘 | Tiny 이상 | Yes |
| Timeline | 세로 타임라인 (교통, 일정) | Large 이상 | No |
| Checklist | 체크박스 리스트 | Medium 이상 | No |
| Waveform | 오디오 파형 시각화 | Widesmall 이상 | Yes |
| Refresh Button | 26px 원형 새로고침 | Medium 이상 | Yes |
| Grid Lines | 차트 배경 격자선 | Large 이상 | Yes |
| Reference Line | 전일종가, 목표선 (점선) | Large 이상 | Yes |
2.3 사이즈 × 컴포넌트 매트릭스
| 컴포넌트 | Tiny | Small | WS | Medium | Large | XL |
| Icon Container | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| H1 Number | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Badge | — | — | — | ✅ | ✅ | ✅ |
| Refresh Button | — | — | — | ✅ | ✅ | ✅ |
| Sparkline | — | ✅ | ✅ | — | — | — |
| Area Chart | — | — | — | ✅ | ✅ | ✅ |
| Grid Lines | — | — | — | — | ✅ | ✅ |
| Reference Line | — | — | — | — | ✅ | ✅ |
| Detail Grid | — | — | — | ✅(2) | ✅(3-4) | ✅(3-5) |
| X-axis Labels | — | — | — | — | ✅(4) | ✅(5) |
| Progress Ring | ✅ | ✅ | — | ✅ | ✅ | ✅ |
| Timeline | — | — | — | — | ✅ | ✅ |
3. 제안 워크플로우 TO-BE
사용자 입력 ("삼성전자 주가 대시")
│
▼
S1 의도 파싱 (LLM)
├── type: info
├── category: finance
├── features: [stock, price, chart, change]
└── NEW: suggested_components: [area_chart, badge, detail_grid, reference_line, change_indicator]
│
▼
S1.5 컴포넌트 자동 선정 (NEW)
├── 도메인 × 사이즈 매트릭스 조회
├── LLM이 5개 핵심 컴포넌트 선정 + 이유
├── 사이즈별 가용 컴포넌트 필터링
└── 출력: {components: [...], reasoning: "..."}
│
▼
S2 사용자 확인 (레이아웃 베리에이션)
├── 선정된 컴포넌트 기반 레이아웃 3종 제안
│ ├── A: 정보 밀집형 (데이터 중심)
│ ├── B: 비주얼 중심 (차트 대형화)
│ └── C: 균형형 (차트 + 데이터 그리드)
└── 사용자 선택 또는 "Auto" (AI 추천)
│
▼
S3 도메인 전문 프롬프트 조합
├── 기반: widget_prompt.md (공통 디자인 시스템)
├── 추가: domain_prompts/{category}.md (도메인별 전문 지식)
├── 추가: 선정 컴포넌트 상세 CSS/SVG 가이드
├── 추가: 레이아웃 배치 지시 (선택된 베리에이션)
└── 추가: 도메인별 현실적 샘플 데이터
│
▼
S4 위젯 HTML 생성 (LLM)
├── 시스템 프롬프트: widget_prompt.md + domain prompt
├── 유저 프롬프트: 사이즈 + 컴포넌트 + 레이아웃 + 데이터
└── 출력: JSON {html, reason, explanation}
│
▼
S5 품질 검증 (NEW)
├── widget-root 사이즈 일치 확인
├── 필수 컴포넌트 존재 확인 (DOM 파싱)
├── overflow 검사
└── 실패 시 → 1회 재생성 (피드백 포함)
4. 도메인별 전문 프롬프트 구조
4.1 domain_prompts 파일 구조
design/domain_prompts/
├── finance.md — 주가, 환율, 코인 (차트 패턴, 등락 표기, 거래량)
├── weather.md — 기온, 습도, 미세먼지 (날씨 아이콘 SVG, 온도 커브)
├── health.md — 운동, 수면, 심박수 (프로그레스 링, 목표 달성)
├── productivity.md — 할일, 캘린더 (체크리스트, 타이머)
├── commute.md — 지하철, 버스 (타임라인, 노선 컬러)
├── media.md — 음악, 뉴스 (웨이브폼, 프로그레스 바)
├── business.md — 매출, 재고 (바 차트, KPI 카드)
└── lifestyle.md — 취미, 반려동물 (카운터, AI 메시지)
4.2 도메인 프롬프트 예시 (finance.md)
## Finance Domain — 금융 위젯 전문 가이드
### 필수 데이터 포인트:
- 현재가 (H1, 44px bold, tabular-nums)
- 등락폭 (H2, 상승=#E53935 ▲, 하락=#1A73E8 ▼)
- 등락률 (괄호 안 퍼센트, 소수점 2자리)
- 전일종가 (참조선, 점선, opacity:0.3)
- 거래량 또는 시가총액 (detail grid)
### 샘플 데이터 (현실적 범위):
- 삼성전자: 72,000~85,000원 범위
- 비트코인: $60,000~$100,000 범위
- 원/달러: 1,300~1,400 범위
- 코스피: 2,400~2,800 범위
### 차트 패턴 (5일 기준):
- 상승 추세: M0,80 C50,75 100,60 150,45 200,30 250,20 282,10
- 하락 추세: M0,20 C50,25 100,40 150,55 200,70 250,80 282,90
- V자 반등: M0,30 C50,70 100,90 150,80 200,50 250,25 282,15
### 색상 규칙:
- 전일 대비 상승: #E53935 (빨강) — 한국 증시 규칙
- 전일 대비 하락: #1A73E8 (파랑)
- 보합: #666666
5. 컴포넌트 자동 선정 워크플로우 (S1.5)
5.1 입력 → 컴포넌트 선정 LLM 프롬프트
시스템: 당신은 위젯 컴포넌트 분석기입니다.
사용자의 위젯 요청을 분석하여 최적의 컴포넌트 5개를 선정합니다.
가용 컴포넌트 풀:
- area_chart: 영역 차트 (트렌드, 시계열)
- line_chart: 라인 차트 (스파크라인)
- bar_chart: 바 차트 (비교, 분포)
- progress_ring: 원형 프로그레스 (달성률)
- progress_bar: 선형 프로그레스
- detail_grid: 상세 데이터 그리드 (2-3열)
- badge: 카테고리 뱃지
- icon_container: 아이콘 박스
- timeline: 세로 타임라인
- checklist: 체크리스트
- waveform: 오디오 파형
- reference_line: 참조선 (전일종가 등)
- change_indicator: 등락 표시 (화살표 + 퍼센트)
- grid_lines: 차트 배경 격자
JSON으로 응답:
{
"components": ["area_chart", "badge", "detail_grid", "change_indicator", "reference_line"],
"reasoning": "주가 위젯이므로 시계열 차트와 등락 표시가 핵심...",
"accent_color": "#E53935",
"sample_data": {"value": "84,500원", "change": "+1,200", "pct": "+1.44%"}
}
5.2 사이즈별 컴포넌트 필터링
S1.5에서 선정된 5개 컴포넌트가 선택된 사이즈에서 사용 가능한지 매트릭스 조회 후 필터링. 예: Tiny 선택 시 area_chart, detail_grid, reference_line은 자동 제외.
6. 레이아웃 베리에이션
| 베리에이션 | 특징 | 컴포넌트 비중 | 적합 카테고리 |
| A. 정보 밀집형 | 데이터 최대한 표시, 차트 최소화 | Detail Grid 60%, Chart 20% | 비즈니스, 생산성 |
| B. 비주얼 중심 | 차트 대형화, 데이터 최소화 | Chart 70%, Data 15% | 금융, 건강 |
| C. 균형형 | 차트 + 데이터 균등 배분 | Chart 40%, Grid 40% | 날씨, 교통 |
| D. 카드 분할형 | 복수 작은 카드로 분할 | Mini Cards 80% | 라이프, 미디어 |
| E. 리스트형 | 세로 리스트 (타임라인) | List Items 70% | 교통, 일정 |
7. 구현 로드맵
| 단계 | 작업 | 담당 | 예상 소요 |
| P1 | 도메인별 프롬프트 8개 작성 (finance, weather, health...) | DD + CTL | 각 1개 작성 후 검증 |
| P2 | S1.5 컴포넌트 자동 선정 엔진 구현 | CTL (BE 팀) | stage15_component.py 신규 |
| P3 | stage4_widget_html.py에 도메인 프롬프트 로드 + 병합 | CTL | generate() 함수 수정 |
| P4 | Creator sub-sidebar에 컴포넌트 선택 반영 (LLM 추천) | UZL (FE) | JS 연동 |
| P5 | 레이아웃 베리에이션 프리뷰 (3종 동시 생성) | CTL + UZL | 병렬 생성 API |
| P6 | S5 품질 검증 자동화 (DOM 파싱, 컴포넌트 존재 확인) | QAD | post-generation 검증 |
| P7 | 도메인별 샘플 데이터 DB (현실적 범위의 더미 데이터) | CTL | JSON 데이터 파일 |
8. 기대 효과
| 지표 | 현재 (AS-IS) | 목표 (TO-BE) |
| 위젯 퀄리티 (레퍼런스 대비) | 70-80% | 95%+ |
| 컴포넌트 적중률 | 임의 생성 | LLM 추천 5개 → 사용자 확인 |
| 도메인 전문성 | 공통 프롬프트 1개 | 8개 도메인 전문 프롬프트 |
| 레이아웃 다양성 | 1종 고정 | 5종 베리에이션 |
| 데이터 현실성 | "123", "78" 임의 | 도메인별 현실적 샘플 |
| 품질 검증 | 없음 | 자동 DOM 검증 + 재생성 |
9. 즉시 적용 가능한 Quick Win
- 도메인별 샘플 데이터를 프롬프트에 포함 — "삼성전자 84,500원" 같은 현실적 값이 나오도록 _get_content_guide에 샘플 데이터 추가
- intent.category 기반 액센트 컬러 자동 지정 — finance=#E53935, weather=#2196F3 등을 generate() 프롬프트에 강제
- Creator의 자동 응답을 첫 번째 옵션 + 프롬프트 기반으로 개선 (이미 완료)