Kims12 commited on
Commit
c6da03e
·
verified ·
1 Parent(s): 0de8588

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -38
app.py CHANGED
@@ -25,9 +25,9 @@ def get_category_prompt(category):
25
  # 공포 마케팅 카피라이팅 생성 규칙
26
  1. 반드시 한글로 출력하라.
27
  2. 너는 세계 최고의 공포 마케팅 카피라이터이다.
28
- 3. 반드시 카피라이팅은 30자 이내로 작성하고, 20개만 출력하라.(다른 내용 출력 금지)
29
  4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
30
- 5. 반드시 1 부터 20까지 번호(리스트형태)를 같이 출력하라
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자 이내로 작성하고, 20개만 출력하라.(다른 내용 출력 금지)
54
  4. 반드시 입력된 주제로만 작성하고 예시를 참고하여 내용을 보강하라.
55
- 5. 반드시 1 부터 20까지 번호(리스트형태)를 같이 출력하라
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
- # 카테고리별로 async 호출 생성
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
- done_count = 0
112
- total = len(tasks)
113
- while done_count < total:
114
- done, pending = await asyncio.wait(tasks.values(), return_when=asyncio.FIRST_COMPLETED)
115
- for d in done:
116
- finished_category = None
117
- # 어느 카테고리 태스크가 끝났는지 식별
118
- for cat, task_obj in tasks.items():
119
- if task_obj == d:
120
- finished_category = cat
121
- break
122
- if finished_category:
123
- try:
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
- # 버튼 클릭 validate_and_generate 호출
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
  )