fantaxy commited on
Commit
19424c2
·
verified ·
1 Parent(s): 8b77bcb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -43
app.py CHANGED
@@ -26,8 +26,18 @@ import logging
26
  logging.basicConfig(level=logging.INFO)
27
  logger = logging.getLogger(__name__)
28
 
 
29
 
 
 
 
30
 
 
 
 
 
 
 
31
 
32
  def setup_session():
33
  try:
@@ -126,6 +136,10 @@ def call_api(content, system_message, max_tokens, temperature, top_p, max_retrie
126
  for attempt in range(max_retries):
127
  try:
128
  messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}]
 
 
 
 
129
  random_seed = random.randint(0, 1000000)
130
  response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed)
131
  modified_text = response.choices[0].message.content
@@ -140,6 +154,15 @@ def call_api(content, system_message, max_tokens, temperature, top_p, max_retrie
140
  return f"API 호출 실패: {str(e)}", 0, 0, 0
141
 
142
 
 
 
 
 
 
 
 
 
 
143
  def analyze_info(category, style, topic, references1, references2, references3):
144
  return f"선택한 카테고리: {category}\n선택한 포스팅 스타일: {style}\n블로그 주제: {topic}\n참고 글1: {references1}\n참고 글2: {references2}\n참고 글3: {references3}"
145
 
@@ -192,72 +215,66 @@ def process_all_titles(category, style, topic):
192
  return "\n".join(results)
193
 
194
 
195
- def generate_outline(category, style, topic, references1, references2, references3, title):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  full_content = analyze_info(category, style, topic, references1, references2, references3)
197
- content = f"{full_content}\nTitle: {title}"
198
  category_prompt = get_outline_prompt(category)
199
  style_prompt = get_style_prompt(style)
200
- max_tokens = 6000
201
- temperature = 0.8
202
- top_p = 0.95
203
  combined_prompt = f"{category_prompt}\n\n{style_prompt}"
204
- modified_text, input_tokens, output_tokens, total_tokens = call_api(content, combined_prompt, max_tokens, temperature, top_p)
205
  token_usage_message = f"[입력 토큰수: {input_tokens}]\n[출력 토큰수: {output_tokens}]\n[총 토큰수: {total_tokens}]"
206
  return modified_text, token_usage_message
207
 
208
- def generate_blog_post(category, style, topic, references1, references2, references3, title, outline):
209
  full_content = analyze_info(category, style, topic, references1, references2, references3)
210
- content = f"{full_content}\nTitle: {title}\nOutline: {outline}"
211
  category_prompt = get_blog_post_prompt(category)
212
  style_prompt = get_style_prompt(style)
213
- max_tokens = 8000
214
- temperature = 0.8
215
- top_p = 0.95
216
  combined_prompt = f"{category_prompt}\n\n{style_prompt}"
217
- modified_text, input_tokens, output_tokens, total_tokens = call_api(content, combined_prompt, max_tokens, temperature, top_p)
218
  formatted_text = modified_text.replace('\n', '\n\n')
219
  token_usage_message = f"[입력 토큰수: {input_tokens}]\n[출력 토큰수: {output_tokens}]\n[총 토큰수: {total_tokens}]"
220
  return formatted_text, token_usage_message
221
 
222
- def fetch_references(topic):
223
- search_url = generate_naver_search_url(topic)
224
- session = setup_session()
225
- if session is None:
226
- return "Failed to set up session.", "", "", ""
227
- results = crawl_naver_search_results(search_url, session)
228
- if not results:
229
- return "No results found.", "", "", ""
230
-
231
- selected_results = random.sample(results, 3)
232
- references1_content = f"제목: {selected_results[0]['제목']}\n내용: {crawl_blog_content(selected_results[0]['링크'], session)}"
233
- references2_content = f"제목: {selected_results[1]['제목']}\n내용: {crawl_blog_content(selected_results[1]['링크'], session)}"
234
- references3_content = f"제목: {selected_results[2]['제목']}\n내용: {crawl_blog_content(selected_results[2]['링크'], session)}"
235
-
236
- return "참고글 생성 완료", references1_content, references2_content, references3_content
237
-
238
  def fetch_references_and_generate_all_steps(category, style, topic, blog_title):
239
- search_url = generate_naver_search_url(topic)
240
- session = setup_session()
241
- if session is None:
242
- return "", "", "", "", "", "", "", "", "", ""
243
-
244
- results = crawl_naver_search_results(search_url, session)
245
- if not results:
246
- return "", "", "", "", "", "", "", "", "", ""
247
-
248
- selected_results = random.sample(results, 3)
249
- references1_content = f"제목: {selected_results[0]['제목']}\n내용: {crawl_blog_content(selected_results[0]['링크'], session)}"
250
- references2_content = f"제목: {selected_results[1]['제목']}\n내용: {crawl_blog_content(selected_results[1]['링크'], session)}"
251
- references3_content = f"제목: {selected_results[2]['제목']}\n내용: {crawl_blog_content(selected_results[2]['링크'], session)}"
252
 
253
- # 아웃라인 생성
254
  outline_result, outline_token_usage = generate_outline(category, style, topic, references1_content, references2_content, references3_content, blog_title)
255
 
256
- # 블로그 글 생성
257
  blog_post_result, blog_post_token_usage = generate_blog_post(category, style, topic, references1_content, references2_content, references3_content, blog_title, outline_result)
258
 
259
  return references1_content, references2_content, references3_content, outline_result, outline_token_usage, blog_post_result, blog_post_token_usage
260
 
 
 
 
 
 
 
 
 
261
  def get_title_prompt(category):
262
  if (category == "일반"):
263
  return """
 
26
  logging.basicConfig(level=logging.INFO)
27
  logger = logging.getLogger(__name__)
28
 
29
+ import tiktoken
30
 
31
+ def count_tokens(text):
32
+ encoding = tiktoken.get_encoding("cl100k_base")
33
+ return len(encoding.encode(text))
34
 
35
+ def truncate_text(text, max_tokens):
36
+ encoding = tiktoken.get_encoding("cl100k_base")
37
+ encoded = encoding.encode(text)
38
+ if len(encoded) > max_tokens:
39
+ return encoding.decode(encoded[:max_tokens])
40
+ return text
41
 
42
  def setup_session():
43
  try:
 
136
  for attempt in range(max_retries):
137
  try:
138
  messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}]
139
+ total_tokens = count_tokens(system_message) + count_tokens(content) + max_tokens
140
+ if total_tokens > 32000:
141
+ max_tokens = 32000 - count_tokens(system_message) - count_tokens(content) - 100 # 안전 마진
142
+
143
  random_seed = random.randint(0, 1000000)
144
  response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed)
145
  modified_text = response.choices[0].message.content
 
154
  return f"API 호출 실패: {str(e)}", 0, 0, 0
155
 
156
 
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
  def analyze_info(category, style, topic, references1, references2, references3):
167
  return f"선택한 카테고리: {category}\n선택한 포스팅 스타일: {style}\n블로그 주제: {topic}\n참고 글1: {references1}\n참고 글2: {references2}\n참고 글3: {references3}"
168
 
 
215
  return "\n".join(results)
216
 
217
 
218
+
219
+
220
+
221
+
222
+ def fetch_references(topic, max_tokens=3000):
223
+ search_url = generate_naver_search_url(topic)
224
+ session = setup_session()
225
+ if session is None:
226
+ return "Failed to set up session.", "", "", ""
227
+ results = crawl_naver_search_results(search_url, session)
228
+ if not results:
229
+ return "No results found.", "", "", ""
230
+
231
+ selected_results = random.sample(results, 3)
232
+ references1_content = truncate_text(f"제목: {selected_results[0]['제목']}\n내용: {crawl_blog_content(selected_results[0]['링크'], session)}", max_tokens)
233
+ references2_content = truncate_text(f"제목: {selected_results[1]['제목']}\n내용: {crawl_blog_content(selected_results[1]['링크'], session)}", max_tokens)
234
+ references3_content = truncate_text(f"제목: {selected_results[2]['제목']}\n내용: {crawl_blog_content(selected_results[2]['링크'], session)}", max_tokens)
235
+
236
+ return "참고글 생성 완료", references1_content, references2_content, references3_content
237
+
238
+
239
+
240
+ def generate_outline(category, style, topic, references1, references2, references3, title, max_tokens=2000):
241
  full_content = analyze_info(category, style, topic, references1, references2, references3)
242
+ content = truncate_text(f"{full_content}\nTitle: {title}", max_tokens)
243
  category_prompt = get_outline_prompt(category)
244
  style_prompt = get_style_prompt(style)
 
 
 
245
  combined_prompt = f"{category_prompt}\n\n{style_prompt}"
246
+ modified_text, input_tokens, output_tokens, total_tokens = call_api(content, combined_prompt, 6000, 0.8, 0.95)
247
  token_usage_message = f"[입력 토큰수: {input_tokens}]\n[출력 토큰수: {output_tokens}]\n[총 토큰수: {total_tokens}]"
248
  return modified_text, token_usage_message
249
 
250
+ def generate_blog_post(category, style, topic, references1, references2, references3, title, outline, max_tokens=4000):
251
  full_content = analyze_info(category, style, topic, references1, references2, references3)
252
+ content = truncate_text(f"{full_content}\nTitle: {title}\nOutline: {outline}", max_tokens)
253
  category_prompt = get_blog_post_prompt(category)
254
  style_prompt = get_style_prompt(style)
 
 
 
255
  combined_prompt = f"{category_prompt}\n\n{style_prompt}"
256
+ modified_text, input_tokens, output_tokens, total_tokens = call_api(content, combined_prompt, 8000, 0.8, 0.95)
257
  formatted_text = modified_text.replace('\n', '\n\n')
258
  token_usage_message = f"[입력 토큰수: {input_tokens}]\n[출력 토큰수: {output_tokens}]\n[총 토큰수: {total_tokens}]"
259
  return formatted_text, token_usage_message
260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  def fetch_references_and_generate_all_steps(category, style, topic, blog_title):
262
+ _, references1_content, references2_content, references3_content = fetch_references(topic)
 
 
 
 
 
 
 
 
 
 
 
 
263
 
 
264
  outline_result, outline_token_usage = generate_outline(category, style, topic, references1_content, references2_content, references3_content, blog_title)
265
 
 
266
  blog_post_result, blog_post_token_usage = generate_blog_post(category, style, topic, references1_content, references2_content, references3_content, blog_title, outline_result)
267
 
268
  return references1_content, references2_content, references3_content, outline_result, outline_token_usage, blog_post_result, blog_post_token_usage
269
 
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
  def get_title_prompt(category):
279
  if (category == "일반"):
280
  return """