Update app.py
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
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,
|
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 |
-
|
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 """
|