|
""" |
|
Ultimate Brand Theory Generator |
|
=============================== |
|
2025-05-28 | 15๊ฐ ์ด๋ก ์ ํตํฉํ ์ข
ํฉ ๋ธ๋๋ ์์ฑ๊ธฐ |
|
----------------------------------------------------- |
|
|
|
ํตํฉ๋ ์ด๋ก ๋ค: |
|
1. Square Theory - ์๋ฏธ์ ์ฌ๊ฐํ ๊ตฌ์กฐ |
|
2. Conceptual Blending - ๊ฐ๋
ํผํฉ |
|
3. Sound Symbolism - ์ํฅ ์์ง์ฃผ์ |
|
4. Linguistic Relativity - ์ธ์ด ์๋์ฑ |
|
5. Archetype Theory - ์ํ ์ด๋ก |
|
6. Jobs-to-be-Done - ํ ์ผ ์ด๋ก |
|
7. SCAMPER Method - ์ฐฝ์์ ๋ณํ |
|
8. Design Thinking - ๋์์ธ ์ฌ๊ณ |
|
9. Biomimicry - ์์ฒด๋ชจ๋ฐฉ |
|
10. Cognitive Load - ์ธ์ง ๋ถํ |
|
11. Von Restorff Effect - ๊ณ ๋ฆฝ ํจ๊ณผ |
|
12. Network Effects - ๋คํธ์ํฌ ํจ๊ณผ |
|
13. Memetics - ๋ฐ ์ด๋ก |
|
14. Color Psychology - ์์ ์ฌ๋ฆฌํ |
|
15. Gestalt Principles - ๊ฒ์ํํธ ์์น |
|
""" |
|
|
|
import os |
|
import json |
|
import gradio as gr |
|
import openai |
|
from openai import OpenAI |
|
from datetime import datetime |
|
from typing import List, Dict, Tuple, Optional |
|
import random |
|
|
|
|
|
if not os.getenv("OPENAI_API_KEY"): |
|
raise EnvironmentError("OPENAI_API_KEY ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ธ์.") |
|
|
|
client = OpenAI() |
|
|
|
|
|
SQUARE_THEORY_PROMPT = """ |
|
๋น์ ์ Square Theory ์ ๋ฌธ๊ฐ์
๋๋ค. Square Theory๋ 4๊ฐ์ ๋จ์ด๊ฐ ์๋ฏธ์ ๊ด๊ณ๋ก ์ฐ๊ฒฐ๋์ด ์ฌ๊ฐํ์ ์ด๋ฃจ๋ ๊ตฌ์กฐ์
๋๋ค. |
|
๋ธ๋๋๋ช
์ด Square๋ฅผ ์์ฑํ๋ฉฐ "์ํ!" ๋ชจ๋จผํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. |
|
|
|
์ฌ์ฉ์ ์
๋ ฅ(์
์ข
/ํค์๋)์ ๋ฐ์ ๋ค์ JSON ํ์์ ๋ฐฐ์ด์ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"tl": "์ผ์ชฝ์๋จ", "tr": "์ค๋ฅธ์ชฝ์๋จ", "bl": "์ผ์ชฝํ๋จ", "br": "์ค๋ฅธ์ชฝํ๋จ", |
|
"top_edge": "์๋จ ๊ด๊ณ", "bottom_edge": "ํ๋จ ๊ด๊ณ", |
|
"left_edge": "์ผ์ชฝ ๊ด๊ณ", "right_edge": "์ค๋ฅธ์ชฝ ๊ด๊ณ", |
|
"slogan": "์ฌ๋ก๊ฑด", |
|
"explanation": "์ ํจ๊ณผ์ ์ธ์ง" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
CONCEPTUAL_BLENDING_PROMPT = """ |
|
๋น์ ์ Conceptual Blending Theory ์ ๋ฌธ๊ฐ์
๋๋ค. ๋ ๊ฐ ์ด์์ ๊ฐ๋
์ ํผํฉํ์ฌ ์๋ก์ด ์๋ฏธ๋ฅผ ์ฐฝ์ถํฉ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"input_space1": "์ฒซ ๋ฒ์งธ ๊ฐ๋
", |
|
"input_space2": "๋ ๋ฒ์งธ ๊ฐ๋
", |
|
"generic_space": "๊ณตํต ๊ตฌ์กฐ", |
|
"blended_space": "ํผํฉ๋ ์๋ก์ด ์๋ฏธ", |
|
"emergent_properties": "์ฐฝ๋ฐ์ ์์ฑ๋ค", |
|
"slogan": "์ฌ๋ก๊ฑด", |
|
"explanation": "ํผํฉ์ด ํจ๊ณผ์ ์ธ ์ด์ " |
|
} |
|
|
|
์์: Netflix = Net(์ธํฐ๋ท) + Flix(์ํ) โ ์จ๋ผ์ธ ์คํธ๋ฆฌ๋ฐ์ ์๋ก์ด ๊ฐ๋
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
SOUND_SYMBOLISM_PROMPT = """ |
|
๋น์ ์ Sound Symbolism ์ ๋ฌธ๊ฐ์
๋๋ค. ์์์ ์๋ฏธ ๊ฐ์ ์ฐ๊ด์ฑ์ ํ์ฉํฉ๋๋ค. |
|
|
|
์ํฅ ์์น: |
|
- ์ ์ค๋ชจ์(i,e): ์๊ณ , ๋น ๋ฅด๊ณ , ๊ฐ๋ฒผ์ |
|
- ํ์ค๋ชจ์(o,u): ํฌ๊ณ , ๋๋ฆฌ๊ณ , ๋ฌด๊ฑฐ์ |
|
- ์ ์(l,r,m,n): ๋ถ๋๋ฝ๊ณ ์ ์ฐํจ |
|
- ํ์ด์(p,t,k,b,d,g): ๊ฐํ๊ณ ์ญ๋์ |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"phonetic_analysis": "์์ฑ ๋ถ์", |
|
"sound_meaning": "์ํฅ์ด ์ ๋ฌํ๋ ์๋ฏธ", |
|
"target_emotion": "๋ชฉํ ๊ฐ์ ", |
|
"industry_fit": "์
์ข
์ ํฉ์ฑ", |
|
"pronunciation_guide": "๋ฐ์ ๊ฐ์ด๋", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
LINGUISTIC_RELATIVITY_PROMPT = """ |
|
๋น์ ์ Linguistic Relativity ์ ๋ฌธ๊ฐ์
๋๋ค. ์ธ์ด๋ณ ์ฌ๊ณ ๋ฐฉ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํฉ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ค์ธ์ด ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๊ธ๋ก๋ฒ ๋ธ๋๋๋ช
", |
|
"korean_adaptation": "ํ๊ตญ์ด ์ ์", |
|
"english_meaning": "์์ด ์๋ฏธ", |
|
"cultural_considerations": "๋ฌธํ์ ๊ณ ๋ ค์ฌํญ", |
|
"avoid_meanings": "ํผํด์ผ ํ ์๋ฏธ๋ค", |
|
"localization_strategy": "ํ์งํ ์ ๋ต", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
ARCHETYPE_THEORY_PROMPT = """ |
|
๋น์ ์ Jung์ Archetype Theory ์ ๋ฌธ๊ฐ์
๋๋ค. 12๊ฐ์ง ์ํ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
12 ์ํ: Innocent, Hero, Outlaw, Explorer, Creator, Ruler, Magician, Lover, Caregiver, Jester, Sage, Regular Guy |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"archetype": "์ ํ๋ ์ํ", |
|
"archetype_traits": "์ํ์ ํน์ง๋ค", |
|
"brand_personality": "๋ธ๋๋ ์ฑ๊ฒฉ", |
|
"visual_direction": "์๊ฐ์ ๋ฐฉํฅ", |
|
"voice_tone": "๋ชฉ์๋ฆฌ ํค", |
|
"slogan": "์ฌ๋ก๊ฑด", |
|
"mythology_reference": "์ ํ์ ์ฐธ์กฐ" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
JOBS_TO_BE_DONE_PROMPT = """ |
|
๋น์ ์ Jobs-to-be-Done Theory ์ ๋ฌธ๊ฐ์
๋๋ค. ๊ณ ๊ฐ์ด ํด๊ฒฐํ๋ ค๋ '์ผ'์ ์ด์ ์ ๋ง์ถฅ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"functional_job": "๊ธฐ๋ฅ์ ์ผ", |
|
"emotional_job": "๊ฐ์ ์ ์ผ", |
|
"social_job": "์ฌํ์ ์ผ", |
|
"job_statement": "ํต์ฌ Job ๋ฌธ์ฅ", |
|
"outcome_metrics": "์ฑ๊ณผ ์งํ", |
|
"slogan": "์ฌ๋ก๊ฑด", |
|
"value_proposition": "๊ฐ์น ์ ์" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
SCAMPER_PROMPT = """ |
|
๋น์ ์ SCAMPER Method ์ ๋ฌธ๊ฐ์
๋๋ค. 7๊ฐ์ง ์ฐฝ์์ ๊ธฐ๋ฒ์ ์ ์ฉํฉ๋๋ค. |
|
|
|
S - Substitute (๋์ฒด) |
|
C - Combine (๊ฒฐํฉ) |
|
A - Adapt (์ ์) |
|
M - Modify/Magnify (์์ /ํ๋) |
|
P - Put to another use (๋ค๋ฅธ ์ฉ๋) |
|
E - Eliminate (์ ๊ฑฐ) |
|
R - Reverse (์ญ์ ) |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"scamper_technique": "์ฌ์ฉ๋ ๊ธฐ๋ฒ", |
|
"original_concept": "์๋ ๊ฐ๋
", |
|
"transformation": "๋ณํ ๊ณผ์ ", |
|
"innovative_aspect": "ํ์ ์ ์ธก๋ฉด", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
DESIGN_THINKING_PROMPT = """ |
|
๋น์ ์ IDEO์ Design Thinking ์ ๋ฌธ๊ฐ์
๋๋ค. ์ธ๊ฐ ์ค์ฌ ํ์ ์ ์ถ๊ตฌํฉ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"user_insight": "์ฌ์ฉ์ ํต์ฐฐ", |
|
"pain_point": "ํด๊ฒฐํ๋ ๋ฌธ์ ์ ", |
|
"desirability": "๋ฐ๋์งํจ (์ธ๊ฐ)", |
|
"feasibility": "์คํ๊ฐ๋ฅ์ฑ (๊ธฐ์ )", |
|
"viability": "์์กด๊ฐ๋ฅ์ฑ (๋น์ฆ๋์ค)", |
|
"prototype_concept": "ํ๋กํ ํ์
์ปจ์
", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
BIOMIMICRY_PROMPT = """ |
|
๋น์ ์ Biomimicry ์ ๋ฌธ๊ฐ์
๋๋ค. ์์ฐ์์ ์๊ฐ์ ๋ฐ์ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"natural_inspiration": "์์ฐ์ ์๊ฐ์", |
|
"biomimetic_principle": "์์ฒด๋ชจ๋ฐฉ ์๋ฆฌ", |
|
"form_function": "ํํ์ ๊ธฐ๋ฅ", |
|
"sustainability_aspect": "์ง์๊ฐ๋ฅ์ฑ ์ธก๋ฉด", |
|
"adaptation_strategy": "์ ์ ์ ๋ต", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
COGNITIVE_LOAD_PROMPT = """ |
|
๋น์ ์ Cognitive Load Theory ์ ๋ฌธ๊ฐ์
๋๋ค. ์ธ์ง ์ฒ๋ฆฌ๋ฅผ ์ต์ํํ๋ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"syllable_count": "์์ ์", |
|
"processing_ease": "์ฒ๋ฆฌ ์ฉ์ด์ฑ ์ ์", |
|
"memory_hooks": "๊ธฐ์ต ๊ณ ๋ฆฌ", |
|
"pronunciation_simplicity": "๋ฐ์ ๋จ์์ฑ", |
|
"cognitive_fluency": "์ธ์ง์ ์ ์ฐฝ์ฑ", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
VON_RESTORFF_PROMPT = """ |
|
๋น์ ์ Von Restorff Effect ์ ๋ฌธ๊ฐ์
๋๋ค. ๋
ํนํ๊ณ ๊ธฐ์ต์ ๋จ๋ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"category_norm": "์นดํ
๊ณ ๋ฆฌ ํ์ค", |
|
"deviation_strategy": "์ผํ ์ ๋ต", |
|
"uniqueness_factors": "๋
ํน์ฑ ์์๋ค", |
|
"memorability_score": "๊ธฐ์ต์ฑ ์ ์", |
|
"attention_triggers": "์ฃผ์ ํธ๋ฆฌ๊ฑฐ", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
NETWORK_EFFECTS_PROMPT = """ |
|
๋น์ ์ Network Effects ์ ๋ฌธ๊ฐ์
๋๋ค. ๋คํธ์ํฌ ๊ฐ์น๋ฅผ ๊ทน๋ํํ๋ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"network_type": "๋คํธ์ํฌ ์ ํ", |
|
"viral_coefficient": "๋ฐ์ด๋ด ๊ณ์", |
|
"sharing_ease": "๊ณต์ ์ฉ์ด์ฑ", |
|
"community_aspect": "์ปค๋ฎค๋ํฐ ์ธก๋ฉด", |
|
"network_value": "๋คํธ์ํฌ ๊ฐ์น", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
MEMETICS_PROMPT = """ |
|
๋น์ ์ Memetics ์ ๋ฌธ๊ฐ์
๋๋ค. ๋ฌธํ์ ์ผ๋ก ๋ณต์ ๋๊ณ ์งํํ๋ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"meme_structure": "๋ฐ ๊ตฌ์กฐ", |
|
"replication_ease": "๋ณต์ ์ฉ์ด์ฑ", |
|
"mutation_potential": "๋ณ์ด ์ ์ฌ๋ ฅ", |
|
"cultural_fitness": "๋ฌธํ์ ์ ํฉ๋", |
|
"transmission_channels": "์ ๋ฌ ์ฑ๋", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
COLOR_PSYCHOLOGY_PROMPT = """ |
|
๋น์ ์ Color Psychology ์ ๋ฌธ๊ฐ์
๋๋ค. ์์ ์ฐ์๊ณผ ๊ฐ์ ์ ํ์ฉํ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"primary_color": "์ฃผ ์์", |
|
"color_meaning": "์์ ์๋ฏธ", |
|
"emotional_response": "๊ฐ์ ์ ๋ฐ์", |
|
"cultural_associations": "๋ฌธํ์ ์ฐ์", |
|
"industry_alignment": "์
์ข
์ ๋ ฌ", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
GESTALT_PROMPT = """ |
|
๋น์ ์ Gestalt Theory ์ ๋ฌธ๊ฐ์
๋๋ค. ์ง๊ฐ ์๋ฆฌ๋ฅผ ํ์ฉํ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
|
๋ค์ JSON ํ์์ผ๋ก ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์: |
|
{ |
|
"brand_name": "๋ธ๋๋๋ช
", |
|
"gestalt_principle": "ํ์ฉ ์์น", |
|
"visual_structure": "์๊ฐ์ ๊ตฌ์กฐ", |
|
"perceptual_grouping": "์ง๊ฐ์ ๊ทธ๋ฃนํ", |
|
"figure_ground": "์ ๊ฒฝ-๋ฐฐ๊ฒฝ ๊ด๊ณ", |
|
"closure_effect": "ํ์ ํจ๊ณผ", |
|
"slogan": "์ฌ๋ก๊ฑด" |
|
} |
|
|
|
๋ฐ๋์ ์ ํจํ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
""" |
|
|
|
|
|
THEORY_PROMPTS = { |
|
"square": SQUARE_THEORY_PROMPT, |
|
"blending": CONCEPTUAL_BLENDING_PROMPT, |
|
"sound": SOUND_SYMBOLISM_PROMPT, |
|
"linguistic": LINGUISTIC_RELATIVITY_PROMPT, |
|
"archetype": ARCHETYPE_THEORY_PROMPT, |
|
"jobs": JOBS_TO_BE_DONE_PROMPT, |
|
"scamper": SCAMPER_PROMPT, |
|
"design": DESIGN_THINKING_PROMPT, |
|
"biomimicry": BIOMIMICRY_PROMPT, |
|
"cognitive": COGNITIVE_LOAD_PROMPT, |
|
"vonrestorff": VON_RESTORFF_PROMPT, |
|
"network": NETWORK_EFFECTS_PROMPT, |
|
"memetics": MEMETICS_PROMPT, |
|
"color": COLOR_PSYCHOLOGY_PROMPT, |
|
"gestalt": GESTALT_PROMPT |
|
} |
|
|
|
def generate_by_theory(industry: str, keywords: str, theory: str, count: int = 3) -> Tuple[str, str]: |
|
"""ํน์ ์ด๋ก ์ผ๋ก ๋ธ๋๋ ์์ฑ""" |
|
|
|
if not industry or not keywords: |
|
return "โ ๏ธ ์
์ข
๊ณผ ํค์๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.", "" |
|
|
|
prompt = THEORY_PROMPTS.get(theory, SQUARE_THEORY_PROMPT) |
|
user_input = f"""์
์ข
: {industry} |
|
ํค์๋: {keywords} |
|
|
|
์ ์ ๋ณด๋ก {count}๊ฐ์ ๋ธ๋๋๋ฅผ ์์ฑํ์ธ์. |
|
๋ฐ๋์ JSON ํ์์ผ๋ก ์๋ตํ์ธ์. |
|
๊ฒฐ๊ณผ๋ ๋ธ๋๋ ๊ฐ์ฒด๋ค์ JSON ๋ฐฐ์ด์ด์ด์ผ ํฉ๋๋ค.""" |
|
|
|
try: |
|
response = client.chat.completions.create( |
|
model="gpt-4o-mini", |
|
messages=[ |
|
{"role": "system", "content": prompt}, |
|
{"role": "user", "content": user_input} |
|
], |
|
temperature=0.8, |
|
max_tokens=2000, |
|
response_format={"type": "json_object"} |
|
) |
|
|
|
content = response.choices[0].message.content |
|
data = json.loads(content) |
|
|
|
|
|
if isinstance(data, dict): |
|
if "results" in data: |
|
results = data["results"] |
|
elif "brands" in data: |
|
results = data["brands"] |
|
elif "brand_name" in data: |
|
|
|
results = [data] |
|
else: |
|
|
|
results = [] |
|
for key, value in data.items(): |
|
if isinstance(value, list): |
|
results = value |
|
break |
|
elif isinstance(value, dict) and "brand_name" in value: |
|
results = [value] |
|
break |
|
else: |
|
results = data |
|
|
|
if not isinstance(results, list): |
|
results = [results] |
|
|
|
|
|
markdown = generate_theory_markdown(theory, results, industry, keywords) |
|
|
|
|
|
html = generate_theory_visualization(theory, results) |
|
|
|
return markdown, html |
|
|
|
except Exception as e: |
|
return f"โ ์ค๋ฅ: {str(e)}", "" |
|
|
|
def generate_theory_markdown(theory: str, results: List[Dict], industry: str, keywords: str) -> str: |
|
"""์ด๋ก ๋ณ ๋ง์ถค ๋งํฌ๋ค์ด ์์ฑ""" |
|
|
|
theory_names = { |
|
"square": "Square Theory", |
|
"blending": "Conceptual Blending", |
|
"sound": "Sound Symbolism", |
|
"linguistic": "Linguistic Relativity", |
|
"archetype": "Archetype Theory", |
|
"jobs": "Jobs-to-be-Done", |
|
"scamper": "SCAMPER Method", |
|
"design": "Design Thinking", |
|
"biomimicry": "Biomimicry", |
|
"cognitive": "Cognitive Load Theory", |
|
"vonrestorff": "Von Restorff Effect", |
|
"network": "Network Effects", |
|
"memetics": "Memetics", |
|
"color": "Color Psychology", |
|
"gestalt": "Gestalt Principles" |
|
} |
|
|
|
markdown = f"""# ๐ฏ {theory_names[theory]} ๊ฒฐ๊ณผ |
|
**์
์ข
**: {industry} | **ํค์๋**: {keywords} |
|
*์์ฑ ์๊ฐ: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}* |
|
|
|
--- |
|
""" |
|
|
|
for idx, result in enumerate(results, 1): |
|
brand_name = result.get('brand_name', 'N/A') |
|
slogan = result.get('slogan', 'N/A') |
|
|
|
markdown += f"\n## {idx}. {brand_name}\n" |
|
markdown += f"**์ฌ๋ก๊ฑด**: *\"{slogan}\"*\n\n" |
|
|
|
|
|
if theory == "square": |
|
markdown += f""" |
|
### Square ๊ตฌ์กฐ |
|
``` |
|
[{result.get('tl')}] โ({result.get('top_edge')})โ [{result.get('tr')}] |
|
โ โ |
|
({result.get('left_edge')}) ({result.get('right_edge')}) |
|
โ โ |
|
[{result.get('bl')}] โ({result.get('bottom_edge')})โ [{result.get('br')}] |
|
``` |
|
""" |
|
elif theory == "blending": |
|
markdown += f""" |
|
### ๊ฐ๋
ํผํฉ |
|
- **์
๋ ฅ ๊ณต๊ฐ 1**: {result.get('input_space1')} |
|
- **์
๋ ฅ ๊ณต๊ฐ 2**: {result.get('input_space2')} |
|
- **์ผ๋ฐ ๊ณต๊ฐ**: {result.get('generic_space')} |
|
- **ํผํฉ ๊ณต๊ฐ**: {result.get('blended_space')} |
|
- **์ฐฝ๋ฐ์ ์์ฑ**: {result.get('emergent_properties')} |
|
""" |
|
elif theory == "sound": |
|
markdown += f""" |
|
### ์ํฅ ๋ถ์ |
|
- **์์ฑ ๋ถ์**: {result.get('phonetic_analysis')} |
|
- **์ํฅ ์๋ฏธ**: {result.get('sound_meaning')} |
|
- **๋ชฉํ ๊ฐ์ **: {result.get('target_emotion')} |
|
- **๋ฐ์ ๊ฐ์ด๋**: {result.get('pronunciation_guide')} |
|
""" |
|
elif theory == "archetype": |
|
markdown += f""" |
|
### ์ํ ๋ถ์ |
|
- **์ํ**: {result.get('archetype')} |
|
- **์ํ ํน์ง**: {result.get('archetype_traits')} |
|
- **๋ธ๋๋ ์ฑ๊ฒฉ**: {result.get('brand_personality')} |
|
- **๋ชฉ์๋ฆฌ ํค**: {result.get('voice_tone')} |
|
""" |
|
|
|
|
|
explanation = result.get('explanation', result.get('value_proposition', '')) |
|
if explanation: |
|
markdown += f"\n๐ก **ํต์ฌ ๊ฐ์น**: {explanation}\n" |
|
|
|
markdown += "\n---\n" |
|
|
|
return markdown |
|
|
|
def generate_theory_visualization(theory: str, results: List[Dict]) -> str: |
|
"""์ด๋ก ๋ณ ๋ง์ถค ์๊ฐํ ์์ฑ""" |
|
|
|
html_parts = [] |
|
|
|
for idx, result in enumerate(results, 1): |
|
if theory == "square": |
|
html_parts.append(visualize_square_brand(result)) |
|
elif theory == "blending": |
|
html_parts.append(visualize_conceptual_blend(result)) |
|
elif theory == "sound": |
|
html_parts.append(visualize_sound_symbolism(result)) |
|
elif theory == "archetype": |
|
html_parts.append(visualize_archetype(result)) |
|
elif theory == "color": |
|
html_parts.append(visualize_color_psychology(result)) |
|
else: |
|
html_parts.append(visualize_generic_brand(result, theory)) |
|
|
|
return "\n".join(html_parts) |
|
|
|
|
|
def visualize_square_brand(brand: Dict) -> str: |
|
"""Square Theory ์๊ฐํ""" |
|
return f""" |
|
<div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: #2c3e50;">{brand.get('brand_name', 'Brand')}</h2> |
|
<p style="text-align: center; font-style: italic; color: #7f8c8d;">"{brand.get('slogan', '')}"</p> |
|
|
|
<div style="position: relative; width: 100%; height: 300px; background: #f5f7fa; border-radius: 12px; padding: 30px;"> |
|
<!-- Square ๊ตฌ์กฐ ์๊ฐํ --> |
|
<div style="position: absolute; top: 30px; left: 30px; background: #3498db; color: white; padding: 15px; border-radius: 8px;"> |
|
{brand.get('tl', '?')} |
|
</div> |
|
<div style="position: absolute; top: 30px; right: 30px; background: #e74c3c; color: white; padding: 15px; border-radius: 8px;"> |
|
{brand.get('tr', '?')} |
|
</div> |
|
<div style="position: absolute; bottom: 30px; left: 30px; background: #f39c12; color: white; padding: 15px; border-radius: 8px;"> |
|
{brand.get('bl', '?')} |
|
</div> |
|
<div style="position: absolute; bottom: 30px; right: 30px; background: #27ae60; color: white; padding: 15px; border-radius: 8px;"> |
|
{brand.get('br', '?')} |
|
</div> |
|
|
|
<!-- ๋ธ๋๋๋ช
์ค์ --> |
|
<div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px 40px; border-radius: 12px; box-shadow: 0 5px 20px rgba(0,0,0,0.15);"> |
|
<div style="font-size: 1.8em; font-weight: bold; color: #2c3e50;">{brand.get('brand_name', 'Brand')}</div> |
|
</div> |
|
</div> |
|
</div> |
|
""" |
|
|
|
def visualize_conceptual_blend(brand: Dict) -> str: |
|
"""Conceptual Blending ์๊ฐํ""" |
|
brand_name = brand.get('brand_name', 'Brand') |
|
input1 = brand.get('input_space1', 'Concept 1') |
|
input2 = brand.get('input_space2', 'Concept 2') |
|
blended = brand.get('blended_space', 'Blended Concept') |
|
slogan = brand.get('slogan', '') |
|
|
|
return f""" |
|
<div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: #2c3e50;">{brand_name}</h2> |
|
|
|
<div style="display: flex; justify-content: space-around; align-items: center; margin: 30px 0;"> |
|
<div style="text-align: center; padding: 20px; background: #3498db; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;"> |
|
<div> |
|
<strong>Input 1</strong><br> |
|
{input1} |
|
</div> |
|
</div> |
|
|
|
<div style="font-size: 2em;">+</div> |
|
|
|
<div style="text-align: center; padding: 20px; background: #e74c3c; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;"> |
|
<div> |
|
<strong>Input 2</strong><br> |
|
{input2} |
|
</div> |
|
</div> |
|
|
|
<div style="font-size: 2em;">=</div> |
|
|
|
<div style="text-align: center; padding: 20px; background: #27ae60; color: white; border-radius: 50%; width: 150px; height: 150px; display: flex; align-items: center; justify-content: center;"> |
|
<div> |
|
<strong>Blend</strong><br> |
|
{blended} |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<p style="text-align: center; font-style: italic;">"{slogan}"</p> |
|
</div> |
|
""" |
|
|
|
def visualize_sound_symbolism(brand: Dict) -> str: |
|
"""Sound Symbolism ์๊ฐํ""" |
|
return f""" |
|
<div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: #2c3e50;">{brand.get('brand_name', 'Brand')}</h2> |
|
|
|
<div style="background: #f8f9fa; padding: 30px; border-radius: 12px; text-align: center;"> |
|
<div style="font-size: 3em; letter-spacing: 0.2em; margin: 20px 0; color: #3498db;"> |
|
{brand.get('brand_name', 'BRAND')} |
|
</div> |
|
|
|
<div style="margin: 20px 0; padding: 15px; background: white; border-radius: 8px;"> |
|
<strong>์์ฑ ๋ถ์</strong><br> |
|
{brand.get('phonetic_analysis', '')} |
|
</div> |
|
|
|
<div style="margin: 20px 0; padding: 15px; background: white; border-radius: 8px;"> |
|
<strong>์ํฅ์ด ์ ๋ฌํ๋ ๊ฐ์ </strong><br> |
|
{brand.get('sound_meaning', '')} |
|
</div> |
|
|
|
<div style="margin: 20px 0; font-style: italic; color: #7f8c8d;"> |
|
๋ฐ์: {brand.get('pronunciation_guide', '')} |
|
</div> |
|
</div> |
|
</div> |
|
""" |
|
|
|
def visualize_archetype(brand: Dict) -> str: |
|
"""Archetype Theory ์๊ฐํ""" |
|
archetype_colors = { |
|
"Hero": "#e74c3c", |
|
"Creator": "#9b59b6", |
|
"Sage": "#3498db", |
|
"Explorer": "#1abc9c", |
|
"Innocent": "#f1c40f", |
|
"Jester": "#e67e22", |
|
"Lover": "#e91e63", |
|
"Caregiver": "#00bcd4", |
|
"Ruler": "#795548", |
|
"Magician": "#673ab7", |
|
"Outlaw": "#212121", |
|
"Regular Guy": "#607d8b" |
|
} |
|
|
|
archetype = brand.get('archetype', 'Hero') |
|
color = archetype_colors.get(archetype, "#3498db") |
|
|
|
return f""" |
|
<div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: {color};">{brand.get('brand_name', 'Brand')}</h2> |
|
|
|
<div style="text-align: center; margin: 30px 0;"> |
|
<div style="display: inline-block; padding: 40px; background: {color}; color: white; border-radius: 50%; width: 200px; height: 200px;"> |
|
<h3 style="margin: 0;">{archetype}</h3> |
|
<p style="margin: 10px 0; font-size: 0.9em;">{brand.get('archetype_traits', '')}</p> |
|
</div> |
|
</div> |
|
|
|
<div style="background: #f8f9fa; padding: 20px; border-radius: 8px; margin: 20px 0;"> |
|
<p><strong>๋ธ๋๋ ์ฑ๊ฒฉ</strong>: {brand.get('brand_personality', '')}</p> |
|
<p><strong>๋ชฉ์๋ฆฌ ํค</strong>: {brand.get('voice_tone', '')}</p> |
|
</div> |
|
|
|
<p style="text-align: center; font-style: italic; font-size: 1.2em;">"{brand.get('slogan', '')}"</p> |
|
</div> |
|
""" |
|
|
|
def visualize_color_psychology(brand: Dict) -> str: |
|
"""Color Psychology ์๊ฐํ""" |
|
color = brand.get('primary_color', '#3498db') |
|
|
|
return f""" |
|
<div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: #2c3e50;">{brand.get('brand_name', 'Brand')}</h2> |
|
|
|
<div style="text-align: center; margin: 30px 0;"> |
|
<div style="display: inline-block; width: 200px; height: 200px; background: {color}; border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,0.2);"></div> |
|
</div> |
|
|
|
<div style="background: #f8f9fa; padding: 20px; border-radius: 8px;"> |
|
<p><strong>์ฃผ ์์</strong>: {brand.get('primary_color', '')}</p> |
|
<p><strong>์์ ์๋ฏธ</strong>: {brand.get('color_meaning', '')}</p> |
|
<p><strong>๊ฐ์ ์ ๋ฐ์</strong>: {brand.get('emotional_response', '')}</p> |
|
<p><strong>๋ฌธํ์ ์ฐ์</strong>: {brand.get('cultural_associations', '')}</p> |
|
</div> |
|
|
|
<p style="text-align: center; font-style: italic; margin-top: 20px;">"{brand.get('slogan', '')}"</p> |
|
</div> |
|
""" |
|
|
|
def visualize_generic_brand(brand: Dict, theory: str) -> str: |
|
"""์ผ๋ฐ์ ์ธ ๋ธ๋๋ ์๊ฐํ""" |
|
|
|
json_str = json.dumps(brand, ensure_ascii=False, indent=2) |
|
json_html = json_str.replace("\n", "<br>").replace(" ", " ") |
|
|
|
html = f""" |
|
<div style="max-width: 700px; margin: 20px auto; padding: 30px; background: #f8f9fa; border-radius: 12px; font-family: -apple-system, sans-serif;"> |
|
<h2 style="text-align: center; color: #2c3e50; margin-bottom: 10px;">{brand.get('brand_name', 'Brand')}</h2> |
|
<p style="text-align: center; font-style: italic; color: #7f8c8d; margin-bottom: 30px;">"{brand.get('slogan', '')}"</p> |
|
|
|
<div style="background: white; padding: 20px; border-radius: 8px; font-family: monospace; font-size: 0.9em;"> |
|
<pre style="margin: 0; white-space: pre-wrap;">{json_str}</pre> |
|
</div> |
|
</div> |
|
""" |
|
return html |
|
|
|
|
|
with gr.Blocks(title="Ultimate Brand Theory Generator", theme=gr.themes.Soft()) as demo: |
|
gr.Markdown(""" |
|
# ๐ Ultimate Brand Theory Generator |
|
### 15๊ฐ ์ด๋ก ์ ํ์ฉํ ์ข
ํฉ ๋ธ๋๋ ์์ฑ๊ธฐ |
|
|
|
ํ๋์ ์
๋ ฅ์ผ๋ก 15๊ฐ์ง ๋ค๋ฅธ ์ด๋ก ์ ๊ธฐ๋ฐํ ๋ธ๋๋๋ฅผ ์์ฑํฉ๋๋ค. |
|
๊ฐ ํญ์์ ๊ฐ ์ด๋ก ์ ๊ณ ์ ํ ๊ด์ ์ผ๋ก ๋ง๋ค์ด์ง ๋ธ๋๋๋ฅผ ํ์ธํ์ธ์! |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
industry_input = gr.Textbox( |
|
label="๐ญ ์
์ข
", |
|
placeholder="์: ์นดํ, ํผํธ๋์ค, ๊ต์ก, ๋ทฐํฐ...", |
|
value="์นดํ/์ปคํผ์" |
|
) |
|
|
|
keywords_input = gr.Textbox( |
|
label="๐ ํต์ฌ ํค์๋", |
|
placeholder="ํ๋ฆฌ๋ฏธ์, ํธ์ํ, ๋์์ ์ธ, ์นํ๊ฒฝ...", |
|
info="๋ธ๋๋๊ฐ ๋ด์์ผ ํ ํต์ฌ ๊ฐ์น๋ ํน์ง๋ค" |
|
) |
|
|
|
generate_btn = gr.Button("๐ ๋ชจ๋ ์ด๋ก ์ผ๋ก ๋ธ๋๋ ์์ฑ", variant="primary", size="lg") |
|
|
|
with gr.Column(scale=1): |
|
gr.Markdown(""" |
|
### ๐ก 15๊ฐ์ง ์ด๋ก ๊ฐ์ |
|
|
|
**๊ตฌ์กฐ์ ์ ๊ทผ** |
|
- Square Theory: 4์์ ์์ฑ |
|
- Conceptual Blending: ๊ฐ๋
ํผํฉ |
|
- Gestalt: ์ง๊ฐ ์๋ฆฌ |
|
|
|
**์ธ์ดํ์ ์ ๊ทผ** |
|
- Sound Symbolism: ์ํฅ ์๋ฏธ |
|
- Linguistic Relativity: ๋ฌธํ ์ ์ |
|
- Cognitive Load: ์ธ์ง ์ต์ ํ |
|
|
|
**์ฌ๋ฆฌํ์ ์ ๊ทผ** |
|
- Archetype: ์ํ ํ์ฉ |
|
- Color Psychology: ์์ ์ฌ๋ฆฌ |
|
- Von Restorff: ๋
ํน์ฑ |
|
|
|
**์ ๋ต์ ์ ๊ทผ** |
|
- Jobs-to-be-Done: ๊ณ ๊ฐ ๊ณผ์
|
|
- SCAMPER: ์ฐฝ์์ ๋ณํ |
|
- Design Thinking: ์ธ๊ฐ์ค์ฌ |
|
|
|
**์์คํ
์ ์ ๊ทผ** |
|
- Network Effects: ๋คํธ์ํฌ |
|
- Memetics: ๋ฌธํ ์ ํ |
|
- Biomimicry: ์์ฐ ๋ชจ๋ฐฉ |
|
""") |
|
|
|
|
|
with gr.Tabs(): |
|
|
|
with gr.Tab("๐ฆ Square Theory"): |
|
square_output = gr.Markdown() |
|
square_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ Conceptual Blending"): |
|
blending_output = gr.Markdown() |
|
blending_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ Sound Symbolism"): |
|
sound_output = gr.Markdown() |
|
sound_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ Linguistic Relativity"): |
|
linguistic_output = gr.Markdown() |
|
linguistic_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ญ Archetype Theory"): |
|
archetype_output = gr.Markdown() |
|
archetype_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("โ
Jobs-to-be-Done"): |
|
jobs_output = gr.Markdown() |
|
jobs_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ง SCAMPER Method"): |
|
scamper_output = gr.Markdown() |
|
scamper_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ญ Design Thinking"): |
|
design_output = gr.Markdown() |
|
design_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ฟ Biomimicry"): |
|
biomimicry_output = gr.Markdown() |
|
biomimicry_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ง Cognitive Load"): |
|
cognitive_output = gr.Markdown() |
|
cognitive_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("โก Von Restorff Effect"): |
|
vonrestorff_output = gr.Markdown() |
|
vonrestorff_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐ Network Effects"): |
|
network_output = gr.Markdown() |
|
network_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐งฌ Memetics"): |
|
memetics_output = gr.Markdown() |
|
memetics_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐จ Color Psychology"): |
|
color_output = gr.Markdown() |
|
color_visual = gr.HTML() |
|
|
|
|
|
with gr.Tab("๐๏ธ Gestalt Principles"): |
|
gestalt_output = gr.Markdown() |
|
gestalt_visual = gr.HTML() |
|
|
|
|
|
def generate_all_theories(industry, keywords): |
|
results = {} |
|
|
|
theories = [ |
|
("square", square_output, square_visual), |
|
("blending", blending_output, blending_visual), |
|
("sound", sound_output, sound_visual), |
|
("linguistic", linguistic_output, linguistic_visual), |
|
("archetype", archetype_output, archetype_visual), |
|
("jobs", jobs_output, jobs_visual), |
|
("scamper", scamper_output, scamper_visual), |
|
("design", design_output, design_visual), |
|
("biomimicry", biomimicry_output, biomimicry_visual), |
|
("cognitive", cognitive_output, cognitive_visual), |
|
("vonrestorff", vonrestorff_output, vonrestorff_visual), |
|
("network", network_output, network_visual), |
|
("memetics", memetics_output, memetics_visual), |
|
("color", color_output, color_visual), |
|
("gestalt", gestalt_output, gestalt_visual) |
|
] |
|
|
|
outputs = [] |
|
for theory_key, md_output, html_output in theories: |
|
md, html = generate_by_theory(industry, keywords, theory_key) |
|
outputs.extend([md, html]) |
|
|
|
return outputs |
|
|
|
|
|
generate_btn.click( |
|
fn=generate_all_theories, |
|
inputs=[industry_input, keywords_input], |
|
outputs=[ |
|
square_output, square_visual, |
|
blending_output, blending_visual, |
|
sound_output, sound_visual, |
|
linguistic_output, linguistic_visual, |
|
archetype_output, archetype_visual, |
|
jobs_output, jobs_visual, |
|
scamper_output, scamper_visual, |
|
design_output, design_visual, |
|
biomimicry_output, biomimicry_visual, |
|
cognitive_output, cognitive_visual, |
|
vonrestorff_output, vonrestorff_visual, |
|
network_output, network_visual, |
|
memetics_output, memetics_visual, |
|
color_output, color_visual, |
|
gestalt_output, gestalt_visual |
|
] |
|
) |
|
|
|
gr.Examples( |
|
examples=[ |
|
["์นดํ/์ปคํผ์", "ํ๋ฆฌ๋ฏธ์, ์๋ํ, ๋์"], |
|
["ํผํธ๋์ค/ํฌ์ค์ฅ", "๊ฐ๋ ฅํ, ์ปค๋ฎค๋ํฐ, ๋ณํ"], |
|
["๊ต์ก/์๋ํ
ํฌ", "์ค๋งํธ, ์ฌ๋ฏธ์๋, ์ฑ์ฅ"], |
|
["์์ ๋ฐฐ๋ฌ", "๋น ๋ฅธ, ์ ์ ํ, ๋ค์ํ"], |
|
["์นํ๊ฒฝ/์ง์๊ฐ๋ฅ", "์์ฐ, ๋ฏธ๋, ์ํ"] |
|
], |
|
inputs=[industry_input, keywords_input] |
|
) |
|
|
|
gr.Markdown(""" |
|
--- |
|
### ๐ฏ ํ์ฉ ๊ฐ์ด๋ |
|
|
|
1. **๋น๊ต ๋ถ์**: ๊ฐ ์ด๋ก ์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ฅ ์ ํฉํ ๋ธ๋๋ ์ ํ |
|
2. **ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ**: ์ฌ๋ฌ ์ด๋ก ์ ์ฅ์ ์ ๊ฒฐํฉํ ์๋ก์ด ๋ธ๋๋ ์ฐฝ์กฐ |
|
3. **ํ๊ฒ๋ณ ์ ํ**: ๋ชฉํ ๊ณ ๊ฐ์ธต์ ๋ฐ๋ผ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ด๋ก ์ ํ |
|
4. **A/B ํ
์คํธ**: ๋ค์ํ ์ด๋ก ๊ธฐ๋ฐ ๋ธ๋๋๋ก ์์ฅ ํ
์คํธ |
|
|
|
### ๐ ๊ฐ ์ด๋ก ์ ๊ฐ์ |
|
|
|
- **์ฆ๊ฐ์ ์ดํด**: Cognitive Load, Sound Symbolism |
|
- **๊ฐ์ ์ ์ฐ๊ฒฐ**: Archetype, Color Psychology |
|
- **์ฐจ๋ณํ**: Von Restorff, SCAMPER |
|
- **๋ฐ์ด๋ด ์ ์ฌ๋ ฅ**: Memetics, Network Effects |
|
- **๋ฌธ์ ํด๊ฒฐ**: Jobs-to-be-Done, Design Thinking |
|
- **ํ์ ์ฑ**: Biomimicry, Conceptual Blending |
|
- **๊ตฌ์กฐ์ ์์ฑ๋**: Square Theory, Gestalt |
|
""") |
|
|
|
if __name__ == "__main__": |
|
demo.launch( |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
share=False |
|
) |