Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 =
|
|
|
|
|
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 |
-
|
|
|
|
|
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 |
-
|
231 |
-
|
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 |
-
|
|
|
|
|
368 |
generate_button = gr.Button("๋ธ๋ก๊ทธ ๊ธ ์์ฑ")
|
369 |
|
370 |
output_text = gr.Textbox(label="์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ")
|
371 |
-
ref1_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ 1", lines=10, visible=
|
372 |
-
ref2_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ 2", lines=10, visible=
|
373 |
-
ref3_text = gr.Textbox(label="์ฐธ๊ณ ๊ธ 3", lines=10, visible=
|
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()
|