AIRider commited on
Commit
8591d17
ยท
verified ยท
1 Parent(s): 150b720

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -53
app.py CHANGED
@@ -129,32 +129,99 @@ def fetch_crawl_results(query):
129
  references = fetch_references(query)
130
  return references[0], references[1], references[2]
131
 
132
- def generate_blog_post(query, prompt_template):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  try:
134
- # ๋กœ๊น… ์„ค์ •
135
- class KST_Formatter(logging.Formatter):
136
- def formatTime(self, record, datefmt=None):
137
- dt = datetime.fromtimestamp(record.created, tz=ZoneInfo("Asia/Seoul"))
138
- return dt.strftime('%Y-%m-%d %H:%M:%S %Z')
139
-
140
- logging.basicConfig(level=logging.INFO)
141
- logger = logging.getLogger(__name__)
142
- handler = logging.StreamHandler()
143
- formatter = KST_Formatter('%(asctime)s - %(levelname)s - %(message)s')
144
- handler.setFormatter(formatter)
145
- logger.addHandler(handler)
146
-
147
- logger.info(f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์‹œ์ž‘: ์ฃผ์ œ - {query}")
148
-
149
  # ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์„ค์ • (๋ฌธ์ž ์ˆ˜)
150
  target_char_length = 3000
151
  max_attempts = 2 # ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜
152
 
153
  # ์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ
154
- logger.info("์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘")
155
  references = fetch_references(query)
156
  ref1, ref2, ref3 = references
157
- logger.info("์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ")
158
 
159
  # OpenAI API ์„ค์ •
160
  model_name = "gpt-4o-mini"
@@ -164,20 +231,13 @@ def generate_blog_post(query, prompt_template):
164
  frequency_penalty = 0.5
165
  presence_penalty = 0.3
166
 
167
- logger.info(f"OpenAI API ์„ค์ •: ๋ชจ๋ธ - {model_name}, ์˜จ๋„ - {temperature}")
168
-
169
- # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ํ•จ์ˆ˜
170
- def remove_unwanted_phrases(text):
171
- unwanted_phrases = [
172
- '์—ฌ๋Ÿฌ๋ถ„', '์ตœ๊ทผ', '๋งˆ์ง€๋ง‰์œผ๋กœ', '๊ฒฐ๋ก ์ ์œผ๋กœ', '๊ฒฐ๊ตญ',
173
- '์ข…ํ•ฉ์ ์œผ๋กœ', '๋”ฐ๋ผ์„œ', '๋งˆ๋ฌด๋ฆฌ', '์š”์•ฝ'
174
- ]
175
- words = re.findall(r'\S+|\n', text)
176
- result_words = [word for word in words if not any(phrase in word for phrase in unwanted_phrases)]
177
- return ' '.join(result_words).replace(' \n ', '\n').replace(' \n', '\n').replace('\n ', '\n')
178
 
179
  # ์ดˆ๊ธฐ ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ
180
- initial_prompt = prompt_template + f"""
 
 
181
  ์ฃผ์ œ: {query}
182
  ์ฐธ๊ณ ๊ธ€ 1: {ref1}
183
  ์ฐธ๊ณ ๊ธ€ 2: {ref2}
@@ -185,7 +245,6 @@ def generate_blog_post(query, prompt_template):
185
  ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜: {target_char_length}
186
  """
187
 
188
- logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์‹œ์ž‘")
189
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„
190
  messages = [{"role": "user", "content": initial_prompt}]
191
  response = openai.ChatCompletion.create(
@@ -198,20 +257,19 @@ def generate_blog_post(query, prompt_template):
198
  presence_penalty=presence_penalty,
199
  )
200
  first_attempt = response['choices'][0]['message']['content'].strip()
201
- logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์™„๋ฃŒ")
202
 
203
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๊ธ€์ž์ˆ˜ ํ™•์ธ
204
  first_attempt_cleaned = remove_unwanted_phrases(first_attempt)
205
  first_attempt_length = len(first_attempt_cleaned)
206
- logger.info(f"์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์ •์ œ ํ›„ ๊ธ€์ž์ˆ˜: {first_attempt_length}")
207
 
208
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์ถฉ์กฑ ์‹œ
209
  if first_attempt_length >= target_char_length:
210
- logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์ถฉ์กฑ")
211
  final_post = f"์ฃผ์ œ: {query}\n\n{first_attempt_cleaned}"
212
  return final_post, ref1, ref2, ref3, first_attempt_length
213
 
214
- logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์ค€๋น„")
 
 
215
  # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ํ”„๋กฌํ”„ํŠธ
216
  revision_prompt = f"""
217
  ์ด์ „์— ์ƒ์„ฑ๋œ ๊ธ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ์ง€์นจ์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์„œ ๊ธ€์„ ํ‡ด๊ณ (revision)ํ•˜๋ผ:
@@ -223,16 +281,14 @@ def generate_blog_post(query, prompt_template):
223
  3. ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์ด ์•„๋‹Œ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”.
224
  4. ๋ฐ˜๋“œ์‹œ ์ด ํ‘œํ˜„๋“ค์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”: ์—ฌ๋Ÿฌ๋ถ„, ์ตœ๊ทผ, ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ฒฐ๋ก ์ ์œผ๋กœ, ๊ฒฐ๊ตญ, ์ข…ํ•ฉ์ ์œผ๋กœ, ๋”ฐ๋ผ์„œ, ๋งˆ๋ฌด๋ฆฌ, ์š”์•ฝ.
225
  5. ๊ธ€์˜ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ ๋‹จ๋ฝ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•ด์ฃผ์„ธ์š”.
226
-
227
  ์ด์ „ ๊ธ€:
228
  {first_attempt_cleaned}
229
-
230
- ์ฐธ๊ณ ๊ธ€ 1: {ref1}
231
- ์ฐธ๊ณ ๊ธ€ 2: {ref2}
232
- ์ฐธ๊ณ ๊ธ€ 3: {ref3}
233
  """
234
 
235
- logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์‹œ์ž‘")
236
  # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )
237
  messages = [{"role": "user", "content": revision_prompt}]
238
  response = openai.ChatCompletion.create(
@@ -245,7 +301,6 @@ def generate_blog_post(query, prompt_template):
245
  presence_penalty=presence_penalty,
246
  )
247
  revised_attempt = response['choices'][0]['message']['content'].strip()
248
- logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์™„๋ฃŒ")
249
 
250
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ
251
  final_post = remove_unwanted_phrases(revised_attempt)
@@ -253,13 +308,10 @@ def generate_blog_post(query, prompt_template):
253
  # ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ๊ตฌ์„ฑ
254
  final_post = f"์ฃผ์ œ: {query}\n\n{final_post}"
255
  actual_char_length = len(final_post)
256
- logger.info(f"์ตœ์ข… ๊ธ€์ž์ˆ˜: {actual_char_length}")
257
 
258
- logger.info("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์™„๋ฃŒ")
259
  return final_post, ref1, ref2, ref3, actual_char_length
260
 
261
  except Exception as e:
262
- logger.error(f"generate_blog_post ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
263
  return f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", "", "", 0
264
 
265
  # PDF ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ํ•จ์ˆ˜ ์ •์˜
@@ -323,7 +375,6 @@ DEFAULT_PROMPT_TEMPLATE = """
323
  6. ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์„ ๋ณด๊ณ  ์—ฌํ–‰ ์Šคํƒ€์ผ(๋šœ๋ฒ…์ด, ๊ฐ€์กฑ(์•„์ด, ๋ถ€๋ชจ๋‹˜), ์ปคํ”Œ, ์†”๋กœ ๋“ฑ)์„ ํ•œ๊ฐ€์ง€ ์„ ์ •ํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ผ
324
  7. ์–ดํˆฌ๋Š” ์ฐธ๊ณ ๊ธ€์˜ ์–ดํˆฌ๋ฅผ ๋ฐ˜์˜ํ•˜๋˜ ์—ฌํ–‰์— ๋Œ€ํ•œ ์„ค๋ ˆ์ž„์ด ๋‹ด๊ธด ์–ดํˆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ
325
  * ๋ชจ๋“  ๋‚ด์šฉ๋“ค์€ ์„น์…˜์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ง๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๊ฒŒ ์ž‘์„ฑํ•˜๋ผ
326
-
327
  [์—ฌํ–‰ ๊ธ€ ์ž‘์„ฑ ์„ธ๋ถ€ ๊ทœ์น™]
328
  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฃผ์ œ์™€ ์ฃผ์–ด์ง„ ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌํ–‰ ๋ธ”๋กœ๊ทธ ๊ธ€ 1๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๋ผ
329
  2. ๊ธ€์˜ ์ฃผ์ œ๋Š” ์ž…๋ ฅ๋œ ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์— ๋งž๊ฒŒ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ
@@ -338,7 +389,6 @@ DEFAULT_PROMPT_TEMPLATE = """
338
  6. ๊ฐ ํ™œ๋™์—์„œ ๊ฒช์€ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜(๋Œ€๊ธฐ ์‹œ๊ฐ„, ๊ตํ†ต, ๋‚ ์”จ ๋“ฑ)์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ผ
339
  7. ์—ฌํ–‰ ์ค‘ ๋จน์€ ์Œ์‹์ด๋‚˜ ์ฒดํ—˜์„ ์ค‘์‹ฌ์œผ๋กœ, ๊ฒฝํ—˜๊ณผ ๋Š๋‚Œ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์ •๋ณด(๋ฉ”๋‰ด, ๊ฐ€๊ฒฉ, ์œ„์น˜ ๋“ฑ)๋ฅผ ์ž‘์„ฑ
340
  8. ์—ฌํ–‰๊ณผ ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ์ข… ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ผ
341
-
342
  [์—ฌํ–‰๊ณผ ๊ด€๋ จ๋œ ๊ฐ์ข… ์ •๋ณด]
343
  1. ์ž…์žฅ๋ฃŒ, ์ค€๋น„๋ฌผ, ์‹œ๊ฐ„, ์ฃผ์ฐจ, ๊ตํ†ต์ˆ˜๋‹จ, ํ–‰์‚ฌ, ์ผ์ •, ๊ฐ€๊ฒฉ, ๋ง›์ง‘์ •๋ณด, ๊ฟ€ํŒ, ์ˆ™์†Œ ์„ ํƒ ๊ธฐ์ค€, ์ฃผ๋ณ€ ํ™˜๊ฒฝ ๋“ฑ
344
  2. ๊ณ„์ ˆ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๊ด€๊ด‘์ง€์˜ ๋ชจ์Šต, ์ฆ๊ธธ ๊ฑฐ๋ฆฌ, ์ฃผ์˜์‚ฌํ•ญ ๋“ฑ
@@ -349,7 +399,6 @@ DEFAULT_PROMPT_TEMPLATE = """
349
  7. ๋Œ€์ค‘๊ตํ†ต, ๋ Œํ„ฐ์นด ๋“ฑ ์ด๋™ ์ˆ˜๋‹จ์— ๋”ฐ๋ฅธ ์—ฌํ–‰ ํŒ
350
  8. ์—ฌํ–‰ ์ค‘ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” ์–ด๋ ค์›€(์˜ˆ: ์›จ์ดํŒ…, ๋‚ ์”จ ๋ณ€ํ™”)๊ณผ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ• ๋“ฑ
351
  9. ์—ฌํ–‰์ง€์˜ ์—ญ์‚ฌ๋‚˜ ๋ฌธํ™”์  ๋ฐฐ๊ฒฝ์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœ
352
-
353
  [๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•ด์•ผ ํ•  ํ‘œํ˜„]
354
  1. ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ๊ธ€์˜ ํฌํ•จ๋œ ๋งํฌ(URL)๋Š” ์ œ์™ธ
355
  2. ์ฐธ๊ณ ๊ธ€์—์„œ '๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”'์™€ ๊ฐ™์€ ๋งํฌ ์ด๋™์˜ ๋ฌธ๊ตฌ๋Š” ์ œ์™ธ
@@ -364,20 +413,22 @@ with gr.Blocks() as iface:
364
 
365
  query_input = gr.Textbox(lines=1, placeholder="ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”...", label="ํ‚ค์›Œ๋“œ")
366
 
367
- prompt_input = gr.Textbox(lines=10, value=DEFAULT_PROMPT_TEMPLATE, label="ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ", visible=True)
 
 
368
  generate_button = gr.Button("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ")
369
 
370
  output_text = gr.Textbox(label="์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€")
371
- ref1_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 1", lines=10, visible=True)
372
- ref2_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 2", lines=10, visible=True)
373
- ref3_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 3", lines=10, visible=True)
374
 
375
  save_pdf_button = gr.Button("PDF๋กœ ์ €์žฅ")
376
  pdf_output = gr.File(label="์ƒ์„ฑ๋œ PDF ํŒŒ์ผ")
377
 
378
  generate_button.click(
379
  generate_blog_post,
380
- inputs=[query_input, prompt_input],
381
  outputs=[output_text, ref1_text, ref2_text, ref3_text],
382
  show_progress=True
383
  )
@@ -388,6 +439,7 @@ with gr.Blocks() as iface:
388
  outputs=[pdf_output],
389
  show_progress=True
390
  )
 
391
  # Gradio ์•ฑ ์‹คํ–‰
392
  if __name__ == "__main__":
393
  iface.launch()
 
129
  references = fetch_references(query)
130
  return references[0], references[1], references[2]
131
 
132
+ def get_style_prompt(style="์นœ๊ทผํ•œ"):
133
+ prompts = {
134
+ "์นœ๊ทผํ•œ": """
135
+ [์นœ๊ทผํ•œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
136
+ 1. ํ†ค๊ณผ ์–ด์กฐ
137
+ - ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
138
+ 2. ๋ฌธ์žฅ ๋ฐ ์–ดํˆฌ
139
+ - ๋ฐ˜๋“œ์‹œ 'ํ•ด์š”์ฒด'๋กœ ์ž‘์„ฑ, ์ ˆ๋Œ€ '์Šต๋‹ˆ๋‹ค'์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ.
140
+ - '~์š”'๋กœ ๋๋‚˜๋„๋ก ์ž‘์„ฑ, '~๋‹ค'๋กœ ๋๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๋ผ
141
+ - ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
142
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
143
+ - ์ „๋ฌธ ์šฉ์–ด ๋Œ€์‹  ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
144
+ - ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฐœ๋… ์„ค๋ช…
145
+ - ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋Š๋‚Œ ์ฃผ๊ธฐ
146
+ 4. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
147
+ - ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
148
+ - ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ๋ฅผ ๋…๋ คํ•˜๋Š” ๋ฌธ๊ตฌ ์‚ฌ์šฉ
149
+ ์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๊ฐ€๋ฒผ์šด ํ†ค์€ ์ง€์–‘ํ•˜๊ณ , ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋Š” ์„ ์—์„œ ์นœ๊ทผํ•จ ์œ ์ง€
150
+ (์˜ˆ์‹œ: ์ž‡๋‹˜๋“ค~ ์˜ค๋ ˆ์˜ค ์ฝ”์นด์ฝœ๋ผ๋ง›์ด์ƒˆ๋กœ ์ถœ์‹œ๊ฐ€ ๋๋‹ค๋Š”๊ฑฐ ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?!ใ…Ž ์˜ค๋ ˆ์˜ค ์ฝ”์นด์ฝœ๋ผ๋ง›์€ ์–ด๋–ค์ง€ ์†”์งํ‰๊ณผ๊ตฌ๋งค์ •๋ณด, ๊ฐ€๊ฒฉ, ์นผ๋กœ๋ฆฌ ๋“ฑ์— ๋Œ€ํ•ด ์ž์„ธ~ ํžˆ ์ ์–ด๋ณด๋„๋ก ํ• ๊ป˜์š”! ์˜ค๋ ˆ์˜ค๋ฅผ ์ข‹์•„ํ•˜๋Š” ์•„๋“ค์—๊ฒŒ๊ฐ„์‹์œผ๋กœ ์˜ค๋ ˆ์˜ค ์ฝ”์นด์ฝœ๋ผ๋ง›์„ ์คฌ๋”๋‹ˆ๋ง›์žˆ๋‹ค๊ณ  ์ข‹์•„ํ•˜๋”๋ผ๊ตฌ์š”. ์ฝœ๋ผํ–ฅ์ด ๋‚˜์„œ ๋” ๋งˆ์Œ์— ๋“ ๋‹ค๋ฉฐใ…Ž๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๋ณ„ โญ๏ธโญ๏ธโญ๏ธ.์š”๊ฑด ๊ฐœ์ธ์ฐจ๊ฐ€ ์žˆ์„๊ฑฐ ๊ฐ™์•„์š”~)
151
+ """,
152
+ "์ผ๋ฐ˜": """
153
+ #์ผ๋ฐ˜์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
154
+ 1. ํ†ค๊ณผ ์–ด์กฐ
155
+ - ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
156
+ - ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")
157
+ 2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
158
+ - ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์ œ์‹œ๋กœ ์‹œ์ž‘
159
+ - ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ
160
+ - ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
161
+ - ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ
162
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
163
+ - ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
164
+ - ํ•„์š”์‹œ ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
165
+ - ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 
166
+ 4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
167
+ - ๋ถˆ๋ฆฟ ํฌ์ธํŠธ๋‚˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ๊ตฌ์กฐํ™”
168
+ - ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๊ตต์€ ๊ธ€์”จ๋‚˜ ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
169
+ 5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
170
+ - ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
171
+ - ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ
172
+ 6. ๋งˆ๋ฌด๋ฆฌ
173
+ - ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋‹จํžˆ ์š”์•ฝ
174
+ - ์ถ”๊ฐ€ ์ •๋ณด์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
175
+ ์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๋”ฑ๋”ฑํ•˜๊ฑฐ๋‚˜ ์ง€๋ฃจํ•˜์ง€ ์•Š๋„๋ก ๊ท ํ˜• ์œ ์ง€
176
+ """,
177
+ "์ „๋ฌธ์ ์ธ": """
178
+ #์ „๋ฌธ์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
179
+ 1. ํ†ค๊ณผ ๊ตฌ์กฐ
180
+ - ๊ณต์‹์ ์ด๊ณ  ํ•™์ˆ ์ ์ธ ํ†ค ์‚ฌ์šฉ
181
+ - ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
182
+ - ๋ช…ํ™•ํ•œ ์„œ๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก  ๊ตฌ์กฐ
183
+ - ์ฒด๊ณ„์ ์ธ ๋…ผ์  ์ „๊ฐœ
184
+ - ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
185
+ 2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
186
+ - ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ •ํ™•ํžˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์žฅ ๊ตฌ์กฐ ์‚ฌ์šฉ
187
+ - ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
188
+ - ํ•ด๋‹น ๋ถ„์•ผ์˜ ์ „๋ฌธ ์šฉ์–ด ์ ๊ทน ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
189
+ - ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ์‚ฌ๊ณ  ์ „๊ฐœ
190
+ - ๋‹ค์–‘ํ•œ ๊ด€์  ์ œ์‹œ ๋ฐ ๋น„๊ต
191
+ 3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
192
+ - ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜ ์ธ์šฉ
193
+ - ํ•„์š”์‹œ ๊ฐ์ฃผ๋‚˜ ์ฐธ๊ณ ๋ฌธํ—Œ ๋ชฉ๋ก ํฌํ•จ
194
+ - ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ํ…์ŠคํŠธ๋กœ ๋ช…ํ™•ํžˆ ์„ค๋ช…
195
+ 4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
196
+ - ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ์‚ฌ์šฉ
197
+ - ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‚˜ ์šฉ์–ด๋Š” ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
198
+ - ๊ธด ์ธ์šฉ๋ฌธ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„
199
+ 5. ๋งˆ๋ฌด๋ฆฌ
200
+ - ํ•ต์‹ฌ ๋…ผ์  ์žฌ๊ฐ•์กฐ
201
+ - ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ์ด๋‚˜ ์‹ค๋ฌด์  ํ•จ์˜ ์ œ์‹œ
202
+ ์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์ค€์€ ์ง€์–‘
203
+ """
204
+ }
205
+ return prompts.get(style, prompts["์นœ๊ทผํ•œ"])
206
+
207
+ def remove_unwanted_phrases(text):
208
+ unwanted_phrases = [
209
+ '์—ฌ๋Ÿฌ๋ถ„', '์ตœ๊ทผ', '๋งˆ์ง€๋ง‰์œผ๋กœ', '๊ฒฐ๋ก ์ ์œผ๋กœ', '๊ฒฐ๊ตญ',
210
+ '์ข…ํ•ฉ์ ์œผ๋กœ', '๋”ฐ๋ผ์„œ', '๋งˆ๋ฌด๋ฆฌ', '๋์œผ๋กœ', '์š”์•ฝ'
211
+ ]
212
+ words = re.findall(r'\S+|\n', text)
213
+ result_words = [word for word in words if not any(phrase in word for phrase in unwanted_phrases)]
214
+ return ' '.join(result_words).replace(' \n ', '\n').replace(' \n', '\n').replace('\n ', '\n')
215
+
216
+ def generate_blog_post(query, prompt_template, style="์นœ๊ทผํ•œ"):
217
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  # ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์„ค์ • (๋ฌธ์ž ์ˆ˜)
219
  target_char_length = 3000
220
  max_attempts = 2 # ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜
221
 
222
  # ์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ
 
223
  references = fetch_references(query)
224
  ref1, ref2, ref3 = references
 
225
 
226
  # OpenAI API ์„ค์ •
227
  model_name = "gpt-4o-mini"
 
231
  frequency_penalty = 0.5
232
  presence_penalty = 0.3
233
 
234
+ # ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
235
+ style_prompt = get_style_prompt(style)
 
 
 
 
 
 
 
 
 
236
 
237
  # ์ดˆ๊ธฐ ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ
238
+ initial_prompt = f"""
239
+ {prompt_template}
240
+ {style_prompt}
241
  ์ฃผ์ œ: {query}
242
  ์ฐธ๊ณ ๊ธ€ 1: {ref1}
243
  ์ฐธ๊ณ ๊ธ€ 2: {ref2}
 
245
  ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜: {target_char_length}
246
  """
247
 
 
248
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„
249
  messages = [{"role": "user", "content": initial_prompt}]
250
  response = openai.ChatCompletion.create(
 
257
  presence_penalty=presence_penalty,
258
  )
259
  first_attempt = response['choices'][0]['message']['content'].strip()
 
260
 
261
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๊ธ€์ž์ˆ˜ ํ™•์ธ
262
  first_attempt_cleaned = remove_unwanted_phrases(first_attempt)
263
  first_attempt_length = len(first_attempt_cleaned)
 
264
 
265
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์ถฉ์กฑ ์‹œ
266
  if first_attempt_length >= target_char_length:
 
267
  final_post = f"์ฃผ์ œ: {query}\n\n{first_attempt_cleaned}"
268
  return final_post, ref1, ref2, ref3, first_attempt_length
269
 
270
+ # ๊ฐ€์žฅ ๊ธด ์ฐธ๊ณ ๊ธ€ ์„ ํƒ
271
+ longest_ref = max([ref1, ref2, ref3], key=len)
272
+
273
  # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ํ”„๋กฌํ”„ํŠธ
274
  revision_prompt = f"""
275
  ์ด์ „์— ์ƒ์„ฑ๋œ ๊ธ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ์ง€์นจ์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์„œ ๊ธ€์„ ํ‡ด๊ณ (revision)ํ•˜๋ผ:
 
281
  3. ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์ด ์•„๋‹Œ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”.
282
  4. ๋ฐ˜๋“œ์‹œ ์ด ํ‘œํ˜„๋“ค์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”: ์—ฌ๋Ÿฌ๋ถ„, ์ตœ๊ทผ, ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ฒฐ๋ก ์ ์œผ๋กœ, ๊ฒฐ๊ตญ, ์ข…ํ•ฉ์ ์œผ๋กœ, ๋”ฐ๋ผ์„œ, ๋งˆ๋ฌด๋ฆฌ, ์š”์•ฝ.
283
  5. ๊ธ€์˜ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ ๋‹จ๋ฝ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•ด์ฃผ์„ธ์š”.
284
+ 6. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•˜์„ธ์š”.
285
  ์ด์ „ ๊ธ€:
286
  {first_attempt_cleaned}
287
+ ์ฐธ๊ณ ๊ธ€: {longest_ref}
288
+ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ:
289
+ {style_prompt}
 
290
  """
291
 
 
292
  # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )
293
  messages = [{"role": "user", "content": revision_prompt}]
294
  response = openai.ChatCompletion.create(
 
301
  presence_penalty=presence_penalty,
302
  )
303
  revised_attempt = response['choices'][0]['message']['content'].strip()
 
304
 
305
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ
306
  final_post = remove_unwanted_phrases(revised_attempt)
 
308
  # ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ๊ตฌ์„ฑ
309
  final_post = f"์ฃผ์ œ: {query}\n\n{final_post}"
310
  actual_char_length = len(final_post)
 
311
 
 
312
  return final_post, ref1, ref2, ref3, actual_char_length
313
 
314
  except Exception as e:
 
315
  return f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", "", "", 0
316
 
317
  # PDF ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ํ•จ์ˆ˜ ์ •์˜
 
375
  6. ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์„ ๋ณด๊ณ  ์—ฌํ–‰ ์Šคํƒ€์ผ(๋šœ๋ฒ…์ด, ๊ฐ€์กฑ(์•„์ด, ๋ถ€๋ชจ๋‹˜), ์ปคํ”Œ, ์†”๋กœ ๋“ฑ)์„ ํ•œ๊ฐ€์ง€ ์„ ์ •ํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ผ
376
  7. ์–ดํˆฌ๋Š” ์ฐธ๊ณ ๊ธ€์˜ ์–ดํˆฌ๋ฅผ ๋ฐ˜์˜ํ•˜๋˜ ์—ฌํ–‰์— ๋Œ€ํ•œ ์„ค๋ ˆ์ž„์ด ๋‹ด๊ธด ์–ดํˆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ
377
  * ๋ชจ๋“  ๋‚ด์šฉ๋“ค์€ ์„น์…˜์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ง๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๊ฒŒ ์ž‘์„ฑํ•˜๋ผ
 
378
  [์—ฌํ–‰ ๊ธ€ ์ž‘์„ฑ ์„ธ๋ถ€ ๊ทœ์น™]
379
  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฃผ์ œ์™€ ์ฃผ์–ด์ง„ ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌํ–‰ ๋ธ”๋กœ๊ทธ ๊ธ€ 1๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๋ผ
380
  2. ๊ธ€์˜ ์ฃผ์ œ๋Š” ์ž…๋ ฅ๋œ ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์— ๋งž๊ฒŒ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ
 
389
  6. ๊ฐ ํ™œ๋™์—์„œ ๊ฒช์€ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜(๋Œ€๊ธฐ ์‹œ๊ฐ„, ๊ตํ†ต, ๋‚ ์”จ ๋“ฑ)์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ผ
390
  7. ์—ฌํ–‰ ์ค‘ ๋จน์€ ์Œ์‹์ด๋‚˜ ์ฒดํ—˜์„ ์ค‘์‹ฌ์œผ๋กœ, ๊ฒฝํ—˜๊ณผ ๋Š๋‚Œ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์ •๋ณด(๋ฉ”๋‰ด, ๊ฐ€๊ฒฉ, ์œ„์น˜ ๋“ฑ)๋ฅผ ์ž‘์„ฑ
391
  8. ์—ฌํ–‰๊ณผ ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ์ข… ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ผ
 
392
  [์—ฌํ–‰๊ณผ ๊ด€๋ จ๋œ ๊ฐ์ข… ์ •๋ณด]
393
  1. ์ž…์žฅ๋ฃŒ, ์ค€๋น„๋ฌผ, ์‹œ๊ฐ„, ์ฃผ์ฐจ, ๊ตํ†ต์ˆ˜๋‹จ, ํ–‰์‚ฌ, ์ผ์ •, ๊ฐ€๊ฒฉ, ๋ง›์ง‘์ •๋ณด, ๊ฟ€ํŒ, ์ˆ™์†Œ ์„ ํƒ ๊ธฐ์ค€, ์ฃผ๋ณ€ ํ™˜๊ฒฝ ๋“ฑ
394
  2. ๊ณ„์ ˆ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๊ด€๊ด‘์ง€์˜ ๋ชจ์Šต, ์ฆ๊ธธ ๊ฑฐ๋ฆฌ, ์ฃผ์˜์‚ฌํ•ญ ๋“ฑ
 
399
  7. ๋Œ€์ค‘๊ตํ†ต, ๋ Œํ„ฐ์นด ๋“ฑ ์ด๋™ ์ˆ˜๋‹จ์— ๋”ฐ๋ฅธ ์—ฌํ–‰ ํŒ
400
  8. ์—ฌํ–‰ ์ค‘ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” ์–ด๋ ค์›€(์˜ˆ: ์›จ์ดํŒ…, ๋‚ ์”จ ๋ณ€ํ™”)๊ณผ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ• ๋“ฑ
401
  9. ์—ฌํ–‰์ง€์˜ ์—ญ์‚ฌ๋‚˜ ๋ฌธํ™”์  ๋ฐฐ๊ฒฝ์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœ
 
402
  [๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•ด์•ผ ํ•  ํ‘œํ˜„]
403
  1. ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ๊ธ€์˜ ํฌํ•จ๋œ ๋งํฌ(URL)๋Š” ์ œ์™ธ
404
  2. ์ฐธ๊ณ ๊ธ€์—์„œ '๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”'์™€ ๊ฐ™์€ ๋งํฌ ์ด๋™์˜ ๋ฌธ๊ตฌ๋Š” ์ œ์™ธ
 
413
 
414
  query_input = gr.Textbox(lines=1, placeholder="ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”...", label="ํ‚ค์›Œ๋“œ")
415
 
416
+ style_input = gr.Radio(["์นœ๊ทผํ•œ", "์ผ๋ฐ˜", "์ „๋ฌธ์ ์ธ"], label="ํฌ์ŠคํŒ… ์Šคํƒ€์ผ", value="์นœ๊ทผํ•œ")
417
+
418
+ prompt_input = gr.Textbox(lines=10, value=DEFAULT_PROMPT_TEMPLATE, label="ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ", visible=False)
419
  generate_button = gr.Button("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ")
420
 
421
  output_text = gr.Textbox(label="์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€")
422
+ ref1_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 1", lines=10, visible=False)
423
+ ref2_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 2", lines=10, visible=False)
424
+ ref3_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ€ 3", lines=10, visible=False)
425
 
426
  save_pdf_button = gr.Button("PDF๋กœ ์ €์žฅ")
427
  pdf_output = gr.File(label="์ƒ์„ฑ๋œ PDF ํŒŒ์ผ")
428
 
429
  generate_button.click(
430
  generate_blog_post,
431
+ inputs=[query_input, prompt_input, style_input],
432
  outputs=[output_text, ref1_text, ref2_text, ref3_text],
433
  show_progress=True
434
  )
 
439
  outputs=[pdf_output],
440
  show_progress=True
441
  )
442
+
443
  # Gradio ์•ฑ ์‹คํ–‰
444
  if __name__ == "__main__":
445
  iface.launch()