Update app.py
Browse files
app.py
CHANGED
|
@@ -25,9 +25,9 @@ def get_category_prompt(category):
|
|
| 25 |
# 공포 마케팅 카피라이팅 생성 규칙
|
| 26 |
1. 반드시 한글로 출력하라.
|
| 27 |
2. 너는 세계 최고의 공포 마케팅 카피라이터이다.
|
| 28 |
-
3. 반드시 카피라이팅은 30자 이내로 작성하고,
|
| 29 |
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 30 |
-
5. 반드시 1 부터
|
| 31 |
6. 사람들에게 두려움을 주면서, 동시에 제품이나 서비스를 사용해야만 하는 이유를 강하게 어필하라.
|
| 32 |
7. 사용하지 않을 때의 위험이나 손실을 강조하라.
|
| 33 |
8. 감정적인 단어와 표현을 사용하여 독자의 불안을 증폭시키라
|
|
@@ -44,15 +44,14 @@ def get_category_prompt(category):
|
|
| 44 |
- 바다 환경오염, 식탁으로 되돌아온다. 플라스틱 사용 이대로 괜찮은가요?
|
| 45 |
- "맥주 한잔이라도 날마다 술이 땡긴다면? 이것 의심해야"
|
| 46 |
"""
|
| 47 |
-
|
| 48 |
elif category == "스토리텔링":
|
| 49 |
return """
|
| 50 |
# 스토리텔링 카피라이팅 생성 규칙
|
| 51 |
1. 반드시 한글로 출력하라.
|
| 52 |
2. 너는 세계 최고의 스토리텔링 마케팅 카피라이터이다.
|
| 53 |
-
3. 반드시 카피라이팅은 30자 이내로 작성하고,
|
| 54 |
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 55 |
-
5. 반드시 1 부터
|
| 56 |
6. 제품/서비스와 관련된 짧고 흥미로운 이야기를 만들어라.
|
| 57 |
7. 고객이 공감할 수 있는 상황이나 캐릭터를 설정하라.
|
| 58 |
8. 이야기를 통해 제품/서비스의 가치를 자연스럽게 전달하라.
|
|
@@ -90,15 +89,15 @@ async def call_api_async(session, content, system_message, max_tokens, temperatu
|
|
| 90 |
result = await response.json()
|
| 91 |
return result["choices"][0]["message"]["content"]
|
| 92 |
|
| 93 |
-
# 여러 카테고리에 대해 병렬 비동기 호출
|
| 94 |
async def generate_copywriting_async(categories, topic):
|
| 95 |
max_tokens = 1000
|
| 96 |
temperature = 0.8
|
| 97 |
top_p = 0.95
|
| 98 |
-
|
| 99 |
results = {}
|
|
|
|
| 100 |
async with aiohttp.ClientSession() as session:
|
| 101 |
-
#
|
| 102 |
tasks = {}
|
| 103 |
for category in categories:
|
| 104 |
prompt = get_category_prompt(category)
|
|
@@ -106,29 +105,21 @@ async def generate_copywriting_async(categories, topic):
|
|
| 106 |
tasks[category] = asyncio.create_task(
|
| 107 |
call_api_async(session, user_content, prompt, max_tokens, temperature, top_p)
|
| 108 |
)
|
| 109 |
-
|
| 110 |
-
#
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
results[finished_category] = d.result()
|
| 125 |
-
except Exception as e:
|
| 126 |
-
results[finished_category] = f"에러 발생: {str(e)}"
|
| 127 |
-
del tasks[finished_category]
|
| 128 |
-
done_count += 1
|
| 129 |
-
|
| 130 |
-
# 완료된 카테고리가 있을 때마다 지금까지의 결과를 yield로 반환
|
| 131 |
-
# (Gradio에서 스트리밍으로 처리하여 중간 결과가 바로바로 표시됨)
|
| 132 |
yield results
|
| 133 |
|
| 134 |
# Gradio 인터페이스 부분
|
|
@@ -149,34 +140,30 @@ with gr.Blocks() as iface:
|
|
| 149 |
|
| 150 |
# validate_and_generate 함수를 '비동기 + 스트리밍' 형태로 작성
|
| 151 |
async def validate_and_generate(topic):
|
| 152 |
-
# 입력이 없을 경우
|
| 153 |
if not topic:
|
| 154 |
yield [gr.update(value="주제를 입력하세요")] + [gr.update(value="") for _ in CATEGORIES]
|
| 155 |
return
|
| 156 |
|
| 157 |
-
# 초기 상태
|
| 158 |
yield [gr.update(value="카피라이팅 생성 중...")] + [gr.update(value="대기중...") for _ in CATEGORIES]
|
| 159 |
|
| 160 |
# 비동기로 카테고리별 카피라이팅 생성
|
| 161 |
async for partial_results in generate_copywriting_async(CATEGORIES, topic):
|
| 162 |
-
# partial_results 딕셔너리에 지금까지 완료된 카테고리 정보가 들어옴
|
| 163 |
updates = []
|
| 164 |
for cat in CATEGORIES:
|
| 165 |
-
# 이미 완료된 카테고리는 결과 표시, 미완료는 "대기중..."
|
| 166 |
if cat in partial_results:
|
| 167 |
updates.append(gr.update(value=partial_results[cat]))
|
| 168 |
else:
|
| 169 |
updates.append(gr.update(value="대기중..."))
|
| 170 |
|
| 171 |
-
# 상
|
| 172 |
yield [gr.update(value=f"진행상황: {len(partial_results)}/{len(CATEGORIES)} 카테고리 완료")] + updates
|
| 173 |
|
| 174 |
-
# 버튼 클릭
|
| 175 |
generate_btn.click(
|
| 176 |
fn=validate_and_generate,
|
| 177 |
inputs=[topic],
|
| 178 |
outputs=[status] + [output_boxes[category] for category in CATEGORIES],
|
| 179 |
-
# Gradio에서 비동기 + 스트리밍 생성을 위해 아래 설정
|
| 180 |
api_name="generate_copywriting",
|
| 181 |
queue=True
|
| 182 |
)
|
|
|
|
| 25 |
# 공포 마케팅 카피라이팅 생성 규칙
|
| 26 |
1. 반드시 한글로 출력하라.
|
| 27 |
2. 너는 세계 최고의 공포 마케팅 카피라이터이다.
|
| 28 |
+
3. 반드시 카피라이팅은 30자 이내로 작성하고, 10개만 출력하라.(다른 내용 출력 금지)
|
| 29 |
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 30 |
+
5. 반드시 1 부터 10까지 번호(리스트형태)를 같이 출력하라
|
| 31 |
6. 사람들에게 두려움을 주면서, 동시에 제품이나 서비스를 사용해야만 하는 이유를 강하게 어필하라.
|
| 32 |
7. 사용하지 않을 때의 위험이나 손실을 강조하라.
|
| 33 |
8. 감정적인 단어와 표현을 사용하여 독자의 불안을 증폭시키라
|
|
|
|
| 44 |
- 바다 환경오염, 식탁으로 되돌아온다. 플라스틱 사용 이대로 괜찮은가요?
|
| 45 |
- "맥주 한잔이라도 날마다 술이 땡긴다면? 이것 의심해야"
|
| 46 |
"""
|
|
|
|
| 47 |
elif category == "스토리텔링":
|
| 48 |
return """
|
| 49 |
# 스토리텔링 카피라이팅 생성 규칙
|
| 50 |
1. 반드시 한글로 출력하라.
|
| 51 |
2. 너는 세계 최고의 스토리텔링 마케팅 카피라이터이다.
|
| 52 |
+
3. 반드시 카피라이팅은 30자 이내로 작성하고, 10개만 출력하라.(다른 내용 출력 금지)
|
| 53 |
4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
|
| 54 |
+
5. 반드시 1 부터 10까지 번호(리스트형태)를 같이 출력하라
|
| 55 |
6. 제품/서비스와 관련된 짧고 흥미로운 이야기를 만들어라.
|
| 56 |
7. 고객이 공감할 수 있는 상황이나 캐릭터를 설정하라.
|
| 57 |
8. 이야기를 통해 제품/서비스의 가치를 자연스럽게 전달하라.
|
|
|
|
| 89 |
result = await response.json()
|
| 90 |
return result["choices"][0]["message"]["content"]
|
| 91 |
|
| 92 |
+
# 여러 카테고리에 대해 병렬 비동기 호출 (두 항목을 동시에 시작)
|
| 93 |
async def generate_copywriting_async(categories, topic):
|
| 94 |
max_tokens = 1000
|
| 95 |
temperature = 0.8
|
| 96 |
top_p = 0.95
|
|
|
|
| 97 |
results = {}
|
| 98 |
+
|
| 99 |
async with aiohttp.ClientSession() as session:
|
| 100 |
+
# 카테고리별로 동시에 시작할 태스크 생성
|
| 101 |
tasks = {}
|
| 102 |
for category in categories:
|
| 103 |
prompt = get_category_prompt(category)
|
|
|
|
| 105 |
tasks[category] = asyncio.create_task(
|
| 106 |
call_api_async(session, user_content, prompt, max_tokens, temperature, top_p)
|
| 107 |
)
|
| 108 |
+
|
| 109 |
+
# 모든 태스크가 동시에 시작되며, 먼저 끝난 태스크부터 결과 반환
|
| 110 |
+
for done_task in asyncio.as_completed(tasks.values()):
|
| 111 |
+
finished_category = None
|
| 112 |
+
for cat, t in tasks.items():
|
| 113 |
+
if t == done_task:
|
| 114 |
+
finished_category = cat
|
| 115 |
+
break
|
| 116 |
+
|
| 117 |
+
try:
|
| 118 |
+
results[finished_category] = await done_task
|
| 119 |
+
except Exception as e:
|
| 120 |
+
results[finished_category] = f"에러 발생: {str(e)}"
|
| 121 |
+
|
| 122 |
+
# 현재까지 완료된 결과를 yield
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
yield results
|
| 124 |
|
| 125 |
# Gradio 인터페이스 부분
|
|
|
|
| 140 |
|
| 141 |
# validate_and_generate 함수를 '비동기 + 스트리밍' 형태로 작성
|
| 142 |
async def validate_and_generate(topic):
|
|
|
|
| 143 |
if not topic:
|
| 144 |
yield [gr.update(value="주제를 입력하세요")] + [gr.update(value="") for _ in CATEGORIES]
|
| 145 |
return
|
| 146 |
|
| 147 |
+
# 초기 상태
|
| 148 |
yield [gr.update(value="카피라이팅 생성 중...")] + [gr.update(value="대기중...") for _ in CATEGORIES]
|
| 149 |
|
| 150 |
# 비동기로 카테고리별 카피라이팅 생성
|
| 151 |
async for partial_results in generate_copywriting_async(CATEGORIES, topic):
|
|
|
|
| 152 |
updates = []
|
| 153 |
for cat in CATEGORIES:
|
|
|
|
| 154 |
if cat in partial_results:
|
| 155 |
updates.append(gr.update(value=partial_results[cat]))
|
| 156 |
else:
|
| 157 |
updates.append(gr.update(value="대기중..."))
|
| 158 |
|
| 159 |
+
# 진행상황(완료된 카테고리 수 / 전체 카테고리 수)
|
| 160 |
yield [gr.update(value=f"진행상황: {len(partial_results)}/{len(CATEGORIES)} 카테고리 완료")] + updates
|
| 161 |
|
| 162 |
+
# 버튼 클릭 -> validate_and_generate(비동기 + 스트리밍)
|
| 163 |
generate_btn.click(
|
| 164 |
fn=validate_and_generate,
|
| 165 |
inputs=[topic],
|
| 166 |
outputs=[status] + [output_boxes[category] for category in CATEGORIES],
|
|
|
|
| 167 |
api_name="generate_copywriting",
|
| 168 |
queue=True
|
| 169 |
)
|