Spaces:
Build error
Build error
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()
|