AIRider commited on
Commit
25d8537
ยท
verified ยท
1 Parent(s): 4235a84

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -11
app.py CHANGED
@@ -130,13 +130,30 @@ def fetch_crawl_results(query):
130
 
131
  def generate_blog_post(query, prompt_template):
132
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  # ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์„ค์ • (๋ฌธ์ž ์ˆ˜)
134
  target_char_length = 3000
135
  max_attempts = 2 # ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜
136
 
137
  # ์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ
 
138
  references = fetch_references(query)
139
  ref1, ref2, ref3 = references
 
140
 
141
  # OpenAI API ์„ค์ •
142
  model_name = "gpt-4o-mini"
@@ -146,6 +163,8 @@ def generate_blog_post(query, prompt_template):
146
  frequency_penalty = 0.5
147
  presence_penalty = 0.3
148
 
 
 
149
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ํ•จ์ˆ˜
150
  def remove_unwanted_phrases(text):
151
  unwanted_phrases = [
@@ -165,6 +184,7 @@ def generate_blog_post(query, prompt_template):
165
  ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜: {target_char_length}
166
  """
167
 
 
168
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„
169
  messages = [{"role": "user", "content": initial_prompt}]
170
  response = openai.ChatCompletion.create(
@@ -177,26 +197,40 @@ def generate_blog_post(query, prompt_template):
177
  presence_penalty=presence_penalty,
178
  )
179
  first_attempt = response['choices'][0]['message']['content'].strip()
180
-
181
- # ๋‘ ๋ฒˆ์งธ ์‹œ๋„๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ํ”„๋กฌํ”„ํŠธ
182
- additional_prompt = f"""
183
- ์ด์ „์— ์ƒ์„ฑ๋œ ๊ธ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ์ง€์นจ์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์„œ ๊ธ€์„ ํ‡ด๊ณ (revision)ํ•˜๋ผ
184
- 1. ๋ฐ˜๋“œ์‹œ ์ด์ „ ๊ธ€(first_attempt)์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด์šฉ์„ ๋ณด์™„ํ•˜๋ผ
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  2. ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์ด ์•„๋‹Œ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”.
186
  3. ๋ฐ˜๋“œ์‹œ ์ด ํ‘œํ˜„๋“ค์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”: ์—ฌ๋Ÿฌ๋ถ„, ์ตœ๊ทผ, ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ฒฐ๋ก ์ ์œผ๋กœ, ๊ฒฐ๊ตญ, ์ข…ํ•ฉ์ ์œผ๋กœ, ๋”ฐ๋ผ์„œ, ๋งˆ๋ฌด๋ฆฌ, ์š”์•ฝ.
187
  4. ๊ธ€์˜ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ ๋‹จ๋ฝ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•ด์ฃผ์„ธ์š”.
188
  5. ๋ฐ˜๋“œ์‹œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜({target_char_length}์ž)๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ๋‚ด์šฉ์„ ํ™•์žฅํ•˜์„ธ์š”.
189
 
190
  ์ด์ „ ๊ธ€:
191
- {first_attempt}
192
 
193
  ์ฐธ๊ณ ๊ธ€ 1: {ref1}
194
  ์ฐธ๊ณ ๊ธ€ 2: {ref2}
195
  ์ฐธ๊ณ ๊ธ€ 3: {ref3}
196
  """
197
 
198
- # ๋‘ ๋ฒˆ์งธ ์‹œ๋„
199
- messages = [{"role": "user", "content": additional_prompt}]
 
200
  response = openai.ChatCompletion.create(
201
  model=model_name,
202
  messages=messages,
@@ -206,19 +240,22 @@ def generate_blog_post(query, prompt_template):
206
  frequency_penalty=frequency_penalty,
207
  presence_penalty=presence_penalty,
208
  )
209
- second_attempt = response['choices'][0]['message']['content'].strip()
 
210
 
211
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ
212
- final_post = remove_unwanted_phrases(second_attempt)
213
 
214
  # ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ๊ตฌ์„ฑ
215
  final_post = f"์ฃผ์ œ: {query}\n\n{final_post}"
216
  actual_char_length = len(final_post)
 
217
 
 
218
  return final_post, ref1, ref2, ref3, actual_char_length
219
 
220
  except Exception as e:
221
- print(f"generate_blog_post ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
222
  return f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", "", "", 0
223
 
224
  # PDF ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ํ•จ์ˆ˜ ์ •์˜
 
130
 
131
  def generate_blog_post(query, prompt_template):
132
  try:
133
+ # ๋กœ๊น… ์„ค์ •
134
+ class KST_Formatter(logging.Formatter):
135
+ def formatTime(self, record, datefmt=None):
136
+ dt = datetime.fromtimestamp(record.created, tz=ZoneInfo("Asia/Seoul"))
137
+ return dt.strftime('%Y-%m-%d %H:%M:%S %Z')
138
+
139
+ logging.basicConfig(level=logging.INFO)
140
+ logger = logging.getLogger(__name__)
141
+ handler = logging.StreamHandler()
142
+ formatter = KST_Formatter('%(asctime)s - %(levelname)s - %(message)s')
143
+ handler.setFormatter(formatter)
144
+ logger.addHandler(handler)
145
+
146
+ logger.info(f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์‹œ์ž‘: ์ฃผ์ œ - {query}")
147
+
148
  # ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์„ค์ • (๋ฌธ์ž ์ˆ˜)
149
  target_char_length = 3000
150
  max_attempts = 2 # ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜
151
 
152
  # ์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ
153
+ logger.info("์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘")
154
  references = fetch_references(query)
155
  ref1, ref2, ref3 = references
156
+ logger.info("์ฐธ๊ณ ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ")
157
 
158
  # OpenAI API ์„ค์ •
159
  model_name = "gpt-4o-mini"
 
163
  frequency_penalty = 0.5
164
  presence_penalty = 0.3
165
 
166
+ logger.info(f"OpenAI API ์„ค์ •: ๋ชจ๋ธ - {model_name}, ์˜จ๋„ - {temperature}")
167
+
168
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ํ•จ์ˆ˜
169
  def remove_unwanted_phrases(text):
170
  unwanted_phrases = [
 
184
  ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜: {target_char_length}
185
  """
186
 
187
+ logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์‹œ์ž‘")
188
  # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„
189
  messages = [{"role": "user", "content": initial_prompt}]
190
  response = openai.ChatCompletion.create(
 
197
  presence_penalty=presence_penalty,
198
  )
199
  first_attempt = response['choices'][0]['message']['content'].strip()
200
+ logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์™„๋ฃŒ")
201
+
202
+ # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๊ธ€์ž์ˆ˜ ํ™•์ธ
203
+ first_attempt_cleaned = remove_unwanted_phrases(first_attempt)
204
+ first_attempt_length = len(first_attempt_cleaned)
205
+ logger.info(f"์ฒซ ๋ฒˆ์งธ ์‹œ๋„ ์ •์ œ ํ›„ ๊ธ€์ž์ˆ˜: {first_attempt_length}")
206
+
207
+ # ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์ถฉ์กฑ ์‹œ
208
+ if first_attempt_length >= target_char_length:
209
+ logger.info("์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜ ์ถฉ์กฑ")
210
+ final_post = f"์ฃผ์ œ: {query}\n\n{first_attempt_cleaned}"
211
+ return final_post, ref1, ref2, ref3, first_attempt_length
212
+
213
+ logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์ค€๋น„")
214
+ # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ํ”„๋กฌํ”„ํŠธ
215
+ revision_prompt = f"""
216
+ ์ด์ „์— ์ƒ์„ฑ๋œ ๊ธ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ์ง€์นจ์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์„œ ๊ธ€์„ ํ‡ด๊ณ (revision)ํ•˜์„ธ์š”:
217
+ 1. ๋ฐ˜๋“œ์‹œ ์ด์ „ ๊ธ€์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด์šฉ์„ ๋ณด์™„ํ•˜์„ธ์š”.
218
  2. ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์ด ์•„๋‹Œ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”.
219
  3. ๋ฐ˜๋“œ์‹œ ์ด ํ‘œํ˜„๋“ค์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”: ์—ฌ๋Ÿฌ๋ถ„, ์ตœ๊ทผ, ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ฒฐ๋ก ์ ์œผ๋กœ, ๊ฒฐ๊ตญ, ์ข…ํ•ฉ์ ์œผ๋กœ, ๋”ฐ๋ผ์„œ, ๋งˆ๋ฌด๋ฆฌ, ์š”์•ฝ.
220
  4. ๊ธ€์˜ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐ ๋‹จ๋ฝ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•ด์ฃผ์„ธ์š”.
221
  5. ๋ฐ˜๋“œ์‹œ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜({target_char_length}์ž)๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ๋‚ด์šฉ์„ ํ™•์žฅํ•˜์„ธ์š”.
222
 
223
  ์ด์ „ ๊ธ€:
224
+ {first_attempt_cleaned}
225
 
226
  ์ฐธ๊ณ ๊ธ€ 1: {ref1}
227
  ์ฐธ๊ณ ๊ธ€ 2: {ref2}
228
  ์ฐธ๊ณ ๊ธ€ 3: {ref3}
229
  """
230
 
231
+ logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์‹œ์ž‘")
232
+ # ๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ )
233
+ messages = [{"role": "user", "content": revision_prompt}]
234
  response = openai.ChatCompletion.create(
235
  model=model_name,
236
  messages=messages,
 
240
  frequency_penalty=frequency_penalty,
241
  presence_penalty=presence_penalty,
242
  )
243
+ revised_attempt = response['choices'][0]['message']['content'].strip()
244
+ logger.info("๋‘ ๋ฒˆ์งธ ์‹œ๋„ (ํ‡ด๊ณ ) ์™„๋ฃŒ")
245
 
246
  # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ
247
+ final_post = remove_unwanted_phrases(revised_attempt)
248
 
249
  # ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ ๊ตฌ์„ฑ
250
  final_post = f"์ฃผ์ œ: {query}\n\n{final_post}"
251
  actual_char_length = len(final_post)
252
+ logger.info(f"์ตœ์ข… ๊ธ€์ž์ˆ˜: {actual_char_length}")
253
 
254
+ logger.info("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์™„๋ฃŒ")
255
  return final_post, ref1, ref2, ref3, actual_char_length
256
 
257
  except Exception as e:
258
+ logger.error(f"generate_blog_post ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
259
  return f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", "", "", 0
260
 
261
  # PDF ํด๋ž˜์Šค ๋ฐ ๊ด€๋ จ ํ•จ์ˆ˜ ์ •์˜