jeongkee's picture
Create app.py
92db474 verified
# =========================================================
# DSCR ํ”„๋กฌํ”„ํŠธ ์ฝ”์นญ ์‹œ์Šคํ…œ (Complete Learning Edition)
# ํ—ˆ๊น…ํŽ˜์ด์Šค ๋ฐฐํฌ์šฉ app.py
# =========================================================
import gradio as gr
import re
from typing import List
# =========================================================
# 2. ํ™•์žฅ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (๋ชจ๋“  ๋ˆ„๋ฝ ํ•ญ๋ชฉ ์ถ”๊ฐ€)
# =========================================================
ALL_TECHS = [
"Persona Prompting","Few-shot Prompting","Self-consistency Prompting","Output Formatting",
"Chain-of-Thought (CoT)","Constrained Prompting","RAG Prompting","Step-back Prompting","Role Prompting",
]
# ํ™•์žฅ๋œ ๊ธฐ์ˆ  ์„ค๋ช…
TECH_DETAILED = {
"Persona Prompting": {
"desc": "๋Œ€์ƒ ์—ญํ• /์„ธ๊ทธ๋จผํŠธ์˜ ์–ธ์–ดยทKPIยท๊ด€์‹ฌ์‚ฌ์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ •๋ ฌํ•ด ๋ฐ˜์‘๋ฅ ยท๊ณต๊ฐ๋„๋ฅผ ๋†’์ด๋Š” ๊ธฐ์ˆ ",
"purpose": "๋ˆ„๊ตฌ์—๊ฒŒ ๋งํ•˜๋Š”์ง€ ๋ถ„๋ช…ํžˆ ํ•ด ๊ฐ€์น˜๊ฐ€ '๊ทธ๋“ค์˜ ์–ธ์–ด'๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ํ•จ",
"when_to_use": "ํƒ€๊ฒŸ ์˜ค๋””์–ธ์Šค๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ , ๊ทธ๋“ค๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ด€์‹ฌ์‚ฌ๋‚˜ ์—…๋ฌด ์šฉ์–ด๊ฐ€ ์žˆ์„ ๋•Œ",
"mechanics": [
"์—ญํ• /๊ถŒํ•œ/๊ด€์‹ฌ KPI ๋ช…์‹œ (์˜ˆ: Sales Leader = ํŒŒ์ดํ”„๋ผ์ธยท์Šน๋ฅ ยท๋ฆฌ๋“œํƒ€์ž„)",
"ํ†ค/๊ธˆ์น™์–ด/์„ ํ˜ธ ํ‘œํ˜„ ์ •์˜ (์ง์„คยท๊ฐ„๊ฒฐยท์ˆซ์ž/ROI ์ค‘์‹ฌ, ๋ชจํ˜ธ์–ด ๊ธˆ์ง€)",
"ํŽ˜๋ฅด์†Œ๋‚˜๋ณ„ ๋ฌธ์žฅ ๋งคํ•‘ (๋ฌธ์ œโ†’๊ฐ€์น˜โ†’์ฆ๊ฑฐโ†’CTA ํ๋ฆ„)"
],
"real_example": """
**Before (์ผ๋ฐ˜์ )**: "์ €ํฌ ์†”๋ฃจ์…˜์„ ์†Œ๊ฐœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค"
**After (CEO ํŽ˜๋ฅด์†Œ๋‚˜)**: "์ด๋ฒˆ ๋ถ„๊ธฐ ์šด์˜๋น„ 15% ์ ˆ๊ฐ์œผ๋กœ EBITDA ๊ฐœ์„ ์— ๊ธฐ์—ฌํ•  ๋ฐฉ์•ˆ์„ ์ œ์•ˆ๋“œ๋ฆฝ๋‹ˆ๋‹ค"
**After (๊ฐœ๋ฐœ์ž ํŽ˜๋ฅด์†Œ๋‚˜)**: "API ์‘๋‹ต์‹œ๊ฐ„ 40% ๋‹จ์ถ•๊ณผ ์—๋Ÿฌ์œจ 0.1% ๋‹ฌ์„ฑํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค"
""",
"tips": "ํŽ˜๋ฅด์†Œ๋‚˜ ์กฐ์‚ฌ ์‹œ LinkedIn, ์—…๊ณ„ ๋ฆฌํฌํŠธ, ๊ณ ๊ฐ ์ธํ„ฐ๋ทฐ๋ฅผ ํ™œ์šฉํ•ด ์‹ค์ œ ์‚ฌ์šฉ ์–ธ์–ด๋ฅผ ํŒŒ์•…ํ•˜์„ธ์š”",
"avoid": "๊ฐ€์ •์— ์˜์กดํ•œ ํŽ˜๋ฅด์†Œ๋‚˜ ์„ค์ •, ๊ณผ๋„ํ•œ ์ผ๋ฐ˜ํ™”, ์—…๊ณ„ ํŠธ๋ Œ๋“œ ๋ฌด์‹œ"
},
"Few-shot Prompting": {
"desc": "์†Œ์ˆ˜์˜ ๊ณ ์„ฑ๊ณผ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•ด ํ†คยท๊ตฌ์กฐยท๋ฆฌ๋“ฌ์„ ๋ชจ์‚ฌํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "๊ฒ€์ฆ๋œ ํŒจํ„ด ๋ณต์ œ๋กœ ์ผ๊ด€์„ฑ ํ™•๋ณด ๋ฐ ํ’ˆ์งˆ ํŽธ์ฐจ ์ตœ์†Œํ™”",
"when_to_use": "ํŠน์ • ์Šคํƒ€์ผ์ด๋‚˜ ํ˜•์‹์„ ์ •ํ™•ํžˆ ๋”ฐ๋ผ์•ผ ํ•  ๋•Œ, ๋ธŒ๋žœ๋“œ ํ†ค ์ผ๊ด€์„ฑ์ด ์ค‘์š”ํ•  ๋•Œ",
"mechanics": [
"๊ณ ์„ฑ๊ณผ ์ƒ˜ํ”Œ 2~3๊ฐœ๋ฅผ ํ—ค๋“œ๋ผ์ธ/์˜คํ”„๋‹/๊ทผ๊ฑฐ/CTA ํŒจํ„ด์œผ๋กœ ์ œ๊ณต",
"๊ตฌ์กฐ์  ์š”์†Œ๋ณ„ ์˜ˆ์‹œ (์ œ๋ชฉ ์Šคํƒ€์ผ, ๋ฌธ์žฅ ๊ธธ์ด, ์–ด์กฐ ๋“ฑ)",
"'์ด ํ†ค์„ ๋ชจ์‚ฌํ•ด 3๊ฐœ ๋ณ€ํ˜•' ๊ฐ™์€ ๋‹ค๋ณ€๋Ÿ‰ ํ›„๋ณด ์ƒ์„ฑ"
],
"real_example": """
**์ œ๊ณต ์˜ˆ์‹œ**:
[์˜ˆ์‹œ 1] "Re: Q3 ๋งค์ถœ 18% ์ฆ๊ฐ€ ๋‹ฌ์„ฑ ๋ฐฉ๋ฒ• - 15๋ถ„ ๋…ผ์˜ ๊ฐ€๋Šฅํ• ๊นŒ์š”?"
[์˜ˆ์‹œ 2] "์ฐธ๊ณ : ์œ ์‚ฌ ์—…๊ณ„ ROI 240% ์‚ฌ๋ก€ - ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ ์žˆ์Šต๋‹ˆ๋‹ค"
**AI ์ƒ์„ฑ ๊ฒฐ๊ณผ**:
"Re: ์—ฐ๋ง ๋ชฉํ‘œ ๋‹ฌ์„ฑ๋ฅ  95% ์ „๋žต - 10๋ถ„ ์ƒ๋‹ด ์š”์ฒญ๋“œ๋ฆฝ๋‹ˆ๋‹ค"
""",
"tips": "์—…๊ณ„ ์ตœ๊ณ  ์„ฑ๊ณผ ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , A/B ํ…Œ์ŠคํŠธ ์Šน๋ฆฌ ๋ฒ„์ „์„ ์˜ˆ์‹œ๋กœ ํ™œ์šฉํ•˜์„ธ์š”",
"avoid": "์˜ˆ์‹œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ํ˜ผ๋ž€ ์•ผ๊ธฐ, ๋งฅ๋ฝ์ด ๋‹ค๋ฅธ ์˜ˆ์‹œ ํ˜ผ์šฉ, ์˜ค๋ž˜๋œ ์˜ˆ์‹œ ์‚ฌ์šฉ"
},
"Self-consistency Prompting": {
"desc": "์—ฌ๋Ÿฌ ํ›„๋ณด์•ˆ ์ƒ์„ฑ ํ›„ ์ž์ฒด ์ฑ„์ ์œผ๋กœ ์ตœ์ ์•ˆ์„ ์„ ํƒํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "A/B ํ…Œ์ŠคํŠธ๋ฅผ ๋‚ด์žฅํ•˜์—ฌ ํ’ˆ์งˆ ํ–ฅ์ƒ ๋ฐ ์ตœ์  ์„ ํƒ์ง€ ๋„์ถœ",
"when_to_use": "์ค‘์š”ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์—์„œ ์ตœ๊ณ  ํ’ˆ์งˆ์ด ํ•„์š”ํ•  ๋•Œ, ๊ฐ๊ด€์  ํ‰๊ฐ€๊ฐ€ ์–ด๋ ค์šธ ๋•Œ",
"mechanics": [
"์ œ๋ชฉ 5๊ฐœยท๋ฐ”๋”” 3๊ฐœยทCTA 3๊ฐœ ๋“ฑ ๋‹ค๋ณ€๋Ÿ‰ ์ƒ์„ฑ",
"์ฒดํฌ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ฑ„์  (๊ฐœ์ธํ™”/๋ช…๋ฃŒ์„ฑ/๊ฐ€์น˜/์ŠคํŒธ ํšŒํ”ผ/CTA ๊ฐ•๋„)",
"์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ โ†’ Top 1~2์•ˆ ์„ ํƒ"
],
"real_example": """
**์ƒ์„ฑ๋œ ์ œ๋ชฉ ํ›„๋ณด๋“ค**:
1. "๋งค์ถœ ์ฆ๋Œ€๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐํšŒ" (์ ์ˆ˜: 6/10)
2. "์ด๋ฒˆ ๋‹ฌ ํŒŒ์ดํ”„๋ผ์ธ 25% ํ™•๋Œ€ ๋ฐฉ๋ฒ•" (์ ์ˆ˜: 9/10) โœ“
3. "ํ˜์‹ ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ์†”๋ฃจ์…˜ ์ œ์•ˆ" (์ ์ˆ˜: 4/10)
**์ฑ„์  ๊ธฐ์ค€**: ๊ตฌ์ฒด์„ฑ(3์ ) + ๊ธด๊ธ‰์„ฑ(2์ ) + ๊ฐ€์น˜ ๋ช…ํ™•์„ฑ(3์ ) + ํด๋ฆญ ์œ ๋„(2์ )
""",
"tips": "๋ช…ํ™•ํ•œ ์ฑ„์  ๊ธฐ์ค€ํ‘œ๋ฅผ ๋งŒ๋“ค๊ณ , ํƒ€๊ฒŸ ์˜ค๋””์–ธ์Šค ๊ด€์ ์—์„œ ํ‰๊ฐ€ํ•˜์„ธ์š”",
"avoid": "์ฃผ๊ด€์  ์ฑ„์  ๊ธฐ์ค€, ๋„ˆ๋ฌด ๋งŽ์€ ํ›„๋ณด์•ˆ์œผ๋กœ ์ธํ•œ ํ˜ผ๋ž€, ์ผ๊ด€์„ฑ ์—†๋Š” ํ‰๊ฐ€"
},
"Output Formatting": {
"desc": "์‚ฐ์ถœ๋ฌผ์˜ ํ˜•์‹/์„น์…˜/ํ•„๋“œ๋ฅผ ๊ณ ์ •ํ•˜์—ฌ ์†๋„ยท๊ฐ€๋…์„ฑยท์žฌ์‚ฌ์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "์Šน์ธ ๋ฃจํ”„ ๋‹จ์ถ•, ํ‘œ์ค€ํ™”๋ฅผ ํ†ตํ•œ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™”",
"when_to_use": "๋ฐ˜๋ณต์ ์ธ ๋ฌธ์„œ ์ž‘์—…, ํŒ€ ํ˜‘์—…, ์Šน์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณต์žกํ•  ๋•Œ",
"mechanics": [
"์œ ํ˜•๋ณ„ ํ…œํ”Œ๋ฆฟ ๊ฐ•์ œ (์ด๋ฉ”์ผ/์นดํ”ผ/๋ณด๊ณ ์„œ/PRD/API ๋ฌธ์„œ)",
"ํ•„์ˆ˜ยท์„ ํƒ ํ•„๋“œ ๋ช…์‹œ ๋ฐ ๊ธธ์ด ์ œํ•œ",
"JSON ์Šคํ‚ค๋งˆ๋‚˜ ๋งˆํฌ๋‹ค์šด ๊ตฌ์กฐ ํ™œ์šฉ"
],
"real_example": """
**์ด๋ฉ”์ผ ํฌ๋งท**:
- ์ œ๋ชฉ: [๊ธด๊ธ‰๋„][์นดํ…Œ๊ณ ๋ฆฌ] ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€ (30์ž ์ด๋‚ด)
- ์˜คํ”„๋‹: ์ƒ๋Œ€๋ฐฉ ์„ฑ๊ณผ/๊ด€์‹ฌ์‚ฌ ์–ธ๊ธ‰ (1๋ฌธ์žฅ)
- ๊ฐ€์น˜์ œ์•ˆ: ๊ตฌ์ฒด์  ํ˜œํƒ (2-3๋ฌธ์žฅ)
- ์ฆ๊ฑฐ: ๋ฐ์ดํ„ฐ/์‚ฌ๋ก€ (1-2๊ฐœ)
- CTA: ๋ช…ํ™•ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„ (1๋ฌธ์žฅ)
- PS: ์ถ”๊ฐ€ ๊ฐ€์น˜/๊ธด๊ธ‰์„ฑ (์„ ํƒ)
""",
"tips": "์กฐ์ง์˜ ๊ธฐ์กด ํ…œํ”Œ๋ฆฟ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐ€์žฅ ์„ฑ๊ณผ ์ข‹์€ ํ˜•์‹์„ ํ‘œ์ค€ํ™”ํ•˜์„ธ์š”",
"avoid": "๊ณผ๋„ํ•œ ์ œ์•ฝ์œผ๋กœ ์ฐฝ์˜์„ฑ ์ €ํ•ด, ๋งฅ๋ฝ์„ ๋ฌด์‹œํ•œ ํš์ผ์  ์ ์šฉ"
},
"Chain-of-Thought (CoT)": {
"desc": "๋ชฉํ‘œโ†’์ง€ํ‘œโ†’๋Œ€์•ˆโ†’์„ ํƒโ†’์‹คํ–‰์˜ ๋‹จ๊ณ„์  ์ถ”๋ก ์œผ๋กœ ๋…ผ๋ฆฌ ๋น„์•ฝ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "๋ถ„์„/์ „๋žต ๋ฌธ์„œ์˜ ๋…ผ๋ฆฌ ์ผ๊ด€์„ฑ ํ™•๋ณด ๋ฐ ์˜์‚ฌ๊ฒฐ์ • ํ’ˆ์งˆ ํ–ฅ์ƒ",
"when_to_use": "๋ณต์žกํ•œ ๋ฌธ์ œ ๋ถ„์„, ์ „๋žต ์ˆ˜๋ฆฝ, ๋…ผ๋ฆฌ์  ์„ค๋“์ด ํ•„์š”ํ•œ ์ƒํ™ฉ",
"mechanics": [
"๊ฐ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ •/๊ทผ๊ฑฐ/๋Œ€์•ˆ/๋ฆฌ์Šคํฌ ์ฒดํฌ ์งˆ๋ฌธ ๋ถ€์—ฌ",
"์—ฐ์—ญ์ /๊ท€๋‚ฉ์  ์ถ”๋ก  ๊ตฌ์กฐ ๋ช…์‹œ",
"์ค‘๊ฐ„ ๊ฒฐ๋ก ๊ณผ ์ตœ์ข… ๊ฒฐ๋ก ์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ํ™•์ธ"
],
"real_example": """
**๋‹จ๊ณ„๋ณ„ ์ถ”๋ก  ์˜ˆ์‹œ**:
1. **ํ˜„ํ™ฉ**: ๊ณ ๊ฐ ์ดํƒˆ๋ฅ  15% (์—…๊ณ„ ํ‰๊ท  12%)
2. **์›์ธ ๋ถ„์„**: ์˜จ๋ณด๋”ฉ ๊ธฐ๊ฐ„ ํ‰๊ท  4์ฃผ (๊ฒฝ์Ÿ์‚ฌ 2์ฃผ)
3. **๊ฐ€์„ค**: ์˜จ๋ณด๋”ฉ ๊ธฐ๊ฐ„ ๋‹จ์ถ• โ†’ ์ดํƒˆ๋ฅ  ๊ฐ์†Œ
4. **๊ฒ€์ฆ**: A/B ํ…Œ์ŠคํŠธ๋กœ 2์ฃผ ์˜จ๋ณด๋”ฉ ๊ทธ๋ฃน์˜ ์ดํƒˆ๋ฅ  8% ํ™•์ธ
5. **๊ฒฐ๋ก **: ์˜จ๋ณด๋”ฉ ํ”„๋กœ์„ธ์Šค ๊ฐœ์„ ์œผ๋กœ ์ดํƒˆ๋ฅ  50% ๊ฐ์†Œ ๊ฐ€๋Šฅ
""",
"tips": "๊ฐ ๋‹จ๊ณ„์—์„œ '์™œ?'๋ผ๋Š” ์งˆ๋ฌธ์„ 3๋ฒˆ ์ด์ƒ ๋˜์ง€๊ณ , ๋ฐ˜๋Œ€ ์˜๊ฒฌ๋„ ๊ณ ๋ คํ•˜์„ธ์š”",
"avoid": "๋…ผ๋ฆฌ์  ๋น„์•ฝ, ํ™•์ธ ํŽธํ–ฅ, ๋‹จ์ˆœํ•œ ์ธ๊ณผ๊ด€๊ณ„ ๊ฐ€์ •"
},
"Constrained Prompting": {
"desc": "๊ธธ์ดยท๊ธˆ์น™์–ดยทํ•„์ˆ˜ํ•„๋“œยทJSON ์Šคํ‚ค๋งˆ ๋“ฑ ๋ช…ํ™•ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "๋ธŒ๋žœ๋“œ/๋ฒ•๋ฌด/์‹ฌ์˜ ๋ฆฌ์Šคํฌ ์ตœ์†Œํ™” ๋ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ",
"when_to_use": "๊ทœ์ œ ์‚ฐ์—…, ๋ธŒ๋žœ๋“œ ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜, ๋Œ€์™ธ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜",
"mechanics": [
"์ œ๋ชฉ โ‰ค 30์ž, ๋ณธ๋ฌธ โ‰ค 200๋‹จ์–ด ๋“ฑ ๋ช…ํ™•ํ•œ ๊ธธ์ด ์ œํ•œ",
"์‚ฌ์šฉ ๊ธˆ์ง€ ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ ์ œ๊ณต",
"ํ•„์ˆ˜ ํฌํ•จ ์š”์†Œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ"
],
"real_example": """
**์ œ์•ฝ ์กฐ๊ฑด ์˜ˆ์‹œ**:
- ๊ธธ์ด: ์ œ๋ชฉ 25์ž ์ด๋‚ด, ๋ณธ๋ฌธ 150๋‹จ์–ด ์ด๋‚ด
- ๊ธˆ์ง€์–ด: "๋ณด์žฅ", "ํ™•์‹คํ•œ", "๋ฌด์กฐ๊ฑด", "์ตœ๊ณ ์˜"
- ํ•„์ˆ˜ ํฌํ•จ: ํšŒ์‚ฌ๋ช…, ์—ฐ๋ฝ์ฒ˜, ๋ฒ•์  ๊ณ ์ง€์‚ฌํ•ญ
- ํ†ค: ์ „๋ฌธ์ ์ด๋˜ ์นœ๊ทผํ•จ, ๊ณผ์žฅ ๊ธˆ์ง€
**๊ฒฐ๊ณผ๋ฌผ ๊ฒ€์ฆ**: โœ“ ๊ธธ์ด ์ค€์ˆ˜ โœ“ ๊ธˆ์ง€์–ด ์—†์Œ โœ“ ํ•„์ˆ˜ ์š”์†Œ ํฌํ•จ
""",
"tips": "์—…๊ณ„ ๊ทœ์ œ ์‚ฌํ•ญ์„ ๋ฏธ๋ฆฌ ์กฐ์‚ฌํ•˜๊ณ , ๊ณผ๊ฑฐ ์ด์Šˆ ์‚ฌ๋ก€๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์„ธ์š”",
"avoid": "๊ณผ๋„ํ•œ ์ œ์•ฝ์œผ๋กœ ๋ฉ”์‹œ์ง€ ํšจ๊ณผ ์ €ํ•ด, ๋ถˆ๋ถ„๋ช…ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ"
},
"RAG Prompting": {
"desc": "์™ธ๋ถ€ ๋ณด๊ณ ์„œ/DB/๋ฌธ์„œ์˜ ๊ทผ๊ฑฐ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์ตœ์‹ ์„ฑยท์‹ ๋ขฐ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "์ถ”์ •/ํ™˜๊ฐ ๋ฐฉ์ง€, ์ถœ์ฒ˜ ๊ธฐ๋ฐ˜ ์„œ์ˆ ๋กœ ์‹ ๋ขฐ๋„ ํ–ฅ์ƒ",
"when_to_use": "์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ, ์ •ํ™•์„ฑ์ด ํ•ต์‹ฌ์ธ ๋ณด๊ณ ์„œ, ๊ทผ๊ฑฐ ๊ธฐ๋ฐ˜ ์„ค๋“",
"mechanics": [
"'๋ฌธ์„œ์— ์—†๋Š” ๋‚ด์šฉ์€ ์ถ”์ • ๊ธˆ์ง€, ์ถœ์ฒ˜ ๋ช…์‹œ' ์ง€์‹œ",
"์ธ์šฉ/๊ฐ์ฃผ/๋งํฌ ํ‘œ๊ธฐ ์˜๋ฌดํ™”",
"์—ฌ๋Ÿฌ ์†Œ์Šค ๊ฐ„ ์ผ์น˜์„ฑ ๊ฒ€์ฆ"
],
"real_example": """
**์ฐธ๊ณ  ์ž๋ฃŒ ์ฃผ์ž…**:
"๋‹ค์Œ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ถ„์„ํ•˜์„ธ์š”:
- Gartner MQ 2024 (์‹œ์žฅ ํ˜„ํ™ฉ)
- ํšŒ์‚ฌ 2024 Q3 ์‹ค์  (๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ)
- McKinsey Global Survey 2024 (ํŠธ๋ Œ๋“œ)
**๊ฒฐ๊ณผ๋ฌผ**: ๋ชจ๋“  ์ฃผ์žฅ์— ์ถœ์ฒ˜ ํ‘œ๊ธฐ
"์‹œ์žฅ ์„ฑ์žฅ๋ฅ  23% (Gartner, 2024)"
"๋‹น์‚ฌ ์ ์œ ์œจ 15% ์ฆ๊ฐ€ (๋‚ด๋ถ€ ์‹ค์ , Q3)"
""",
"tips": "์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” 1์ฐจ ์ž๋ฃŒ๋ฅผ ์šฐ์„ ํ•˜๊ณ , ์ •๋ณด์˜ ๋ฐœํ–‰ ๋‚ ์งœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”",
"avoid": "์ถœ์ฒ˜ ๋ถˆ๋ถ„๋ช…ํ•œ ์ •๋ณด ํ™œ์šฉ, ํŽธํ–ฅ๋œ ์ž๋ฃŒ๋งŒ ์„ ํƒ, ๋งฅ๋ฝ ๋ฌด์‹œํ•œ ๋ฐ์ดํ„ฐ ์ธ์šฉ"
},
"Step-back Prompting": {
"desc": "์ƒ์œ„ ๋ชฉ์ /์›์น™์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์˜๋ฏธ ์ค‘์‹ฌ์œผ๋กœ ์žฌํ•ด์„ํ•˜๋Š” ๊ธฐ์ˆ ",
"purpose": "'์™œ ์ค‘์š”ํ•œ๊ฐ€'์— ๋จผ์ € ๋‹ตํ•ด ๊ฒฝ์˜ ์‹œ์‚ฌ์  ๊ฐ•ํ™”",
"when_to_use": "์ „๋žต์  ์˜์‚ฌ๊ฒฐ์ •, ๊ทผ๋ณธ์  ๋ฌธ์ œ ํ•ด๊ฒฐ, ์กฐ์ง ์ฐจ์›์˜ ๋ณ€ํ™” ๊ด€๋ฆฌ",
"mechanics": [
"์ƒ์œ„ ๋ชฉํ‘œ โ†’ ํ•ต์‹ฌ ์›์น™ โ†’ ํ˜„์žฌ ์„ ํƒ์˜ ์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ",
"5 Whys ๊ธฐ๋ฒ•์œผ๋กœ ๊ทผ๋ณธ ์›์ธ ํƒ๊ตฌ",
"๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ์™€ ์ „๋žต์  ์˜๋ฏธ ์—ฐ๊ฒฐ"
],
"real_example": """
**Step-back ์‚ฌ๊ณ  ๊ณผ์ •**:
ํ‘œ๋ฉด์  ๋ฌธ์ œ: "๋งˆ์ผ€ํŒ… ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’๋‹ค"
โ†“
Step back: "์™œ ๋งˆ์ผ€ํŒ…์„ ํ•˜๋Š”๊ฐ€?" โ†’ ๊ณ ๊ฐ ํš๋“
โ†“
๋” ๊นŠ์ด: "์™œ ๊ณ ๊ฐ ํš๋“์ด ์ค‘์š”ํ•œ๊ฐ€?" โ†’ ์„ฑ์žฅ ์ „๋žต
โ†“
ํ•ต์‹ฌ ์งˆ๋ฌธ: "์ง€์† ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ ๋ฐฉ๋ฒ•์€?" โ†’ ๊ณ ๊ฐ ์ƒ์• ๊ฐ€์น˜ ์ตœ์ ํ™”
""",
"tips": "๋ฌธ์ œ์˜ ์ฆ์ƒ์ด ์•„๋‹Œ ๊ทผ๋ณธ ์›์ธ์— ์ง‘์ค‘ํ•˜๊ณ , ์žฅ๊ธฐ์  ๊ด€์ ์—์„œ ์ ‘๊ทผํ•˜์„ธ์š”",
"avoid": "ํ‘œ๋ฉด์  ํ•ด๊ฒฐ์ฑ…์—๋งŒ ๋งค๋ชฐ, ํ˜„์‹ค์„ฑ ์—†๋Š” ์ด์ƒ๋ก , ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”"
},
"Role Prompting": {
"desc": "'๋‹น์‹ ์€ PM/์ „๋žต๊ฐ€/UX ๋ผ์ดํ„ฐ...'์ฒ˜๋Ÿผ ํŠน์ • ๊ด€์ ์„ ๊ณ ์ •ํ•˜์—ฌ ๋ชฉ์  ์ ํ•ฉ์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ์ˆ ",
"purpose": "์ง๋ฌด๋ณ„ ์–ธ์–ด/ํŒ๋‹จ ๊ธฐ์ค€/์šฐ์„ ์ˆœ์œ„ ์ผ์น˜",
"when_to_use": "์ „๋ฌธ ๋ถ„์•ผ๋ณ„ ๊ฒฐ๊ณผ๋ฌผ, ํŠน์ • ์ง๋ฌด์˜ ๊ด€์ ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ",
"mechanics": [
"์—ญํ• ๋ณ„ KPIยท๊ถŒํ•œยท๋ฆฌ์Šคํฌ ๊ด€์  ๋ช…์‹œ",
"ํ•ด๋‹น ์ง๋ฌด์˜ ์ „๋ฌธ ์šฉ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ ํ™œ์šฉ",
"์—ญํ• ๋ณ„ ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€๊ณผ ์ œ์•ฝ์‚ฌํ•ญ ๋ฐ˜์˜"
],
"real_example": """
**PM ๊ด€์ **: "์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ ํ˜•ํƒœ๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •๋ฆฌํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜์™€ ๊ฐœ๋ฐœ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์„ค์ •ํ•˜์„ธ์š”"
**CFO ๊ด€์ **: "ROI, EBITDA ์˜ํ–ฅ, ํ˜„๊ธˆํ๋ฆ„ ๊ด€์ ์—์„œ ๋ถ„์„ํ•˜๊ณ , ์žฌ๋ฌด ๋ฆฌ์Šคํฌ๋ฅผ ์ˆ˜์น˜๋กœ ์ •๋Ÿ‰ํ™”ํ•˜์„ธ์š”"
**UX ๋””์ž์ด๋„ˆ ๊ด€์ **: "์‚ฌ์šฉ์ž ์—ฌ์ •๊ณผ ์ ‘์ ๋ณ„ ํŽ˜์ธํฌ์ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ์‚ฌ์šฉ์„ฑ ํ…Œ์ŠคํŠธ ๊ธฐ์ค€์„ ์ œ์‹œํ•˜์„ธ์š”"
""",
"tips": "๊ฐ ์—ญํ• ์˜ ์‹ค์ œ ์—…๋ฌด ๋ฐฉ์‹๊ณผ ๊ณ ๋ฏผ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ , ํ•ด๋‹น ์ง๋ฌด์˜ ์ „๋ฌธ๊ฐ€์™€ ๊ฒ€์ฆํ•˜์„ธ์š”",
"avoid": "ํ‘œ๋ฉด์  ์—ญํ•  ์ดํ•ด, ์ง๋ฌด๋ณ„ ์ฐจ์ด ๋ฌด์‹œ, ๊ณ ์ •๊ด€๋…์— ์˜์กดํ•œ ์—ญํ•  ์„ค์ •"
}
}
# ์™„์ „ํ•œ Pain Points ์„ค๋ช…
PAIN_DETAILED = {
"๋ฐ˜์‘๋ฅ  ์ €์กฐ": {
"definition": "์ด๋ฉ”์ผ ๊ฐœ๋ด‰๋ฅ , ํด๋ฆญ๋ฅ , ์‘๋‹ต๋ฅ ์ด ์—…๊ณ„ ํ‰๊ท ์ด๋‚˜ ๋ชฉํ‘œ์น˜๋ณด๋‹ค ํ˜„์ €ํžˆ ๋‚ฎ์€ ์ƒํ™ฉ",
"symptoms": [
"์ด๋ฉ”์ผ ๊ฐœ๋ด‰๋ฅ  15% ๋ฏธ๋งŒ (B2B ํ‰๊ท  21%)",
"ํด๋ฆญ๋ฅ  2% ๋ฏธ๋งŒ (์—…๊ณ„ ํ‰๊ท  3-4%)",
"์ฝœ๋“œ ์•„์›ƒ๋ฆฌ์น˜ ์‘๋‹ต๋ฅ  1% ๋ฏธ๋งŒ",
"์†Œ์…œ๋ฏธ๋””์–ด ์ฐธ์—ฌ๋„ ์ง€์†์  ํ•˜๋ฝ"
],
"root_causes": [
"ํƒ€๊ฒŸ ์˜ค๋””์–ธ์Šค ๋ถˆ์ผ์น˜",
"์ œ๋ชฉ/ํ—ค๋“œ๋ผ์ธ์˜ ๋งค๋ ฅ๋„ ๋ถ€์กฑ",
"๊ฐ€์น˜ ์ œ์•ˆ์˜ ๋ชจํ˜ธํ•จ",
"ํƒ€์ด๋ฐ๊ณผ ์ฑ„๋„ ์ „๋žต ์˜ค๋ฅ˜"
],
"business_impact": "๊ณ ๊ฐ ํš๋“ ๋น„์šฉ ์ฆ๊ฐ€, ๋งค์ถœ ๋ชฉํ‘œ ๋‹ฌ์„ฑ ์–ด๋ ค์›€, ๋งˆ์ผ€ํŒ… ROI ํ•˜๋ฝ",
"real_examples": [
"SaaS ํšŒ์‚ฌ: ๊ธฐ๋Šฅ ์ค‘์‹ฌ ๋ฉ”์‹œ์ง€ โ†’ ROI ์ค‘์‹ฌ์œผ๋กœ ๋ณ€๊ฒฝ ํ›„ ์‘๋‹ต๋ฅ  3๋ฐฐ ์ฆ๊ฐ€",
"์ปจ์„คํŒ… ํŽŒ: ์ผ๋ฐ˜์  ์ œ์•ˆ โ†’ ์—…๊ณ„๋ณ„ ๋งž์ถค ์‚ฌ๋ก€๋กœ ๊ฐœ๋ด‰๋ฅ  40% ๊ฐœ์„ "
],
"measurement": "Google Analytics, ์ด๋ฉ”์ผ ๋งˆ์ผ€ํŒ… ํˆด, CRM ๋ฐ์ดํ„ฐ๋กœ ์ถ”์ "
},
"๋ฉ”์‹œ์ง€ ๋ถˆ์ผ์น˜": {
"definition": "์ฑ„๋„, ํŒ€, ์‹œ์ ๋ณ„๋กœ ๋ธŒ๋žœ๋“œ ๋ฉ”์‹œ์ง€๋‚˜ ํ†ค์ด ์ผ๊ด€๋˜์ง€ ์•Š์•„ ๋ธŒ๋žœ๋“œ ์‹ ๋ขฐ๋„๊ฐ€ ์ €ํ•˜๋˜๋Š” ์ƒํ™ฉ",
"symptoms": [
"์ฑ„๋„๋ณ„ ๋‹ค๋ฅธ ํ†ค์•ค๋งค๋„ˆ (์ด๋ฉ”์ผ์€ ๊ฒฉ์‹, SNS๋Š” ์บ์ฃผ์–ผ)",
"ํŒ€๋ณ„ ์ƒ์ดํ•œ ๊ฐ€์น˜ ์ œ์•ˆ ์„ค๋ช…",
"์‹œ๊ธฐ๋ณ„ ๋ฉ”์‹œ์ง€ ๋ณ€ํ™”๋กœ ํ˜ผ๋ž€ ์•ผ๊ธฐ",
"๋ธŒ๋žœ๋“œ ๊ฐ€์ด๋“œ๋ผ์ธ ๋ฌด์‹œ"
],
"root_causes": [
"๋ช…ํ™•ํ•œ ๋ธŒ๋žœ๋“œ ๊ฐ€์ด๋“œ๋ผ์ธ ๋ถ€์žฌ",
"ํŒ€ ๊ฐ„ ์†Œํ†ต ๋ถ€์กฑ",
"์ฝ˜ํ…์ธ  ๊ฒ€ํ†  ํ”„๋กœ์„ธ์Šค ๋ฏธ๋น„",
"์™ธ๋ถ€ ์—์ด์ „์‹œ์™€์˜ ์กฐ์œจ ๋ถ€์กฑ"
],
"business_impact": "๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ํ˜ผ๋ž€, ๊ณ ๊ฐ ์‹ ๋ขฐ๋„ ํ•˜๋ฝ, ๋งˆ์ผ€ํŒ… ํšจ์œจ์„ฑ ์ €ํ•˜",
"real_examples": [
"์Šคํƒ€ํŠธ์—…: ์ฐฝ์—…์ž์™€ ๋งˆ์ผ€ํŒ…ํŒ€์˜ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๋กœ ๊ณ ๊ฐ ํ˜ผ๋ž€ โ†’ ํ†ตํ•ฉ ๋ฉ”์‹œ์ง€ ํ•˜์šฐ์Šค ๊ตฌ์ถ•",
"๊ธ€๋กœ๋ฒŒ ๊ธฐ์—…: ์ง€์—ญ๋ณ„ ๋‹ค๋ฅธ ํฌ์ง€์…”๋‹ โ†’ ๊ธ€๋กœ๋ฒŒ ๋ธŒ๋žœ๋“œ ๊ฐ€์ด๋“œ๋ผ์ธ ์ˆ˜๋ฆฝ"
],
"measurement": "๋ธŒ๋žœ๋“œ ์ถ”์  ์กฐ์‚ฌ, ์†Œ์…œ ๋ฏธ๋””์–ด ๋ฉ˜์…˜ ๋ถ„์„, ๊ณ ๊ฐ ํ”ผ๋“œ๋ฐฑ ๋ถ„์„"
},
"์ž‘์„ฑ ์‹œ๊ฐ„ ๊ณผ๋‹ค": {
"definition": "์ฝ˜ํ…์ธ ๋‚˜ ๋ฌธ์„œ ์ž‘์„ฑ์— ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์–ด ๋‹ค๋ฅธ ์—…๋ฌด์— ์ง€์žฅ์„ ์ฃผ๋Š” ์ƒํ™ฉ",
"symptoms": [
"์ด๋ฉ”์ผ ํ•˜๋‚˜ ์ž‘์„ฑ์— 30๋ถ„ ์ด์ƒ ์†Œ์š”",
"๋ณด๊ณ ์„œ ์ž‘์„ฑ์œผ๋กœ ์ธํ•œ ์•ผ๊ทผ ๋นˆ๋ฒˆ",
"์ฝ˜ํ…์ธ  ์Šน์ธ ๊ณผ์ •์—์„œ ๋ฌดํ•œ ์ˆ˜์ •",
"์ฐฝ์˜์  ์•„์ด๋””์–ด ๋ถ€์กฑ์œผ๋กœ ๊ณ ๋ฏผ ์‹œ๊ฐ„ ์ฆ๊ฐ€"
],
"root_causes": [
"ํ…œํ”Œ๋ฆฟ์ด๋‚˜ ๊ฐ€์ด๋“œ๋ผ์ธ ๋ถ€์žฌ",
"๋ช…ํ™•ํ•œ ๋ชฉํ‘œ ์„ค์ • ๋ถ€์กฑ",
"์™„๋ฒฝ์ฃผ์˜ ์„ฑํ–ฅ",
"ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์˜ ๋น„ํšจ์œจ์„ฑ"
],
"business_impact": "์ƒ์‚ฐ์„ฑ ์ €ํ•˜, ๊ธฐํšŒ๋น„์šฉ ์ฆ๊ฐ€, ์ง์› ์ŠคํŠธ๋ ˆ์Šค ์ฆ๊ฐ€, ํ”„๋กœ์ ํŠธ ์ง€์—ฐ",
"real_examples": [
"๋งˆ์ผ€ํŒ…ํŒ€: ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ๋„์ž…์œผ๋กœ ์ž‘์„ฑ ์‹œ๊ฐ„ 70% ๋‹จ์ถ•",
"์„ธ์ผ์ฆˆํŒ€: ์˜์—… ์ œ์•ˆ์„œ ์ž๋™ํ™”๋กœ ํ•˜๋ฃจ 3์‹œ๊ฐ„ ์ ˆ์•ฝ"
],
"measurement": "์ž‘์—… ์‹œ๊ฐ„ ์ถ”์ , ์ƒ์‚ฐ์„ฑ ์ง€ํ‘œ, ์ง์› ๋งŒ์กฑ๋„ ์กฐ์‚ฌ"
},
"A/B ํ…Œ์ŠคํŠธ ๋ถ€๋‹ด": {
"definition": "A/B ํ…Œ์ŠคํŠธ ์„ค๊ณ„, ์‹คํ–‰, ๋ถ„์„์— ๊ณผ๋„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ํˆฌ์ž…๋˜์–ด ๋ถ€๋‹ด์ด ๋˜๋Š” ์ƒํ™ฉ",
"symptoms": [
"ํ…Œ์ŠคํŠธ ์„ค๊ณ„์— ์ผ์ฃผ์ผ ์ด์ƒ ์†Œ์š”",
"ํ†ต๊ณ„์  ์œ ์˜์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•œ ๊ธด ํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„",
"๊ฒฐ๊ณผ ๋ถ„์„์˜ ๋ณต์žก์„ฑ",
"ํ…Œ์ŠคํŠธ ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€"
],
"root_causes": [
"ํ…Œ์ŠคํŠธ ๋„๊ตฌ ๋ถ€์กฑ ๋˜๋Š” ๋ณต์žก์„ฑ",
"ํ†ต๊ณ„ ์ง€์‹ ๋ถ€์กฑ",
"๋ช…ํ™•ํ•œ ๊ฐ€์„ค ์„ค์ • ์‹คํŒจ",
"ํ‘œ๋ณธ ํฌ๊ธฐ ๋ถ€์กฑ"
],
"business_impact": "์˜์‚ฌ๊ฒฐ์ • ์ง€์—ฐ, ํ…Œ์ŠคํŠธ ๋น„์šฉ ์ฆ๊ฐ€, ๊ธฐํšŒ๋น„์šฉ ๋ฐœ์ƒ",
"real_examples": [
"์ด์ปค๋จธ์Šค: ์ž๋™ํ™” ๋„๊ตฌ ๋„์ž…์œผ๋กœ ํ…Œ์ŠคํŠธ ์„ค์ • ์‹œ๊ฐ„ 80% ๋‹จ์ถ•",
"SaaS: ๊ฐ„๋‹จํ•œ A/B ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜์œจ 25% ๊ฐœ์„ "
],
"measurement": "ํ…Œ์ŠคํŠธ ์™„๋ฃŒ์œจ, ํ‰๊ท  ํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„, ํ…Œ์ŠคํŠธ ROI"
},
"๊ฒฝ์Ÿ์‚ฌ ์ •๋ณด ๋ถ€์กฑ": {
"definition": "๊ฒฝ์Ÿ์‚ฌ์˜ ์ „๋žต, ์ œํ’ˆ, ๊ฐ€๊ฒฉ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด ๋ถ€์กฑ์œผ๋กœ ์ „๋žต ์ˆ˜๋ฆฝ์— ์–ด๋ ค์›€์„ ๊ฒช๋Š” ์ƒํ™ฉ",
"symptoms": [
"๊ฒฝ์Ÿ์‚ฌ ๊ฐ€๊ฒฉ ์ •์ฑ… ํŒŒ์•… ๋ถˆ๊ฐ€",
"๊ฒฝ์Ÿ์‚ฌ ์‹ ์ œํ’ˆ ์ถœ์‹œ ํ›„ ๋’ค๋Šฆ์€ ๋Œ€์‘",
"์‹œ์žฅ ํฌ์ง€์…”๋‹ ์ „๋žต ๋ถ€์žฌ",
"๊ณ ๊ฐ ์ดํƒˆ ์›์ธ ๋ถ„์„ ๋ถ€์กฑ"
],
"root_causes": [
"์ฒด๊ณ„์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„ ๋ถ€์žฌ",
"์ •๋ณด ์ˆ˜์ง‘ ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ",
"๊ฒฝ์Ÿ ๋ถ„์„ ์ „๋ฌธ์„ฑ ๋ถ€์กฑ",
"์ •๋ณด ๊ณต์œ  ์‹œ์Šคํ…œ ๋ฏธ๋น„"
],
"business_impact": "์‹œ์žฅ ๊ธฐํšŒ ์ƒ์‹ค, ๊ฒฝ์Ÿ๋ ฅ ์•ฝํ™”, ๊ณ ๊ฐ ์ดํƒˆ ์ฆ๊ฐ€",
"real_examples": [
"ํ•€ํ…Œํฌ: ๊ฒฝ์Ÿ์‚ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๋„์ž…์œผ๋กœ ์‹ ์†ํ•œ ์‹œ์žฅ ๋Œ€์‘",
"๋ฆฌํ…Œ์ผ: ๊ฐ€๊ฒฉ ๋น„๊ต ์‹œ์Šคํ…œ์œผ๋กœ ๋™์  ๊ฐ€๊ฒฉ ์ „๋žต ์ˆ˜๋ฆฝ"
],
"measurement": "์‹œ์žฅ ์ ์œ ์œจ, ๊ฒฝ์Ÿ์‚ฌ ๋Œ€๋น„ ์„ฑ๊ณผ ์ง€ํ‘œ, ๊ณ ๊ฐ ๋งŒ์กฑ๋„ ๋น„๊ต"
},
"๊ณ ๊ฐ ์š”๊ตฌ ๋ถˆ๋ช…ํ™•": {
"definition": "๊ณ ๊ฐ์˜ ์‹ค์ œ ๋‹ˆ์ฆˆ์™€ ๊ธฐ๋Œ€์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•ด ์ œํ’ˆ/์„œ๋น„์Šค ๊ฐœ์„  ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ",
"symptoms": [
"๊ณ ๊ฐ ์ดํƒˆ ์›์ธ ๋ถˆ๋ช…",
"์‹ ๊ธฐ๋Šฅ ์ถœ์‹œ ํ›„ ์‚ฌ์šฉ๋ฅ  ์ €์กฐ",
"๊ณ ๊ฐ ์ง€์› ๋ฌธ์˜ ์ฆ๊ฐ€",
"๊ณ ๊ฐ ๋งŒ์กฑ๋„ ์ ์ˆ˜ ์ •์ฒด"
],
"root_causes": [
"์ฒด๊ณ„์ ์ธ ๊ณ ๊ฐ ์กฐ์‚ฌ ๋ถ€์žฌ",
"๊ณ ๊ฐ ์„ธ๋ถ„ํ™” ๋ถ€์กฑ",
"ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ ์ฑ„๋„ ํ•œ๊ณ„",
"๋ฐ์ดํ„ฐ ๋ถ„์„ ์—ญ๋Ÿ‰ ๋ถ€์กฑ"
],
"business_impact": "์ œํ’ˆ ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ์„ฑ ์˜ค๋ฅ˜, ๊ณ ๊ฐ ์ดํƒˆ ์ฆ๊ฐ€, R&D ํˆฌ์ž ํšจ์œจ์„ฑ ์ €ํ•˜",
"real_examples": [
"B2B SaaS: ๊ณ ๊ฐ ์ธํ„ฐ๋ทฐ๋ฅผ ํ†ตํ•ด ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์šฐ์„ ์ˆœ์œ„ ์žฌ์ •๋ฆฝ",
"์ด์ปค๋จธ์Šค: ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์œผ๋กœ ๊ฐœ์ธํ™” ์ถ”์ฒœ ์‹œ์Šคํ…œ ๊ฐœ์„ "
],
"measurement": "๊ณ ๊ฐ ๋งŒ์กฑ๋„, Net Promoter Score, ๊ณ ๊ฐ ์ƒ์• ๊ฐ€์น˜"
},
"์ถœ์ฒ˜/๊ธฐ๊ฐ„ ๋ˆ„๋ฝ": {
"definition": "๋ฆฌ์„œ์น˜๋‚˜ ๋ถ„์„ ๋ฌธ์„œ์—์„œ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜์™€ ์ˆ˜์ง‘ ๊ธฐ๊ฐ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ์‹ ๋ขฐ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ์ƒํ™ฉ",
"symptoms": [
"๋ณด๊ณ ์„œ์— '์ตœ๊ทผ ์กฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด'๊ณผ ๊ฐ™์€ ๋ชจํ˜ธํ•œ ํ‘œํ˜„",
"๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ ๋ฏธํ‘œ๊ธฐ๋กœ ์‹ ๋ขฐ์„ฑ ์˜์‹ฌ",
"๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์™€ ์ตœ์‹  ๋ฐ์ดํ„ฐ ํ˜ผ์žฌ",
"์ •๋ณด์˜ ์œ ํšจ๊ธฐ๊ฐ„ ๋ถˆ๋ถ„๋ช…"
],
"root_causes": [
"์ฒด๊ณ„์ ์ธ ์ž๋ฃŒ ๊ด€๋ฆฌ ๋ถ€์žฌ",
"์ถœ์ฒ˜ ํ‘œ๊ธฐ ๊ฐ€์ด๋“œ๋ผ์ธ ๋ฏธ๋น„",
"์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ๊ฐ„๊ณผ",
"๊ฒ€์ฆ๋˜์ง€ ์•Š์€ 2์ฐจ ์ž๋ฃŒ ์˜์กด"
],
"business_impact": "์˜์‚ฌ๊ฒฐ์ • ์˜ค๋ฅ˜, ์‹ ๋ขฐ๋„ ํ•˜๋ฝ, ๋ฒ•์  ๋ฆฌ์Šคํฌ ์ฆ๊ฐ€",
"real_examples": [
"์ปจ์„คํŒ… ํšŒ์‚ฌ: ์ถœ์ฒ˜ ํ‘œ๊ธฐ ํ‘œ์ค€ํ™”๋กœ ํด๋ผ์ด์–ธํŠธ ์‹ ๋ขฐ๋„ 30% ํ–ฅ์ƒ",
"ํˆฌ์ž ํšŒ์‚ฌ: ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค ๋„์ž…์œผ๋กœ ํˆฌ์ž ์˜์‚ฌ๊ฒฐ์ • ์ •ํ™•๋„ ๊ฐœ์„ "
],
"measurement": "์ž๋ฃŒ ๊ฒ€์ฆ๋ฅ , ๊ณ ๊ฐ ์‹ ๋ขฐ๋„ ์กฐ์‚ฌ, ์˜์‚ฌ๊ฒฐ์ • ์ •ํ™•๋„"
},
"๋ฆฌ์„œ์น˜ ์ž‘์„ฑ ๋ถ€๋‹ด": {
"definition": "์‹œ์žฅ ์กฐ์‚ฌ๋‚˜ ๋ถ„์„ ๋ณด๊ณ ์„œ ์ž‘์„ฑ์— ๊ณผ๋„ํ•œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ํˆฌ์ž…๋˜๋Š” ์ƒํ™ฉ",
"symptoms": [
"๋‹จ์ผ ๋ณด๊ณ ์„œ ์ž‘์„ฑ์— 2์ฃผ ์ด์ƒ ์†Œ์š”",
"๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ๋ถ„์„์˜ ์ค‘๋ณต ์ž‘์—…",
"ํ˜•์‹ ํ†ต์ผ๊ณผ ํ’ˆ์งˆ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€",
"๋ฆฌ์„œ์น˜ ๊ฒฐ๊ณผ์˜ ์žฌํ™œ์šฉ์„ฑ ๋ถ€์กฑ"
],
"root_causes": [
"ํšจ์œจ์ ์ธ ๋ฆฌ์„œ์น˜ ํ”„๋กœ์„ธ์Šค ๋ถ€์žฌ",
"๋ถ„์„ ํˆด๊ณผ ํ…œํ”Œ๋ฆฟ ๋ฏธ๋น„",
"ํŒ€ ๋‚ด ์—ญํ•  ๋ถ„๋‹ด ๋ถˆ๋ช…ํ™•",
"๊ณผ๊ฑฐ ์ž๋ฃŒ ์žฌํ™œ์šฉ ์‹œ์Šคํ…œ ๋ถ€์กฑ"
],
"business_impact": "๋ฆฌ์„œ์น˜ ๋น„์šฉ ์ฆ๊ฐ€, ์˜์‚ฌ๊ฒฐ์ • ์ง€์—ฐ, ๊ธฐํšŒ๋น„์šฉ ๋ฐœ์ƒ",
"real_examples": [
"์ „๋žต ์ปจ์„คํŒ…: ๋ฆฌ์„œ์น˜ ํ…œํ”Œ๋ฆฟ ํ‘œ์ค€ํ™”๋กœ ์ž‘์„ฑ ์‹œ๊ฐ„ 50% ๋‹จ์ถ•",
"์Šคํƒ€ํŠธ์—…: ์ž๋™ํ™”๋œ ์‹œ์žฅ ๋ถ„์„ ๋„๊ตฌ ๋„์ž…์œผ๋กœ ์ฃผ๊ฐ„ ๋ฆฌํฌํŠธ ์ฒด๊ณ„ ๊ตฌ์ถ•"
],
"measurement": "๋ฆฌ์„œ์น˜ ์™„๋ฃŒ ์‹œ๊ฐ„, ๋น„์šฉ ๋Œ€๋น„ ํšจ๊ณผ, ์žฌํ™œ์šฉ๋ฅ "
},
"์š”๊ตฌ์‚ฌํ•ญ ์–ธ์–ดํ™” ๋‚œํ•ญ": {
"definition": "์ œํ’ˆ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ",
"symptoms": [
"๋ชจํ˜ธํ•˜๊ณ  ์ถ”์ƒ์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ ๋ฌธ์„œ",
"๊ฐœ๋ฐœํŒ€๊ณผ ๊ธฐํšํŒ€ ๊ฐ„ ์ดํ•ด ๊ฒฉ์ฐจ",
"์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์žฆ์€ ์žฌ์ž‘์—…",
"๊ฒ€์ˆ˜ ๊ธฐ์ค€์˜ ๋ถˆ๋ช…ํ™•์„ฑ"
],
"root_causes": [
"๋„๋ฉ”์ธ ์ง€์‹๊ณผ ๊ธฐ์ˆ  ์ดํ•ด ๋ถ€์กฑ",
"์ฒด๊ณ„์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜ ๋ฐฉ๋ฒ•๋ก  ๋ถ€์žฌ",
"์ดํ•ด๊ด€๊ณ„์ž ๊ฐ„ ์†Œํ†ต ๋ถ€์กฑ",
"์‚ฌ์šฉ์ž ๊ด€์ ์˜ ๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค ๋ฏธ๋น„"
],
"business_impact": "๊ฐœ๋ฐœ ์ง€์—ฐ, ์˜ˆ์‚ฐ ์ดˆ๊ณผ, ์ตœ์ข… ์ œํ’ˆ ํ’ˆ์งˆ ์ €ํ•˜",
"real_examples": [
"ํ•€ํ…Œํฌ: ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ ๋ฐฉ์‹ ๋„์ž…์œผ๋กœ ์š”๊ตฌ์‚ฌํ•ญ ๋ช…ํ™•์„ฑ 80% ๊ฐœ์„ ",
"์ด์ปค๋จธ์Šค: ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ์œผ๋กœ ๊ฐœ๋ฐœ ์žฌ์ž‘์—… 60% ๊ฐ์†Œ"
],
"measurement": "์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ๋ฅ , ๊ฐœ๋ฐœ ์™„๋ฃŒ์œจ, ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„"
},
"UX ์นดํ”ผ ๋ถˆ์ผ์น˜": {
"definition": "์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด ํ…์ŠคํŠธ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ƒํ™ฉ",
"symptoms": [
"๊ฐ™์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ์šฉ์–ด ์‚ฌ์šฉ",
"ํŽ˜์ด์ง€๋ณ„ ํ†ค์•ค๋งค๋„ˆ ์ฐจ์ด",
"์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ ์ผ๊ด€์„ฑ ๋ถ€์กฑ",
"๋ธŒ๋žœ๋“œ ๋ณด์ด์Šค์™€ UX ์นดํ”ผ ๋ถˆ์ผ์น˜"
],
"root_causes": [
"UX ๋ผ์ดํŒ… ๊ฐ€์ด๋“œ๋ผ์ธ ๋ถ€์žฌ",
"๋””์ž์ด๋„ˆ์™€ ์นดํ”ผ๋ผ์ดํ„ฐ ๊ฐ„ ํ˜‘์—… ๋ถ€์กฑ",
"์šฉ์–ด์ง‘(Glossary) ๋ฏธ์ •๋ฆฝ",
"๋‹ค๊ตญ์–ด ๋ฒˆ์—ญ์—์„œ์˜ ์ผ๊ด€์„ฑ ๊ด€๋ฆฌ ๋ฏธํก"
],
"business_impact": "์‚ฌ์šฉ์ž ํ˜ผ๋ž€ ์ฆ๊ฐ€, ์ดํƒˆ๋ฅ  ์ƒ์Šน, ๋ธŒ๋žœ๋“œ ์‹ ๋ขฐ๋„ ํ•˜๋ฝ",
"real_examples": [
"SaaS ํ”Œ๋žซํผ: UX ๋ผ์ดํŒ… ์‹œ์Šคํ…œ ๊ตฌ์ถ•์œผ๋กœ ์‚ฌ์šฉ์ž ์™„๋ฃŒ์œจ 25% ํ–ฅ์ƒ",
"๋ชจ๋ฐ”์ผ ์•ฑ: ์ผ๊ด€๋œ ์šฉ์–ด ์ฒด๊ณ„ ๋„์ž…์œผ๋กœ ๊ณ ๊ฐ ์ง€์› ๋ฌธ์˜ 40% ๊ฐ์†Œ"
],
"measurement": "์‚ฌ์šฉ์ž ์™„๋ฃŒ์œจ, ์ดํƒˆ๋ฅ , ๊ณ ๊ฐ ์ง€์› ๋ฌธ์˜ ๋นˆ๋„"
},
"์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€ ๋ถˆ๋ช…ํ™•": {
"definition": "์ œํ’ˆ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์‹œ ์šฐ์„ ์ˆœ์œ„๋‚˜ ๋ฐฉํ–ฅ์„ฑ ๊ฒฐ์ • ๊ธฐ์ค€์ด ์• ๋งคํ•˜์—ฌ ํšจ์œจ์ ์ธ ์˜์‚ฌ๊ฒฐ์ •์ด ์–ด๋ ค์šด ์ƒํ™ฉ",
"symptoms": [
"๊ธฐ๋Šฅ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •์˜ ์ฃผ๊ด€์„ฑ",
"์ดํ•ด๊ด€๊ณ„์ž๋ณ„ ์ƒ์ดํ•œ ํŒ๋‹จ ๊ธฐ์ค€",
"๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ • ์ฒด๊ณ„ ๋ถ€์žฌ",
"์˜์‚ฌ๊ฒฐ์ • ์ง€์—ฐ๊ณผ ๋ฐ˜๋ณต์  ๋…ผ์˜"
],
"root_causes": [
"๋ช…ํ™•ํ•œ ์ œํ’ˆ ์ „๋žต๊ณผ ๋ชฉํ‘œ ๋ถ€์žฌ",
"์ •๋Ÿ‰์  ํ‰๊ฐ€ ์ง€ํ‘œ ๋ฏธ์„ค์ •",
"์˜์‚ฌ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค ํ‘œ์ค€ํ™” ๋ถ€์กฑ",
"์—ญํ• ๊ณผ ๊ถŒํ•œ์˜ ๋ชจํ˜ธํ•จ"
],
"business_impact": "๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ์ €ํ•˜, ๊ธฐํšŒ๋น„์šฉ ์ฆ๊ฐ€, ํŒ€ ๋‚ด ๊ฐˆ๋“ฑ",
"real_examples": [
"์Šคํƒ€ํŠธ์—…: RICE ํ”„๋ ˆ์ž„์›Œํฌ ๋„์ž…์œผ๋กœ ์˜์‚ฌ๊ฒฐ์ • ์‹œ๊ฐ„ 70% ๋‹จ์ถ•",
"๋Œ€๊ธฐ์—…: OKR ๊ธฐ๋ฐ˜ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •์œผ๋กœ ์ œํ’ˆ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ํ–ฅ์ƒ"
],
"measurement": "์˜์‚ฌ๊ฒฐ์ • ์†Œ์š” ์‹œ๊ฐ„, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์™„๋ฃŒ์œจ, ํŒ€ ๋งŒ์กฑ๋„"
}
}
# ์™„์ „ํ•œ Output ์„ค๋ช…
OUTPUT_DETAILED = {
"์ฝœ๋“œ๋ฉ”์ผ": {
"definition": "์ด์ „ ์ ‘์ ์ด ์—†๋Š” ์ž ์žฌ ๊ณ ๊ฐ์—๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉ์ ์œผ๋กœ ๋ฐœ์†กํ•˜๋Š” ์ฒซ ์—ฐ๋ฝ ์ด๋ฉ”์ผ",
"purpose": "์‹ ๊ทœ ๊ณ ๊ฐ ๋ฐœ๊ตด, ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€๊ณ„ ๊ตฌ์ถ•, ์„ธ์ผ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ ํ™•์žฅ",
"key_components": [
"๋งค๋ ฅ์ ์ธ ์ œ๋ชฉ์ค„ (๊ฐœ๋ด‰๋ฅ  ๊ฒฐ์ •)",
"๊ฐœ์ธํ™”๋œ ์˜คํ”„๋‹ (์—ฐ๊ฒฐ์  ๊ตฌ์ถ•)",
"๋ช…ํ™•ํ•œ ๊ฐ€์น˜ ์ œ์•ˆ (๊ด€์‹ฌ ์œ ๋ฐœ)",
"๊ตฌ์ฒด์ ์ธ CTA (๋‹ค์Œ ๋‹จ๊ณ„ ์œ ๋„)"
],
"success_metrics": [
"๊ฐœ๋ด‰๋ฅ : 20-30% (B2B ๊ธฐ์ค€)",
"์‘๋‹ต๋ฅ : 5-10%",
"๋ฏธํŒ… ์ „ํ™˜์œจ: 1-3%",
"์ŠคํŒธ ์‹ ๊ณ ์œจ: 1% ๋ฏธ๋งŒ"
],
"best_practices": [
"๋ฐœ์†ก ์ „ ํƒ€๊ฒŸ ๋ฆฌ์„œ์น˜ ํ•„์ˆ˜",
"3-5๊ฐœ ์ด๋ฉ”์ผ ์‹œํ€€์Šค ์„ค๊ณ„",
"A/B ํ…Œ์ŠคํŠธ๋กœ ์ง€์† ์ตœ์ ํ™”",
"๋ฒ•์  ๊ทœ์ œ (GDPR, CAN-SPAM) ์ค€์ˆ˜"
],
"common_mistakes": [
"๊ณผ๋„ํ•œ ์ž๊ธฐ์†Œ๊ฐœ",
"๋ชจํ˜ธํ•œ ๊ฐ€์น˜ ์ œ์•ˆ",
"๋„ˆ๋ฌด ๊ธด ๋‚ด์šฉ",
"์ผ๋ฐฉ์ ์ธ ํŒ๋งค ๋ฉ”์‹œ์ง€"
],
"real_examples": """
**IT ์ปจ์„คํŒ… โ†’ CFO**:
์ œ๋ชฉ: Re: Q4 IT ์˜ˆ์‚ฐ 20% ์ ˆ๊ฐ ์‚ฌ๋ก€ - 15๋ถ„ ๋…ผ์˜ ๊ฐ€๋Šฅํ• ๊นŒ์š”?
์•ˆ๋…•ํ•˜์„ธ์š” ๊น€CFO๋‹˜,
์ตœ๊ทผ [ํšŒ์‚ฌ๋ช…]์˜ ๋””์ง€ํ„ธ ์ „ํ™˜ ํˆฌ์ž ์†Œ์‹์„ ๋ดค์Šต๋‹ˆ๋‹ค.
์ €ํฌ๋Š” ์œ ์‚ฌ ๊ทœ๋ชจ ์ œ์กฐ์—…์ฒด 3๊ณณ์˜ IT ์šด์˜๋น„๋ฅผ ํ‰๊ท  23% ์ ˆ๊ฐํ•˜๋ฉฐ
๋™์‹œ์— ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ 99.9%๋กœ ํ–ฅ์ƒ์‹œํ‚จ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์ฃผ ํ™”์š”์ผ ์˜ค์ „ 11์‹œ, 15๋ถ„๊ฐ„ ๊ฐ„๋‹จํ•œ ์‚ฌ๋ก€ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ์š”?
[๊ตฌ์ฒด์  ROI ๊ณ„์‚ฐ์„œ ์ฒจ๋ถ€]
"""
},
"๊ด‘๊ณ  ์นดํ”ผ": {
"definition": "์œ ๋ฃŒ ๊ด‘๊ณ  ๋งค์ฒด๋ฅผ ํ†ตํ•ด ํƒ€๊ฒŸ ์˜ค๋””์–ธ์Šค์˜ ๊ด€์‹ฌ์„ ๋Œ๊ณ  ํ–‰๋™์„ ์œ ๋„ํ•˜๋Š” ์งง๊ณ  ๊ฐ•๋ ฅํ•œ ๋ฉ”์‹œ์ง€",
"purpose": "๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ์ œ๊ณ , ํŠธ๋ž˜ํ”ฝ ์œ ๋„, ์ „ํ™˜์œจ ์ฆ๋Œ€, ๋งค์ถœ ์ฆ๊ฐ€",
"key_components": [
"์ž„ํŒฉํŠธ ์žˆ๋Š” ํ—ค๋“œ๋ผ์ธ (์ฃผ๋ชฉ ๋Œ๊ธฐ)",
"๊ฐ์ •์  ์—ฐ๊ฒฐ๊ณ ๋ฆฌ (๊ณต๊ฐ๋Œ€ ํ˜•์„ฑ)",
"๋ช…ํ™•ํ•œ ํ˜œํƒ (๊ฐ€์น˜ ์ „๋‹ฌ)",
"๊ฐ•๋ ฅํ•œ CTA (ํ–‰๋™ ์œ ๋„)"
],
"platform_specific": {
"Google ๊ฒ€์ƒ‰๊ด‘๊ณ ": "ํ‚ค์›Œ๋“œ ์—ฐ๊ด€์„ฑ, ๋ฌธ์ž ์ˆ˜ ์ œํ•œ ๊ณ ๋ ค",
"Facebook/Instagram": "๋น„์ฃผ์–ผ๊ณผ ์กฐํ™”, ์†Œ์…œ ๋งฅ๋ฝ ํ™œ์šฉ",
"LinkedIn": "์ „๋ฌธ์  ํ†ค, B2B ๊ฐ€์น˜ ์ œ์•ˆ ์ค‘์‹ฌ",
"YouTube": "์Šคํ† ๋ฆฌํ…”๋ง, ๊ฐ์ •์  ์–ดํ•„"
},
"success_metrics": [
"CTR (ํด๋ฆญ๋ฅ ): 2-5%",
"์ „ํ™˜์œจ: 1-3%",
"CPA (ํš๋“ ๋น„์šฉ): ๋ชฉํ‘œ LTV ๋Œ€๋น„ 1:3 ์ด์ƒ",
"ROAS (๊ด‘๊ณ  ์ˆ˜์ต๋ฅ ): 4:1 ์ด์ƒ"
],
"real_examples": """
**B2B SaaS - LinkedIn ๊ด‘๊ณ **:
ํ—ค๋“œ๋ผ์ธ: "์—‘์…€๋กœ 2์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋˜ ๋ณด๊ณ ์„œ, ์ด์ œ 5๋ถ„์ด๋ฉด ๋"
๋ฐ”๋””: 300+ ๊ธฐ์—…์ด ์„ ํƒํ•œ ์ž๋™ ๋Œ€์‹œ๋ณด๋“œ
CTA: "๋ฌด๋ฃŒ ๋ฐ๋ชจ ์‹ ์ฒญํ•˜๊ธฐ"
**์ด์ปค๋จธ์Šค - Facebook ๊ด‘๊ณ **:
ํ—ค๋“œ๋ผ์ธ: "10๋งŒ์›์œผ๋กœ ์นจ์‹ค ์™„์ „ ๋ณ€์‹ "
๋ฐ”๋””: 24์‹œ๊ฐ„ ํ•œ์ • ํŠน๊ฐ€ + ๋ฌด๋ฃŒ๋ฐฐ์†ก
CTA: "์ง€๊ธˆ ์‡ผํ•‘ํ•˜๊ธฐ"
"""
},
"์‹œ์žฅ์กฐ์‚ฌ ๋ณด๊ณ ์„œ": {
"definition": "ํŠน์ • ์‹œ์žฅ์˜ ๊ทœ๋ชจ, ์„ฑ์žฅ๋ฅ , ํŠธ๋ Œ๋“œ, ๊ฒฝ์Ÿ ๊ตฌ๋„ ๋“ฑ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋ถ„์„ํ•œ ๋ฌธ์„œ",
"purpose": "์ „๋žต์  ์˜์‚ฌ๊ฒฐ์ • ์ง€์›, ํˆฌ์ž ์œ ์น˜, ์‹ ์‚ฌ์—… ๊ธฐํšŒ ๋ฐœ๊ตด, ๋ฆฌ์Šคํฌ ํ‰๊ฐ€",
"key_sections": [
"Executive Summary (ํ•ต์‹ฌ ์š”์•ฝ)",
"์‹œ์žฅ ์ •์˜ ๋ฐ ์„ธ๋ถ„ํ™”",
"์‹œ์žฅ ๊ทœ๋ชจ ๋ฐ ์„ฑ์žฅ๋ฅ  ๋ถ„์„",
"๊ฒฝ์Ÿ ๊ตฌ๋„ ๋ฐ ์ฃผ์š” ํ”Œ๋ ˆ์ด์–ด",
"ํŠธ๋ Œ๋“œ ๋ฐ ์„ฑ์žฅ ๋™๋ ฅ",
"๊ธฐํšŒ์™€ ์œ„ํ—˜ ์š”์ธ",
"๊ฒฐ๋ก  ๋ฐ ๊ถŒ๊ณ ์‚ฌํ•ญ"
],
"methodology": [
"Primary Research (์„ค๋ฌธ, ์ธํ„ฐ๋ทฐ, FGD)",
"Secondary Research (๊ณต๊ฐœ ์ž๋ฃŒ, ๋ณด๊ณ ์„œ)",
"๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋ชจ๋ธ๋ง",
"์ „๋ฌธ๊ฐ€ ๊ฒ€์ฆ"
],
"credibility_factors": [
"๋ฐ์ดํ„ฐ ์ถœ์ฒ˜์˜ ์‹ ๋ขฐ์„ฑ",
"๋ถ„์„ ๋ฐฉ๋ฒ•๋ก ์˜ ํƒ€๋‹น์„ฑ",
"๊ฐ๊ด€์  ์‹œ๊ฐ ์œ ์ง€",
"ํ•œ๊ณ„์  ๋ช…์‹œ"
],
"real_examples": """
**ํ•€ํ…Œํฌ ํŽ˜์ด๋จผํŠธ ์‹œ์žฅ ๋ณด๊ณ ์„œ**:
Executive Summary:
- ๊ตญ๋‚ด ๋ชจ๋ฐ”์ผ ๊ฒฐ์ œ ์‹œ์žฅ ๊ทœ๋ชจ 85์กฐ์› (2024๋…„)
- ์—ฐํ‰๊ท  ์„ฑ์žฅ๋ฅ  15.3% (2020-2024)
- ์ฃผ์š” ์„ฑ์žฅ ๋™๋ ฅ: ๋น„๋Œ€๋ฉด ๊ฒฐ์ œ ์ฆ๊ฐ€, ๊ฐ„ํŽธ๊ฒฐ์ œ ํ™•์‚ฐ
Key Findings:
- 20-30๋Œ€๊ฐ€ ์ „์ฒด ๊ฑฐ๋ž˜๋Ÿ‰์˜ 67% ์ฐจ์ง€
- O2O ์„œ๋น„์Šค ์—ฐ๊ณ„ ๊ฒฐ์ œ ๊ธ‰์„ฑ์žฅ (์ „๋…„ ๋Œ€๋น„ 45% ์ฆ๊ฐ€)
- ๋ณด์•ˆ ๊ธฐ์ˆ  ๋ฐœ์ „์ด ์‹œ์žฅ ํ™•์žฅ์˜ ํ•ต์‹ฌ ์š”์ธ
"""
},
"PRD": {
"definition": "Product Requirements Document - ์ œํ’ˆ ๊ฐœ๋ฐœ์˜ ๋ชฉํ‘œ, ๊ธฐ๋Šฅ, ์š”๊ตฌ์‚ฌํ•ญ์„ ์ƒ์„ธํžˆ ์ •์˜ํ•œ ๋ฌธ์„œ",
"purpose": "๊ฐœ๋ฐœํŒ€ ๊ฐ€์ด๋“œ, ์ดํ•ด๊ด€๊ณ„์ž ์ •๋ ฌ, ํ”„๋กœ์ ํŠธ ๋ฒ”์œ„ ์ •์˜, ์„ฑ๊ณต ๊ธฐ์ค€ ์ˆ˜๋ฆฝ",
"essential_sections": [
"๋ฌธ์ œ ์ •์˜ (Problem Statement)",
"๋ชฉํ‘œ ๋ฐ ์„ฑ๊ณต ์ง€ํ‘œ (Goals & Success Metrics)",
"์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ (User Stories)",
"๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ (Functional Requirements)",
"๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ (Non-functional Requirements)",
"์ œ์•ฝ์‚ฌํ•ญ ๋ฐ ๊ฐ€์ • (Constraints & Assumptions)",
"์šฐ์„ ์ˆœ์œ„ (Prioritization)",
"ํƒ€์ž„๋ผ์ธ (Timeline)"
],
"stakeholder_alignment": [
"Engineering: ๊ธฐ์ˆ ์  ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ",
"Design: ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ผ๊ด€์„ฑ",
"Business: ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜ ์—ฐ๊ฒฐ",
"QA: ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ"
],
"success_criteria": [
"๋ช…ํ™•์„ฑ: ๋ชจํ˜ธํ•จ ์—†๋Š” ์š”๊ตฌ์‚ฌํ•ญ",
"์™„์ „์„ฑ: ๋ˆ„๋ฝ๋œ ์š”๊ตฌ์‚ฌํ•ญ ์—†์Œ",
"์‹คํ˜„๊ฐ€๋Šฅ์„ฑ: ๊ธฐ์ˆ ์  ์ œ์•ฝ ๊ณ ๋ ค",
"์ธก์ •๊ฐ€๋Šฅ์„ฑ: ์ •๋Ÿ‰์  ์„ฑ๊ณต ์ง€ํ‘œ"
],
"real_examples": """
**๋ชจ๋ฐ”์ผ ์•ฑ ์•Œ๋ฆผ ๊ธฐ๋Šฅ PRD**:
Problem Statement:
์‚ฌ์šฉ์ž์˜ 70%๊ฐ€ ์ค‘์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด
์‚ฌ์šฉ์ž ์ฐธ์—ฌ๋„๊ฐ€ ์—…๊ณ„ ํ‰๊ท  ๋Œ€๋น„ 30% ๋‚ฎ์Œ
Success Metrics:
- ์•Œ๋ฆผ ์—ด๋žŒ๋ฅ : ํ˜„์žฌ 15% โ†’ ๋ชฉํ‘œ 35%
- 7์ผ ๋ฆฌํ…์…˜: ํ˜„์žฌ 45% โ†’ ๋ชฉํ‘œ 60%
- ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„: ํ˜„์žฌ 3.2/5 โ†’ ๋ชฉํ‘œ 4.0/5
User Stories:
- ์‚ฌ์šฉ์ž๋กœ์„œ, ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์•Œ๋ฆผ๋งŒ ๋ฐ›๊ณ  ์‹ถ๋‹ค
- ์‚ฌ์šฉ์ž๋กœ์„œ, ์•Œ๋ฆผ์„ ๋ฐ›์„ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค
"""
},
"๋ณด๋„์ž๋ฃŒ": {
"definition": "์–ธ๋ก ๋งค์ฒด๋ฅผ ํ†ตํ•ด ๊ธฐ์—…์˜ ๋‰ด์Šค๋‚˜ ์ •๋ณด๋ฅผ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•˜๋Š” ๋ฌธ์„œ",
"purpose": "๋ฏธ๋””์–ด ๋…ธ์ถœ ํ™•๋ณด, ๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ์ œ๊ณ , ๊ณต์‹์  ์ž…์žฅ ์ „๋‹ฌ, ์œ„๊ธฐ ๋Œ€์‘",
"key_components": [
"๋‰ด์Šค๊ฐ€์น˜ ์žˆ๋Š” ํ—ค๋“œ๋ผ์ธ",
"5W1H ๊ธฐ๋ฐ˜ ๋ฆฌ๋“œ ๋ฌธ๋‹จ",
"๋ฐฐ๊ฒฝ ์ •๋ณด์™€ ๋งฅ๋ฝ",
"์ธ์šฉ๋ฌธ (๊ฒฝ์˜์ง„, ์ „๋ฌธ๊ฐ€)",
"ํšŒ์‚ฌ ์†Œ๊ฐœ (Boilerplate)",
"์—ฐ๋ฝ์ฒ˜ ์ •๋ณด"
],
"success_metrics": [
"์–ธ๋ก  ๋ณด๋„์œจ: ๋ฐœ์†ก ๋Œ€๋น„ 10-20%",
"์ฃผ์š” ๋งค์ฒด ํ”ฝ์—…๋ฅ ",
"์˜จ๋ผ์ธ ์–ธ๊ธ‰๋Ÿ‰ ์ฆ๊ฐ€",
"์›น์‚ฌ์ดํŠธ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€"
],
"best_practices": [
"๊ธฐ์ž ๊ด€์ ์—์„œ ๋‰ด์Šค๊ฐ€์น˜ ๊ฒ€ํ† ",
"๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋ฌธ์ฒด",
"์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ์ •๋ณด ์ œ๊ณต",
"์ ์ ˆํ•œ ๋ฐœ์†ก ํƒ€์ด๋ฐ"
],
"real_examples": """
**์Šคํƒ€ํŠธ์—… ํˆฌ์ž ์œ ์น˜ ๋ณด๋„์ž๋ฃŒ**:
[ํ—ค๋“œ๋ผ์ธ] โ—‹โ—‹ํ…Œํฌ, ์‹œ๋ฆฌ์ฆˆA 100์–ต์› ํˆฌ์ž ์œ ์น˜โ€ฆ AI ํ—ฌ์Šค์ผ€์–ด ์‚ฌ์—… ํ™•์žฅ
[๋ฆฌ๋“œ] ์ธ๊ณต์ง€๋Šฅ ๊ธฐ๋ฐ˜ ํ—ฌ์Šค์ผ€์–ด ์†”๋ฃจ์…˜ ์ „๋ฌธ๊ธฐ์—… โ—‹โ—‹ํ…Œํฌ(๋Œ€ํ‘œ ๊น€โ—‹โ—‹)๊ฐ€
์‹œ๋ฆฌ์ฆˆA ๋ผ์šด๋“œ์—์„œ 100์–ต์› ๊ทœ๋ชจ์˜ ํˆฌ์ž๋ฅผ ์œ ์น˜ํ–ˆ๋‹ค๊ณ  15์ผ ๋ฐœํ‘œํ–ˆ๋‹ค.
[๋ณธ๋ฌธ] ์ด๋ฒˆ ํˆฌ์ž๋Š” โ—‹โ—‹โ—‹์บํ”ผํ„ธ์ด ์ฃผ๋„ํ•˜๊ณ  โ—‹โ—‹โ—‹๋ฒค์ฒ˜์Šค, โ—‹โ—‹โ—‹์ธ๋ฒ ์ŠคํŠธ๋จผํŠธ๊ฐ€
์ฐธ์—ฌํ–ˆ๋‹ค. ์กฐ๋‹ฌ๋œ ์ž๊ธˆ์€ AI ์ง„๋‹จ ์†”๋ฃจ์…˜ ๊ณ ๋„ํ™”์™€ ํ•ด์™ธ ์ง„์ถœ์— ์‚ฌ์šฉ๋  ์˜ˆ์ •์ด๋‹ค.
"""
},
"๋žœ๋”ฉํŽ˜์ด์ง€ ์„น์…˜": {
"definition": "ํŠน์ • ๋งˆ์ผ€ํŒ… ์บ ํŽ˜์ธ์˜ ๋ชฉ์ ์— ๋งž์ถฐ ๋ฐฉ๋ฌธ์ž๋ฅผ ์ „ํ™˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์›นํŽ˜์ด์ง€์˜ ๊ตฌ์„ฑ ์š”์†Œ",
"purpose": "๋ฐฉ๋ฌธ์ž ์ „ํ™˜์œจ ๊ทน๋Œ€ํ™”, ๋ช…ํ™•ํ•œ ํ–‰๋™ ์œ ๋„, ์บ ํŽ˜์ธ ROI ํ–ฅ์ƒ",
"key_components": [
"๊ฐ•๋ ฅํ•œ ํ—ค๋“œ๋ผ์ธ๊ณผ ์„œ๋ธŒํ—ค๋“œ๋ผ์ธ",
"๋ช…ํ™•ํ•œ ๊ฐ€์น˜ ์ œ์•ˆ (Value Proposition)",
"์‚ฌํšŒ์  ์ฆ๋ช… (๊ณ ๊ฐ ํ›„๊ธฐ, ๋กœ๊ณ )",
"ํ˜œํƒ ์ค‘์‹ฌ์˜ ๊ธฐ๋Šฅ ์„ค๋ช…",
"๊ฐ•๋ ฅํ•œ CTA ๋ฒ„ํŠผ",
"์‹ ๋ขฐ ์š”์†Œ (๋ณด์•ˆ, ์ธ์ฆ๋งˆํฌ)"
],
"conversion_optimization": [
"๋‹จ์ผ ๋ชฉํ‘œ์— ์ง‘์ค‘",
"์‚ฐ๋งŒํ•œ ์š”์†Œ ์ œ๊ฑฐ",
"๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”",
"๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”",
"A/B ํ…Œ์ŠคํŠธ ์ง€์† ์‹คํ–‰"
],
"success_metrics": [
"์ „ํ™˜์œจ: 2-5% (์—…์ข…๋ณ„ ์ฐจ์ด)",
"์ดํƒˆ๋ฅ : 70% ์ดํ•˜",
"ํŽ˜์ด์ง€ ์ฒด๋ฅ˜์‹œ๊ฐ„: 2๋ถ„ ์ด์ƒ",
"CTA ํด๋ฆญ๋ฅ : 5-15%"
],
"real_examples": """
**SaaS ๋ฌด๋ฃŒ์ฒดํ—˜ ๋žœ๋”ฉํŽ˜์ด์ง€**:
[Hero Section]
ํ—ค๋“œ๋ผ์ธ: "์—‘์…€ ๋Œ€์‹  3๋ถ„๋งŒ์— ์™„์„ฑํ•˜๋Š” ๋งค์ถœ ๋Œ€์‹œ๋ณด๋“œ"
์„œ๋ธŒํ—ค๋“œ: "1,000+ ๊ธฐ์—…์ด ์„ ํƒํ•œ No-code ๋ถ„์„ ํˆด"
CTA: "14์ผ ๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ"
[Social Proof]
"๋งค์ถœ ๋ถ„์„ ์‹œ๊ฐ„์ด 80% ๋‹จ์ถ•๋์–ด์š”" - โ—‹โ—‹๊ธฐ์—… ๋งˆ์ผ€ํŒ…ํŒ€์žฅ
์‚ผ์„ฑ, LG, ํ˜„๋Œ€ ๋“ฑ ๊ณ ๊ฐ์‚ฌ ๋กœ๊ณ 
[Features]
โœ“ ๋“œ๋ž˜๊ทธ&๋“œ๋ž์œผ๋กœ 5๋ถ„๋งŒ์— ๋Œ€์‹œ๋ณด๋“œ ์™„์„ฑ
โœ“ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ž๋™ ์—…๋ฐ์ดํŠธ
โœ“ 20+ ์ฑ„๋„ ์—ฐ๋™ ์ง€์›
"""
},
"๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„": {
"definition": "์‹œ์žฅ ๋‚ด ์ฃผ์š” ๊ฒฝ์Ÿ์‚ฌ์˜ ์ „๋žต, ์ œํ’ˆ, ์„ฑ๊ณผ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋ถ„์„ํ•œ ๋ณด๊ณ ์„œ",
"purpose": "๊ฒฝ์Ÿ ์šฐ์œ„ ์š”์†Œ ์‹๋ณ„, ์‹œ์žฅ ํฌ์ง€์…”๋‹ ์ „๋žต ์ˆ˜๋ฆฝ, ๋ฒค์น˜๋งˆํ‚น ๊ธฐํšŒ ๋ฐœ๊ตด",
"key_sections": [
"๊ฒฝ์Ÿ์‚ฌ ๊ฐœ์š” ๋ฐ ํฌ์ง€์…”๋‹",
"์ œํ’ˆ/์„œ๋น„์Šค ๋น„๊ต ๋ถ„์„",
"๊ฐ€๊ฒฉ ์ •์ฑ… ๋ฐ ์ˆ˜์ต ๋ชจ๋ธ",
"๋งˆ์ผ€ํŒ… ์ „๋žต ๋ฐ ์ฑ„๋„",
"๊ฐ•์ ๊ณผ ์•ฝ์  (SWOT)",
"์‹œ์žฅ ์ ์œ ์œจ ๋ฐ ์„ฑ๊ณผ ์ง€ํ‘œ",
"ํ–ฅํ›„ ์ „๋žต ์˜ˆ์ธก",
"์šฐ๋ฆฌ์˜ ๋Œ€์‘ ๋ฐฉ์•ˆ"
],
"analysis_framework": [
"์ง์ ‘ ๊ฒฝ์Ÿ์‚ฌ vs ๊ฐ„์ ‘ ๊ฒฝ์Ÿ์‚ฌ",
"์ œํ’ˆ ๊ธฐ๋Šฅ ๋น„๊ต ๋งคํŠธ๋ฆญ์Šค",
"๊ฐ€๊ฒฉ-์„ฑ๋Šฅ ํฌ์ง€์…”๋‹ ๋งต",
"๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๊ฐ์„ฑ ๋ถ„์„"
],
"data_sources": [
"๊ณต๊ฐœ ์žฌ๋ฌด ์ •๋ณด",
"์ œํ’ˆ ์›น์‚ฌ์ดํŠธ ๋ฐ ์•ฑ",
"๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ ํ‰์ ",
"์†Œ์…œ๋ฏธ๋””์–ด ํ™œ๋™",
"์ฑ„์šฉ ๊ณต๊ณ  ๋ถ„์„",
"์–ธ๋ก  ๋ณด๋„ ์ž๋ฃŒ"
],
"real_examples": """
**ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ๊ฒฝ์Ÿ ๋ถ„์„**:
[Executive Summary]
Dropbox, Google Drive, OneDrive 3๊ฐ• ๊ตฌ๋„์—์„œ
๋ณด์•ˆ๊ณผ ํ˜‘์—… ๊ธฐ๋Šฅ์ด ์ฐจ๋ณ„ํ™” ํฌ์ธํŠธ๋กœ ๋ถ€์ƒ
[์ œํ’ˆ ๋น„๊ต]
- ์ €์žฅ ์šฉ๋Ÿ‰: Dropbox(2GB) < Google Drive(15GB) < OneDrive(5GB)
- ํ˜‘์—… ๊ธฐ๋Šฅ: OneDrive > Google Drive > Dropbox
- ๋ณด์•ˆ: Dropbox > OneDrive > Google Drive
[๊ฐ€๊ฒฉ ์ „๋žต]
Dropbox: ํ”„๋ฆฌ๋ฏธ์—„ ์ „๋žต (์›” $12)
Google: ํ†ตํ•ฉ ์„œ๋น„์Šค ์ „๋žต (์›” $6)
Microsoft: ๋ฒˆ๋“ค๋ง ์ „๋žต (Office 365 ํฌํ•จ)
"""
},
"ํŽ˜๋ฅด์†Œ๋‚˜": {
"definition": "์‹ค์ œ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“  ๊ฐ€์ƒ์˜ ๋Œ€ํ‘œ ๊ณ ๊ฐ ํ”„๋กœํ•„",
"purpose": "๊ณ ๊ฐ ์ค‘์‹ฌ ์ œํ’ˆ ๊ฐœ๋ฐœ, ๋งˆ์ผ€ํŒ… ๋ฉ”์‹œ์ง€ ๊ฐœ์ธํ™”, ํŒ€ ๋‚ด ๊ณ ๊ฐ ์ดํ•ด ํ†ต์ผ",
"key_components": [
"์ธ๊ตฌํ†ต๊ณ„ํ•™์  ์ •๋ณด",
"ํ–‰๋™ ํŒจํ„ด ๋ฐ ์„ ํ˜ธ๋„",
"๋ชฉํ‘œ์™€ ๋™๊ธฐ (Goals & Motivations)",
"๊ณ ์ถฉ๊ณผ ํ•ด๊ฒฐ ๊ณผ์ œ (Pain Points)",
"์ •๋ณด ์Šต๋“ ์ฑ„๋„",
"๊ตฌ๋งค ์˜์‚ฌ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค",
"์„ ํ˜ธํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์Šคํƒ€์ผ"
],
"creation_process": [
"๊ณ ๊ฐ ์ธํ„ฐ๋ทฐ ๋ฐ ์„ค๋ฌธ ์กฐ์‚ฌ",
"์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐ์ดํ„ฐ ๋ถ„์„",
"๊ณ ๊ฐ ์ง€์›ํŒ€ ์ธ์‚ฌ์ดํŠธ ์ˆ˜์ง‘",
"์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ๋ง",
"ํŽ˜๋ฅด์†Œ๋‚˜ ๊ฒ€์ฆ ๋ฐ ์—…๋ฐ์ดํŠธ"
],
"validation_methods": [
"์‹ค์ œ ๊ณ ๊ฐ๊ณผ์˜ ๊ฒ€์ฆ ์ธํ„ฐ๋ทฐ",
"A/B ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ํšจ๊ณผ ์ธก์ •",
"๋งˆ์ผ€ํŒ… ์บ ํŽ˜์ธ ์„ฑ๊ณผ ๋ถ„์„",
"์ œํ’ˆ ์‚ฌ์šฉ ํŒจํ„ด ์ถ”์ "
],
"real_examples": """
**SaaS ๋งˆ์ผ€ํŒ… ํˆด ํŽ˜๋ฅด์†Œ๋‚˜**:
[Sarah, ๋งˆ์ผ€ํŒ… ๋งค๋‹ˆ์ €, 32์„ธ]
Demographics:
- ์ง๊ธ‰: ๋งˆ์ผ€ํŒ… ๋งค๋‹ˆ์ € (๊ฒฝ๋ ฅ 5๋…„)
- ํšŒ์‚ฌ: B2B SaaS (์ง์› 50-200๋ช…)
- ์—ฐ๋ด‰: 5,500๋งŒ์›
- ๊ฑฐ์ฃผ์ง€: ์„œ์šธ ๊ฐ•๋‚จ
Goals:
- ๋งˆ์ผ€ํŒ… ROI ๊ฐœ์„  (์ฃผ์š” KPI)
- ๋ฆฌ๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ
- ํŒ€ ์ƒ์‚ฐ์„ฑ ์ฆ๋Œ€
Pain Points:
- ๋ถ„์‚ฐ๋œ ๋งˆ์ผ€ํŒ… ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ์˜ ์–ด๋ ค์›€
- ์‹ค์‹œ๊ฐ„ ์„ฑ๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ถˆ๊ฐ€
- ๋ณด๊ณ ์„œ ์ž‘์„ฑ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„
Preferred Channels:
- LinkedIn (์—…๊ณ„ ํŠธ๋ Œ๋“œ)
- ์ด๋ฉ”์ผ ๋‰ด์Šค๋ ˆํ„ฐ
- ์›จ๋น„๋‚˜ ๋ฐ ์˜จ๋ผ์ธ ์„ธ๋ฏธ๋‚˜
"""
},
"VOC ์š”์•ฝ": {
"definition": "๊ณ ๊ฐ์˜ ์†Œ๋ฆฌ(Voice of Customer)๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜์—ฌ ํ•ต์‹ฌ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์š”์•ฝํ•œ ๋ณด๊ณ ์„œ",
"purpose": "๊ณ ๊ฐ ๋งŒ์กฑ๋„ ๊ฐœ์„ , ์ œํ’ˆ ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ ์„ค์ •, ์„œ๋น„์Šค ํ’ˆ์งˆ ํ–ฅ์ƒ",
"key_sections": [
"์กฐ์‚ฌ ๊ฐœ์š” ๋ฐ ๋ฐฉ๋ฒ•๋ก ",
"์ฃผ์š” ๋ฐœ๊ฒฌ์‚ฌํ•ญ (Key Findings)",
"๊ณ ๊ฐ ๋งŒ์กฑ๋„ ํ˜„ํ™ฉ",
"์ฃผ์š” ๋ถˆ๋งŒ์‚ฌํ•ญ ๋ฐ ๊ฐœ์„  ์š”์ฒญ",
"๊ธ์ •์  ํ”ผ๋“œ๋ฐฑ ๋ฐ ๋งŒ์กฑ ์š”์ธ",
"๊ณ ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋ณ„ ์ฐจ์ด์ ",
"๊ฐœ์„  ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์•ก์…˜ ํ”Œ๋žœ"
],
"data_collection_methods": [
"๊ณ ๊ฐ ๋งŒ์กฑ๋„ ์„ค๋ฌธ์กฐ์‚ฌ",
"์‹ฌ์ธต ์ธํ„ฐ๋ทฐ (FGI)",
"๊ณ ๊ฐ ์ง€์›ํŒ€ ํ‹ฐ์ผ“ ๋ถ„์„",
"์˜จ๋ผ์ธ ๋ฆฌ๋ทฐ ๋ฐ ์†Œ์…œ ๋ฏธ๋””์–ด",
"์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐ์ดํ„ฐ"
],
"analysis_techniques": [
"ํ…์ŠคํŠธ ๋งˆ์ด๋‹ ๋ฐ ๊ฐ์„ฑ ๋ถ„์„",
"ํ…Œ๋งˆ๋ณ„ ํ‚ค์›Œ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ง",
"๋งŒ์กฑ๋„-์ค‘์š”๋„ ๋งคํŠธ๋ฆญ์Šค",
"๊ณ ๊ฐ ์—ฌ์ •๋ณ„ ํ„ฐ์น˜ํฌ์ธํŠธ ๋ถ„์„"
],
"real_examples": """
**์ด์ปค๋จธ์Šค VOC ๋ถ„์„ ์š”์•ฝ**:
[์ฃผ์š” ๋ฐœ๊ฒฌ์‚ฌํ•ญ]
- ์ „์ฒด ๊ณ ๊ฐ ๋งŒ์กฑ๋„: 7.2/10 (๋ชฉํ‘œ 8.0)
- NPS(Net Promoter Score): +15 (์—…๊ณ„ ํ‰๊ท  +8)
[Top 3 ๋ถˆ๋งŒ์‚ฌํ•ญ]
1. ๋ฐฐ์†ก ์ง€์—ฐ (37% ์–ธ๊ธ‰)
2. ๋ฐ˜ํ’ˆ/๊ตํ™˜ ์ ˆ์ฐจ ๋ณต์žก (24%)
3. ๊ณ ๊ฐ์„ผํ„ฐ ์‘๋‹ต ์ง€์—ฐ (19%)
[Top 3 ๋งŒ์กฑ์š”์ธ]
1. ์ƒํ’ˆ ํ’ˆ์งˆ (42% ์–ธ๊ธ‰)
2. ๊ฐ€๊ฒฉ ๊ฒฝ์Ÿ๋ ฅ (31%)
3. ์›น์‚ฌ์ดํŠธ ์‚ฌ์šฉ ํŽธ์˜์„ฑ (28%)
[์ฆ‰์‹œ ๊ฐœ์„  ํ•„์š” ์˜์—ญ]
์šฐ์„ ์ˆœ์œ„ 1: ๋ฐฐ์†ก ํ”„๋กœ์„ธ์Šค ๊ฐœ์„  (๋งŒ์กฑ๋„ ์˜ํ–ฅ ์ตœ๋Œ€)
์šฐ์„ ์ˆœ์œ„ 2: ๊ณ ๊ฐ์„ผํ„ฐ ์‘๋‹ต์‹œ๊ฐ„ ๋‹จ์ถ•
"""
},
"์œ ์Šค์ผ€์ด์Šค": {
"definition": "์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ์™€ ๊ทธ ๊ณผ์ •์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ธฐ์ˆ ํ•œ ๋ฌธ์„œ",
"purpose": "์š”๊ตฌ์‚ฌํ•ญ ๋ช…ํ™•ํ™”, ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ ์ œ๊ณต, ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ์ œ๊ณต",
"key_components": [
"์•กํ„ฐ (Actor) - ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž",
"์ „์ œ์กฐ๊ฑด (Preconditions)",
"์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค (Main Flow)",
"๋Œ€์•ˆ ์‹œ๋‚˜๋ฆฌ์˜ค (Alternative Flows)",
"์˜ˆ์™ธ ์ƒํ™ฉ (Exception Flows)",
"ํ›„์กฐ๊ฑด (Postconditions)",
"๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™"
],
"writing_guidelines": [
"์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ์ž‘์„ฑ",
"๊ตฌ์ฒด์ ์ด๊ณ  ์ธก์ • ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ",
"๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ๋ณด๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜ ์ค‘์‹ฌ",
"์˜ˆ์™ธ ์ƒํ™ฉ๊นŒ์ง€ ํฌ๊ด„์  ์ปค๋ฒ„"
],
"validation_criteria": [
"์‹ค์ œ ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ผ์น˜",
"๊ฐœ๋ฐœํŒ€์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅ",
"ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋„์ถœ ๊ฐ€๋Šฅ",
"๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ ๋‹ฌ์„ฑ์— ๊ธฐ์—ฌ"
],
"real_examples": """
**์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ ์ฃผ๋ฌธ ์œ ์Šค์ผ€์ด์Šค**:
[UC-001: ์ƒํ’ˆ ์ฃผ๋ฌธํ•˜๊ธฐ]
Actor: ๋กœ๊ทธ์ธํ•œ ๊ณ ๊ฐ
Preconditions:
- ๊ณ ๊ฐ์ด ํšŒ์› ๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์™„๋ฃŒ
- ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— 1๊ฐœ ์ด์ƒ ์ƒํ’ˆ ์กด์žฌ
Main Flow:
1. ๊ณ ๊ฐ์ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€์—์„œ "์ฃผ๋ฌธํ•˜๊ธฐ" ํด๋ฆญ
2. ์‹œ์Šคํ…œ์ด ๋ฐฐ์†ก์ง€ ์ •๋ณด ์ž…๋ ฅ ํŽ˜์ด์ง€ ํ‘œ์‹œ
3. ๊ณ ๊ฐ์ด ๋ฐฐ์†ก์ง€ ์ •๋ณด ์ž…๋ ฅ ๋ฐ ํ™•์ธ
4. ์‹œ์Šคํ…œ์ด ๊ฒฐ์ œ ๋ฐฉ๋ฒ• ์„ ํƒ ํŽ˜์ด์ง€ ํ‘œ์‹œ
5. ๊ณ ๊ฐ์ด ๊ฒฐ์ œ ๋ฐฉ๋ฒ• ์„ ํƒ ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ž…๋ ฅ
6. ์‹œ์Šคํ…œ์ด ์ฃผ๋ฌธ ์ •๋ณด ํ™•์ธ ํŽ˜์ด์ง€ ํ‘œ์‹œ
7. ๊ณ ๊ฐ์ด ์ตœ์ข… ์ฃผ๋ฌธ ํ™•์ธ
8. ์‹œ์Šคํ…œ์ด ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ๋ฐ ์ฃผ๋ฌธ ์™„๋ฃŒ ์•ˆ๋‚ด
Exception Flow:
- 3a. ๋ฐฐ์†ก ๋ถˆ๊ฐ€ ์ง€์—ญ์ธ ๊ฒฝ์šฐ
3a1. ์‹œ์Šคํ…œ์ด ๋ฐฐ์†ก ๋ถˆ๊ฐ€ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
3a2. UC ์ข…๋ฃŒ
"""
},
"UX ์นดํ”ผ": {
"definition": "์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ํ…์ŠคํŠธ ์š”์†Œ",
"purpose": "์‚ฌ์šฉ์ž ์ดํ•ด๋„ ์ฆ์ง„, ํ–‰๋™ ์œ ๋„, ๋ธŒ๋žœ๋“œ ํ†ค ์ „๋‹ฌ, ์—๋Ÿฌ ์ƒํ™ฉ ์•ˆ๋‚ด",
"key_components": [
"๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ ๋ฉ”๋‰ด ๋ผ๋ฒจ",
"๋ฒ„ํŠผ ํ…์ŠคํŠธ ๋ฐ CTA",
"์•ˆ๋‚ด ๋ฉ”์‹œ์ง€ ๋ฐ ๋„์›€๋ง",
"์—๋Ÿฌ ๋ฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€",
"ํผ ๋ผ๋ฒจ ๋ฐ ํ”Œ๋ ˆ์ด์Šคํ™€๋”",
"ํˆดํŒ ๋ฐ ์„ค๋ช…๋ฌธ"
],
"writing_principles": [
"๋ช…ํ™•์„ฑ: ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์–ธ์–ด",
"์ผ๊ด€์„ฑ: ๋™์ผํ•œ ๊ธฐ๋Šฅ์—๋Š” ๋™์ผํ•œ ์šฉ์–ด",
"๋„์›€์ด ๋˜๋Š” ํ†ค: ์นœ๊ทผํ•˜๋˜ ์ „๋ฌธ์ ",
"์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ: ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์— ํ•  ์ผ ๋ช…ํ™•ํžˆ ์ œ์‹œ"
],
"testing_methods": [
"์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ ๋ฐ A/B ํ…Œ์ŠคํŠธ",
"์™„๋ฃŒ์œจ ๋ฐ ์ดํƒˆ๋ฅ  ๋ถ„์„",
"๊ณ ๊ฐ ์ง€์›ํŒ€ ๋ฌธ์˜ ๋นˆ๋„ ์ถ”์ ",
"์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ •์„ฑ ๋ถ„์„"
],
"real_examples": """
**๋ชจ๋ฐ”์ผ ๋ฑ…ํ‚น ์•ฑ UX ์นดํ”ผ**:
[Before - ์• ๋งคํ•œ ํ‘œํ˜„]
- ๋ฒ„ํŠผ: "์ฒ˜๋ฆฌ"
- ์—๋Ÿฌ: "์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค"
- ์•ˆ๋‚ด: "์ •๋ณด๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”"
[After - ๋ช…ํ™•ํ•œ UX ์นดํ”ผ]
- ๋ฒ„ํŠผ: "์ด์ฒดํ•˜๊ธฐ"
- ์—๋Ÿฌ: "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
- ์•ˆ๋‚ด: "๊ณ„์ขŒ๋ฒˆํ˜ธ 14์ž๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
[ํ†ค์•ค๋งค๋„ˆ ์ผ๊ด€์„ฑ]
- ์„ฑ๊ณต: "์ด์ฒด๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"
- ์ง„ํ–‰: "์ด์ฒด ์ค‘์ž…๋‹ˆ๋‹ค. ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”"
- ์•ˆ๋‚ด: "์ด์ฒด ํ•œ๋„๋Š” ์ผ์ผ 500๋งŒ์›์ž…๋‹ˆ๋‹ค"
"""
},
"๋ฆด๋ฆฌ์Šค ๋…ธํŠธ": {
"definition": "์ œํ’ˆ์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „ ์ถœ์‹œ ์‹œ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ๊ฐœ์„ ์‚ฌํ•ญ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฌธ์„œ",
"purpose": "์‚ฌ์šฉ์ž ๊ต์œก, ์‹ ๊ธฐ๋Šฅ ํ™๋ณด, ํˆฌ๋ช…ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜, ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ํ–ฅ์ƒ",
"key_components": [
"๋ฒ„์ „ ์ •๋ณด ๋ฐ ์ถœ์‹œ์ผ",
"์ฃผ์š” ์‹ ๊ธฐ๋Šฅ ์†Œ๊ฐœ",
"๊ธฐ์กด ๊ธฐ๋Šฅ ๊ฐœ์„ ์‚ฌํ•ญ",
"๋ฒ„๊ทธ ์ˆ˜์ • ๋‚ด์—ญ",
"์•Œ๋ ค์ง„ ์ด์Šˆ ๋ฐ ์ œํ•œ์‚ฌํ•ญ",
"์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€์ด๋“œ",
"์ง€์› ๋ฐ ๋ฌธ์˜ ์ •๋ณด"
],
"writing_style": [
"์‚ฌ์šฉ์ž ์นœํ™”์  ์–ธ์–ด ์‚ฌ์šฉ",
"๊ธฐ์ˆ ์  ์šฉ์–ด๋ณด๋‹ค ํ˜œํƒ ์ค‘์‹ฌ ์„ค๋ช…",
"์‹œ๊ฐ์  ์š”์†Œ (์Šคํฌ๋ฆฐ์ƒท, GIF) ํ™œ์šฉ",
"๊ฐ์‚ฌ ํ‘œํ˜„ ๋ฐ ๊ธ์ •์  ํ†ค"
],
"distribution_channels": [
"์•ฑ ์Šคํ† ์–ด ์—…๋ฐ์ดํŠธ ์„ค๋ช…",
"์ด๋ฉ”์ผ ๋‰ด์Šค๋ ˆํ„ฐ",
"์ธ์•ฑ ์•Œ๋ฆผ ๋ฐ ํŒ์—…",
"์›น์‚ฌ์ดํŠธ ๋ฐ ๋ธ”๋กœ๊ทธ",
"์†Œ์…œ ๋ฏธ๋””์–ด"
],
"real_examples": """
**ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ํˆด ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ v2.4**:
๐ŸŽ‰ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
โ€ข **ํŒ€ ๋Œ€์‹œ๋ณด๋“œ**: ํŒ€ ์ „์ฒด ์ง„ํ–‰๋ฅ ์„ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜์„ธ์š”
โ€ข **์ž๋™ ์•Œ๋ฆผ**: ๋งˆ๊ฐ์ผ 3์ผ ์ „ ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์œผ์„ธ์š”
โ€ข **ํ…œํ”Œ๋ฆฟ ๊ฐค๋Ÿฌ๋ฆฌ**: ์—…์ข…๋ณ„ ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ 20๊ฐœ ์ถ”๊ฐ€
๐Ÿ”ง ๊ฐœ์„ ์‚ฌํ•ญ
โ€ข ํŒŒ์ผ ์—…๋กœ๋“œ ์†๋„ 50% ํ–ฅ์ƒ
โ€ข ๋ชจ๋ฐ”์ผ ์•ฑ UI ๊ฐœ์„ ์œผ๋กœ ํ„ฐ์น˜ ๋ฐ˜์‘์„ฑ ์ฆ๋Œ€
โ€ข ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ •ํ™•๋„ ๊ฐœ์„ 
๐Ÿ› ๋ฒ„๊ทธ ์ˆ˜์ •
โ€ข ๋Œ“๊ธ€ ์•Œ๋ฆผ์ด ์˜ค์ง€ ์•Š๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ
โ€ข ์—‘์…€ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์˜ค๋ฅ˜ ์ˆ˜์ •
๐Ÿ’ ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์ฃผ์‹  500+ ์‚ฌ์šฉ์ž๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
"""
}
}
# ์™„์ „ํ•œ User ์„ค๋ช…
USER_DETAILED = {
"์„ธ์ผ์ฆˆ": {
"definition": "์ œํ’ˆ์ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์ž ์žฌ ๊ณ ๊ฐ์—๊ฒŒ ํŒ๋งคํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์ง๋ฌด",
"primary_goals": [
"๋งค์ถœ ๋ชฉํ‘œ ๋‹ฌ์„ฑ",
"์‹ ๊ทœ ๊ณ ๊ฐ ํ™•๋ณด",
"๊ธฐ์กด ๊ณ ๊ฐ ๊ด€๊ณ„ ์œ ์ง€",
"ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ"
],
"key_metrics": [
"๋งค์ถœ ๋‹ฌ์„ฑ๋ฅ  (%)",
"์‹ ๊ทœ ๊ณ ๊ฐ ์ˆ˜",
"ํ‰๊ท  ๋”œ ์‚ฌ์ด์ฆˆ",
"์„ธ์ผ์ฆˆ ์‚ฌ์ดํด",
"์ „ํ™˜์œจ (Lead โ†’ Opportunity โ†’ Close)"
],
"daily_challenges": [
"๋ฆฌ๋“œ ๋ฐœ๊ตด ๋ฐ ๊ฒ€์ฆ",
"๊ณ ๊ฐ ๊ด€๊ณ„ ๊ตฌ์ถ•",
"์ œ์•ˆ์„œ ์ž‘์„ฑ",
"ํ˜‘์ƒ ๋ฐ ํด๋กœ์ง•",
"CRM ์—…๋ฐ์ดํŠธ"
],
"communication_style": [
"๊ฒฐ๊ณผ ์ค‘์‹ฌ์  ์–ธ์–ด",
"์ˆซ์ž์™€ ๋ฐ์ดํ„ฐ ์„ ํ˜ธ",
"์‹ ์†ํ•œ ์˜์‚ฌ๊ฒฐ์ • ์š”๊ตฌ",
"๊ตฌ์ฒด์ ์ธ ํ˜œํƒ ๊ฐ•์กฐ"
],
"content_needs": [
"๊ณ ๊ฐ ์‚ฌ๋ก€ ์—ฐ๊ตฌ",
"ROI ๊ณ„์‚ฐ๊ธฐ",
"๊ฒฝ์Ÿ์‚ฌ ๋น„๊ต ์ž๋ฃŒ",
"๊ฐ€๊ฒฉ ์ •์ฑ… ๊ฐ€์ด๋“œ",
"์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ"
],
"personas": {
"BDR (Business Development Rep)": "์‹ ๊ทœ ๋ฆฌ๋“œ ๋ฐœ๊ตด ๋ฐ ์ดˆ๊ธฐ ์ ‘์ด‰ ์ „๋‹ด",
"AE (Account Executive)": "๊ธฐํšŒ ๋ฐœ๊ตด๋ถ€ํ„ฐ ๊ณ„์•ฝ ์ฒด๊ฒฐ๊นŒ์ง€ ์ „์ฒด ์„ธ์ผ์ฆˆ ํ”„๋กœ์„ธ์Šค ๋‹ด๋‹น",
"AM (Account Manager)": "๊ธฐ์กด ๊ณ ๊ฐ ๊ด€๋ฆฌ ๋ฐ ์—…์…€/ํฌ๋กœ์Šค์…€ ๋‹ด๋‹น",
"Sales Leader": "ํŒ€ ๊ด€๋ฆฌ ๋ฐ ์ „๋žต ์ˆ˜๋ฆฝ, ๋ชฉํ‘œ ์„ค์ •"
}
},
"๋งˆ์ผ€ํŒ…ํŒ€": {
"definition": "๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ์ œ๊ณ , ๋ฆฌ๋“œ ์ƒ์„ฑ, ๊ณ ๊ฐ ์œ ์น˜๋ฅผ ์œ„ํ•œ ๋งˆ์ผ€ํŒ… ํ™œ๋™์„ ๊ธฐํšํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ง๋ฌด",
"primary_goals": [
"๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ํ–ฅ์ƒ",
"์–‘์งˆ์˜ ๋ฆฌ๋“œ ์ƒ์„ฑ",
"๊ณ ๊ฐ ํš๋“ ๋น„์šฉ ์ตœ์ ํ™”",
"๋งˆ์ผ€ํŒ… ROI ๊ทน๋Œ€ํ™”"
],
"key_metrics": [
"๋ฆฌ๋“œ ์ƒ์„ฑ ์ˆ˜ ๋ฐ ํ’ˆ์งˆ",
"CAC (Customer Acquisition Cost)",
"LTV (Customer Lifetime Value)",
"๋งˆ์ผ€ํŒ… ROI/ROAS",
"๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ์ง€ํ‘œ"
],
"specialized_roles": {
"ํผํฌ๋จผ์Šค ๋งˆ์ผ€ํŒ…": "์œ ๋ฃŒ ๊ด‘๊ณ  ์šด์˜ ๋ฐ ์ตœ์ ํ™”, ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •",
"์ฝ˜ํ…์ธ  ๋งˆ์ผ€ํŒ…": "๋ธ”๋กœ๊ทธ, ์˜์ƒ, ์†Œ์…œ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ  ๊ธฐํš ๋ฐ ์ œ์ž‘",
"๋ธŒ๋žœ๋“œ ๋งˆ์ผ€ํŒ…": "๋ธŒ๋žœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ๊ตฌ์ถ• ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€",
"๊ทธ๋กœ์Šค ๋งˆ์ผ€ํŒ…": "์‹คํ—˜์  ์ ‘๊ทผ์œผ๋กœ ๋น ๋ฅธ ์„ฑ์žฅ ๋™๋ ฅ ๋ฐœ๊ตด"
},
"communication_preferences": [
"์ฐฝ์˜์ ์ด๊ณ  ํŠธ๋ Œ๋””ํ•œ ํ‘œํ˜„",
"์‹œ๊ฐ์  ์š”์†Œ ์ค‘์š”์‹œ",
"์Šคํ† ๋ฆฌํ…”๋ง ์„ ํ˜ธ",
"๊ฐ์ •์  ์—ฐ๊ฒฐ ์ถ”๊ตฌ"
],
"tool_ecosystem": [
"Google Analytics, Adobe Analytics",
"Facebook Ads Manager, Google Ads",
"HubSpot, Marketo (๋งˆ์ผ€ํŒ… ์ž๋™ํ™”)",
"Canva, Figma (๋””์ž์ธ ํˆด)"
]
},
"PM": {
"definition": "์ œํ’ˆ์˜ ์ „๋žต, ๊ธฐํš, ๊ฐœ๋ฐœ, ์ถœ์‹œ๊นŒ์ง€ ์ „์ฒด ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ",
"core_responsibilities": [
"์ œํ’ˆ ์ „๋žต ์ˆ˜๋ฆฝ",
"์‹œ์žฅ ๋ฐ ๊ณ ๊ฐ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„",
"์ œํ’ˆ ๋กœ๋“œ๋งต ์ž‘์„ฑ",
"ํฌ๋กœ์ŠคํŒฉ์…”๋„ ํŒ€ ์กฐ์œจ",
"์ œํ’ˆ ์„ฑ๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง"
],
"key_skills": [
"๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ํ•ด์„",
"์‚ฌ์šฉ์ž ์ค‘์‹ฌ ์‚ฌ๊ณ ",
"๊ธฐ์ˆ ์  ์ดํ•ด๋„",
"๋น„์ฆˆ๋‹ˆ์Šค ์„ผ์Šค",
"์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ฐ ๋ฆฌ๋”์‹ญ"
],
"decision_framework": [
"Impact vs Effort ๋งคํŠธ๋ฆญ์Šค",
"RICE ์Šค์ฝ”์–ด๋ง (Reach, Impact, Confidence, Effort)",
"OKR (Objectives and Key Results)",
"๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •"
],
"stakeholder_management": [
"Engineering: ๊ธฐ์ˆ ์  ์‹คํ˜„๊ฐ€๋Šฅ์„ฑ ๋…ผ์˜",
"Design: ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™”",
"Sales: ์‹œ์žฅ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ํ”ผ๋“œ๋ฐฑ",
"Leadership: ์ „๋žต ์ •๋ ฌ ๋ฐ ๋ฆฌ์†Œ์Šค ํ™•๋ณด"
],
"career_levels": {
"Jr PM": "1-3๋…„ ๊ฒฝ๋ ฅ, ํŠน์ • ๊ธฐ๋Šฅ ๋‹ด๋‹น, ๋ฉ˜ํ† ๋ง ํ•„์š”",
"Sr PM": "3-7๋…„ ๊ฒฝ๋ ฅ, ๋…๋ฆฝ์  ์ œํ’ˆ ์˜์—ญ ๋‹ด๋‹น",
"Group PM": "7+ ๊ฒฝ๋ ฅ, ์—ฌ๋Ÿฌ ์ œํ’ˆ/ํŒ€ ์ด๊ด„, ์ „๋žต ์ˆ˜๋ฆฝ"
}
},
"์ „๋žตํŒ€": {
"definition": "๊ธฐ์—…์˜ ์žฅ๊ธฐ์  ๋ฐฉํ–ฅ์„ฑ ์„ค์ •, ์‹ ์‚ฌ์—… ๊ธฐํšŒ ๋ฐœ๊ตด, ๊ฒฝ์˜์ง„ ์˜์‚ฌ๊ฒฐ์ • ์ง€์›์„ ๋‹ด๋‹นํ•˜๋Š” ์ง๋ฌด",
"primary_functions": [
"์‹œ์žฅ ๋ถ„์„ ๋ฐ ๊ฒฝ์Ÿ ์ธํ…”๋ฆฌ์ „์Šค",
"์‹ ์‚ฌ์—… ๊ธฐํšŒ ํ‰๊ฐ€",
"M&A ๋ฐ ํŒŒํŠธ๋„ˆ์‹ญ ๊ฒ€ํ† ",
"๊ฒฝ์˜ ์ „๋žต ์ˆ˜๋ฆฝ",
"์„ฑ๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„"
],
"analytical_frameworks": [
"Porter's Five Forces",
"SWOT Analysis",
"BCG Matrix",
"McKinsey 7S Model",
"Blue Ocean Strategy"
],
"deliverables": [
"์‹œ์žฅ ๋ถ„์„ ๋ณด๊ณ ์„œ",
"๊ฒฝ์Ÿ์‚ฌ ๋ฒค์น˜๋งˆํ‚น",
"๋น„์ฆˆ๋‹ˆ์Šค ์ผ€์ด์Šค",
"์ „๋žต ํ”„๋ ˆ์  ํ…Œ์ด์…˜",
"์‹คํ–‰ ๊ณ„ํš์„œ"
],
"communication_style": [
"๋…ผ๋ฆฌ์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์‚ฌ๊ณ ",
"๋ฐ์ดํ„ฐ์™€ ์‚ฌ์‹ค ๊ธฐ๋ฐ˜",
"์ „๋žต์  ํ•จ์˜ ์ค‘์‹œ",
"์žฅ๊ธฐ์  ๊ด€์ "
],
"career_paths": {
"Corp Strategy": "๊ธฐ์—… ์ „์ฒด ์ฐจ์›์˜ ์ „๋žต ์ˆ˜๋ฆฝ",
"Biz Ops": "์šด์˜ ํšจ์œจ์„ฑ ๋ฐ ํ”„๋กœ์„ธ์Šค ๊ฐœ์„  ์ค‘์‹ฌ"
}
},
"PRํŒ€": {
"definition": "๊ธฐ์—…์˜ ๋Œ€์™ธ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ์™€ ์–ธ๋ก  ๊ด€๊ณ„, ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ „๋žต์„ ๋‹ด๋‹นํ•˜๋Š” ์ง๋ฌด",
"primary_goals": [
"๋ธŒ๋žœ๋“œ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ ๋ฐ ํ–ฅ์ƒ",
"๋ฏธ๋””์–ด ๊ด€๊ณ„ ๊ตฌ์ถ• ๋ฐ ์œ ์ง€",
"์œ„๊ธฐ ์ƒํ™ฉ ๋Œ€์‘ ๋ฐ ๊ด€๋ฆฌ",
"๊ธฐ์—… ๋ฉ”์‹œ์ง€ ์ผ๊ด€์„ฑ ํ™•๋ณด"
],
"key_metrics": [
"์–ธ๋ก  ๋ณด๋„๋Ÿ‰ ๋ฐ ํ†ค",
"๋ธŒ๋žœ๋“œ ๋ฉ˜์…˜ ์ฆ๊ฐ€์œจ",
"๋ฏธ๋””์–ด ๋„๋‹ฌ์œจ (Reach)",
"์œ„๊ธฐ ๋Œ€์‘ ์‹œ๊ฐ„",
"๋ธŒ๋žœ๋“œ ์ธ์ง€๋„ ์ง€ํ‘œ"
],
"core_activities": [
"๋ณด๋„์ž๋ฃŒ ์ž‘์„ฑ ๋ฐ ๋ฐฐํฌ",
"๊ธฐ์ž ๊ด€๊ณ„ ๊ด€๋ฆฌ",
"์ด๋ฒคํŠธ ๋ฐ ๊ธฐ์ž๊ฐ„๋‹ดํšŒ ๊ธฐํš",
"์œ„๊ธฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋Œ€์‘",
"๋‚ด๋ถ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ง€์›"
],
"communication_style": [
"์ •ํ™•ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์ „๋‹ฌ",
"๋ธŒ๋žœ๋“œ ๋ฉ”์‹œ์ง€ ์ผ๊ด€์„ฑ ์œ ์ง€",
"ํƒ€์ด๋ฐ๊ณผ ๋งฅ๋ฝ ๊ณ ๋ ค",
"ํˆฌ๋ช…ํ•˜๊ณ  ์ง„์ •์„ฑ ์žˆ๋Š” ์†Œํ†ต"
],
"specialized_roles": {
"์ฝ”ํผ๋ ˆ์ดํŠธ PR": "๊ธฐ์—… ์ „์ฒด ์ด๋ฏธ์ง€ ๋ฐ ๊ฒฝ์˜์ง„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜",
"ํ”„๋กœ๋•ํŠธ PR": "์ œํ’ˆ/์„œ๋น„์Šค ๊ด€๋ จ ํ™๋ณด ๋ฐ ๋Ÿฐ์นญ ์ง€์›"
}
},
"์ฐฝ์—…์ž": {
"definition": "์ƒˆ๋กœ์šด ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ด๋Œ์–ด๊ฐ€๋Š” ๊ธฐ์—…์˜ ์„ค๋ฆฝ์ž ๋ฐ ์ตœ๊ณ  ์˜์‚ฌ๊ฒฐ์ •์ž",
"primary_goals": [
"๋น„์ „ ๊ตฌํ˜„ ๋ฐ ํšŒ์‚ฌ ์„ฑ์žฅ",
"์ž๊ธˆ ์กฐ๋‹ฌ ๋ฐ ํˆฌ์ž ์œ ์น˜",
"ํ•ต์‹ฌ ์ธ์žฌ ํ™•๋ณด",
"์ œํ’ˆ-์‹œ์žฅ ๊ถํ•ฉ(PMF) ๋‹ฌ์„ฑ",
"์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ๊ตฌ์ถ•"
],
"key_challenges": [
"์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค ๋‚ด ์šฐ์„ ์ˆœ์œ„ ๊ฒฐ์ •",
"๋ถˆํ™•์‹ค์„ฑ ํ•˜์—์„œ์˜ ๋น ๋ฅธ ์˜์‚ฌ๊ฒฐ์ •",
"๋‹ค์–‘ํ•œ ์ดํ•ด๊ด€๊ณ„์ž ๊ด€๋ฆฌ",
"๊ฐœ์ธ์  ์ŠคํŠธ๋ ˆ์Šค ๋ฐ ๊ณ ๋…๊ฐ ๊ด€๋ฆฌ"
],
"communication_needs": [
"ํˆฌ์ž์ž๋ฅผ ์œ„ํ•œ ํ”ผ์นญ ์ž๋ฃŒ",
"์ง์›๋“ค์„ ์œ„ํ•œ ๋น„์ „ ์ „๋‹ฌ",
"๊ณ ๊ฐ์„ ์œ„ํ•œ ๊ฐ€์น˜ ์ œ์•ˆ",
"ํŒŒํŠธ๋„ˆ๋ฅผ ์œ„ํ•œ ํ˜‘๋ ฅ ์ œ์•ˆ"
],
"decision_criteria": [
"์žฅ๊ธฐ์  ๋น„์ „๊ณผ์˜ ์ •๋ ฌ์„ฑ",
"๋น ๋ฅธ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ",
"๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ",
"์‹œ์žฅ ์ž„ํŒฉํŠธ ์ž ์žฌ๋ ฅ"
],
"stage_characteristics": {
"Seed": "์•„์ด๋””์–ด ๊ฒ€์ฆ, ์ดˆ๊ธฐ ์ œํ’ˆ ๊ฐœ๋ฐœ, ํŒ€ ๊ตฌ์„ฑ",
"Series A+": "์„ฑ์žฅ ๊ฐ€์†ํ™”, ์กฐ์ง ํ™•์žฅ, ์‹œ์žฅ ์ ์œ ์œจ ํ™•๋Œ€",
"๋ถ€ํŠธ์ŠคํŠธ๋žฉ": "์ž์ฒด ์ž๊ธˆ์œผ๋กœ ์„ฑ์žฅ, ์ˆ˜์ต์„ฑ ์ค‘์‹ฌ ์šด์˜"
}
},
"๊ธฐํšํŒ€": {
"definition": "์กฐ์ง์˜ ์ค‘์žฅ๊ธฐ ๊ณ„ํš ์ˆ˜๋ฆฝ๊ณผ ํ”„๋กœ์ ํŠธ ๊ธฐํš, ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ง๋ฌด",
"primary_functions": [
"์‚ฌ์—… ๊ณ„ํš ์ˆ˜๋ฆฝ ๋ฐ ๊ด€๋ฆฌ",
"ํ”„๋กœ์ ํŠธ ๊ธฐํš ๋ฐ ์ถ”์ง„",
"์„ฑ๊ณผ ์ง€ํ‘œ ์„ค์ • ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง",
"์กฐ์ง ์šด์˜ ํšจ์œจ์„ฑ ๊ฐœ์„ ",
"์‹ ์‚ฌ์—… ๊ธฐํšŒ ๋ฐœ๊ตด"
],
"key_skills": [
"์ฒด๊ณ„์  ์‚ฌ๊ณ  ๋ฐ ๋ถ„์„ ๋Šฅ๋ ฅ",
"ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์—ญ๋Ÿ‰",
"๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์ธ์‚ฌ์ดํŠธ ๋„์ถœ",
"์ดํ•ด๊ด€๊ณ„์ž ์กฐ์œจ",
"๋ฌธ์„œํ™” ๋ฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜"
],
"deliverables": [
"์‚ฌ์—… ๊ณ„ํš์„œ",
"ํ”„๋กœ์ ํŠธ ๊ธฐํš์„œ",
"์„ฑ๊ณผ ๋ณด๊ณ ์„œ",
"์‹œ์žฅ ๋ถ„์„ ์ž๋ฃŒ",
"์ •์ฑ… ์ œ์•ˆ์„œ"
],
"communication_style": [
"๋…ผ๋ฆฌ์ ์ด๊ณ  ์ฒด๊ณ„์ ์ธ ๊ตฌ์„ฑ",
"๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ทผ๊ฑฐ ์ œ์‹œ",
"๋ช…ํ™•ํ•œ ๋ชฉํ‘œ ๋ฐ ์ผ์ • ๋ช…์‹œ",
"๋ฆฌ์Šคํฌ์™€ ๋Œ€์•ˆ ํ•จ๊ป˜ ์ œ์‹œ"
]
},
"์ปจ์„คํ„ดํŠธ": {
"definition": "๊ธฐ์—…์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ ์„ฑ๊ณผ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ „๋ฌธ์  ์กฐ์–ธ๊ณผ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ์ „๋ฌธ๊ฐ€",
"primary_goals": [
"๊ณ ๊ฐ ๋ฌธ์ œ์˜ ์ •ํ™•ํ•œ ์ง„๋‹จ",
"ํšจ๊ณผ์ ์ธ ์†”๋ฃจ์…˜ ์„ค๊ณ„",
"๋ณ€ํ™” ๊ด€๋ฆฌ ๋ฐ ์‹คํ–‰ ์ง€์›",
"์ธก์ • ๊ฐ€๋Šฅํ•œ ์„ฑ๊ณผ ์ฐฝ์ถœ"
],
"expertise_areas": [
"์ „๋žต ์ปจ์„คํŒ… (Strategy)",
"์šด์˜ ์ปจ์„คํŒ… (Operations)",
"์กฐ์ง/HR ์ปจ์„คํŒ…",
"IT/๋””์ง€ํ„ธ ์ปจ์„คํŒ…",
"์žฌ๋ฌด ์ปจ์„คํŒ…"
],
"methodology": [
"๋ฌธ์ œ ์ •์˜ ๋ฐ ํ˜„ํ™ฉ ๋ถ„์„",
"๊ฐ€์„ค ์„ค์ • ๋ฐ ๊ฒ€์ฆ",
"์†”๋ฃจ์…˜ ์„ค๊ณ„ ๋ฐ ์ œ์•ˆ",
"์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ",
"์„ฑ๊ณผ ์ธก์ • ๋ฐ ๊ฐœ์„ "
],
"communication_characteristics": [
"๊ตฌ์กฐํ™”๋œ ๋…ผ๋ฆฌ ์ „๊ฐœ",
"ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ๋ถ„์„",
"์•ก์…˜ ์ค‘์‹ฌ์˜ ์ œ์•ˆ",
"๊ฒฝ์˜์ง„ ์–ธ์–ด๋กœ ์†Œํ†ต"
],
"key_deliverables": [
"ํ˜„ํ™ฉ ์ง„๋‹จ ๋ณด๊ณ ์„œ",
"๋ฌธ์ œ ๋ถ„์„ ๋ฐ ์›์ธ ๊ทœ๋ช…",
"์†”๋ฃจ์…˜ ์ œ์•ˆ์„œ",
"์‹คํ–‰ ๋กœ๋“œ๋งต",
"์„ฑ๊ณผ ์ธก์ • ๋Œ€์‹œ๋ณด๋“œ"
]
},
"IR/ํˆฌ์ž์ค€๋น„ํŒ€": {
"definition": "ํˆฌ์ž์ž ๊ด€๊ณ„ ๊ด€๋ฆฌ์™€ ์ž๊ธˆ ์กฐ๋‹ฌ, ๊ธฐ์—… ๊ฐ€์น˜ ์ œ๊ณ ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ „๋ฌธ ์กฐ์ง",
"primary_functions": [
"ํˆฌ์ž์ž ๊ด€๊ณ„ ๊ด€๋ฆฌ (Investor Relations)",
"์ž๊ธˆ ์กฐ๋‹ฌ ์ „๋žต ์ˆ˜๋ฆฝ ๋ฐ ์‹คํ–‰",
"๊ธฐ์—… ๊ฐ€์น˜ ํ‰๊ฐ€ ๋ฐ ์ œ๊ณ ",
"์žฌ๋ฌด ์ •๋ณด ๊ณต์‹œ ๋ฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜",
"์‹œ์žฅ ๋™ํ–ฅ ๋ถ„์„ ๋ฐ ๋ณด๊ณ "
],
"key_stakeholders": [
"๊ธฐ๊ด€ ํˆฌ์ž์ž (VC, PE ๋“ฑ)",
"๊ฐœ์ธ ํˆฌ์ž์ž",
"์• ๋„๋ฆฌ์ŠคํŠธ ๋ฐ ์‹ ์šฉํ‰๊ฐ€์‚ฌ",
"๊ฒฝ์˜์ง„ ๋ฐ ์ด์‚ฌํšŒ",
"๊ทœ์ œ ๊ธฐ๊ด€"
],
"core_materials": [
"ํˆฌ์ž ์ œ์•ˆ์„œ (IR Deck)",
"์‚ฌ์—… ๊ณ„ํš์„œ",
"์žฌ๋ฌด ๋ชจ๋ธ๋ง",
"๊ธฐ์—… ๊ฐœ์š”์„œ",
"์‹ค์  ๋ฐœํ‘œ ์ž๋ฃŒ"
],
"communication_focus": [
"์žฌ๋ฌด์  ์„ฑ๊ณผ์™€ ์ „๋ง",
"๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์˜ ์ง€์†๊ฐ€๋Šฅ์„ฑ",
"๊ฒฝ์Ÿ ์šฐ์œ„ ๋ฐ ์ฐจ๋ณ„ํ™” ์š”์†Œ",
"๋ฆฌ์Šคํฌ ์š”์ธ ๋ฐ ๋Œ€์‘ ๋ฐฉ์•ˆ",
"ESG ๊ฒฝ์˜ ์„ฑ๊ณผ"
],
"success_metrics": [
"ํˆฌ์ž ์œ ์น˜ ์„ฑ๊ณต๋ฅ ",
"๊ธฐ์—… ๊ฐ€์น˜ ์ƒ์Šน๋ฅ ",
"ํˆฌ์ž์ž ๋งŒ์กฑ๋„",
"์‹œ์žฅ ์ธ์ง€๋„",
"์ž๊ธˆ ์กฐ๋‹ฌ ๋น„์šฉ"
]
},
"UX ๋””์ž์ด๋„ˆ": {
"definition": "์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์—ฐ๊ตฌํ•˜๊ณ  ์„ค๊ณ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์ œํ’ˆ์„ ๋งŒ๋“œ๋Š” ์ „๋ฌธ๊ฐ€",
"primary_goals": [
"์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๊ฒฝํ—˜ ์„ค๊ณ„",
"์‚ฌ์šฉ์„ฑ ๋ฐ ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ",
"๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ์™€ ์‚ฌ์šฉ์ž ๋‹ˆ์ฆˆ ๊ท ํ˜•",
"๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋””์ž์ธ ์˜์‚ฌ๊ฒฐ์ •"
],
"key_processes": [
"์‚ฌ์šฉ์ž ๋ฆฌ์„œ์น˜ ๋ฐ ์ธ์‚ฌ์ดํŠธ ๋„์ถœ",
"์‚ฌ์šฉ์ž ์—ฌ์ • ๋งตํ•‘",
"์™€์ด์–ดํ”„๋ ˆ์ž„ ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘",
"์‚ฌ์šฉ์„ฑ ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ",
"๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐ ๊ด€๋ฆฌ"
],
"core_deliverables": [
"์‚ฌ์šฉ์ž ๋ฆฌ์„œ์น˜ ๋ณด๊ณ ์„œ",
"ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฐ ์‚ฌ์šฉ์ž ์—ฌ์ •",
"์™€์ด์–ดํ”„๋ ˆ์ž„ ๋ฐ ํ”Œ๋กœ์šฐ์ฐจํŠธ",
"์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ”„๋กœํ† ํƒ€์ž…",
"๋””์ž์ธ ๊ฐ€์ด๋“œ๋ผ์ธ"
],
"collaboration_focus": [
"PM๊ณผ์˜ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜",
"๊ฐœ๋ฐœํŒ€๊ณผ์˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ† ",
"๋งˆ์ผ€ํŒ…ํŒ€๊ณผ์˜ ์‚ฌ์šฉ์ž ์ดํ•ด ๊ณต์œ ",
"๊ฒฝ์˜์ง„๊ณผ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ ๋…ผ์˜"
],
"specialized_roles": {
"UX Writer": "์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ํ…์ŠคํŠธ ๋ฐ ๋งˆ์ดํฌ๋กœ์นดํ”ผ ์ „๋ฌธ",
"Product Designer": "์ œํ’ˆ ์ „๋ฐ˜์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์„ค๊ณ„ ๋‹ด๋‹น"
}
},
"๊ฐœ๋ฐœํŒ€": {
"definition": "์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์˜ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ์ˆ  ์ „๋ฌธ๊ฐ€ ๊ทธ๋ฃน",
"primary_goals": [
"์•ˆ์ •์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ๊ตฌ์ถ•",
"์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์˜ ๊ธฐ์ˆ ์  ๊ตฌํ˜„",
"์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณด์•ˆ ์œ ์ง€",
"๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ๋ฐ ๋ฐฐํฌ ์†๋„ ํ–ฅ์ƒ"
],
"key_responsibilities": [
"๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ์„ค๊ณ„",
"์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋ฆฌ๋ทฐ",
"ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ํ’ˆ์งˆ ๋ณด์ฆ",
"๋ฐฐํฌ ๋ฐ ์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง",
"๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ"
],
"communication_needs": [
"๊ธฐ์ˆ  ๋ช…์„ธ์„œ ๋ฐ API ๋ฌธ์„œ",
"์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฌธ์„œ",
"์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ฐ€์ด๋“œ๋ผ์ธ",
"๋ฐฐํฌ ๋ฐ ์šด์˜ ๋งค๋‰ด์–ผ",
"์žฅ์•  ๋Œ€์‘ ๋ณด๊ณ ์„œ"
],
"decision_criteria": [
"๊ธฐ์ˆ ์  ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ",
"์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ์„ฑ",
"๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ",
"๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ",
"ํŒ€ ์—ญ๋Ÿ‰ ๋ฐ ํ•™์Šต ๊ณก์„ "
],
"specialized_roles": {
"FE (Frontend)": "์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋ฐœ ์ „๋‹ด",
"BE (Backend)": "์„œ๋ฒ„ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง ๊ฐœ๋ฐœ",
"ML (Machine Learning)": "AI/ML ๋ชจ๋ธ ๊ฐœ๋ฐœ ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„",
"Infra": "์ธํ”„๋ผ ๊ตฌ์ถ• ๋ฐ DevOps ๋‹ด๋‹น"
}
},
"QA": {
"definition": "์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์˜ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ ์ „๋ฌธ๊ฐ€",
"primary_goals": [
"๊ฒฐํ•จ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ ๋ฐ ์˜ˆ๋ฐฉ",
"์‚ฌ์šฉ์ž ๊ด€์ ์˜ ํ’ˆ์งˆ ๊ฒ€์ฆ",
"๋ฆด๋ฆฌ์ฆˆ ํ’ˆ์งˆ ๊ธฐ์ค€ ํ™•๋ณด",
"ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค ๊ฐœ์„ "
],
"key_activities": [
"ํ…Œ์ŠคํŠธ ๊ณ„ํš ์ˆ˜๋ฆฝ ๋ฐ ์ผ€์ด์Šค ์ž‘์„ฑ",
"์ˆ˜๋™/์ž๋™ ํ…Œ์ŠคํŠธ ์‹คํ–‰",
"๊ฒฐํ•จ ๋ฐœ๊ฒฌ ๋ฐ ์žฌํ˜„",
"ํ’ˆ์งˆ ์ง€ํ‘œ ๋ชจ๋‹ˆํ„ฐ๋ง",
"ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ตฌ์ถ•"
],
"testing_types": [
"๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ (Functional Testing)",
"์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ (Performance Testing)",
"๋ณด์•ˆ ํ…Œ์ŠคํŠธ (Security Testing)",
"์‚ฌ์šฉ์„ฑ ํ…Œ์ŠคํŠธ (Usability Testing)",
"ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Regression Testing)"
],
"communication_focus": [
"๋ช…ํ™•ํ•˜๊ณ  ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐํ•จ ๋ณด๊ณ ",
"ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์˜ ์ •๋Ÿ‰์  ์ œ์‹œ",
"๋ฆฌ์Šคํฌ ๊ธฐ๋ฐ˜ ์šฐ์„ ์ˆœ์œ„ ์ œ์•ˆ",
"ํ’ˆ์งˆ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ œ์•ˆ์‚ฌํ•ญ"
],
"career_levels": {
"QA ์—”์ง€๋‹ˆ์–ด": "ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐํ•จ ๋ฐœ๊ฒฌ ์ค‘์‹ฌ",
"QA ๋ฆฌ๋“œ": "ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ ๋ฐ ํŒ€ ๊ด€๋ฆฌ"
}
}
}
# =========================================================
# 3. ๋กœ์ง ํ•จ์ˆ˜๋“ค
# =========================================================
def uniq(xs: List[str]) -> List[str]:
if not xs: return []
s=set(); out=[]
for x in xs:
if x not in s:
s.add(x); out.append(x)
return out
AUTO_RULES_PAIN = {
"๋ฐ˜์‘๋ฅ ": ["Persona Prompting", "Few-shot Prompting", "Self-consistency Prompting"],
"๋ถˆ์ผ์น˜": ["Output Formatting", "Constrained Prompting"],
"์ž‘์„ฑ": ["Output Formatting", "Few-shot Prompting"],
"๊ฒฝ์Ÿ": ["RAG Prompting", "Chain-of-Thought (CoT)"],
"์š”๊ตฌ": ["Persona Prompting", "Step-back Prompting"],
}
AUTO_RULES_OUTPUT = {
"์ด๋ฉ”์ผ": ["Persona Prompting", "Output Formatting", "Few-shot Prompting", "Self-consistency Prompting"],
"์นดํ”ผ": ["Few-shot Prompting", "Self-consistency Prompting", "Output Formatting"],
"๋ณด๊ณ ์„œ": ["RAG Prompting", "Chain-of-Thought (CoT)", "Output Formatting"],
"PRD": ["Role Prompting", "Constrained Prompting", "Chain-of-Thought (CoT)"],
}
AUTO_RULES_USER = {
"์„ธ์ผ์ฆˆ": ["Persona Prompting", "Few-shot Prompting", "Self-consistency Prompting"],
"๋งˆ์ผ€ํŒ…": ["Few-shot Prompting", "Self-consistency Prompting"],
"์ „๋žต": ["Chain-of-Thought (CoT)", "Step-back Prompting", "RAG Prompting"],
"PM": ["Role Prompting", "Constrained Prompting"],
"๋ฐ์ดํ„ฐ": ["RAG Prompting", "Constrained Prompting"],
}
def auto_recommend(domain_key, pains, outs, users):
rec=[]
if not domain_key: return [], ""
if domain_key=="1 ์™ธ๋ถ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜":
rec+=["Persona Prompting","Few-shot Prompting","Self-consistency Prompting","Output Formatting"]
if domain_key=="2 ์‹œ์žฅยท๊ณ ๊ฐ ๋ฆฌ์„œ์น˜":
rec+=["RAG Prompting","Chain-of-Thought (CoT)","Output Formatting","Step-back Prompting"]
if domain_key=="3 ์ œํ’ˆยทUX ๋ฌธ์„œ":
rec+=["Role Prompting","Constrained Prompting","Chain-of-Thought (CoT)","Output Formatting"]
for p in pains or []:
for k,ts in AUTO_RULES_PAIN.items():
if k in p: rec+=ts
for o in outs or []:
for k,ts in AUTO_RULES_OUTPUT.items():
if k in o: rec+=ts
for u in users or []:
for k,ts in AUTO_RULES_USER.items():
if k in u: rec+=ts
rec.append("Output Formatting")
unique_rec = uniq(rec)
rationale_md = "### ๐Ÿ”ฎ ์ž๋™ ์ถ”์ฒœ ๊ธฐ์ˆ  ๋ฐ ํ•ต์‹ฌ ๊ทผ๊ฑฐ\n\n"
if not unique_rec:
rationale_md += "์„ ํƒ๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ž๋™ ์ถ”์ฒœ ๊ธฐ์ˆ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๊ธฐ์ˆ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."
else:
for tech in unique_rec:
g = TECH_DETAILED.get(tech, {})
desc = g.get("desc", "์„ค๋ช… ์—†์Œ")
rationale_md += f"- **{tech}**: {desc}\n"
return gr.update(value=unique_rec, choices=uniq(ALL_TECHS + unique_rec)), rationale_md
def reason_from_pain(tech: str, pains: List[str], pain_subs: List[str]) -> List[str]:
R=[]
jp=" ".join(pains or []) + " " + " ".join(pain_subs or [])
if "๋ฐ˜์‘๋ฅ " in jp:
if tech=="Persona Prompting": R.append("๋ฐ˜์‘๋ฅ  ์ €์กฐ โ†’ ์„ธ๊ทธ๋จผํŠธ ๋งž์ถค ์–ดํœ˜/์–ด์กฐ๋กœ **์ฒด๊ฐ ๊ฐ€์น˜** ์ƒ์Šน")
if tech=="Few-shot Prompting": R.append("๋ฐ˜์‘๋ฅ  ์ €์กฐ โ†’ ๊ณ ์„ฑ๊ณผ ์˜ˆ์‹œ ํŒจํ„ด ๋ณต์ œ")
if tech=="Self-consistency Prompting": R.append("๋ฐ˜์‘๋ฅ  ์ €์กฐ โ†’ ๋‹ค๋ณ€๋Ÿ‰ ํ›„๋ณด ์ƒ์„ฑโ†’์ž์ฒด ์ฑ„์ ์œผ๋กœ **Top-1**")
if "๋ถˆ์ผ์น˜" in jp or "ํ†ค/๋ณด์ด์Šค" in jp or "ํฌ๋งท" in jp:
if tech=="Output Formatting": R.append("๋ฉ”์‹œ์ง€ ๋ถˆ์ผ์น˜ โ†’ ํ˜•์‹/์„น์…˜ ๊ณ ์ •์œผ๋กœ ์ •ํ•ฉ์„ฑโ†‘")
if tech=="Constrained Prompting": R.append("๋ฉ”์‹œ์ง€ ๋ถˆ์ผ์น˜ โ†’ ๊ธˆ์น™/๊ธธ์ด/ํ•„์ˆ˜ํ•„๋“œ ๊ฐ•์ œ")
if "์ž‘์„ฑ ์‹œ๊ฐ„" in jp or "์˜ˆ์‹œ ๋ถ€์กฑ" in jp:
if tech in {"Few-shot Prompting","Output Formatting"}: R.append("์ž‘์„ฑ์‹œ๊ฐ„ ๊ณผ๋‹ค/์˜ˆ์‹œ ๋ถ€์กฑ โ†’ ํ…œํ”Œ๋ฆฟ + ์˜ˆ์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ์†๋„โ†‘")
if "๊ฒฝ์Ÿ์‚ฌ ์ •๋ณด" in jp:
if tech=="RAG Prompting": R.append("๊ฒฝ์Ÿ์‚ฌ ์ •๋ณด ๋ถ€์กฑ โ†’ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๊ทผ๊ฑฐ ์ฃผ์ž…(์ตœ์‹ ์„ฑ/์‹ ๋ขฐ์„ฑ)")
if tech=="Chain-of-Thought (CoT)": R.append("๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„ ๊ตฌ์กฐํ™”(CoT)๋กœ ์ธ์‚ฌ์ดํŠธ ๋ช…๋ฃŒํ™”")
if "์š”๊ตฌ ๋ถˆ๋ช…ํ™•" in jp:
if tech in {"Persona Prompting","Step-back Prompting"}: R.append("๊ณ ๊ฐ ์š”๊ตฌ ๋ถˆ๋ช…ํ™• โ†’ ์ƒ์œ„ ๋ชฉ์ /JTBD ์ •๋ ฌ")
return R
def reason_from_output(tech: str, outs: List[str], out_subs: List[str]) -> List[str]:
R=[]
jo=" ".join(outs or []) + " " + " ".join(out_subs or [])
if "๋ฉ”์ผ" in jo or "์นดํ”ผ" in jo or "๋žœ๋”ฉ" in jo:
if tech=="Output Formatting": R.append("์นดํ”ผ/๋ฉ”์ผ ๊ณ„์—ด โ†’ **ํ—ค๋“œ๋ผ์ธ/์„œ๋ธŒ/๋ฐ”๋””/CTA** ๊ณ ์ •์ด ์„ฑ๊ณผ ์ขŒ์šฐ")
if tech=="Self-consistency Prompting": R.append("๋ฉ”์‹œ์ง€ ํ›„๋ณด ๋‹ค๋ณ€๋Ÿ‰ ์ƒ์„ฑโ†’์ตœ์ ์•ˆ ์„ ํƒ ํ•„์š”")
if tech=="Few-shot Prompting": R.append("์ฑ„๋„๋ณ„ ํ†ค/๊ธธ์ด ์ฐจ์ด๋ฅผ ์˜ˆ์‹œ๋กœ ๋น ๋ฅด๊ฒŒ ์ ์‘")
if "๋ณด๊ณ ์„œ" in jo or "๋ถ„์„" in jo:
if tech=="RAG Prompting": R.append("๋ณด๊ณ ์„œ/๋ถ„์„ โ†’ ์ˆ˜์น˜ยท์ถœ์ฒ˜ ์ตœ์‹ ์„ฑ ๋ณด์žฅ")
if tech=="Chain-of-Thought (CoT)": R.append("๋ณด๊ณ ์„œ/๋ถ„์„ โ†’ ๋‹จ๊ณ„์  ๊ตฌ์กฐ(CoT)๋กœ ๋…ผ๋ฆฌ ๊ฐ•ํ™”")
if "PRD" in jo or "API" in jo:
if tech in {"Constrained Prompting","Role Prompting"}: R.append("PRD/API โ†’ JSON/ํ•„๋“œ ๊ฐ•์ œ + ์ง๋ฌด ๊ด€์  ๊ณ ์ • ํ•„์š”")
return R
def reason_from_user(tech: str, users: List[str], user_subs: List[str]) -> List[str]:
R=[]
ju=" ".join(users or []) + " " + " ".join(user_subs or [])
if "์„ธ์ผ์ฆˆ" in ju:
if tech=="Persona Prompting": R.append("Sales๋Š” ํŒŒ์ดํ”„๋ผ์ธ/์Šน๋ฅ  ์–ธ์–ด ์„ ํ˜ธ โ†’ ํŽ˜๋ฅด์†Œ๋‚˜ ํ†ค ์ ์šฉ")
if tech=="Few-shot Prompting": R.append("์˜์—… ๋ ˆํผ๋Ÿฐ์Šค ์‚ฌ๋ก€ ๋ชจ์‚ฌ๊ฐ€ ์„ค๋“๋ ฅโ†‘")
if "์ „๋žต" in ju:
if tech in {"Chain-of-Thought (CoT)","Step-back Prompting","RAG Prompting"}:
R.append("์ „๋žต์กฐ์ง์€ ๊ทผ๊ฑฐ/๋…ผ๋ฆฌ/์‹œ์‚ฌ์  ์ค‘์‹œ โ†’ CoT+RAG+Step-back ์ ํ•ฉ")
if "PM" in ju or "UX" in ju:
if tech in {"Role Prompting","Constrained Prompting"}:
R.append("PM/UX๋Š” ํ•„๋“œ/AC/ํ†ค ํ‘œ์ค€ ํ•„์š” โ†’ ์—ญํ•  ๊ณ ์ • + ์ œ์•ฝ ๊ฐ•์ œ")
return R
# =========================================================
# 4. ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ ํ•จ์ˆ˜๋“ค
# =========================================================
def show_pain_details(selected_pains):
if not selected_pains:
return "Pain Point๋ฅผ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."
details_html = "<div style='max-height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'>"
for pain in selected_pains:
if pain in PAIN_DETAILED:
detail = PAIN_DETAILED[pain]
details_html += f"""
<div style='margin-bottom: 20px; padding: 15px; background: #f8f9fa; border-radius: 8px;'>
<h4 style='color: #2c3e50; margin-bottom: 10px;'>๐Ÿ“ {pain}</h4>
<p><strong>์ •์˜:</strong> {detail['definition']}</p>
<p><strong>์ฃผ์š” ์ฆ์ƒ:</strong></p>
<ul>{"".join([f'<li>{symptom}</li>' for symptom in detail['symptoms']])}</ul>
<p><strong>๊ทผ๋ณธ ์›์ธ:</strong></p>
<ul>{"".join([f'<li>{cause}</li>' for cause in detail['root_causes']])}</ul>
<p><strong>๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ:</strong> {detail['business_impact']}</p>
<div style='background: #e8f5e8; padding: 10px; border-radius: 5px; margin-top: 10px;'>
<strong>์‹ค์ œ ์‚ฌ๋ก€:</strong>
<ul>{"".join([f'<li>{example}</li>' for example in detail['real_examples']])}</ul>
</div>
<p><strong>์ธก์ • ๋ฐฉ๋ฒ•:</strong> {detail['measurement']}</p>
</div>
"""
details_html += "</div>"
return details_html
def show_output_details(selected_outputs):
if not selected_outputs:
return "Output์„ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."
details_html = "<div style='max-height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'>"
for output in selected_outputs:
if output in OUTPUT_DETAILED:
detail = OUTPUT_DETAILED[output]
details_html += f"""
<div style='margin-bottom: 20px; padding: 15px; background: #f0f8ff; border-radius: 8px;'>
<h4 style='color: #1f4e79; margin-bottom: 10px;'>๐Ÿ“„ {output}</h4>
<p><strong>์ •์˜:</strong> {detail['definition']}</p>
<p><strong>๋ชฉ์ :</strong> {detail['purpose']}</p>
<p><strong>ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ:</strong></p>
<ul>{"".join([f'<li>{component}</li>' for component in detail.get('key_components', detail.get('key_sections', detail.get('essential_sections', [])))])}</ul>
"""
if 'success_metrics' in detail:
details_html += f"""
<p><strong>์„ฑ๊ณต ์ง€ํ‘œ:</strong></p>
<ul>{"".join([f'<li>{metric}</li>' for metric in detail['success_metrics']])}</ul>
"""
if 'real_examples' in detail:
details_html += f"""
<div style='background: #fff3cd; padding: 10px; border-radius: 5px; margin-top: 10px;'>
<strong>์‹ค์ œ ์˜ˆ์‹œ:</strong>
<pre style='white-space: pre-wrap; font-size: 12px;'>{detail['real_examples']}</pre>
</div>
"""
details_html += "</div>"
details_html += "</div>"
return details_html
def show_user_details(selected_users):
if not selected_users:
return "User๋ฅผ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."
details_html = "<div style='max-height: 400px; overflow-y: auto; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'>"
for user in selected_users:
if user in USER_DETAILED:
detail = USER_DETAILED[user]
details_html += f"""
<div style='margin-bottom: 20px; padding: 15px; background: #fff0f5; border-radius: 8px;'>
<h4 style='color: #8b4789; margin-bottom: 10px;'>๐Ÿ‘ค {user}</h4>
<p><strong>์ •์˜:</strong> {detail['definition']}</p>
<p><strong>์ฃผ์š” ๋ชฉํ‘œ:</strong></p>
<ul>{"".join([f'<li>{goal}</li>' for goal in detail.get('primary_goals', detail.get('primary_functions', detail.get('core_responsibilities', [])))])}</ul>
<p><strong>ํ•ต์‹ฌ ์ง€ํ‘œ:</strong></p>
<ul>{"".join([f'<li>{metric}</li>' for metric in detail.get('key_metrics', detail.get('key_skills', []))])}</ul>
"""
if 'communication_style' in detail:
details_html += f"""
<p><strong>์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์Šคํƒ€์ผ:</strong></p>
<ul>{"".join([f'<li>{style}</li>' for style in detail['communication_style']])}</ul>
"""
if 'personas' in detail:
details_html += f"""
<p><strong>์„ธ๋ถ€ ์—ญํ• :</strong></p>
<ul>{"".join([f'<li><strong>{role}:</strong> {desc}</li>' for role, desc in detail['personas'].items()])}</ul>
"""
if 'specialized_roles' in detail:
details_html += f"""
<p><strong>์ „๋ฌธ ๋ถ„์•ผ:</strong></p>
<ul>{"".join([f'<li><strong>{role}:</strong> {desc}</li>' for role, desc in detail['specialized_roles'].items()])}</ul>
"""
details_html += "</div>"
details_html += "</div>"
return details_html
def show_tech_details(selected_techs):
if not selected_techs:
return "ํ”„๋กฌํ”„ํŒ… ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."
details_html = "<div style='max-height: 500px; overflow-y: auto; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'>"
for tech in selected_techs:
if tech in TECH_DETAILED:
detail = TECH_DETAILED[tech]
details_html += f"""
<div style='margin-bottom: 25px; padding: 20px; background: #f5f5f5; border-radius: 8px; border-left: 4px solid #4CAF50;'>
<h4 style='color: #2e7d32; margin-bottom: 15px;'>๐Ÿ› ๏ธ {tech}</h4>
<p><strong>๐Ÿ“– ์ •์˜:</strong> {detail['desc']}</p>
<p><strong>๐ŸŽฏ ๋ชฉ์ :</strong> {detail['purpose']}</p>
<p><strong>โฐ ์–ธ์ œ ์‚ฌ์šฉ:</strong> {detail['when_to_use']}</p>
<p><strong>๐Ÿ”ง ์ž‘๋™ ์›๋ฆฌ:</strong></p>
<ul>{"".join([f'<li>{mechanism}</li>' for mechanism in detail['mechanics']])}</ul>
<div style='background: #e8f5e8; padding: 15px; border-radius: 5px; margin: 15px 0;'>
<strong>๐Ÿ’ก ์‹ค๋ฌด ์˜ˆ์‹œ:</strong>
<pre style='white-space: pre-wrap; font-size: 13px; margin-top: 10px;'>{detail['real_example']}</pre>
</div>
<p><strong>โœ… ํ™œ์šฉ ํŒ:</strong> {detail['tips']}</p>
<p><strong>โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ:</strong> {detail['avoid']}</p>
</div>
"""
details_html += "</div>"
return details_html
# =========================================================
# 5. ์นดํƒˆ๋กœ๊ทธ ๋ฐ ํ…œํ”Œ๋ฆฟ
# =========================================================
CATALOG = {
"1 ์™ธ๋ถ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜": {
"subdomains": ["์ด๋ฉ”์ผ(์ฝœ๋“œ/์›œ)", "๊ด‘๊ณ /๋žœ๋”ฉ", "PR/๋ณด๋„์ž๋ฃŒ", "SNS/์˜์ƒ"],
"pains": ["๋ฐ˜์‘๋ฅ  ์ €์กฐ", "๋ฉ”์‹œ์ง€ ๋ถˆ์ผ์น˜", "์ž‘์„ฑ ์‹œ๊ฐ„ ๊ณผ๋‹ค", "A/B ํ…Œ์ŠคํŠธ ๋ถ€๋‹ด"],
"outputs": ["์ฝœ๋“œ๋ฉ”์ผ", "๊ด‘๊ณ  ์นดํ”ผ", "๋ณด๋„์ž๋ฃŒ", "๋žœ๋”ฉํŽ˜์ด์ง€ ์„น์…˜"],
"users": ["์„ธ์ผ์ฆˆ", "๋งˆ์ผ€ํŒ…ํŒ€", "PRํŒ€", "์ฐฝ์—…์ž"]
},
"2 ์‹œ์žฅยท๊ณ ๊ฐ ๋ฆฌ์„œ์น˜": {
"subdomains": ["์‹œ์žฅ๋ณด๊ณ ์„œ", "๊ฒฝ์Ÿ๋ถ„์„", "VOC ๋ถ„์„", "ํŽ˜๋ฅด์†Œ๋‚˜"],
"pains": ["๊ฒฝ์Ÿ์‚ฌ ์ •๋ณด ๋ถ€์กฑ", "๊ณ ๊ฐ ์š”๊ตฌ ๋ถˆ๋ช…ํ™•", "์ถœ์ฒ˜/๊ธฐ๊ฐ„ ๋ˆ„๋ฝ", "๋ฆฌ์„œ์น˜ ์ž‘์„ฑ ๋ถ€๋‹ด"],
"outputs": ["์‹œ์žฅ์กฐ์‚ฌ ๋ณด๊ณ ์„œ", "๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„", "ํŽ˜๋ฅด์†Œ๋‚˜", "VOC ์š”์•ฝ"],
"users": ["์ „๋žตํŒ€", "๊ธฐํšํŒ€", "์ปจ์„คํ„ดํŠธ", "IR/ํˆฌ์ž์ค€๋น„ํŒ€"]
},
"3 ์ œํ’ˆยทUX ๋ฌธ์„œ": {
"subdomains": ["PRD/์š”๊ตฌ์‚ฌํ•ญ", "์œ ์Šค์ผ€์ด์Šค", "UX ๋งˆ์ดํฌ๋กœ์นดํ”ผ", "๋ฆด๋ฆฌ์Šค ๋…ธํŠธ"],
"pains": ["์š”๊ตฌ์‚ฌํ•ญ ์–ธ์–ดํ™” ๋‚œํ•ญ", "UX ์นดํ”ผ ๋ถˆ์ผ์น˜", "์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€ ๋ถˆ๋ช…ํ™•"],
"outputs": ["PRD", "์œ ์Šค์ผ€์ด์Šค", "UX ์นดํ”ผ", "๋ฆด๋ฆฌ์Šค ๋…ธํŠธ"],
"users": ["PM", "UX ๋””์ž์ด๋„ˆ", "๊ฐœ๋ฐœํŒ€", "QA"]
},
}
PAIN_SUB = {
"๋ฐ˜์‘๋ฅ  ์ €์กฐ": ["์ œ๋ชฉ/ํ”„๋ฆฌํ—ค๋”", "ํƒ€๊ฒŒํŒ…", "CTA ์•ฝํ•จ", "์‹ ๋ขฐ ๊ทผ๊ฑฐ ๋ถ€์กฑ"],
"๋ฉ”์‹œ์ง€ ๋ถˆ์ผ์น˜": ["ํ†ค/๋ณด์ด์Šค", "ํฌ๋งท/๊ธธ์ด", "์ฑ„๋„/ํŽ˜์ด์‹ฑ"],
"์ž‘์„ฑ ์‹œ๊ฐ„ ๊ณผ๋‹ค": ["ํ…œํ”Œ๋ฆฟ ๋ถ€์žฌ", "์˜ˆ์‹œ ๋ถ€์กฑ", "์Šน์ธ ๋ฃจํ”„ ์ง€์—ฐ"],
"A/B ํ…Œ์ŠคํŠธ ๋ถ€๋‹ด": ["์„ค๊ณ„ ๋ณต์žก์„ฑ", "๊ฒฐ๊ณผ ๋ถ„์„", "๋ฆฌ์†Œ์Šค ๋ถ€์กฑ"],
"๊ฒฝ์Ÿ์‚ฌ ์ •๋ณด ๋ถ€์กฑ": ["์ž๋ฃŒ ์ˆ˜์ง‘", "์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ", "์ตœ์‹ ์„ฑ"],
"๊ณ ๊ฐ ์š”๊ตฌ ๋ถˆ๋ช…ํ™•": ["์„ธ๊ทธ๋จผํŠธ ์ •์˜", "JTBD ๋ชจํ˜ธ", "ํŽ˜์ธ/๊ฒŒ์ธ"],
"์ถœ์ฒ˜/๊ธฐ๊ฐ„ ๋ˆ„๋ฝ": ["๋ฐ์ดํ„ฐ ๊ฒ€์ฆ", "์‹ ๋ขฐ์„ฑ ํ™•๋ณด", "์œ ํšจ๊ธฐ๊ฐ„"],
"๋ฆฌ์„œ์น˜ ์ž‘์„ฑ ๋ถ€๋‹ด": ["ํšจ์œจ์„ฑ", "ํ‘œ์ค€ํ™”", "์žฌํ™œ์šฉ"],
"์š”๊ตฌ์‚ฌํ•ญ ์–ธ์–ดํ™” ๋‚œํ•ญ": ["์ถ”์ƒ์„ฑ", "๊ธฐ์ˆ  ๊ฒฉ์ฐจ", "๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค"],
"UX ์นดํ”ผ ๋ถˆ์ผ์น˜": ["์šฉ์–ด ํ†ต์ผ", "ํ†ค์•ค๋งค๋„ˆ", "๋ธŒ๋žœ๋“œ ๋ณด์ด์Šค"],
"์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€ ๋ถˆ๋ช…ํ™•": ["ํ‰๊ฐ€ ์ง€ํ‘œ", "์šฐ์„ ์ˆœ์œ„", "ํ”„๋กœ์„ธ์Šค"],
}
OUTPUT_SUB = {
"์ฝœ๋“œ๋ฉ”์ผ": ["์‹ ๊ทœ ์ธ๋ฐ”์šด๋“œ", "์ฝœ๋“œ ์•„์›ƒ๋ฐ”์šด๋“œ", "ํ›„์†/๋ฆฌ๋งˆ์ธ๋“œ", "์ดํƒˆ ์žฌ์ฐธ์—ฌ"],
"๊ด‘๊ณ  ์นดํ”ผ": ["์›น ๋ฐฐ๋„ˆ", "๊ฒ€์ƒ‰๊ด‘๊ณ ", "SNS ์นด๋“œ", "์•ฑ ํ‘ธ์‹œ"],
"๋ณด๋„์ž๋ฃŒ": ["์ œํ’ˆ ์ถœ์‹œ", "ํˆฌ์ž ์œ ์น˜", "์ธ์‚ฌ ๋ฐœ๋ น", "์—…๊ณ„ ๋™ํ–ฅ"],
"๋žœ๋”ฉํŽ˜์ด์ง€ ์„น์…˜": ["Hero", "Feature", "Testimonial", "CTA"],
"์‹œ์žฅ์กฐ์‚ฌ ๋ณด๊ณ ์„œ": ["ํƒ‘๋‹ค์šด(ํƒ์ƒ‰)", "๋ฐ”ํ…€์—… ์ถ”์ •", "ํ˜ผํ•ฉ ์ ‘๊ทผ", "๋ฆฌ์„œ์น˜ ๋ธŒ๋ฆฌํ”„"],
"๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„": ["๊ธฐ๋Šฅ ๋น„๊ตํ‘œ", "๊ฐ€๊ฒฉ/ํŒจํ‚ค์ง€", "ํฌ์ง€์…”๋‹ ๋งต", "SWOT"],
"ํŽ˜๋ฅด์†Œ๋‚˜": ["B2B ๊ตฌ๋งค์ž", "B2C ์†Œ๋น„์ž", "๋‚ด๋ถ€ ์‚ฌ์šฉ์ž", "ํŒŒํŠธ๋„ˆ"],
"VOC ์š”์•ฝ": ["๋งŒ์กฑ๋„ ์กฐ์‚ฌ", "๋ถˆ๋งŒ ๋ถ„์„", "๊ฐœ์„  ์š”์ฒญ", "ํŠธ๋ Œ๋“œ ๋ถ„์„"],
"PRD": ["๋ฌธ์ œ์ •์˜", "๋ชฉํ‘œ/์ง€ํ‘œ", "๋ฒ”์œ„/๋น„๋ฒ”์œ„", "์ˆ˜์šฉ๊ธฐ์ค€(AC)", "๋ฆฌ์Šคํฌ"],
"์œ ์Šค์ผ€์ด์Šค": ["์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค", "๋Œ€์•ˆ ํ”Œ๋กœ์šฐ", "์˜ˆ์™ธ ์ƒํ™ฉ", "๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™"],
"UX ์นดํ”ผ": ["๋ฒ„ํŠผ/CTA", "์—๋Ÿฌ ๋ฉ”์‹œ์ง€", "์•ˆ๋‚ด๋ฌธ", "ํผ ๋ผ๋ฒจ"],
"๋ฆด๋ฆฌ์Šค ๋…ธํŠธ": ["์‹ ๊ธฐ๋Šฅ", "๊ฐœ์„ ์‚ฌํ•ญ", "๋ฒ„๊ทธ์ˆ˜์ •", "์•Œ๋ ค์ง„ ์ด์Šˆ"],
}
USER_SUB = {
"์„ธ์ผ์ฆˆ": ["BDR", "AE", "AM", "Sales Leader"],
"๋งˆ์ผ€ํŒ…ํŒ€": ["ํผํฌ๋จผ์Šค", "์ฝ˜ํ…์ธ ", "๋ธŒ๋žœ๋“œ", "๊ทธ๋กœ์Šค"],
"PRํŒ€": ["์ฝ”ํผ๋ ˆ์ดํŠธ", "ํ”„๋กœ๋•ํŠธ PR"],
"์ฐฝ์—…์ž": ["Seed", "Series A+", "๋ถ€ํŠธ์ŠคํŠธ๋žฉ"],
"์ „๋žตํŒ€": ["Corp Strategy", "Biz Ops"],
"๊ธฐํšํŒ€": ["์‚ฌ์—…๊ธฐํš", "์ •์ฑ…๊ธฐํš", "์šด์˜๊ธฐํš"],
"์ปจ์„คํ„ดํŠธ": ["์ „๋žต", "์šด์˜", "์กฐ์ง/HR", "IT/๋””์ง€ํ„ธ"],
"IR/ํˆฌ์ž์ค€๋น„ํŒ€": ["๊ธฐ๊ด€ํˆฌ์ž", "๊ฐœ์ธํˆฌ์ž", "๊ณต์‹œ/IR"],
"PM": ["Jr PM", "Sr PM", "Group PM"],
"UX ๋””์ž์ด๋„ˆ": ["UX Writer", "Product Designer"],
"๊ฐœ๋ฐœํŒ€": ["FE", "BE", "ML", "Infra"],
"QA": ["QA ์—”์ง€๋‹ˆ์–ด", "QA ๋ฆฌ๋“œ"]
}
TEMPLATE = """
# ์ตœ์ข… ๋ชฉํ‘œ (Mission Statement)
{mission}
# ์‚ฐ์ถœ๋ฌผ ์ •์˜ (Output Definition)
- **์‚ฐ์ถœ๋ฌผ ์ข…๋ฅ˜**: {out}
- **ํ•ต์‹ฌ ์„ฑ๊ณต ์ง€ํ‘œ(KPI)**: {kpi}
- **์„ฑ๊ณต ๊ธฐ์ค€**:
1) **ํ˜•์‹**: [{format_hint}] ๊ตฌ์กฐ๋ฅผ 100% ์ค€์ˆ˜ํ•ด์•ผ ํ•จ.
2) **๊ฐ€์น˜**: ์ตœ์ข… ๋…์ž์ธ [{audience}]์—๊ฒŒ ์ฒซ 3์ค„ ์•ˆ์— ํ•ต์‹ฌ ๊ฐ€์น˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•จ.
3) **ํ’ˆ์งˆ**: ์ŠคํŒธ์„ฑ, ๊ณผ์žฅ, ๋ชจํ˜ธํ•œ ํ‘œํ˜„์ด ์—†์–ด์•ผ ํ•จ.
# ๊ฐ€๋“œ๋ ˆ์ผ (Guardrails)
- **ํ†ค์•ค๋งค๋„ˆ**: {tone}
- **๊ธˆ์ง€ ํ‘œํ˜„**: {ng}
# ์ ์šฉ๋œ ํ”„๋กฌํ”„ํŒ… ์ „๋žต ๋ฐ ๊ทผ๊ฑฐ (Prompting Strategies & Rationale)
{tech_blocks}
{rag_section}
# ๊ตฌ์ฒด์ ์ธ ์ž‘์„ฑ ์ž‘์—… (Task)
1. ์œ„์— ์ œ์‹œ๋œ **๋ชจ๋“  ์ •์˜, ๊ฐ€๋“œ๋ ˆ์ผ, ์ „๋žต, ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ฐ˜์˜**ํ•˜์—ฌ [{out}]์˜ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•˜๋ผ.
2. [{format_hint}] ํ˜•์‹์— ๋งž์ถฐ ์„น์…˜๋ณ„๋กœ ๋‚ด์šฉ์„ ๊ตฌ์„ฑํ•˜๋ผ.
3. ํ•ต์‹ฌ์ ์ธ ๋ฉ”์‹œ์ง€, ์ œ๋ชฉ, CTA์— ๋Œ€ํ•ด์„œ๋Š” 2~3๊ฐœ์˜ ๋Œ€์•ˆ์„ ํ•จ๊ป˜ ์ œ์‹œํ•˜๋ผ.
4. ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ๋งˆ์ง€๋ง‰์—, ์•„๋ž˜ **์ž๊ฐ€ ๊ฒ€์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ**๋ฅผ ํฌํ•จํ•˜๊ณ  ์Šค์Šค๋กœ ์ ๊ฒ€ํ•˜๋ผ.
---
**[์ž๊ฐ€ ๊ฒ€์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ]**
- [ ] ๋ฏธ์…˜ ์Šคํ…Œ์ดํŠธ๋จผํŠธ์˜ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š”๊ฐ€?
- [ ] ์ตœ์ข… ๋…์ž({audience})์˜ ์–ธ์–ด์™€ ๊ด€์‹ฌ์‚ฌ์— ๋ถ€ํ•ฉํ•˜๋Š”๊ฐ€?
- [ ] ์ง€์ •๋œ ํ†ค์•ค๋งค๋„ˆ({tone})๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š”๊ฐ€?
- [ ] ๊ธˆ์ง€ ํ‘œํ˜„({ng})์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋Š”๊ฐ€?
- [ ] ์„ ํƒ๋œ ํ”„๋กฌํ”„ํŒ… ๊ธฐ์ˆ ๋“ค์˜ ์˜๋„๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ˜์˜๋˜์—ˆ๋Š”๊ฐ€?
"""
def compose_final_prompt(
mission, domain_key, pains, pain_subs, outs, out_subs, users, user_subs,
techs, my_rationale,
kpi_text, tone_text, ng_text, format_override, fewshot_text, rag_text
):
if not all([mission.strip(), domain_key, techs]):
return "โš ๏ธ [Phase 1]์˜ ๋ฏธ์…˜ ์„ ์–ธ๋ฌธ๊ณผ [Phase 2]์˜ ๊ธฐ์ˆ  ์„ ํƒ์„ ๋จผ์ € ์™„๋ฃŒํ•ด์ฃผ์„ธ์š”."
format_hint = format_override.strip() or ("์„น์…˜๋ณ„ ์ œ๋ชฉ/๋ณธ๋ฌธ" if not outs else "์ž๋™ ์ถ”์ • ํ•„์š”")
audience = ", ".join(user_subs or users or ["์ •์˜๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž"])
kpi = kpi_text.strip() or "์ •ํ™•์„ฑ, ๋ช…๋ฃŒ์„ฑ, ์„ค๋“๋ ฅ"
tone = tone_text.strip() or "์ „๋ฌธ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ด๋ฉฐ ๊ฐ„๊ฒฐํ•จ"
ng = ng_text.strip() or "๊ณผ์žฅ, ์ถ”์ธก, ๊ทผ๊ฑฐ ์—†๋Š” ์ฃผ์žฅ"
tech_blocks = []
if my_rationale.strip():
tech_blocks.append(f"## ๋‚ด ์ „๋žต๊ณผ ๊ทผ๊ฑฐ\n{my_rationale.strip()}\n")
for t in techs:
reasons = uniq(
reason_from_pain(t, pains, pain_subs) +
reason_from_output(t, outs, out_subs) +
reason_from_user(t, users, user_subs)
)
head = f"- **{t}**: {TECH_DETAILED.get(t,{}).get('desc','')}"
tail = ""
if reasons:
tail = "\n - **์„ ์ • ๊ทผ๊ฑฐ**: " + " / ".join(reasons[:3])
tech_blocks.append(head + tail)
if fewshot_text.strip():
tech_blocks.append(f"- **Few-shot ์˜ˆ์‹œ (๋ชจ๋ฐฉํ•  ํŒจํ„ด)**:\n```\n{fewshot_text.strip()}\n```")
rag_section = ""
if rag_text.strip():
rag_section = f"# ์ฐธ๊ณ  ์ž๋ฃŒ ๋ฐ ์ปจํ…์ŠคํŠธ\n{rag_text.strip()}\n"
return TEMPLATE.format(
mission=mission,
out=", ".join(outs or ["์ •์˜๋˜์ง€ ์•Š์Œ"]),
kpi=kpi,
format_hint=format_hint,
audience=audience,
tone=tone,
ng=ng,
tech_blocks="\n".join(tech_blocks),
rag_section=rag_section
).strip()
# =========================================================
# 6. Gradio UI
# =========================================================
css = """
.gradio-container {
font-family: 'IBM Plex Sans KR', sans-serif;
max-width: 1400px;
}
.gr-button {
color: white;
border: none;
border-radius: 8px;
}
.gr-button-primary {
background: linear-gradient(to right, #4A90E2, #50E3C2);
}
.phase-header {
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 15px;
border-radius: 10px;
margin: 10px 0;
text-align: center;
font-weight: bold;
}
.detail-panel {
background-color: #f8f9fa;
border-radius: 8px;
padding: 15px;
margin-top: 10px;
}
"""
with gr.Blocks(theme=gr.themes.Soft(), css=css, title="DSCR Prompt Coach - Complete Learning Edition") as demo:
gr.Markdown("""
# ๐Ÿง  DSCR ํ”„๋กฌํ”„ํŠธ ์ฝ”์นญ ์‹œ์Šคํ…œ (Complete Learning Edition)
## ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์˜ 4๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ฒด๊ณ„์ ์ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”
**Define โ†’ Select โ†’ Compose โ†’ Refine**
๐Ÿ’ก **๋ชจ๋“  Pain Points, Outputs, Users์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.**
""")
# ์ƒํƒœ ๋ณ€์ˆ˜๋“ค
domain_key = gr.State()
pains = gr.State([])
pain_subs = gr.State([])
outs = gr.State([])
out_subs = gr.State([])
users = gr.State([])
user_subs = gr.State([])
techs = gr.State([])
with gr.Tabs() as tabs:
# Phase 1: ๋ฌธ์ œ ์ •์˜ (Define)
with gr.TabItem("๐Ÿš€ Phase 1: ๋ฌธ์ œ ์ •์˜ (Define)", id=0):
gr.HTML("<div class='phase-header'>์„ฑ๊ณต์ ์ธ ํ”„๋กฌํ”„ํŠธ์˜ ์‹œ์ž‘์€ 'ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ'๋ฅผ ๋ช…ํ™•ํžˆ ์•„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค</div>")
with gr.Row():
with gr.Column(scale=2):
with gr.Row():
with gr.Column():
gr.Markdown("### 1. Domain (์–ด๋–ค ์˜์—ญ์˜ ๋ฌธ์ œ์ธ๊ฐ€?)")
domain_dd = gr.Dropdown(
label="๋„๋ฉ”์ธ ์„ ํƒ",
choices=list(CATALOG.keys()),
info="ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ์†ํ•œ ์ฃผ์š” ์˜์—ญ์„ ์„ ํƒํ•˜์„ธ์š”"
)
domain_note = gr.Textbox(
label="๋„๋ฉ”์ธ ํŠน์„ฑ ๋ฉ”๋ชจ",
placeholder="์˜ˆ: ๋ถ๋ฏธ SaaS B2B ์‹œ์žฅ ์ง„์ถœ ์ดˆ๊ธฐ ๋‹จ๊ณ„",
info="๋„๋ฉ”์ธ์˜ ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์ด๋‚˜ ๋งฅ๋ฝ์„ ๊ธฐ๋กํ•˜์„ธ์š”"
)
with gr.Column():
gr.Markdown("### 2. Pain (๋ˆ„๊ตฌ์˜ ์–ด๋–ค ๊ณ ํ†ต์„ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€?)")
pains_dd = gr.Dropdown(
label="Pain Points(๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ฃผ์š” ๋ฌธ์ œ์ ๋“ค์„ ์„ ํƒํ•˜์„ธ์š”"
)
pains_sub_dd = gr.Dropdown(
label="Pain ์„ธ๋ถ€์‚ฌํ•ญ(๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="์„ ํƒํ•œ ๋ฌธ์ œ์˜ ๊ตฌ์ฒด์ ์ธ ์–‘์ƒ๋“ค"
)
with gr.Row():
with gr.Column():
gr.Markdown("### 3. Output (์–ด๋–ค ๊ฒฐ๊ณผ๋ฌผ์ด ํ•„์š”ํ•œ๊ฐ€?)")
outs_dd = gr.Dropdown(
label="์‚ฐ์ถœ๋ฌผ ์œ ํ˜•(๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒฐ๊ณผ๋ฌผ๋“ค"
)
outs_sub_dd = gr.Dropdown(
label="์‚ฐ์ถœ๋ฌผ ์„ธ๋ถ€(๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="๊ฒฐ๊ณผ๋ฌผ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜•ํƒœ๋‚˜ ๋ณ€ํ˜•"
)
with gr.Column():
gr.Markdown("### 4. User (๋ˆ„๊ฐ€ ์ด ๊ฒฐ๊ณผ๋ฌผ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?)")
users_dd = gr.Dropdown(
label="์ตœ์ข… ์‚ฌ์šฉ์ž(๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="๊ฒฐ๊ณผ๋ฌผ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์‚ฌ๋žŒ๋“ค"
)
users_sub_dd = gr.Dropdown(
label="์‚ฌ์šฉ์ž ์„ธ๋ถ€ ์—ญํ• (๋ณต์ˆ˜ ์„ ํƒ)",
multiselect=True,
interactive=False,
info="์‚ฌ์šฉ์ž๋“ค์˜ ๊ตฌ์ฒด์ ์ธ ์ง๊ธ‰์ด๋‚˜ ์—ญํ• "
)
with gr.Column(scale=1):
gr.Markdown("### ๐Ÿ“š ์™„์ „ํ•œ ํ•™์Šต ํŒจ๋„")
with gr.Accordion("๐Ÿ’ก Pain Points ์ƒ์„ธ ์„ค๋ช…", open=False):
pain_details = gr.HTML("Pain Point๋ฅผ ์„ ํƒํ•˜๋ฉด ์™„์ „ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
with gr.Accordion("๐Ÿ“„ Output ์ƒ์„ธ ์„ค๋ช…", open=False):
output_details = gr.HTML("Output์„ ์„ ํƒํ•˜๋ฉด ์™„์ „ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
with gr.Accordion("๐Ÿ‘ค User ์ƒ์„ธ ์„ค๋ช…", open=False):
user_details = gr.HTML("User๋ฅผ ์„ ํƒํ•˜๋ฉด ์™„์ „ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
gr.Markdown("---")
gr.Markdown("### ๐ŸŽฏ ๋‚˜์˜ ๋ฏธ์…˜ ์„ ์–ธ๋ฌธ (Mission Statement)")
mission_statement_txt = gr.Textbox(
label="๋ฏธ์…˜ ์„ ์–ธ๋ฌธ",
placeholder="์œ„ ํ•ญ๋ชฉ๋“ค์„ ์„ ํƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ดˆ์•ˆ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜์„ธ์š”.",
lines=3,
info="์ด ํ”„๋กฌํ”„ํŠธ๋กœ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ตœ์ข… ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ์„œ์ˆ ํ•˜์„ธ์š”"
)
def update_mission_statement(d, p, o, u):
if not all([d, p, o, u]): return ""
d_str = f"[{d.split(' ')[1] if ' ' in d else d}]"
p_str = f"[{', '.join(p) if p else '์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ'}]"
o_str = f"[{', '.join(o) if o else '์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฌผ'}]"
u_str = f"[{', '.join(u) if u else '์ •์˜๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž'}]"
return f"๋‚˜๋Š” {u_str}๋ฅผ ์œ„ํ•ด, {p_str} ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž, {d_str} ๋งฅ๋ฝ์—์„œ {o_str}์„(๋ฅผ) ์ž‘์„ฑํ•œ๋‹ค."
def on_domain_change(dkey):
if not dkey: return [dkey, gr.update(), gr.update(), gr.update(), gr.update(), gr.update(), gr.update()]
cfg = CATALOG.get(dkey, {})
return [
dkey,
gr.update(choices=cfg.get("pains", []), value=[], interactive=True),
gr.update(choices=[], value=[], interactive=False),
gr.update(choices=cfg.get("outputs", []), value=[], interactive=True),
gr.update(choices=[], value=[], interactive=False),
gr.update(choices=cfg.get("users", []), value=[], interactive=True),
gr.update(choices=[], value=[], interactive=False)
]
def on_list_change(selected_list, sub_map):
if not selected_list: return gr.update(choices=[], value=[], interactive=False)
choices = uniq([item for s in selected_list for item in sub_map.get(s, [])])
return gr.update(choices=choices, value=[], interactive=True)
domain_dd.change(
on_domain_change,
inputs=[domain_dd],
outputs=[domain_key, pains_dd, pains_sub_dd, outs_dd, outs_sub_dd, users_dd, users_sub_dd]
)
pains_dd.change(lambda x: on_list_change(x, PAIN_SUB), inputs=[pains_dd], outputs=[pains_sub_dd])
outs_dd.change(lambda x: on_list_change(x, OUTPUT_SUB), inputs=[outs_dd], outputs=[outs_sub_dd])
users_dd.change(lambda x: on_list_change(x, USER_SUB), inputs=[users_dd], outputs=[users_sub_dd])
pains_dd.change(show_pain_details, inputs=[pains_dd], outputs=[pain_details])
outs_dd.change(show_output_details, inputs=[outs_dd], outputs=[output_details])
users_dd.change(show_user_details, inputs=[users_dd], outputs=[user_details])
for comp in [domain_dd, pains_dd, outs_dd, users_dd]:
comp.change(
update_mission_statement,
inputs=[domain_dd, pains_dd, outs_dd, users_dd],
outputs=[mission_statement_txt]
)
pains_dd.change(lambda x: x, pains_dd, pains)
pains_sub_dd.change(lambda x: x, pains_sub_dd, pain_subs)
outs_dd.change(lambda x: x, outs_dd, outs)
outs_sub_dd.change(lambda x: x, outs_sub_dd, out_subs)
users_dd.change(lambda x: x, users_dd, users)
users_sub_dd.change(lambda x: x, users_sub_dd, user_subs)
# Phase 2: ๊ธฐ์ˆ  ์„ ์ • (Select)
with gr.TabItem("๐Ÿ’ก Phase 2: ๊ธฐ์ˆ  ์„ ์ • (Select)", id=1):
gr.HTML("<div class='phase-header'>๋ฌธ์ œ ํ•ด๊ฒฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ”„๋กฌํ”„ํŒ… ๊ธฐ์ˆ  ์กฐํ•ฉ์„ ๋…ผ๋ฆฌ์  ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค</div>")
with gr.Row():
with gr.Column(scale=2):
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### 1. ์ž๋™ ์ถ”์ฒœ ๋ฐ›๊ธฐ")
gr.Markdown("Phase 1์—์„œ ์ •์˜ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ํšจ๊ณผ์ ์ธ ๊ธฐ์ˆ  ์กฐํ•ฉ์„ ์ถ”์ฒœ๋ฐ›์œผ์„ธ์š”.")
auto_recommend_btn = gr.Button("๐Ÿ”ฎ Mixed Prompts ์ž๋™ ์ถ”์ฒœ", variant="primary")
techs_dd = gr.Dropdown(
label="ํ”„๋กฌํ”„ํŒ… ๊ธฐ์ˆ (๋ณต์ˆ˜ ์„ ํƒ/์ˆ˜์ • ๊ฐ€๋Šฅ)",
choices=ALL_TECHS,
multiselect=True,
interactive=True,
info="์ž๋™ ์ถ”์ฒœ๋œ ๊ธฐ์ˆ ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํ•„์š”์‹œ ์ˆ˜์ •ํ•˜์„ธ์š”"
)
with gr.Column(scale=1):
gr.Markdown("### 2. ์ž๋™ ์ถ”์ฒœ ๊ทผ๊ฑฐ ๊ฒ€ํ† ")
auto_rationale_md = gr.Markdown("์ž๋™ ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, ๊ฐ ๊ธฐ์ˆ ์ด ์™œ ์ถ”์ฒœ๋˜์—ˆ๋Š”์ง€ ํ•ต์‹ฌ์ ์ธ ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
with gr.Column(scale=1):
gr.Markdown("### ๐Ÿ› ๏ธ ์™„์ „ํ•œ ๊ธฐ์ˆ  ํ•™์Šต ํŒจ๋„")
with gr.Accordion("๐Ÿ“– ์„ ํƒ๋œ ๊ธฐ์ˆ  ์ƒ์„ธ ์„ค๋ช…", open=True):
tech_details = gr.HTML("ํ”„๋กฌํ”„ํŒ… ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋ฉด ์™„์ „ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
gr.Markdown("---")
gr.Markdown("### ๐Ÿค” ๋‚˜์˜ ์ตœ์ข… ์„ ํƒ๊ณผ ๊ทผ๊ฑฐ (My Rationale)")
gr.Markdown("**์ž๋™ ์ถ”์ฒœ๊ณผ ์„ค๋ช…์„ ๋น„ํŒ์ ์œผ๋กœ ๊ฒ€ํ† ํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ธฐ์ˆ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์ง์ ‘ ์ •๋ฆฌํ•ด๋ณด์„ธ์š”.** ์ด๊ฒƒ์ด ๋‹น์‹ ์˜ '์ „๋žต'์ด ๋ฉ๋‹ˆ๋‹ค.")
my_rationale_txt = gr.Textbox(
label="๋‚˜์˜ ์ „๋žต์  ํŒ๋‹จ ๊ธฐ๋ก",
lines=5,
placeholder="์˜ˆ์‹œ) RAG๋Š” ์ตœ์‹ ์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•ด, CoT๋Š” CEO๊ฐ€ ์ค‘์‹œํ•˜๋Š” ๋…ผ๋ฆฌ ๊ตฌ์กฐ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์ตœ์ข… ์„ ํƒํ•จ. Persona Prompting์€ ๋ฒ”์šฉ ๋ณด๊ณ ์„œ์ด๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ œ์™ธํ•จ.",
info="์„ ํƒํ•œ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•œ ๋‹น์‹ ๋งŒ์˜ ์ „๋žต์  ํŒ๋‹จ์„ ๊ธฐ๋กํ•˜์„ธ์š”"
)
auto_recommend_btn.click(
auto_recommend,
inputs=[domain_key, pains, outs, users],
outputs=[techs_dd, auto_rationale_md]
)
techs_dd.change(show_tech_details, inputs=[techs_dd], outputs=[tech_details])
techs_dd.change(lambda x: x, techs_dd, techs)
# Phase 3: ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ (Compose)
with gr.TabItem("โœ๏ธ Phase 3: ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ (Compose)", id=2):
gr.HTML("<div class='phase-header'>์„ ํƒํ•œ ์ „๋žต์„ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋กฌํ”„ํŠธ์˜ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ๊ณผ ๊ฐ€๋“œ๋ ˆ์ผ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค</div>")
with gr.Row():
with gr.Column():
gr.Markdown("### 1. ์ƒ์„ธ ๊ฐ€๋“œ๋ ˆ์ผ ์„ค์ •")
kpi_text = gr.Textbox(label="ํ•ต์‹ฌ ์„ฑ๊ณต ์ง€ํ‘œ(KPI)", placeholder="์˜ˆ: ์ธ์‚ฌ์ดํŠธ ์ •ํ™•์„ฑ, ๊ฒฝ์˜์ง„ ์˜์‚ฌ๊ฒฐ์ • ์ง€์›")
tone_text = gr.Textbox(label="ํ†ค์•ค๋งค๋„ˆ", placeholder="์˜ˆ: ๊ฐ๊ด€ยท๊ฐ„๊ฒฐยท๋ฐ์ดํ„ฐ ์ค‘์‹ฌ")
ng_text = gr.Textbox(label="๊ธˆ์ง€์–ด/NG ํ‘œํ˜„", placeholder="์˜ˆ: ๊ณผ์žฅ, ์ถœ์ฒ˜ ๋ฏธํ‘œ๊ธฐ, ์ถ”์ • ์ˆ˜์น˜ ๋‹จ์ •ํ™”")
format_override = gr.Textbox(label="์‚ฐ์ถœ๋ฌผ ํ˜•์‹(Format)", placeholder="์˜ˆ: ์š”์•ฝ/ํ˜„ํ™ฉ/๊ฒฝ์Ÿ/์ธ์‚ฌ์ดํŠธ/๊ถŒ๊ณ /ํ•œ๊ณ„")
with gr.Column():
gr.Markdown("### 2. ํ’ˆ์งˆ ๋ ˆํผ๋Ÿฐ์Šค ์ฃผ์ž…")
fewshot_text = gr.Textbox(label="Few-shot ์˜ˆ์‹œ (๋ชจ๋ฐฉํ•  ํŒจํ„ด)", lines=4, placeholder="AI๊ฐ€ ๋ชจ๋ฐฉํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๊ธ€์˜ ์ข‹์€ ์˜ˆ์‹œ๋ฅผ 2~3๊ฐœ ์ž์œ ๋กญ๊ฒŒ ์ž…๋ ฅํ•˜์„ธ์š”.")
rag_text = gr.Textbox(label="์ฐธ๊ณ ์ž๋ฃŒ (์ปจํ…์ŠคํŠธ ์ฃผ์ž…์šฉ)", lines=4, placeholder="์ฐธ๊ณ ํ•  ๋ฐ์ดํ„ฐ, ๋ณด๊ณ ์„œ ๋‚ด์šฉ, ๋˜๋Š” ๋ฐฐ๊ฒฝ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.")
gr.Markdown("---")
gen_btn = gr.Button("๐Ÿš€ ์ตœ์ข… ์œตํ•ฉ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ!", variant="primary", size="lg")
final_prompt_txt = gr.Textbox(
label="์™„์„ฑ๋œ ์œตํ•ฉ ํ”„๋กฌํ”„ํŠธ",
lines=25,
show_copy_button=True,
interactive=False,
info="์ƒ์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ChatGPT, Claude ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜์„ธ์š”"
)
gr.Markdown("### 4. ์ž๊ฐ€ ๊ฒ€์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ")
gr.Markdown("ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „, ๋‚˜์˜ ์˜๋„๊ฐ€ ๋ชจ๋‘ ์ž˜ ๋ฐ˜์˜๋˜์—ˆ๋Š”์ง€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ๊ฒ€ํ•˜์„ธ์š”.")
self_inspection_chk = gr.CheckboxGroup(
label="Self-Inspection Checklist",
choices=[
"Phase 1์˜ '๋ฏธ์…˜ ์„ ์–ธ๋ฌธ'์ด ํ”„๋กฌํ”„ํŠธ ๋ชฉ์ ์— ์ž˜ ๋ฐ˜์˜๋˜์—ˆ๋Š”๊ฐ€?",
"Phase 2์—์„œ ์„ ํƒํ•œ ๊ธฐ์ˆ ๋“ค์˜ ํ•ต์‹ฌ ์˜๋„๊ฐ€ ํ”„๋กฌํ”„ํŠธ์— ๋…น์•„์žˆ๋Š”๊ฐ€?",
"๋…์ž(User)๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ „๋ฌธ ์šฉ์–ด๋‚˜ ๋ชจํ˜ธํ•œ ์ง€์‹œ๋Š” ์—†๋Š”๊ฐ€?",
"์ œ๊ณตํ•œ Few-shot ์˜ˆ์‹œ๋‚˜ ์ฐธ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜๊ณ  ์ ์ ˆํ•œ๊ฐ€?"
]
)
gen_btn.click(
compose_final_prompt,
inputs=[
mission_statement_txt, domain_key, pains, pain_subs, outs, out_subs, users, user_subs,
techs, my_rationale_txt,
kpi_text, tone_text, ng_text, format_override, fewshot_text, rag_text
],
outputs=[final_prompt_txt]
)
# Phase 4: ์‹คํ–‰ ๋ฐ ๊ฐœ์„  (Refine)
with gr.TabItem("๐Ÿ”„ Phase 4: ์‹คํ–‰ ๋ฐ ๊ฐœ์„  (Refine)", id=3):
gr.HTML("<div class='phase-header'>ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์€ '๋ฐ˜๋ณต'์„ ํ†ตํ•ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค</div>")
gr.Markdown("์ƒ์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹ค์ œ LLM์— ์‹คํ–‰ํ•ด๋ณด๊ณ , ๊ฒฐ๊ณผ๋ฌผ์„ ๋น„ํŒ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๊ฐœ์„ ์ ์„ ์ฐพ์•„๋ณด์„ธ์š”.")
with gr.Row():
with gr.Column():
gr.Markdown("### 1. LLM ๊ฒฐ๊ณผ๋ฌผ ๋ถ„์„")
llm_output_txt = gr.Textbox(label="LLM ๊ฒฐ๊ณผ๋ฌผ ์›๋ฌธ", lines=15, placeholder="LLM(ChatGPT, Claude ๋“ฑ)์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”.")
with gr.Column():
gr.Markdown("### 2. ๊ฒฐ๊ณผ๋ฌผ ํ‰๊ฐ€ ๋ฐ ๊ฐœ์„ ")
eval_radio = gr.Radio(label="๊ฒฐ๊ณผ๋ฌผ ๋งŒ์กฑ๋„ ํ‰๊ฐ€", choices=["๋งค์šฐ ๋งŒ์กฑ", "๋งŒ์กฑ", "๊ฐœ์„  ํ•„์š”", "๋งค์šฐ ๋ถˆ๋งŒ์กฑ"], value="๊ฐœ์„  ํ•„์š”")
analysis_txt = gr.Textbox(label="์›์ธ ๋ถ„์„ ๋ฐ ๊ฐœ์„  ๋ฐฉํ–ฅ", lines=8, placeholder="""๊ฒฐ๊ณผ๋ฌผ์ด ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š๋‹ค๋ฉด, ๊ทธ ๊ทผ๋ณธ ์›์ธ์€ ์–ด๋””์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‚˜์š”?\n\n- ๋ฌธ์ œ ์ •์˜ ์˜ค๋ฅ˜? (Phase 1)\n- ๊ธฐ์ˆ  ์„ ํƒ ๋ฏธ์Šค? (Phase 2)\n- Few-shot ์˜ˆ์‹œ ๋ถ€์กฑ? (Phase 3)\n- ์ง€์‹œ๊ฐ€ ๋ชจํ˜ธํ–ˆ๋‚˜?""", visible=True)
gr.Markdown("### 3. AI ๊ฐœ์„  ์ œ์•ˆ")
improve_btn = gr.Button("๐Ÿ” ๊ฐœ์„ ์  ๋ถ„์„ ๋ฐ ์ œ์•ˆ ๋ฐ›๊ธฐ", variant="secondary")
improvement_suggestions = gr.Textbox(label="AI ๊ฐœ์„  ์ œ์•ˆ", lines=8, interactive=False)
def analyze_and_improve(llm_output, satisfaction, user_analysis):
if not llm_output.strip():
return "๋ถ„์„ํ•  LLM ๊ฒฐ๊ณผ๋ฌผ์„ ๋จผ์ € ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
suggestions = f"""## ๐Ÿ” ๊ฒฐ๊ณผ๋ฌผ ๋ถ„์„ ๋ฆฌํฌํŠธ
**๋งŒ์กฑ๋„**: {satisfaction}
**์‚ฌ์šฉ์ž ๋ถ„์„**: {user_analysis or '๋ถ„์„ ๋‚ด์šฉ ์—†์Œ'}
### ๊ฐœ์„  ์ œ์•ˆ์‚ฌํ•ญ:
1. **ํ”„๋กฌํ”„ํŠธ ๊ตฌ์กฐ ๊ฐœ์„ **: ๋” ๋ช…ํ™•ํ•œ ๋‹จ๊ณ„๋ณ„ ์ง€์‹œ์‚ฌํ•ญ ์ถ”๊ฐ€, ์„ฑ๊ณต ๊ธฐ์ค€์˜ ๊ตฌ์ฒดํ™” ํ•„์š”
2. **์ปจํ…์ŠคํŠธ ๋ณด๊ฐ•**: Few-shot ์˜ˆ์‹œ์˜ ํ’ˆ์งˆ ํ–ฅ์ƒ, ๋„๋ฉ”์ธ ํŠนํ™” ์ •๋ณด ๋ณด์™„
3. **์ œ์•ฝ์‚ฌํ•ญ ๋ช…ํ™•ํ™”**: ๊ธˆ์ง€์–ด/NG ํ‘œํ˜„ ๊ตฌ์ฒดํ™”, ํ˜•์‹ ์š”๊ตฌ์‚ฌํ•ญ ์„ธ๋ถ„ํ™”
### ๋‹ค์Œ ๋ฐ˜๋ณต ์•ก์…˜ ์•„์ดํ…œ:
- [ ] Phase 1์—์„œ ๋ฏธ์…˜ ์Šคํ…Œ์ดํŠธ๋จผํŠธ ์žฌ๊ฒ€ํ† 
- [ ] Phase 2์—์„œ ๊ธฐ์ˆ  ์กฐํ•ฉ ์žฌ์„ ํƒ
- [ ] Phase 3์—์„œ Few-shot ์˜ˆ์‹œ ๊ฐœ์„ 
- [ ] ์ƒˆ๋กœ์šด ํ”„๋กฌํ”„ํŠธ๋กœ ์žฌ์‹คํ–‰ ๋ฐ ๋น„๊ต
### ๊ถŒ์žฅ์‚ฌํ•ญ:
ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์œ„ ์ œ์•ˆ์‚ฌํ•ญ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด์ „ Phase๋“ค๋กœ ๋Œ์•„๊ฐ€ ์ˆ˜์ •ํ•œ ํ›„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”."""
return suggestions
improve_btn.click(
analyze_and_improve,
inputs=[llm_output_txt, eval_radio, analysis_txt],
outputs=[improvement_suggestions]
)
def toggle_analysis_visibility(evaluation):
return gr.update(visible=(evaluation in ["๊ฐœ์„  ํ•„์š”", "๋งค์šฐ ๋ถˆ๋งŒ์กฑ"]))
eval_radio.change(toggle_analysis_visibility, inputs=[eval_radio], outputs=[analysis_txt])
gr.Markdown("---")
gr.Markdown("### ๐Ÿ’ก ์™„์ „ํ•œ ํ•™์Šต ๊ฐ€์ด๋“œ\n...") # (ํ•˜๋‹จ ํ‘ธํ„ฐ ๋‚ด์šฉ ์ƒ๋žต)
if __name__ == "__main__":
demo.launch()