"""
Square Theory Brand Generator
=============================
2025-05-28 | Square Theory를 활용한 브랜드 네이밍 & 슬로건 생성기
----------------------------------------------------------
Square Theory를 브랜딩에 적용: 브랜드명이 Square를 완성하는 구조
예: GRUBHUB = GRUB(음식) + HUB(중심) → 음식 배달의 중심
"""
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
# OpenAI 클라이언트
if not os.getenv("OPENAI_API_KEY"):
raise EnvironmentError("OPENAI_API_KEY 환경 변수를 설정하세요.")
client = OpenAI()
# Square Theory 브랜딩 전용 프롬프트
BRANDING_SQUARE_PROMPT = """
당신은 Square Theory를 활용한 브랜드 네이밍 전문가입니다.
Square Theory는 4개의 단어가 의미적 관계로 연결되어 사각형을 이루는 구조입니다.
이를 브랜딩에 적용하면, 브랜드명이 Square를 완성하며 "아하!" 모먼트를 만듭니다.
성공적인 브랜드 Square 예시:
1. GRUBHUB: GRUB(음식) + HUB(중심) = 음식 배달의 중심지
2. Brand New (리브랜딩 블로그): BRAND + NEW = 새로운 브랜드 = 업데이트된 브랜드
3. Crosscord: CROSSWORD + DISCORD = 크로스워드 커뮤니티 서버
브랜드 Square 생성 원칙:
1. 브랜드명은 두 단어의 조합 (합성어, 포트맨토, 또는 구문)
2. 각 단어는 비즈니스의 핵심 속성과 연결
3. 전체 Square가 브랜드의 정체성을 강화
4. 슬로건은 Square의 의미를 확장
사용자 입력(업종/키워드)을 받아 다음 형식의 JSON 배열을 생성하세요:
{
"brand_name": "브랜드명",
"brand_type": "compound/portmanteau/phrase",
"tl": "왼쪽상단 단어",
"tr": "오른쪽상단 단어",
"bl": "왼쪽하단 단어",
"br": "오른쪽하단 단어",
"top_edge": "상단 관계",
"bottom_edge": "하단 관계",
"left_edge": "왼쪽 관계",
"right_edge": "오른쪽 관계",
"slogan": "브랜드 슬로건",
"tagline": "짧은 태그라인",
"business_description": "비즈니스 설명",
"why_it_works": "왜 이 Square가 효과적인지",
"target_audience": "타겟 고객",
"brand_personality": "브랜드 개성",
"impact_score": 1-10
}
창의적이면서도 기억하기 쉽고, 비즈니스 본질을 담은 브랜드를 만드세요.
"""
# 업종별 예시
INDUSTRY_EXAMPLES = [
"카페/커피숍",
"피트니스/헬스장",
"교육/에듀테크",
"뷰티/화장품",
"음식 배달",
"여행/관광",
"금융/핀테크",
"패션/의류",
"반려동물",
"친환경/지속가능"
]
def generate_brand_squares(industry: str, keywords: str, count: int = 5) -> List[Dict]:
"""Square Theory 기반 브랜드 생성"""
user_prompt = f"""
업종: {industry}
키워드: {keywords}
위 정보를 바탕으로 Square Theory를 활용한 브랜드 {count}개를 생성하세요.
각 브랜드는 완전한 Square를 형성해야 하며, 브랜드명이 Square의 핵심이 되어야 합니다.
"""
try:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": BRANDING_SQUARE_PROMPT},
{"role": "user", "content": user_prompt}
],
temperature=0.85,
max_tokens=4000,
response_format={"type": "json_object"}
)
content = response.choices[0].message.content
data = json.loads(content)
# 응답 정규화
if isinstance(data, dict):
if "brands" in data:
results = data["brands"]
elif "results" in data:
results = data["results"]
else:
results = [data]
else:
results = data
# 점수순 정렬
results.sort(key=lambda x: x.get("impact_score", 0), reverse=True)
return results[:count]
except Exception as e:
raise RuntimeError(f"브랜드 생성 실패: {e}")
def visualize_brand_square(brand: Dict) -> str:
"""브랜드 Square 시각화"""
brand_name = brand.get('brand_name', 'BRAND')
tl, tr = brand.get('tl', '?'), brand.get('tr', '?')
bl, br = brand.get('bl', '?'), brand.get('br', '?')
# 브랜드명 분해 (compound/portmanteau인 경우)
if brand.get('brand_type') == 'compound':
parts = brand_name.split()
brand_part1 = parts[0] if len(parts) > 0 else brand_name[:len(brand_name)//2]
brand_part2 = parts[1] if len(parts) > 1 else brand_name[len(brand_name)//2:]
else:
# 포트맨토의 경우 대략적으로 분할
mid = len(brand_name) // 2
brand_part1 = brand_name[:mid+1]
brand_part2 = brand_name[mid-1:]
return f"""
{brand_name}
"{brand.get('slogan', '')}"
{brand.get('tagline', '')}
{brand_name}
{brand.get('brand_type', 'compound')}
{tl}
{tr}
{bl}
{br}
{brand.get('top_edge', '관계')}
{brand.get('bottom_edge', '관계')}
{brand.get('left_edge', '관계')}
{brand.get('right_edge', '관계')}
🎯 타겟 고객
{brand.get('target_audience', 'N/A')}
✨ 브랜드 개성
{brand.get('brand_personality', 'N/A')}
💡 왜 효과적인가?
{brand.get('why_it_works', '')}
"""
def generate_brands(industry: str, keywords: str, count: int) -> Tuple[str, str, List[Dict]]:
"""브랜드 생성 및 표시"""
if not industry or not keywords:
return "⚠️ 업종과 키워드를 모두 입력해주세요.", "", []
try:
brands = generate_brand_squares(industry, keywords, count)
# 마크다운 결과
markdown_parts = [
f"# 🏢 Square Theory 브랜드 제안",
f"**업종**: {industry} | **키워드**: {keywords}",
f"*생성 시각: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*\n"
]
# HTML 시각화
html_parts = []
for idx, brand in enumerate(brands, 1):
score = brand.get('impact_score', 0)
markdown_parts.append(f"""
## {idx}. {brand.get('brand_name', 'N/A')} {'⭐' * min(score, 5)}
**슬로건**: *"{brand.get('slogan', 'N/A')}"*
**태그라인**: {brand.get('tagline', 'N/A')}
### 📐 Square 구조
```
[{brand.get('tl', '?')}] ─({brand.get('top_edge', '?')})─ [{brand.get('tr', '?')}]
│ │
({brand.get('left_edge', '?')}) ({brand.get('right_edge', '?')})
│ │
[{brand.get('bl', '?')}] ─({brand.get('bottom_edge', '?')})─ [{brand.get('br', '?')}]
```
**비즈니스**: {brand.get('business_description', 'N/A')}
**타겟**: {brand.get('target_audience', 'N/A')}
**개성**: {brand.get('brand_personality', 'N/A')}
💡 **효과**: {brand.get('why_it_works', 'N/A')}
---
""")
# 모든 브랜드 시각화
html_parts.append(f"#{idx}
")
html_parts.append(visualize_brand_square(brand))
return "\n".join(markdown_parts), "\n".join(html_parts), brands
except Exception as e:
return f"❌ 오류: {str(e)}", "", []
def export_brands(brands: List[Dict]) -> str:
"""브랜드 정보 JSON 내보내기"""
if not brands:
return None
export_data = {
"generated_at": datetime.now().isoformat(),
"total_brands": len(brands),
"brands": brands
}
return json.dumps(export_data, ensure_ascii=False, indent=2)
# Gradio UI
with gr.Blocks(title="Square Theory Brand Generator", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🏢 Square Theory Brand Generator
### 의미적 Square를 완성하는 브랜드 네이밍 & 슬로건 생성기
Square Theory를 활용해 브랜드명이 의미적 사각형을 완성하는 강력한 브랜드를 만들어보세요.
좋은 브랜드명은 단순한 이름이 아닌, 비즈니스의 본질을 담은 Square를 형성합니다.
**성공 사례**: GRUBHUB (GRUB+HUB), Brand New, Crosscord
""")
with gr.Row():
with gr.Column(scale=2):
industry_input = gr.Dropdown(
choices=INDUSTRY_EXAMPLES,
label="🏭 업종",
allow_custom_value=True,
value="카페/커피숍"
)
keywords_input = gr.Textbox(
label="🔑 핵심 키워드",
placeholder="프리미엄, 편안한, 도시적인, 친환경...",
info="브랜드가 담아야 할 핵심 가치나 특징들"
)
count_slider = gr.Slider(
minimum=3,
maximum=10,
value=5,
step=1,
label="생성 개수"
)
generate_btn = gr.Button("🚀 브랜드 Square 생성", variant="primary", size="lg")
with gr.Column(scale=1):
gr.Markdown("""
### 💡 Square Theory 브랜딩
**좋은 브랜드 Square의 조건:**
1. 브랜드명의 각 부분이 의미를 가짐
2. 비즈니스 본질과 연결
3. 기억하기 쉽고 발음 가능
4. Square가 "아하!" 모먼트 생성
**Square 구조 예시:**
```
GRUB ─(음식)─ FOOD
│ │
(중심) (배달)
│ │
HUB ─(서비스)─ DELIVERY
```
""")
# 전역 변수
current_brands = gr.State([])
with gr.Tabs():
with gr.Tab("📊 결과 리스트"):
output_markdown = gr.Markdown()
with gr.Tab("🎨 브랜드 시각화"):
output_visual = gr.HTML()
with gr.Tab("💾 내보내기"):
export_btn = gr.Button("JSON 파일 생성")
download_file = gr.File(label="다운로드", visible=False)
# 예시
gr.Examples(
examples=[
["카페/커피숍", "프리미엄, 아늑한, 도시"],
["피트니스/헬스장", "강력한, 커뮤니티, 변화"],
["교육/에듀테크", "스마트, 재미있는, 성장"],
["음식 배달", "빠른, 신선한, 다양한"],
["친환경/지속가능", "자연, 미래, 순환"]
],
inputs=[industry_input, keywords_input]
)
# 이벤트 연결
def generate_and_store(industry, keywords, count):
markdown, html, brands = generate_brands(industry, keywords, count)
return markdown, html, brands
generate_btn.click(
fn=generate_and_store,
inputs=[industry_input, keywords_input, count_slider],
outputs=[output_markdown, output_visual, current_brands]
)
def create_export_file(brands):
if not brands:
return None
content = export_brands(brands)
filename = f"square_theory_brands_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
return gr.File(value=filename, visible=True)
export_btn.click(
fn=create_export_file,
inputs=[current_brands],
outputs=[download_file]
)
gr.Markdown("""
---
### 🎯 활용 방법
1. **브랜드 개발**: 생성된 Square 중 가장 강력한 것 선택
2. **마케팅 전략**: Square의 각 요소를 캠페인에 활용
3. **스토리텔링**: Square가 만드는 내러티브 활용
4. **확장 가능성**: Square의 각 모서리에서 서브브랜드 파생
### 📚 Square Theory 브랜딩의 힘
Square를 완성하는 브랜드는:
- **기억하기 쉬움**: 의미적 연결이 기억을 강화
- **스토리가 있음**: Square 자체가 브랜드 스토리
- **확장 가능**: 각 요소에서 새로운 의미 파생
- **차별화됨**: 독특한 의미 구조로 경쟁사와 구별
""")
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)