Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import openai
|
| 4 |
+
import requests
|
| 5 |
+
import logging
|
| 6 |
+
|
| 7 |
+
# 로깅 설정
|
| 8 |
+
logging.basicConfig(level=logging.INFO)
|
| 9 |
+
logger = logging.getLogger(__name__)
|
| 10 |
+
|
| 11 |
+
# OpenAI API 클라이언트 설정
|
| 12 |
+
openai.api_key = os.getenv("OPENAI_API_KEY")
|
| 13 |
+
|
| 14 |
+
# 요청사항에 따라 카테고리 수정
|
| 15 |
+
CATEGORIES = [
|
| 16 |
+
"공포 마케팅",
|
| 17 |
+
"스토리텔링"
|
| 18 |
+
]
|
| 19 |
+
|
| 20 |
+
def get_category_prompt(category):
|
| 21 |
+
if category == "공포 마케팅":
|
| 22 |
+
return """
|
| 23 |
+
# 공포 마케팅 카피라이팅 생성 규칙
|
| 24 |
+
1. 반드시 한글로 출력하라.
|
| 25 |
+
2. 너는 세계 최고의 공포 마케팅 카피라이터이다.
|
| 26 |
+
3. 반드시 카피라이팅은 30자 이내로 작성하고, 10개만 출력하라.(다른 내용 출력 금지)
|
| 27 |
+
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 28 |
+
5. 반드시 1 부터 10까지 번호(리스트형태)를 같이 출력하라
|
| 29 |
+
6. 사람들에게 두려움을 주면서, 동시에 제품이나 서비스를 사용해야만 하는 이유를 강하게 어필하라.
|
| 30 |
+
7. 사용하지 않을 때의 위험이나 손실을 강조하라.
|
| 31 |
+
8. 감정적인 단어와 표현을 사용하여 독자의 불안을 증폭시키라
|
| 32 |
+
9. 제품/서비스의 중요성과 그것이 없을 때의 극단적인 결과를 구체적으로 설명하라.
|
| 33 |
+
예시:
|
| 34 |
+
- 스쿼트 할 때 이 동작 하면 무릎 부상 옵니다
|
| 35 |
+
- 책 안 읽는 사람이 가난할 확률 98%인 이유
|
| 36 |
+
- 신제품을 출시할 때 실패하는 7 가지 치명적 실수
|
| 37 |
+
- 소셜 미디어를 잘못 사용하면 기업이 망할 수 있는 이유
|
| 38 |
+
- 이 앱 안 쓰면 해킹 당할 확률 80% 증가
|
| 39 |
+
- 이 보험 없으면 사고 시 파산 위기 온다
|
| 40 |
+
- 충격! 이 선크림 안 바르면 피부암 위험 500% 증가
|
| 41 |
+
- 가습기 2일만 관리하지 않아도 "세균 범벅"
|
| 42 |
+
- 바다 환경오염, 식탁으로 되돌아온다. 플라스틱 사용 이대로 괜찮은가요?
|
| 43 |
+
- "맥주 한잔이라도 날마다 술이 땡긴다면? 이것 의심해야"
|
| 44 |
+
"""
|
| 45 |
+
|
| 46 |
+
elif category == "스토리텔링":
|
| 47 |
+
return """
|
| 48 |
+
# 스토리텔링 카피라이팅 생성 규칙
|
| 49 |
+
1. 반드시 한글로 출력하라.
|
| 50 |
+
2. 너는 세계 최고의 스토리텔링 마케팅 카피라이터이다.
|
| 51 |
+
3. 반드시 카피라이팅은 30자 이내로 작성하고, 10개만 출력하라.(다른 내용 출력 금지)
|
| 52 |
+
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 53 |
+
5. 반드시 1 부터 10까지 번호(리스트형태)를 같이 출력하라
|
| 54 |
+
6. 제품/서비스와 관련된 짧고 흥미로운 이야기를 만들어라.
|
| 55 |
+
7. 고객이 공감할 수 있는 상황이나 캐릭터를 설정하라.
|
| 56 |
+
8. 이야기를 통해 제품/서비스의 가치를 자연스럽게 전달하라.
|
| 57 |
+
예시:
|
| 58 |
+
- 한 어부의 꿈에서 시작된 혁신적인 낚시장비
|
| 59 |
+
- 100년 된 가족 레시피로 만든 수제 잼
|
| 60 |
+
- 우주 비행사의 아이디어로 탄생한 초경량 재킷
|
| 61 |
+
- 할머니의 100년 된 비밀 레시피로 만든 건강한 집밥 간식
|
| 62 |
+
- 히말라야 등산객의 고민에서 시작된 혁신적 초경량 배낭
|
| 63 |
+
- 몽골 유목민의 천년 지혜를 담은 친환경 오토캠핑 텐트
|
| 64 |
+
- 바다를 사랑한 해양생물학자의 혁신적인 해양 정화 기술
|
| 65 |
+
- 20년 불면증 환자가 직접 개발한 꿀잠 유도 스마트 베개
|
| 66 |
+
- 길고양이 100마리를 구조한 수의사의 반려동물 건강관리 앱
|
| 67 |
+
- 팔 없는 장애인 화가의 꿈을 이뤄준 첨단 그림 도구
|
| 68 |
+
"""
|
| 69 |
+
|
| 70 |
+
def call_api_sync(content, system_message, max_tokens, temperature, top_p):
|
| 71 |
+
response = requests.post(
|
| 72 |
+
"https://api.openai.com/v1/chat/completions",
|
| 73 |
+
headers={"Authorization": f"Bearer {openai.api_key}"},
|
| 74 |
+
json={
|
| 75 |
+
"model": "gpt-4o-mini",
|
| 76 |
+
"messages": [
|
| 77 |
+
{"role": "system", "content": system_message},
|
| 78 |
+
{"role": "user", "content": content},
|
| 79 |
+
],
|
| 80 |
+
"max_tokens": max_tokens,
|
| 81 |
+
"temperature": temperature,
|
| 82 |
+
"top_p": top_p,
|
| 83 |
+
}
|
| 84 |
+
)
|
| 85 |
+
result = response.json()
|
| 86 |
+
return result['choices'][0]['message']['content']
|
| 87 |
+
|
| 88 |
+
def generate_copywriting(categories, topic):
|
| 89 |
+
max_tokens = 1000
|
| 90 |
+
temperature = 0.8
|
| 91 |
+
top_p = 0.95
|
| 92 |
+
|
| 93 |
+
results = {}
|
| 94 |
+
for category in categories:
|
| 95 |
+
prompt = get_category_prompt(category)
|
| 96 |
+
user_content = f"주제: {topic}"
|
| 97 |
+
copywriting = call_api_sync(user_content, prompt, max_tokens, temperature, top_p)
|
| 98 |
+
results[category] = copywriting
|
| 99 |
+
return results
|
| 100 |
+
|
| 101 |
+
# Gradio 인터페이스 부분
|
| 102 |
+
with gr.Blocks() as iface:
|
| 103 |
+
gr.Markdown("# AI 카피라이팅 생성기")
|
| 104 |
+
|
| 105 |
+
with gr.Column():
|
| 106 |
+
# 선택 기능 제거
|
| 107 |
+
topic = gr.Textbox(lines=1, label="주제를 입력하세요")
|
| 108 |
+
|
| 109 |
+
generate_btn = gr.Button("카피라이팅 생성하기")
|
| 110 |
+
|
| 111 |
+
status = gr.Markdown("준비됨")
|
| 112 |
+
|
| 113 |
+
output_boxes = {}
|
| 114 |
+
with gr.Column():
|
| 115 |
+
for category in CATEGORIES:
|
| 116 |
+
output_box = gr.Textbox(label=category, visible=True)
|
| 117 |
+
output_boxes[category] = output_box
|
| 118 |
+
|
| 119 |
+
def validate_and_generate(topic):
|
| 120 |
+
try:
|
| 121 |
+
results = generate_copywriting(CATEGORIES, topic)
|
| 122 |
+
logger.debug(f"Generated results: {results}")
|
| 123 |
+
|
| 124 |
+
outputs = []
|
| 125 |
+
for category in CATEGORIES:
|
| 126 |
+
if category in results:
|
| 127 |
+
outputs.append(gr.update(value=results[category]))
|
| 128 |
+
else:
|
| 129 |
+
outputs.append(gr.update(value=""))
|
| 130 |
+
|
| 131 |
+
return [gr.update(value="카피라이팅 생성이 완료되었습니다.")] + outputs
|
| 132 |
+
except Exception as e:
|
| 133 |
+
logger.error(f"Error during copywriting generation: {str(e)}")
|
| 134 |
+
return [gr.update(value=f"오류 발생: {str(e)}")] + [gr.update(value="") for _ in CATEGORIES]
|
| 135 |
+
|
| 136 |
+
generate_btn.click(
|
| 137 |
+
fn=validate_and_generate,
|
| 138 |
+
inputs=[topic],
|
| 139 |
+
outputs=[status] + [output_boxes[category] for category in CATEGORIES]
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
# 인터페이스 실행
|
| 143 |
+
iface.launch()
|