ssboost commited on
Commit
86582c0
ยท
verified ยท
1 Parent(s): 810dee9

Create info_blog.py

Browse files
Files changed (1) hide show
  1. info_blog.py +755 -0
info_blog.py ADDED
@@ -0,0 +1,755 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import re
4
+ import logging
5
+ import tempfile
6
+ from datetime import datetime
7
+ from zoneinfo import ZoneInfo
8
+ import html
9
+ from PIL import Image
10
+ from urllib.request import urlopen
11
+ import markdown2
12
+
13
+ # ๋กœ๊น… ์„ค์ • (INFO ๋ ˆ๋ฒจ)
14
+ logging.basicConfig(level=logging.INFO)
15
+
16
+ # -------------------------------
17
+ # ์ƒ์ˆ˜ ์ •์˜ (ํ–ฅํ›„ ์กฐ์ • ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ดํ•˜๋„๋ก)
18
+ # -------------------------------
19
+ TARGET_CHAR_LENGTH = 4000 # ์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์ตœ์†Œ ๊ธ€์ž์ˆ˜
20
+ MIN_SECTION_LENGTH = 600 # ๊ฐ ์†Œ์ œ๋ชฉ ์•„๋ž˜ ์ตœ์†Œ ๊ธ€์ž์ˆ˜
21
+ MAX_TOKENS = 15000 # Gemini API ์ตœ๋Œ€ ํ† ํฐ ์ˆ˜
22
+ TEMPERATURE = 0.75 # Gemini API ์˜จ๋„ ๊ฐ’
23
+ TOP_P = 0.95 # Gemini API top_p ๊ฐ’
24
+
25
+ # Gemini API ์„ค์ •
26
+ gemini_api_key = os.getenv("GEMINI_API_KEY")
27
+
28
+ # --- Google Gemini SDK ์ดˆ๊ธฐํ™” ---
29
+ from google import genai
30
+ from google.genai import types
31
+ client = genai.Client(api_key=gemini_api_key)
32
+
33
+ # -------------------------------
34
+ # ๊ธฐ๋ณธ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋“ค
35
+ # -------------------------------
36
+
37
+ def remove_unwanted_phrases(text):
38
+ """๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ํ•จ์ˆ˜"""
39
+ unwanted_phrases = [
40
+ '์—ฌ๋Ÿฌ๋ถ„', '์ตœ๊ทผ', '๋งˆ์ง€๋ง‰์œผ๋กœ', '๊ฒฐ๋ก ์ ์œผ๋กœ', '๊ฒฐ๊ตญ',
41
+ '์ข…ํ•ฉ์ ์œผ๋กœ', '๋”ฐ๋ผ์„œ', '๋งˆ๋ฌด๋ฆฌ', '๋์œผ๋กœ', '์š”์•ฝ',
42
+ 'ํ•œ ์ค„ ์š”์•ฝ', '์ •๋ฆฌํ•˜์ž๋ฉด', '์ด์ •๋ฆฌ', '๊ธ€์„ ๋งˆ์น˜๋ฉฐ',
43
+ '์ด์ƒ์œผ๋กœ', '์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค', '์ฐธ๊ณ ํ•˜์„ธ์š”', '๋„์›€์ด ๋˜์…จ๊ธธ',
44
+ '์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”', '๋‹ค์Œ ๊ธ€์—์„œ', '๋„์›€์ด ๋˜์—ˆ๊ธธ',
45
+ '์ฆ๊ฑฐ์šด ํ•˜๋ฃจ ๋˜์„ธ์š”', '๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค'
46
+ ]
47
+
48
+ # ๋ฌธ๋‹จ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌ
49
+ lines = text.split('\n')
50
+ result_lines = []
51
+
52
+ for line in lines:
53
+ if "๋‹ค์Œ ์„น์…˜์—์„œ๋Š”" in line:
54
+ parts = line.split("๋‹ค์Œ ์„น์…˜์—์„œ๋Š”")
55
+ if parts[0].strip():
56
+ result_lines.append(parts[0].strip())
57
+ else:
58
+ # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ (๊ตฌ๋‘์  ํฌํ•จ)
59
+ for phrase in unwanted_phrases:
60
+ # ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์•ž๋’ค์˜ ๊ตฌ๋‘์ ๊ณผ ๊ณต๋ฐฑ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ œ๊ฑฐ
61
+ pattern = rf'(\b{re.escape(phrase)}\b[\s,.!?]*)|([,.!?]*\b{re.escape(phrase)}\b)'
62
+ line = re.sub(pattern, '', line)
63
+
64
+ # ๋ฌธ์žฅ ๋‚ด ์ž”์—ฌ ๊ณต๋ฐฑ ๋ฐ ๊ตฌ๋‘์  ์ •๋ฆฌ
65
+ line = re.sub(r'\s{2,}', ' ', line) # ์—ฐ์† ๊ณต๋ฐฑ ์ œ๊ฑฐ
66
+ line = line.strip() # ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ
67
+ result_lines.append(line)
68
+
69
+ return '\n'.join(result_lines)
70
+
71
+ def convert_to_html(text):
72
+ """๋งˆํฌ๋‹ค์šด ํ˜•์‹์„ HTML๋กœ ๋ณ€ํ™˜"""
73
+ text = re.sub(r'^\s*[-*]\s+', '', text, flags=re.MULTILINE)
74
+ text = re.sub(r'^\s*\d+\.\s+', '', text, flags=re.MULTILINE)
75
+ text = re.sub(r'^\s*#{1,6}\s+', '', text, flags=re.MULTILINE)
76
+ return markdown2.markdown(text)
77
+
78
+ def extract_text_from_html(html_content):
79
+ """HTML์—์„œ ์ˆœ์ˆ˜ ํ…์ŠคํŠธ๋งŒ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜"""
80
+ if not html_content:
81
+ return ""
82
+
83
+ # HTML ํƒœ๊ทธ ์ œ๊ฑฐ
84
+ text = re.sub(r'<[^>]+>', '', html_content)
85
+
86
+ # HTML ์—”ํ‹ฐํ‹ฐ ๋””์ฝ”๋”ฉ
87
+ text = html.unescape(text)
88
+
89
+ # ์—ฐ์†๋œ ๊ณต๋ฐฑ ์ œ๊ฑฐ
90
+ text = re.sub(r'\s+', ' ', text)
91
+
92
+ return text.strip()
93
+
94
+ def format_blog_post(blog_post, query="", with_title=False):
95
+ """๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ํฌ๋งทํŒ… ํ•จ์ˆ˜ - ์†Œ์ œ๋ชฉ ๊ฐ•ํ™” ๋ฒ„์ „"""
96
+ blog_post = re.sub(r'^#+\s+', '', blog_post, flags=re.MULTILINE)
97
+ blog_post = re.sub(r'^\d+\.\s+', '', blog_post, flags=re.MULTILINE)
98
+ blog_post = re.sub(r'^[\*\-]\s+', '', blog_post, flags=re.MULTILINE)
99
+
100
+ # ์ฒซ ์ค„(์›๋ณธ ์ œ๋ชฉ)๊ณผ ๋น„์Šทํ•œ ํŒจํ„ด์ด ์žˆ๋‹ค๋ฉด ์ œ๊ฑฐ
101
+ lines = blog_post.split('\n')
102
+ if lines and len(lines) > 0:
103
+ first_line = lines[0].strip()
104
+ # ์ฒซ ์ค„์ด ์ œ๋ชฉ์ธ ๊ฒฝ์šฐ, ๋น„์Šทํ•œ ๋‚ด์šฉ์˜ ๋ผ์ธ์„ ๋ชจ๋‘ ์ œ๊ฑฐ
105
+ if first_line and len(first_line) > 5:
106
+ # ์ฒซ ์ค„๊ณผ ์œ ์‚ฌํ•œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ๋ผ์ธ ์ฐพ์•„ ์ œ๊ฑฐ
107
+ filtered_lines = []
108
+ for line in lines:
109
+ # ์ฒซ ์ค„๊ณผ ์œ ์‚ฌํ•˜๋ฉด ์ œ๊ฑฐ
110
+ if line.strip() and (first_line in line or line in first_line):
111
+ continue
112
+ filtered_lines.append(line)
113
+ lines = filtered_lines
114
+
115
+ # ๋„์ž…๋ถ€, ๊ฒฐ๋ก  ์†Œ์ œ๋ชฉ ํŒจํ„ด
116
+ intro_pattern = r'(?i)๋„์ž…๋ถ€\s*[:]?\s*(.*?)$'
117
+ conclusion_pattern = r'(?i)๊ฒฐ๋ก \s*[:]?\s*(.*?)$'
118
+
119
+ # ๋„์ž…๋ถ€, ๊ฒฐ๋ก  ์†Œ์ œ๋ชฉ ์ œ๊ฑฐ
120
+ filtered_lines = []
121
+ for line in lines:
122
+ if re.match(intro_pattern, line) or re.match(conclusion_pattern, line):
123
+ continue
124
+ filtered_lines.append(line)
125
+ lines = filtered_lines
126
+
127
+ # ๋ณธ๋ก  ์†Œ์ œ๋ชฉ ํŒจํ„ด ๊ฐ•ํ™”
128
+ section_patterns = [
129
+ r'^๋ณธ๋ก \d+\s*[:]?\s*(.*?)$', # ๋ณธ๋ก 1: ๋‚ด์šฉ ํŒจํ„ด
130
+ r'^.{5,50}์˜ [๊ฐ€-ํžฃ\s]+$', # ~์˜ ~ ํŒจํ„ด
131
+ r'^[๊ฐ€-ํžฃ\s]{5,30}(์ด๋ž€|์ด๋ž€\?|์ด๋ž€\s๋ฌด์—‡์ธ๊ฐ€|์ด๋ž€\s๋ฌด์—‡์ผ๊นŒ)[\?\s]*$', # ~์ด๋ž€? ํŒจํ„ด
132
+ r'^[๊ฐ€-ํžฃ\s]{5,50}\s[-โ€“]\s.{5,30}$', # ๊ฐ•์กฐ ํ‘œํ˜„ ํŒจํ„ด (์˜ˆ: ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ• - ์‹ค์ฒœํ•˜๊ธฐ)
133
+ r'^[๊ฐ€-ํžฃA-Za-z\s]{10,50}[\.!\?]$', # ๊ธด ๋ฌธ์žฅ์œผ๋กœ ๋œ ์†Œ์ œ๋ชฉ ํŒจํ„ด
134
+ ]
135
+
136
+ formatted_lines = []
137
+ in_paragraph = False
138
+
139
+ # ๋ณธ๋ก  ์„น์…˜ ๋ฒˆํ˜ธ ์ถ”์ 
140
+ section_number = 1
141
+
142
+ for i, line in enumerate(lines):
143
+ line = line.strip()
144
+ if not line:
145
+ if in_paragraph:
146
+ formatted_lines.append("</p>")
147
+ in_paragraph = False
148
+ formatted_lines.append("<br>")
149
+ continue
150
+
151
+ # ๋‹ค์Œ ์ค„๊ณผ ์ด์ „ ์ค„์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
152
+ prev_empty = i == 0 or not lines[i-1].strip()
153
+ next_empty = i == len(lines) - 1 or not lines[i+1].strip()
154
+
155
+ # ์†Œ์ œ๋ชฉ์ธ์ง€ ์ฒดํฌ
156
+ is_subtitle = False
157
+ clean_subtitle = line
158
+
159
+ # ํŒจํ„ด ๋งค์นญ์œผ๋กœ ์†Œ์ œ๋ชฉ ํ™•์ธ
160
+ for pattern in section_patterns:
161
+ if re.match(pattern, line):
162
+ is_subtitle = True
163
+ # ๋ณธ๋ก X: ํŒจํ„ด์ธ ๊ฒฝ์šฐ ์ •๋ฆฌ
164
+ if "๋ณธ๋ก " in line:
165
+ clean_subtitle = re.sub(r'^๋ณธ๋ก \d+\s*[:]?\s*', '', line)
166
+ break
167
+
168
+ # ํŒจํ„ด์— ๋งค์นญ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค์Œ ๊ทœ์น™์œผ๋กœ ์†Œ์ œ๋ชฉ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
169
+ if not is_subtitle:
170
+ # ์•ž๋’ค ์ค„์ด ๋น„์–ด์žˆ๊ณ , ๊ธธ์ด๊ฐ€ ์งง์€(5-50์ž) ๋ฌธ์žฅ์€ ์†Œ์ œ๋ชฉ์œผ๋กœ ์ฒ˜๋ฆฌ
171
+ if prev_empty and next_empty and 5 <= len(line) <= 50:
172
+ is_subtitle = True
173
+ # ์ด์ „์— ์žˆ๋˜ ์†Œ์ œ๋ชฉ๋“ค๊ณผ ๋น„์Šทํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ๋„ ์†Œ์ œ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ
174
+ elif section_number > 1 and prev_empty and 5 <= len(line) <= 50:
175
+ is_subtitle = True
176
+
177
+ if is_subtitle and clean_subtitle.strip():
178
+ if in_paragraph:
179
+ formatted_lines.append("</p>")
180
+ in_paragraph = False
181
+
182
+ # ์†Œ์ œ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์งง์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
183
+ if not clean_subtitle.strip() or len(clean_subtitle.strip()) < 2:
184
+ clean_subtitle = f"์ฃผ์š” ํฌ์ธํŠธ {section_number}"
185
+
186
+ # ์†Œ์ œ๋ชฉ ํ˜•์‹ ๊ฐ•ํ™” - ํ•ญ์ƒ ๋ณผ๋“œ์ฒ˜๋ฆฌ์™€ ์Šคํƒ€์ผ๋ง ์ ์šฉ
187
+ formatted_lines.append(
188
+ f'<h2 style="font-size: 1.4em; margin-top: 30px; margin-bottom: 15px; font-weight: bold; color: #333; border-bottom: 1px solid #eee; padding-bottom: 8px;">{html.escape(clean_subtitle)}</h2>'
189
+ )
190
+ section_number += 1
191
+ else:
192
+ # ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ
193
+ if not in_paragraph:
194
+ formatted_lines.append("<p>")
195
+ in_paragraph = True
196
+ content = html.escape(line)
197
+ bold_content = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', content)
198
+ formatted_lines.append(bold_content)
199
+
200
+ if in_paragraph:
201
+ formatted_lines.append("</p>")
202
+
203
+ return '\n'.join(formatted_lines)
204
+
205
+ # -------------------------------
206
+ # ์Šคํƒ€์ผ ๋ฐ ํ”„๋กฌํ”„ํŠธ ๊ฐ€์ด๋“œ ํ•จ์ˆ˜
207
+ # -------------------------------
208
+
209
+ def get_style_prompt(style="์นœ๊ทผํ•œ"):
210
+ """๋ธ”๋กœ๊ทธ ๊ธ€์˜ ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐ˜ํ™˜"""
211
+ prompts = {
212
+ "์นœ๊ทผํ•œ": """
213
+ [์นœ๊ทผํ•œ ์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
214
+ 1. ํ†ค๊ณผ ์–ด์กฐ
215
+ - ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
216
+ - ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ด€์‹ฌ๊ณผ ํ˜ธ๊ธฐ์‹ฌ์„ ๋‹ด์€ ํ‘œํ˜„ ์‚ฌ์šฉ
217
+ 2. ๋ฌธ์žฅ ๋ฐ ์–ดํˆฌ
218
+ - ๋ฐ˜๋“œ์‹œ 'ํ•ด์š”์ฒด'๋กœ ์ž‘์„ฑ, ์ ˆ๋Œ€ '์Šต๋‹ˆ๋‹ค'์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ
219
+ - '~์š”'๋กœ ๋๋‚˜๋„๋ก ์ž‘์„ฑ, '~๋‹ค'๋กœ ๋๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๋ผ
220
+ - ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
221
+ - ์ ์ ˆํ•œ ๊ฐ์ • ํ‘œํ˜„๊ณผ ๊ณต๊ฐ๋Œ€ ํ˜•์„ฑ
222
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
223
+ - ์ „๋ฌธ ์šฉ์–ด๋Š” ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
224
+ - ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฐœ๋… ์„ค๋ช…
225
+ - ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋А๋‚Œ ์ฃผ๊ธฐ (์˜ˆ: "์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?", "์ด๋Ÿฐ ๊ฒฝํ—˜ ์žˆ์œผ์‹ ๊ฐ€์š”?")
226
+ - ๊ตฌ์ฒด์  ์‚ฌ๋ก€์™€ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•œ ๊ฐœ๋… ์„ค๋ช…
227
+ 4. ์ •๋ณด ์ „๋‹ฌ ๋ฐฉ์‹
228
+ - ๊ฐœ์ธ์ ์ธ ๊ด€์ ์— ๋…น์—ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ •๋ณด ์ „๋‹ฌ
229
+ - ๋ณต์žกํ•œ ๊ฐœ๋…์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์„ค๋ช…
230
+ - ๋…์ž๊ฐ€ ์‹ค์ œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์  ์ •๋ณด ์ œ๊ณต
231
+ 5. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
232
+ - ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
233
+ - ์‹ค์ƒํ™œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์ด๋‚˜ ์กฐ์–ธ ์ œ๊ณต
234
+ ์ฃผ์˜์‚ฌํ•ญ: ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”์ฒด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •๋ณด์˜ ์งˆ๊ณผ ๋‚ด์šฉ์˜ ๊นŠ์ด๋ฅผ ์žƒ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค
235
+ """,
236
+ "์ผ๋ฐ˜": """
237
+ [์ผ๋ฐ˜์ ์ธ ์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
238
+ 1. ํ†ค๊ณผ ์–ด์กฐ
239
+ - ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
240
+ - ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")
241
+ - ์ •๋ณด ์ „๋‹ฌ ์ค‘์‹ฌ์˜ ๋ช…ํ™•ํ•œ ์–ดํˆฌ
242
+ 2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
243
+ - ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์†Œ๊ฐœ๋กœ ์‹œ์ž‘
244
+ - ๋…ผ๋ฆฌ์ ์ธ ๏ฟฝ๏ฟฝ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ (๋ฐฐ๊ฒฝ โ†’ ์ฃผ์š” ๊ฐœ๋… โ†’ ๋ถ„์„ โ†’ ์ ์šฉ ๋“ฑ)
245
+ - ํ•ต์‹ฌ ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
246
+ - ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ
247
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
248
+ - ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
249
+ - ํ•„์š”์‹œ ์ „๋ฌธ ์šฉ์–ด์— ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
250
+ - ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 
251
+ - ๊ท ํ˜• ์žกํžŒ ์‹œ๊ฐ์—์„œ ๋‹ค์–‘ํ•œ ๊ด€์  ์ œ์‹œ
252
+ 4. ์ •๋ณด ์ „๋‹ฌ ๋ฐฉ์‹
253
+ - ์ฃผ์ œ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์›๋ฆฌ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณต
254
+ - ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ์™€ ์‚ฌ๋ก€ ํฌํ•จ
255
+ - ์ตœ์‹  ์—ฐ๊ตฌ๋‚˜ ๋™ํ–ฅ ์ฐธ๊ณ 
256
+ 5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
257
+ - ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
258
+ - ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ
259
+ - ์‹ค์šฉ์ ์ธ ์ ์šฉ ๋ฐฉ์•ˆ ์ œ๊ณต
260
+
261
+ ์ฃผ์˜์‚ฌํ•ญ: ๊ฐ๊ด€์  ์ •๋ณด ์ œ๊ณต์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋˜, ๋…์ž์˜ ์ดํ•ด์™€ ํ™œ์šฉ์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋งฅ๋ฝ๊ณผ ์„ค๋ช…์„ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•œ๋‹ค
262
+ """,
263
+ "์ „๋ฌธ์ ์ธ": """
264
+ [์ „๋ฌธ์ ์ธ ์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
265
+ 1. ํ†ค๊ณผ ๊ตฌ์กฐ
266
+ - ๊ณต์‹์ ์ด๊ณ  ์ „๋ฌธ์ ์ธ ํ†ค ์‚ฌ์šฉ
267
+ - ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
268
+ - ๋ช…ํ™•ํ•œ ์„œ๋ก (๊ฐœ์š”), ๋ณธ๋ก (์ƒ์„ธ ๋ถ„์„), ๊ฒฐ๋ก (์ข…ํ•ฉ ํ‰๊ฐ€) ๊ตฌ์กฐ
269
+ - ์ฒด๊ณ„์ ์ธ ์ •๋ณด ์ „๊ฐœ
270
+ - ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
271
+ 2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
272
+ - ์ฃผ์ œ์˜ ์—ญ์‚ฌ์  ๋ฐฐ๊ฒฝ, ์ด๋ก ์  ๊ธฐ๋ฐ˜, ํ˜„์žฌ ๋™ํ–ฅ ๋“ฑ ์‹ฌ์ธต์  ์ •๋ณด ํฌํ•จ
273
+ - ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
274
+ - ์ „๋ฌธ ์šฉ์–ด ์ ์ ˆํžˆ ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
275
+ - ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ํ‰๊ฐ€ ์ œ๊ณต
276
+ - ๋‹ค์–‘ํ•œ ๊ด€์ ๊ณผ ์ด๋ก ์  ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์‹œ
277
+ 3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
278
+ - ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์‚ฌ๋ก€ ์—ฐ๊ตฌ ๋“ฑ ๊ฐ๊ด€์  ๋ฐ์ดํ„ฐ ํ™œ์šฉ
279
+ - ์ฃผ์ œ ๋ถ„์„์„ ์œ„ํ•œ ์ฒด๊ณ„์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์‹œ
280
+ - ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ๋ช…ํ™•ํžˆ ์„ค๋ช… (์ถ”์„ธ, ์ƒ๊ด€๊ด€๊ณ„, ์ธ๊ณผ๊ด€๊ณ„ ๋“ฑ)
281
+ - ํ•™์ˆ ์  ๊ทผ๊ฑฐ์™€ ํ˜„์‹ค ์ ์šฉ์˜ ๊ท ํ˜•
282
+ 4. ์ „๋ฌธ์  ์ •๋ณด ์ œ๊ณต
283
+ - ์ตœ์‹  ์—ฐ๊ตฌ ๋™ํ–ฅ ๋ฐ ๋ฐœ์ „ ๋ฐฉํ–ฅ ๋ถ„์„
284
+ - ์ด๋ก ๊ณผ ์‹ค์ œ ์ ์šฉ ์‚ฌ์ด์˜ ๊ฐ„๊ทน ๋ถ„์„
285
+ - ์ฃผ์ œ ๊ด€๋ จ ์Ÿ์ ๊ณผ ๋…ผ์Ÿ์  ์†Œ๊ฐœ
286
+ - ์ฒด๊ณ„์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ ‘๊ทผ๋ฒ• ์ œ์‹œ
287
+ ์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ๊ณผ ๊นŠ์ด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์šฉ์–ด์™€ ์„ค๋ช…์„ ํ†ตํ•ด ์ ‘๊ทผ์„ฑ์„ ๋†’์ธ๋‹ค
288
+ """
289
+ }
290
+ return prompts.get(style, prompts["์นœ๊ทผํ•œ"])
291
+
292
+ def get_category_outline_prompt(category="์ผ๋ฐ˜"):
293
+ """์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ"""
294
+ prompts = {
295
+ "์ผ๋ฐ˜": """
296
+ [์ผ๋ฐ˜ ์ฃผ์ œ ์†Œ์ฃผ์ œ(Outline) ์ƒ์„ฑ ๊ทœ์น™]
297
+ [์‹œ์Šคํ…œ ์—ญํ• ]
298
+ ๋‹น์‹ ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ „๋ฌธ ์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์ž‘๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ๊นŠ์ด ์žˆ๋Š” ๋ถ„์„๊ณผ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋งŽ์€ ๋…์ž๋“ค์˜ ์‹ ๋ขฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
299
+
300
+ [๋ถ„์„ ๋‹จ๊ณ„]
301
+ 1. ์ฐธ๊ณ  ์ž๋ฃŒ 3๊ฐœ๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•˜์—ฌ ํ•ต์‹ฌ ์ฃผ์ œ์™€ ์ค‘์š” ์ •๋ณด ํŒŒ์•…
302
+ 2. ํฌ์ŠคํŒ… ์ฃผ์ œ์˜ ์œ ํ˜•๊ณผ ํŠน์„ฑ ์‹๋ณ„ (๊ฑด๊ฐ•, ๊ธฐ์ˆ , ๊ต์œก, ์ทจ๋ฏธ, ๊ฒฝ์ œ ๋“ฑ)
303
+ 3. ํฌ์ŠคํŒ…์˜ ํ•ต์‹ฌ์ด ๋  5๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ํŒŒ์•… (๊ฐœ๋… ์„ค๋ช…, ์ฃผ์š” ์ด์ , ์‹ค์šฉ์  ์ ์šฉ, ์ตœ์‹  ํŠธ๋ Œ๋“œ, ์ „๋ฌธ๊ฐ€ ๊ฒฌํ•ด ๋“ฑ)
304
+
305
+ [์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ ์›์น™]
306
+ 1. ๋„์ž…๋ถ€(1๊ฐœ) - ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ๋งค๋ ฅ์ ์ธ ์ œ๋ชฉ์œผ๋กœ ์‹œ์ž‘
307
+ 2. ๋ณธ๋ก (4-5๊ฐœ) - ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ์ฃผ์ œ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜์™€ ์ค‘์š” ์ •๋ณด๋ฅผ ๋‹ด์€ ์†Œ์ œ๋ชฉ
308
+ - ์ฃผ์ œ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ฐฐ๊ฒฝ ์ง€์‹
309
+ - ๋…์ž๋“ค์ด ๊ฐ€์žฅ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด
310
+ - ์ตœ์‹  ํŠธ๋ Œ๋“œ๋‚˜ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ
311
+ - ์‹ค์šฉ์ ์ธ ์ ์šฉ ๋ฐฉ๋ฒ•์ด๋‚˜ ํŒ
312
+ - (์œ„ ํ•ญ๋ชฉ๋“ค์€ ์˜ˆ์‹œ์ผ ๋ฟ, ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ๊ฒฐ์ •)
313
+ 3. ๊ฒฐ๋ก (1๊ฐœ) - ์ „์ฒด ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๊ณ  ๋…์ž์—๊ฒŒ ์œ ์šฉํ•œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ œ๋ชฉ
314
+
315
+ [ํ•ต์‹ฌ ์ง€์นจ]
316
+ 1. ์™„์ „ํžˆ ํ•œ๊ตญ์–ด๋กœ๋งŒ ์ž‘์„ฑํ•  ๊ฒƒ
317
+ 2. ์†Œ์ œ๋ชฉ์€ ์ตœ๋Œ€ 30์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
318
+ 3. ๋…์ž์˜ ํ˜ธ๊ธฐ์‹ฌ๊ณผ ๊ด€์‹ฌ์„ ์ž๊ทนํ•˜๋Š” ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ• ", "๋†€๋ผ์šด ์‚ฌ์‹ค", "์ „๋ฌธ๊ฐ€๋“ค์ด ์ถ”์ฒœํ•˜๋Š”")
319
+ 4. ์ฃผ์ œ์˜ ๊ฐ€์žฅ ๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์†Œ์ œ๋ชฉ์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑ
320
+ 5. ํ‚ค์›Œ๋“œ๋Š” ์†Œ์ œ๋ชฉ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (๋ณธ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฐธ๊ณ ์‚ฌํ•ญ์œผ๋กœ๋งŒ ํ™œ์šฉ)
321
+ 6. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์€ ๋„์ž…๋ถ€(1) + ๋ณธ๋ก (์ตœ๋Œ€ 5๊ฐœ) + ๊ฒฐ๋ก (1)์œผ๋กœ ๊ตฌ์„ฑ
322
+
323
+ [์ถœ๋ ฅ ํ˜•์‹]
324
+ 1. ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์ฃผ์ œ์™€ ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ
325
+ 2. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ:(๊ฐ ํ•ญ๋ชฉ๋‹น 1๋ฒˆ ์—”ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์นธ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋กํ•˜๋ผ.)
326
+ 3. ๋„์ž…๋ถ€: 1๊ฐœ (๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ๋งค๋ ฅ์ ์ธ ์ œ๋ชฉ)
327
+ 4. ๋ณธ๋ก : 4-5๊ฐœ (์ฃผ์ œ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด์™€ ๊ฐ€์น˜๋ฅผ ๋ฐ˜์˜ํ•œ ์ œ๋ชฉ)
328
+ 5. ๊ฒฐ๋ก : 1๊ฐœ (์ „์ฒด ๋‚ด์šฉ ์š”์•ฝ ์ œ๋ชฉ)
329
+ 6. ์†Œ์ œ๋ชฉ์€ ์ฃผ์ œ์˜ ํ•ต์‹ฌ ์ •๋ณด์™€ ๊ฐ€์น˜์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑ
330
+ 7. ํ‚ค์›Œ๋“œ์— ๋งž์ถ”์ง€ ๋ง๊ณ , ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ๊ฐ€์น˜์™€ ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ
331
+ 8. ์˜ˆ์‹œ ํ˜•์‹ (์ฐธ๊ณ ์šฉ์ผ ๋ฟ, ๋‚ด์šฉ์€ ์ฐธ๊ณ  ์ž๋ฃŒ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ๏ฟฝ๏ฟฝ๏ฟฝ ์žˆ์Œ):
332
+ - ๋„์ž…๋ถ€: [๊ด€์‹ฌ์„ ๋„๋Š” ๋„์ž… ์ œ๋ชฉ]
333
+ - ๋ณธ๋ก 1: [ํ•ต์‹ฌ ๊ฐœ๋…/๋ฐฐ๊ฒฝ ๊ด€๋ จ ์ œ๋ชฉ]
334
+ - ๋ณธ๋ก 2: [์ฃผ์š” ์ด์ /๊ฐ€์น˜ ๊ด€๋ จ ์ œ๋ชฉ]
335
+ - ๋ณธ๋ก 3: [์ตœ์‹  ํŠธ๋ Œ๋“œ/์—ฐ๊ตฌ ๊ด€๋ จ ์ œ๋ชฉ]
336
+ - ๋ณธ๋ก 4: [์‹ค์šฉ์  ์ ์šฉ/ํŒ ๊ด€๋ จ ์ œ๋ชฉ]
337
+ - ๋ณธ๋ก 5: [์ „๋ฌธ๊ฐ€ ๊ฒฌํ•ด/์ฃผ์š” ์‚ฌ๋ก€ ๊ด€๋ จ ์ œ๋ชฉ] (ํ•„์š”์‹œ)
338
+ - ๊ฒฐ๋ก : [์ „์ฒด ๋‚ด์šฉ ์š”์•ฝ ๋ฐ ์ธ์‚ฌ์ดํŠธ ์ œ๋ชฉ]
339
+ """,
340
+ "์ƒํ™œ๊ฑด๊ฐ•": """
341
+ [์ƒํ™œ๊ฑด๊ฐ• ์ฃผ์ œ ์†Œ์ฃผ์ œ(Outline) ์ƒ์„ฑ ๊ทœ์น™]
342
+ [์‹œ์Šคํ…œ ์—ญํ• ]
343
+ ๋‹น์‹ ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ƒํ™œ๊ฑด๊ฐ• ์ „๋ฌธ ๋ธ”๋กœ๊ฑฐ์ž…๋‹ˆ๋‹ค. ์˜์–‘, ์šด๋™, ์ •์‹ ๊ฑด๊ฐ•, ์ˆ˜๋ฉด, ์ž์—ฐ์น˜์œ ๋ฒ• ๋“ฑ ์ผ์ƒ์—์„œ ์‹ค์ฒœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด๊ฐ• ์ •๋ณด๋กœ ๋งŽ์€ ๋…์ž๋“ค์˜ ์‹ ๋ขฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
344
+
345
+ [๋ถ„์„ ๋‹จ๊ณ„]
346
+ 1. ์ฐธ๊ณ  ์ž๋ฃŒ 3๊ฐœ๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•˜์—ฌ ํ•ต์‹ฌ ๊ฑด๊ฐ• ์ฃผ์ œ์™€ ์ค‘์š” ์ •๋ณด ํŒŒ์•…
347
+ 2. ๊ฑด๊ฐ• ์ฃผ์ œ์˜ ์œ ํ˜•๊ณผ ํŠน์„ฑ ์‹๋ณ„ (์˜์–‘, ์šด๋™, ์ŠคํŠธ๋ ˆ์Šค ๊ด€๋ฆฌ, ์ˆ˜๋ฉด, ๋ฉด์—ญ๋ ฅ ๋“ฑ)
348
+ 3. ํฌ์ŠคํŒ…์˜ ํ•ต์‹ฌ์ด ๋  5๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ํŒŒ์•… (๊ณผํ•™์  ๊ทผ๊ฑฐ, ์‹ค์ฒœ ๋ฐฉ๋ฒ•, ๊ธฐ๋Œ€ ํšจ๊ณผ, ์ฃผ์˜์‚ฌํ•ญ, ์ „๋ฌธ๊ฐ€ ์กฐ์–ธ ๋“ฑ)
349
+
350
+ [์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ ์›์น™]
351
+ 1. ๋„์ž…๋ถ€(1๊ฐœ) - ๊ฑด๊ฐ• ๋ฌธ์ œ๋‚˜ ๊ด€์‹ฌ์‚ฌ์— ๋Œ€ํ•œ ๊ณต๊ฐ๋Œ€๋ฅผ ํ˜•์„ฑํ•˜๋Š” ์ œ๋ชฉ์œผ๋กœ ์‹œ์ž‘
352
+ 2. ๋ณธ๋ก (4-5๊ฐœ) - ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๊ฑด๊ฐ• ๊ด€๋ จ ํ•ต์‹ฌ ์ •๋ณด์™€ ์‹ค์ฒœ ๋ฐฉ๋ฒ•์„ ๋‹ด์€ ์†Œ์ œ๋ชฉ
353
+ - ๊ฑด๊ฐ• ์ด์Šˆ์˜ ์›์ธ๊ณผ ๊ณผํ•™์  ๋ฐฐ๊ฒฝ]
354
+ - ์ผ์ƒ์—์„œ ์‰ฝ๊ฒŒ ์‹ค์ฒœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์„  ๋ฐฉ๋ฒ•
355
+ - ๊ฑด๊ฐ• ์Šต๊ด€์ด ๊ฐ€์ ธ์˜ค๋Š” ๊ตฌ์ฒด์  ์ด์ 
356
+ - ํ”ํ•œ ์˜คํ•ด์™€ ์ฃผ์˜์‚ฌํ•ญ
357
+ - ์ „๋ฌธ๊ฐ€ ์กฐ์–ธ์ด๋‚˜ ์ตœ์‹  ์—ฐ๊ตฌ ๊ฒฐ๊ณผ
358
+ - (์œ„ ํ•ญ๋ชฉ๋“ค์€ ์˜ˆ์‹œ์ผ ๋ฟ, ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ๊ฒฐ์ •)
359
+ 3. ๊ฒฐ๋ก (1๊ฐœ) - ์ „์ฒด ๊ฑด๊ฐ• ์ •๋ณด๋ฅผ ์š”์•ฝํ•˜๊ณ  ์ง€์†์ ์ธ ์‹ค์ฒœ์„ ๋…๋ คํ•˜๋Š” ์ œ๋ชฉ
360
+
361
+ [ํ•ต์‹ฌ ์ง€์นจ]
362
+ 1. ์™„์ „ํžˆ ํ•œ๊ตญ์–ด๋กœ๋งŒ ์ž‘์„ฑํ•  ๊ฒƒ
363
+ 2. ์†Œ์ œ๋ชฉ์€ ์ตœ๋Œ€ 30์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
364
+ 3. ๋…์ž์˜ ๊ฑด๊ฐ• ๊ฐœ์„  ์˜์ง€๋ฅผ ์ž๊ทนํ•˜๋Š” ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "ํ•˜๋ฃจ 5๋ถ„๋งŒ ํˆฌ์žํ•˜๋ฉด", "์ „๋ฌธ์˜๊ฐ€ ๊ถŒ์žฅํ•˜๋Š”", "์ž˜๋ชป๋œ ๊ฑด๊ฐ• ์ƒ์‹")
365
+ 4. ๊ณผํ•™์  ๊ทผ๊ฑฐ์™€ ์‹ค์ƒํ™œ ์ ์šฉ ๋ฐฉ๋ฒ•์ด ์†Œ์ œ๋ชฉ์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑ
366
+ 5. ๊ฑด๊ฐ• ํ‚ค์›Œ๋“œ๋Š” ์†Œ์ œ๋ชฉ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (๋ณธ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฐธ๊ณ ์‚ฌํ•ญ์œผ๋กœ๋งŒ ํ™œ์šฉ)
367
+ 6. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์€ ๋„์ž…๋ถ€(1) + ๋ณธ๋ก (์ตœ๋Œ€ 5๊ฐœ) + ๊ฒฐ๋ก (1)์œผ๋กœ ๊ตฌ์„ฑ
368
+
369
+ [์ถœ๋ ฅ ํ˜•์‹]
370
+ 1. ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฑด๊ฐ• ์ฃผ์ œ์™€ ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ
371
+ 2. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ:(๊ฐ ํ•ญ๋ชฉ๋‹น 1๋ฒˆ ์—”ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์นธ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋กํ•˜๋ผ.)
372
+ 3. ๋„์ž…๋ถ€: 1๊ฐœ (๊ฑด๊ฐ• ๋ฌธ์ œ์— ๊ณต๊ฐํ•˜๊ณ  ๊ด€์‹ฌ์„ ๋„๋Š” ์ œ๋ชฉ)
373
+ 4. ๋ณธ๋ก : 4-5๊ฐœ (๊ฑด๊ฐ• ๊ฐœ์„ ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์ •๋ณด์™€ ์‹ค์ฒœ๋ฒ•์„ ๋ฐ˜์˜ํ•œ ์ œ๋ชฉ)
374
+ 5. ๊ฒฐ๋ก : 1๊ฐœ (์ „์ฒด ๊ฑด๊ฐ• ์ •๋ณด ์š”์•ฝ ๋ฐ ์‹ค์ฒœ ๋…๋ ค ์ œ๋ชฉ)
375
+ 6. ์†Œ์ œ๋ชฉ์€ ๊ฑด๊ฐ• ์ฃผ์ œ์˜ ๊ณผํ•™์  ๊ทผ๊ฑฐ์™€ ์‹ค์ฒœ ๋ฐฉ๋ฒ•์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑ
376
+ 7. ํ‚ค์›Œ๋“œ์— ๋งž์ถ”์ง€ ๋ง๊ณ , ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ๊ฑด๊ฐ• ๊ฐ€์น˜์™€ ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ
377
+ 8. ์˜ˆ์‹œ ํ˜•์‹ (์ฐธ๊ณ ์šฉ์ผ ๋ฟ, ๋‚ด์šฉ์€ ์ฐธ๊ณ  ์ž๋ฃŒ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ):
378
+ - ๋„์ž…๋ถ€: [๊ฑด๊ฐ• ๋ฌธ์ œ ๊ณต๊ฐ ๋ฐ ๊ด€์‹ฌ ์œ ๋„ ์ œ๋ชฉ]
379
+ - ๋ณธ๋ก 1: [๊ฑด๊ฐ• ์ด์Šˆ ์›์ธ/๋ฐฐ๊ฒฝ ๊ด€๋ จ ์ œ๋ชฉ]
380
+ - ๋ณธ๋ก 2: [์‹ค์ฒœ ๊ฐ€๋Šฅํ•œ ๊ฐœ์„  ๋ฐฉ๋ฒ• ๊ด€๋ จ ์ œ๋ชฉ]
381
+ - ๋ณธ๋ก 3: [๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด๊ฐ• ์ด์  ๊ด€๋ จ ์ œ๋ชฉ]
382
+ - ๋ณธ๋ก 4: [์ฃผ์˜์‚ฌํ•ญ/ํ”ํ•œ ์˜คํ•ด ๊ด€๋ จ ์ œ๋ชฉ]
383
+ - ๋ณธ๋ก 5: [์ „๋ฌธ๊ฐ€ ์กฐ์–ธ/์ตœ์‹  ์—ฐ๊ตฌ ๊ด€๋ จ ์ œ๋ชฉ] (ํ•„์š”์‹œ)
384
+ - ๊ฒฐ๋ก : [๊ฑด๊ฐ• ์ •๋ณด ์š”์•ฝ ๋ฐ ์‹ค์ฒœ ๋…๋ ค ์ œ๋ชฉ]
385
+ """
386
+ }
387
+ return prompts.get(category, prompts["์ผ๋ฐ˜"])
388
+
389
+ def get_category_blog_prompt(category="์ผ๋ฐ˜"):
390
+ """์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ"""
391
+ prompts = {
392
+ "์ผ๋ฐ˜": """
393
+ [์ผ๋ฐ˜ ์ฃผ์ œ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ ๊ฐ€์ด๋“œ]
394
+ 1. ๋„ˆ๋Š” ์ตœ๊ณ ์˜ ๋ธ”๋กœ๊ทธ ์ž‘๊ฐ€์ด์ž ์ •๋ณด ์ „๋‹ฌ ์ „๋ฌธ๊ฐ€์ด๋‹ค.
395
+ 2. ์ฃผ์–ด์ง„ ์•„์›ƒ๋ผ์ธ๊ณผ ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๋…์ž์—๊ฒŒ ๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ผ.
396
+ 3. ์ •๋ณด์˜ ์ •ํ™•์„ฑ๊ณผ ๊นŠ์ด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ผ.
397
+ [์ฝ˜ํ…์ธ  ์ž‘์„ฑ ๊ทœ์น™]
398
+ 1. ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ ์„ ๋‘๋˜, ๋…์ž์˜ ๊ด€์‹ฌ๊ณผ ์ฐธ์—ฌ๋ฅผ ์œ ๋„ํ•˜๋ผ.
399
+ 2. ๋ณต์žกํ•œ ๊ฐœ๋…์€ ๋น„์œ ์™€ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ผ.
400
+ 3. ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๊ด€์ ๊ณผ ์ธก๋ฉด์„ ๊ท ํ˜• ์žˆ๊ฒŒ ๋‹ค๋ฃจ์–ด๋ผ.
401
+ 4. ๋…์ž๊ฐ€ ์‹ค์ƒํ™œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ์ •๋ณด์™€ ํŒ์„ ์ œ๊ณตํ•˜๋ผ.
402
+ 5. ์ฐธ๊ณ ๊ธ€์˜ ์ •๋ณด๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋˜, ํ‘œํ˜„์„ ๋‹จ์ˆœํžˆ ๋ณต์‚ฌํ•˜์ง€ ๋ง๊ณ  ์ฐฝ์˜์ ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•˜๋ผ.
403
+ 6. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ์˜ ์ถฉ๋ถ„ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
404
+ 7. ๊ธ€ ์ „์ฒด ๊ธธ์ด๋Š” ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž๊ฐ€ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
405
+ 8. ๊ธ€ ์ „์ฒด ๊ธธ์ด๋Š” {TARGET_CHAR_LENGTH}์ž์—์„œ {TARGET_CHAR_LENGTH + 1000}์ž ์‚ฌ์ด๊ฐ€ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
406
+ [์ค‘์š” ๊ทœ์น™]
407
+ 1. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
408
+ 2. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
409
+ 3. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
410
+ 4. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
411
+ 5. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ.
412
+ """,
413
+ "์ƒํ™œ๊ฑด๊ฐ•": """
414
+ [์ƒํ™œ๊ฑด๊ฐ• ์ฃผ์ œ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ ๊ฐ€์ด๋“œ]
415
+ 1. ๋„ˆ๋Š” ์ƒํ™œ๊ฑด๊ฐ• ๋ฐ ์›ฐ๋น™ ์ „๋ฌธ ๋ธ”๋กœ๊ฑฐ์ด์ž ๊ฑด๊ฐ• ์ •๋ณด ์ „๋‹ฌ์ž์ด๋‹ค.
416
+ 2. ๊ณผํ•™์  ๊ทผ๊ฑฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •ํ™•ํ•œ ๊ฑด๊ฐ• ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ผ.
417
+ 3. ๋ณต์žกํ•œ ๊ฑด๊ฐ• ๊ฐœ๋…์„ ์ผ์ƒ์  ๋งฅ๋ฝ์—์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ผ.
418
+ [์ฝ˜ํ…์ธ  ์ž‘์„ฑ ๊ทœ์น™]
419
+ 1. ๊ฑด๊ฐ• ์ •๋ณด์˜ ์ •ํ™•์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ•˜๋ผ.
420
+ 2. ์˜ํ•™์  ์ฃผ์žฅ์€ ๊ณผํ•™์  ๊ทผ๊ฑฐ๋‚˜ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
421
+ 3. ๊ณผ๋„ํ•œ ์ฃผ์žฅ์ด๋‚˜ ๊ณผ์žฅ๋œ ํšจ๊ณผ๋ฅผ ์•ฝ์†ํ•˜์ง€ ๋ง๋ผ.
422
+ 4. ์ผ์ƒ์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์‹ค์ฒœํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑด๊ฐ• ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜๋ผ.
423
+ 5. ๊ฑด๊ฐ• ๋ฌธ์ œ์˜ ์›์ธ, ์ฆ์ƒ, ์˜ˆ๋ฐฉ, ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ผ.
424
+ 6. ์ „๋ฌธ์ ์ธ ์˜ํ•™ ์šฉ์–ด๋Š” ์‰ฌ์šด ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ผ.
425
+ 7. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ์˜ ์ถฉ๋ถ„ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
426
+ 8. ๊ธ€ ์ „์ฒด ๊ธธ์ด๋Š” ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž๊ฐ€ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
427
+ [์ค‘์š” ๊ทœ์น™]
428
+ 1. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
429
+ 2. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
430
+ 3. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
431
+ 4. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
432
+ 5. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ.
433
+ 6. ์˜ํ•™์  ์กฐ์–ธ์ด ํ•„์š”ํ•œ ์‹ฌ๊ฐํ•œ ์ฆ์ƒ์˜ ๊ฒฝ์šฐ ์ „๋ฌธ์˜ ์ƒ๋‹ด์„ ๊ถŒ๊ณ ํ•˜๋ผ.
434
+ """
435
+ }
436
+ return prompts.get(category, prompts["์ผ๋ฐ˜"])
437
+
438
+ # -------------------------------
439
+ # ๊ธ€ ์ƒ์„ฑ ๊ด€๋ จ ์ฃผ์š” ํ•จ์ˆ˜
440
+ # -------------------------------
441
+
442
+ def call_gemini_api(prompt, temperature=TEMPERATURE, top_p=TOP_P):
443
+ """Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜"""
444
+ response = client.models.generate_content(
445
+ model="gemini-2.0-flash",
446
+ contents=[prompt],
447
+ config=types.GenerateContentConfig(
448
+ max_output_tokens=MAX_TOKENS,
449
+ temperature=temperature,
450
+ top_p=top_p
451
+ )
452
+ )
453
+ return response.text.strip()
454
+
455
+ def generate_outline(category, style, references1, references2, references3):
456
+ """์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ํ•จ์ˆ˜"""
457
+ try:
458
+ category_prompt = get_category_outline_prompt(category)
459
+ style_prompt = get_style_prompt(style)
460
+
461
+ # ์ฐธ๊ณ ๊ธ€ ์ •๋ณด ์ค€๋น„
462
+ references = [
463
+ references1.strip() if references1.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
464
+ references2.strip() if references2.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
465
+ references3.strip() if references3.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"
466
+ ]
467
+
468
+ # ์˜๋ฏธ ์žˆ๋Š” ์ฐธ๊ณ ๊ธ€๋งŒ ํ•„ํ„ฐ๋ง
469
+ meaningful_refs = [ref for ref in references if ref != "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"]
470
+
471
+ if not meaningful_refs:
472
+ return "์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
473
+
474
+ outline_prompt = f"""
475
+ [๋ธ”๋กœ๊ทธ ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์š”์ฒญ]
476
+ ์นดํ…Œ๊ณ ๋ฆฌ: {category}
477
+ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
478
+ ์ฐธ๊ณ ๊ธ€:
479
+ {references[0]}
480
+ {references[1] if len(meaningful_refs) > 1 else ""}
481
+ {references[2] if len(meaningful_refs) > 2 else ""}
482
+ {category_prompt}
483
+ ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์‹œ ์ถ”๊ฐ€ ์ง€์นจ:
484
+ 1. ์ฐธ๊ณ ๊ธ€์˜ ํ•ต์‹ฌ ์ฃผ์ œ์™€ ๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋ผ.
485
+ 2. ๊ฐ ์†Œ์ฃผ์ œ๋Š” 20์ž ์ด๋‚ด๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๋งค๋ ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
486
+ 3. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์ด ๋…ผ๋ฆฌ์  ํ๋ฆ„๊ณผ ์ผ๊ด€์„ฑ์„ ๊ฐ€์ง€๋„๋ก ๊ตฌ์„ฑํ•˜๋ผ.
487
+ 4. ๋…์ž์˜ ๊ด€์‹ฌ๊ณผ ํ˜ธ๊ธฐ์‹ฌ์„ ์œ ๋ฐœํ•˜๋Š” ์†Œ์ฃผ์ œ๋ฅผ ์„ค๊ณ„ํ•˜๋ผ.
488
+ 5. ์†Œ์ฃผ์ œ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ณ  ์„ค๋ช…์€ ํฌํ•จํ•˜์ง€ ๋ง๋ผ.
489
+ 6. ๊ฐ ์†Œ์ฃผ์ œ๊ฐ€ ์•ฝ์†๋œ ์„น์…˜(๋„์ž…๋ถ€, ๋ณธ๋ก 1~5, ๊ฒฐ๋ก )์— ์ ํ•ฉํ•œ์ง€ ํ™•์ธํ•˜๋ผ.
490
+ 7. ๋ฐฑํ‹ฑ(```)์ด๋‚˜ ์ฝ”๋“œ ๋ธ”๋ก ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
491
+ 8. ์ •ํ™•ํžˆ 7์ค„๋กœ ๊ตฌ์„ฑํ•˜์—ฌ '๋„์ž…๋ถ€', '๋ณธ๋ก 1~5', '๊ฒฐ๋ก '๋งŒ ์ถœ๋ ฅํ•˜๋ผ.
492
+ """
493
+
494
+ # Gemini API ํ˜ธ์ถœ
495
+ outline_result = call_gemini_api(outline_prompt, temperature=0.7)
496
+
497
+ # ๊ฒฐ๊ณผ ํ›„์ฒ˜๋ฆฌ (๋ถˆํ•„์š”ํ•œ ํ˜•์‹ ์ œ๊ฑฐ)
498
+ outline_result = re.sub(r'^\s*[-*]\s+', '', outline_result, flags=re.MULTILINE)
499
+ outline_result = re.sub(r'^\s*\d+\.\s+', '', outline_result, flags=re.MULTILINE)
500
+
501
+ # ๋ฐฑํ‹ฑ ๋ฐ ์ฝ”๋“œ ๋ธ”๋ก ์ œ๊ฑฐ
502
+ outline_result = re.sub(r'```[a-zA-Z]*\n?', '', outline_result)
503
+ outline_result = re.sub(r'```', '', outline_result)
504
+
505
+ # ์ •ํ™•ํžˆ 7์ค„ ํ˜•์‹์œผ๋กœ ์ •๋ฆฌ
506
+ lines = outline_result.strip().split('\n')
507
+ clean_lines = []
508
+
509
+ for line in lines:
510
+ line = line.strip()
511
+ if line and (line.startswith('๋„์ž…๋ถ€:') or
512
+ line.startswith('๋ณธ๋ก ') or
513
+ line.startswith('๊ฒฐ๋ก :')):
514
+ clean_lines.append(line)
515
+
516
+ # ์ •ํ™•ํžˆ 7์ค„์ด ๋‚˜์˜ค๋„๋ก ์กฐ์ •
517
+ if len(clean_lines) > 7:
518
+ clean_lines = clean_lines[:7]
519
+ elif len(clean_lines) < 7:
520
+ sections = ['๋„์ž…๋ถ€:', '๋ณธ๋ก 1:', '๋ณธ๋ก 2:', '๋ณธ๋ก 3:', '๋ณธ๋ก 4:', '๋ณธ๋ก 5:', '๊ฒฐ๋ก :']
521
+ while len(clean_lines) < 7:
522
+ missing_section = sections[len(clean_lines)]
523
+ clean_lines.append(f"{missing_section} ์ถ”๊ฐ€ ๋‚ด์šฉ ํ•„์š”")
524
+
525
+ return '\n'.join(clean_lines)
526
+
527
+ except Exception as e:
528
+ logging.error(f"์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
529
+ return f"์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
530
+
531
+
532
+ def post_process_blog(blog_content, style="์นœ๊ทผํ•œ"):
533
+ """๋ธ”๋กœ๊ทธ ์ปจํ…์ธ  ํ›„์ฒ˜๋ฆฌ ํ•จ์ˆ˜"""
534
+ try:
535
+ # ๋ฒˆํ˜ธ ๋ชฉ๋ก, ๋ถˆ๋ฆฟ, ํ—ค๋”ฉ ๋“ฑ ์ œ๊ฑฐ
536
+ blog_content = re.sub(r'^\d+\.\s+', '', blog_content, flags=re.MULTILINE)
537
+ blog_content = re.sub(r'^[\*\-\โ€ข]\s+', '', blog_content, flags=re.MULTILINE)
538
+ blog_content = re.sub(r'^#+\s+', '', blog_content, flags=re.MULTILINE)
539
+
540
+ # ์Šคํƒ€์ผ์— ๋”ฐ๋ฅธ ์–ดํˆฌ ์กฐ์ •
541
+ if style == "์นœ๊ทผํ•œ":
542
+ blog_content = re.sub(r'([๊ฐ€-ํžฃ]+)๊ณ ์š”', r'\1๊ตฌ์š”', blog_content)
543
+ blog_content = re.sub(r'๋‹ต๋‹ˆ๋‹ค', '์–ด์š”', blog_content)
544
+ blog_content = re.sub(r'์˜€๋‹ต๋‹ˆ๋‹ค', '์˜€์–ด์š”', blog_content)
545
+ blog_content = re.sub(r'ํ–ˆ๋‹ต๋‹ˆ๋‹ค', 'ํ–ˆ์–ด์š”', blog_content)
546
+ blog_content = re.sub(r'์Šต๋‹ˆ๋‹ค', '์š”', blog_content)
547
+ blog_content = re.sub(r'ํ•ฉ๋‹ˆ๋‹ค', 'ํ•ด์š”', blog_content)
548
+ blog_content = re.sub(r'๋ฉ๋‹ˆ๋‹ค', '๋ผ์š”', blog_content)
549
+ blog_content = re.sub(r'์ž…๋‹ˆ๋‹ค', '์ด์—์š”', blog_content)
550
+
551
+ # ๊ณผ์žฅ๋œ ํ‘œํ˜„ ์ •๋ฆฌ
552
+ exaggerated_expressions = [
553
+ (r'ํ•„์ˆ˜์ ์ธ', r'์ค‘์š”ํ•œ'),
554
+ (r'ํ˜๋ช…์ ์ธ', r'์ค‘์š”ํ•œ'),
555
+ (r'๋†€๋ผ์šด', r'์ฃผ๋ชฉํ•  ๋งŒํ•œ'),
556
+ (r'๊ธฐ์ ์˜', r'ํšจ๊ณผ์ ์ธ'),
557
+ (r'์ตœ๊ณ ์˜', r'์ข‹์€'),
558
+ (r'์„ธ๊ณ„์ ์ธ', r'์œ ๋ช…ํ•œ'),
559
+ (r'์™„๋ฒฝํ•œ', r'์šฐ์ˆ˜ํ•œ'),
560
+ (r'๊ทน์ ์ธ', r'์ƒ๋‹นํ•œ'),
561
+ (r'๋ฌดํ•œํ•œ', r'๋งŽ์€'),
562
+ (r'์ ˆ๋Œ€์ ์ธ', r'์ƒ๋‹นํ•œ'),
563
+ (r'ํ˜์‹ ์ ์ธ', r'์ƒˆ๋กœ์šด'),
564
+ (r'ํ™˜์ƒ์ ์ธ', r'์ข‹์€'),
565
+ (r'๊ทผ๋ณธ์ ์ธ', r'๊ธฐ๋ณธ์ ์ธ'),
566
+ (r'ํš๊ธฐ์ ์ธ', r'์ค‘์š”ํ•œ'),
567
+ (r'์ „๋ก€์—†๋Š”', r'ํŠน๋ณ„ํ•œ'),
568
+ (r'์••๋„์ ์ธ', r'์ฃผ๋ชฉํ•  ๋งŒํ•œ'),
569
+ (r'ํ™ฉํ™€ํ•œ', r'์ข‹์€'),
570
+ (r'์ฒœ์ƒ์˜', r'์šฐ์ˆ˜ํ•œ'),
571
+ (r'๊ธฐ๊ฐ€ ๋ง‰ํžŒ', r'ํšจ๊ณผ์ ์ธ'),
572
+ (r'๋ํŒ์™•', r'์ตœ์ƒ์œ„'),
573
+ (r'๊ทธ ์ž์ฒด', r''),
574
+ (r'์ด .{1,10} ๊ทธ ์ž์ฒด์˜€์–ด์š”', r'์ด \1์˜€์–ด์š”'),
575
+ (r'๊ฐ€ .{1,10} ๊ทธ ์ž์ฒด์˜€์–ด์š”', r'๊ฐ€ \1์˜€์–ด์š”'),
576
+ (r'์••๋„์ ์ธ', r'์ค‘์š”ํ•œ'),
577
+ (r'์ฒœ๊ตญ', r'์ข‹์€ ๊ณณ'),
578
+ (r'ํ™ฉํ™€ํ–ˆ์–ด์š”', r'์ข‹์•˜์–ด์š”'),
579
+ (r'ํ™˜์ƒ์˜', r'์ข‹์€')
580
+ ]
581
+
582
+ for pattern, replacement in exaggerated_expressions:
583
+ blog_content = re.sub(pattern, replacement, blog_content, flags=re.IGNORECASE)
584
+
585
+ blog_content = re.sub(r'์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด', r'์•Œ๋ ค์ง„ ๋ฐ”๋กœ๋Š”', blog_content)
586
+ blog_content = re.sub(r'์ฐธ๊ณ ๊ธ€', r'๊ด€๋ จ ์ •๋ณด', blog_content)
587
+
588
+ return blog_content
589
+ except Exception as e:
590
+ logging.error(f"๋ธ”๋กœ๊ทธ ๊ธ€ ํ›„์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
591
+ return blog_content
592
+
593
+ def generate_blog_post(category, style, outline_input, references1, references2, references3):
594
+ """ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์ „์ฒด ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ํ•จ์ˆ˜ (ํ‡ด๊ณ  ๋ฐ ํ™•์žฅ ๊ธฐ๋Šฅ ํฌํ•จ)"""
595
+ try:
596
+ # ์ฐธ๊ณ ๊ธ€ ์ค€๋น„
597
+ references = [
598
+ references1.strip() if references1.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
599
+ references2.strip() if references2.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
600
+ references3.strip() if references3.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"
601
+ ]
602
+
603
+ # ์˜๋ฏธ ์žˆ๋Š” ์ฐธ๊ณ ๊ธ€๋งŒ ํ•„ํ„ฐ๋ง
604
+ references = [ref for ref in references if ref != "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"]
605
+
606
+ if not references:
607
+ return "<p>์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</p>", 0
608
+
609
+ if not outline_input.strip():
610
+ return "<p>์•„์›ƒ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„์›ƒ๋ผ์ธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</p>", 0
611
+
612
+ # ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐ ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
613
+ category_prompt = get_category_blog_prompt(category)
614
+ style_prompt = get_style_prompt(style)
615
+
616
+ # Phase 1: ์ดˆ๊ธฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ
617
+ blog_prompt = f"""
618
+ [๋ธ”๋กœ๊ทธ ๊ธ€ ๏ฟฝ๏ฟฝ์„ฑ ์š”์ฒญ]
619
+ ์นดํ…Œ๊ณ ๋ฆฌ: {category}
620
+ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
621
+ ์•„์›ƒ๋ผ์ธ:
622
+ {outline_input}
623
+ ์ฐธ๊ณ ๊ธ€:
624
+ {references[0]}
625
+ {references[1] if len(references) > 1 else ""}
626
+ {references[2] if len(references) > 2 else ""}
627
+ {category_prompt}
628
+ {style_prompt}
629
+ [์†Œ์ œ๋ชฉ ์ž‘์„ฑ ๊ฐ€์ด๋“œ]
630
+ 1. ๋ณธ๋ก ์˜ ๊ฐ ๋ถ€๋ถ„๋งˆ๋‹ค ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
631
+ 2. ์†Œ์ œ๋ชฉ์€ 10~20์ž ๋‚ด์™ธ๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”.
632
+ 3. ์†Œ์ œ๋ชฉ์€ ๋…๋ฆฝ๋œ ์ค„์— ์œ„์น˜ํ•˜๊ณ  ์•ž๋’ค์— ๋นˆ ์ค„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
633
+ 4. ์†Œ์ œ๋ชฉ ์˜ˆ์‹œ: 'ํšจ๊ณผ์ ์ธ ์šด๋™ ๋ฐฉ๋ฒ•', '๊ฑด๊ฐ•ํ•œ ์‹์Šต๊ด€์˜ ์ค‘์š”์„ฑ', '์ŠคํŠธ๋ ˆ์Šค ๊ด€๋ฆฌ๋ž€?'
634
+ [์ค‘์š” ์ž‘์„ฑ ๊ทœ์น™]
635
+ 1. ๋ฐ˜๋“œ์‹œ ์œ„์˜ ์•„์›ƒ๋ผ์ธ ์ˆœ์„œ์™€ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ž‘์„ฑํ•˜๋ผ.
636
+ 2. ๊ฐ ์„น์…˜์€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์„น์…˜ ์ œ๋ชฉ์„ ํฌํ•จํ•˜๋ผ.
637
+ 3. ๋„์ž…๋ถ€๋Š” ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋Œ๊ณ  ์ฃผ์ œ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
638
+ 4. ๋ณธ๋ก  ๊ฐ ๋ถ€๋ถ„์€ ์ฃผ์ œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ๋‹ค๋ฃจ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ์ •๋ณด์™€ ์˜ˆ์‹œ๋ฅผ ํฌํ•จํ•˜๋ผ.
639
+ 5. ๊ฒฐ๋ก ์€ ํ•ต์‹ฌ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๊ณ  ์ตœ์ข… ๋ฉ”์‹œ์ง€๋‚˜ ํ†ต์ฐฐ์„ ์ œ๊ณตํ•˜๋ผ.
640
+ 6. ์ „์ฒด ๊ธ€์˜ ๊ธธ์ด๋Š” ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž๊ฐ€ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
641
+ 7. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ์˜ ์ถฉ๋ถ„ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
642
+ 8. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
643
+ 9. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
644
+ 10. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
645
+ 11. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
646
+ 12. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ.
647
+ 13. ๊ณผ์žฅ๋œ ํ‘œํ˜„์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๋ผ.
648
+ 14. ๊ฐ ์„น์…˜ ์‚ฌ์ด์— ์ž์—ฐ์Šค๋Ÿฌ์šด ์—ฐ๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
649
+ 15. ๊ธ€์˜ ์ฒ˜์Œ์— ์ „์ฒด ๊ธ€์˜ ๋งค๋ ฅ์ ์ธ ์ œ๋ชฉ์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•˜๋ผ.
650
+ """
651
+
652
+ # Gemini API ํ˜ธ์ถœ (ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์ „์ฒด ๊ธ€ ์ƒ์„ฑ)
653
+ logging.info("์ „์ฒด ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์‹œ์ž‘")
654
+ blog_content = call_gemini_api(blog_prompt, temperature=0.7)
655
+ logging.info(f"์ƒ์„ฑ๋œ ์›๋ณธ ๊ธ€ ๊ธธ์ด: {len(blog_content)}")
656
+
657
+ # ํ›„์ฒ˜๋ฆฌ
658
+ processed_content = post_process_blog(blog_content, style)
659
+
660
+ # HTML ๋ณ€ํ™˜ํ•˜์—ฌ ๊ธ€์ž ์ˆ˜ ์ฒดํฌ
661
+ temp_html = format_blog_post(processed_content)
662
+ char_count = len(extract_text_from_html(temp_html))
663
+ logging.info(f"์ดˆ๊ธฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {char_count}")
664
+
665
+ # Phase 2: ๊ธ€์ž ์ˆ˜๊ฐ€ ๋ชฉํ‘œ์— ๋ฏธ๋‹ฌํ•˜๋ฉด ํ‡ด๊ณ  ๋ฐ ํ™•์žฅ
666
+ if char_count < TARGET_CHAR_LENGTH * 0.8: # ๋ชฉํ‘œ์˜ 80% ๋ฏธ๋งŒ์ด๋ฉด ํ™•์žฅ
667
+ logging.info(f"๊ธ€์ž ์ˆ˜ ๋ถ€์กฑ ({char_count} < {TARGET_CHAR_LENGTH * 0.8}), ํ™•์žฅ ์‹œ๋„")
668
+
669
+ # ๊ฐ€์žฅ ๊ธด ์ฐธ๊ณ ๊ธ€ ์„ ํƒ
670
+ longest_ref = max(references, key=len)
671
+
672
+ expansion_prompt = f"""
673
+ [๋ธ”๋กœ๊ทธ ๊ธ€ ํ™•์žฅ ์š”์ฒญ]
674
+ ์นดํ…Œ๊ณ ๋ฆฌ: {category}
675
+ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
676
+ ์›๋ณธ ๊ธ€:
677
+ {processed_content}
678
+ ์ฐธ๊ณ ๊ธ€:
679
+ {longest_ref}
680
+ ๋ฌธ์ œ์ :
681
+ ์ด ๊ธ€์€ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜์ธ {TARGET_CHAR_LENGTH}์ž์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜๋Š” ์•ฝ {char_count}์ž์ž…๋‹ˆ๋‹ค.
682
+ ๋‚ด์šฉ์ด ๋ถ€์‹คํ•˜์—ฌ ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
683
+ {style_prompt}
684
+ [ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ]
685
+ 1. ์›๋ณธ ๊ธ€์˜ ๊ตฌ์กฐ์™€ ์•„์›ƒ๋ผ์ธ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ ์„น์…˜์˜ ๋‚ด์šฉ์„ ๋Œ€ํญ ํ™•์žฅํ•˜๋ผ.
686
+ 2. ๊ฐ ์„น์…˜์— ๋” ๊ตฌ์ฒด์ ์ธ ์ •๋ณด, ์˜ˆ์‹œ, ์‚ฌ๋ก€, ํ†ต๊ณ„ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋ผ.
687
+ 3. ์ „์ฒด ๊ธ€์ž ์ˆ˜๋ฅผ ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ ๋‹ฌ์„ฑํ•˜๋ผ.
688
+ 4. ์Šคํƒ€์ผ๊ณผ ์–ด์กฐ๋Š” ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
689
+ 5. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
690
+ 6. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
691
+ 7. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
692
+ 8. "์ฐธ๊ณ ๊ธ€" ๊ด€๋ จ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
693
+ 9. ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐ˜๋ณต์ด๋‚˜ ๊ณผ์žฅ๋œ ํ‘œํ˜„์„ ํ”ผํ•˜๋ผ.
694
+ """
695
+
696
+ # ํ™•์žฅ ์‹œ๋„
697
+ expanded_content = call_gemini_api(expansion_prompt, temperature=0.75)
698
+ processed_content = post_process_blog(expanded_content, style)
699
+
700
+ # ๋‹ค์‹œ ๊ธ€์ž ์ˆ˜ ์ฒดํฌ
701
+ temp_html = format_blog_post(processed_content)
702
+ char_count = len(extract_text_from_html(temp_html))
703
+ logging.info(f"ํ™•์žฅ ํ›„ ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {char_count}")
704
+
705
+ # Phase 3: ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•˜๋ฉด ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„
706
+ if char_count < TARGET_CHAR_LENGTH * 0.9: # ๋ชฉํ‘œ์˜ 90% ๋ฏธ๋งŒ์ด๋ฉด ์ถ”๊ฐ€ ํ™•์žฅ
707
+ logging.info(f"์—ฌ์ „ํžˆ ๊ธ€์ž ์ˆ˜ ๋ถ€์กฑ ({char_count} < {TARGET_CHAR_LENGTH * 0.9}), ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„")
708
+
709
+ additional_expansion_prompt = f"""
710
+ [๋ธ”๋กœ๊ทธ ๊ธ€ ์ถ”๊ฐ€ ํ™•์žฅ ์š”์ฒญ]
711
+ ์นดํ…Œ๊ณ ๋ฆฌ: {category}
712
+ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
713
+ ์›๋ณธ ๊ธ€:
714
+ {processed_content}
715
+ ๋ฌธ์ œ์ :
716
+ ์ด ๊ธ€์€ ์—ฌ๏ฟฝ๏ฟฝ๏ฟฝํžˆ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜์ธ {TARGET_CHAR_LENGTH}์ž์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜๋Š” ์•ฝ {char_count}์ž์ž…๋‹ˆ๋‹ค.
717
+ [์ถ”๊ฐ€ ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ]
718
+ 1. ๋ณธ๋ก  ๋ถ€๋ถ„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ํฌ๊ฒŒ ํ™•์žฅํ•˜๋ผ.
719
+ 2. ๊ฐ ๊ฐœ๋…์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์„ค๋ช…๊ณผ ์‹ค์šฉ์ ์ธ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ผ.
720
+ 3. ๋…์ž์—๊ฒŒ ์œ ์šฉํ•œ ํ•ต์‹ฌ ์ •๋ณด์™€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋ผ.
721
+ 4. ์ „์ฒด ๊ธ€์ž ์ˆ˜๋ฅผ ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ์œผ๋กœ ํ™•์žฅํ•˜๋ผ.
722
+ 5. ์Šคํƒ€์ผ๊ณผ ์–ด์กฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
723
+ 6. ๋ฐ˜๋ณต๋˜๋Š” ๋‚ด์šฉ์ด๋‚˜ ์ค‘๋ณต์€ ํ”ผํ•˜๋ผ.
724
+ """
725
+
726
+ # ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„
727
+ further_expanded_content = call_gemini_api(additional_expansion_prompt, temperature=0.8)
728
+ processed_content = post_process_blog(further_expanded_content, style)
729
+
730
+ # ์ตœ์ข… HTML ๋ณ€ํ™˜
731
+ final_html = format_blog_post(processed_content)
732
+
733
+ # ์ตœ์ข… ๊ธ€์ž ์ˆ˜ ๊ณ„์‚ฐ
734
+ final_char_count = len(extract_text_from_html(final_html))
735
+ logging.info(f"์ตœ์ข… ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {final_char_count}")
736
+
737
+ return final_html, final_char_count
738
+
739
+ except Exception as e:
740
+ logging.error(f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
741
+ return f"<p>๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}</p>", 0
742
+
743
+ def format_filename(text):
744
+ text = re.sub(r'[^\w\s-]', '', text)
745
+ return text[:50].strip()
746
+
747
+ # API ํ•จ์ˆ˜๋“ค (์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์˜ API ์—”๋“œํฌ์ธํŠธ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์ž‘์„ฑ)
748
+ def generate_outline_1(category, style, ref1, ref2, ref3):
749
+ """API endpoint: /generate_outline_1"""
750
+ return generate_outline(category, style, ref1, ref2, ref3)
751
+
752
+ def generate_blog_post_1(category, style, ref1, ref2, ref3, outline):
753
+ """API endpoint: /generate_blog_post_1"""
754
+ result = generate_blog_post(category, style, outline, ref1, ref2, ref3)
755
+ return result[0] # ํŠœํ”Œ์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ(HTML)๋งŒ ๋ฐ˜ํ™˜