""" 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 )