Spaces:
Sleeping
Sleeping
| # ========================================================= | |
| # 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() |