4g3gf / product_review_blog.py
ssboost's picture
Create product_review_blog.py
1775df5 verified
import os
import random
import re
import requests
import logging
import tempfile
from bs4 import BeautifulSoup
from datetime import datetime
from zoneinfo import ZoneInfo
import html
from PIL import Image
from urllib.request import urlopen
import markdown2
import gradio as gr
# ๋กœ๊น… ์„ค์ • (INFO ๋ ˆ๋ฒจ)
logging.basicConfig(level=logging.INFO)
# ์ƒ์ˆ˜ ์ •์˜
TARGET_CHAR_LENGTH = 4000
MIN_SECTION_LENGTH = 600
MAX_TOKENS = 15000
TEMPERATURE = 0.75
TOP_P = 0.95
# API ๊ด€๋ จ ์„ค์ •
gemini_api_key = os.getenv("GEMINI_API_KEY")
# --- Google Gemini SDK ์ดˆ๊ธฐํ™” ---
from google import genai
from google.genai import types
client = genai.Client(api_key=gemini_api_key)
# -------------------------------
# ๊ธฐ๋ณธ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋“ค
# -------------------------------
def remove_unwanted_phrases(text):
"""๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ ํ•จ์ˆ˜"""
unwanted_phrases = [
'์—ฌ๋Ÿฌ๋ถ„', '์ตœ๊ทผ', '๋งˆ์ง€๋ง‰์œผ๋กœ', '๊ฒฐ๋ก ์ ์œผ๋กœ', '๊ฒฐ๊ตญ',
'์ข…ํ•ฉ์ ์œผ๋กœ', '๋”ฐ๋ผ์„œ', '๋งˆ๋ฌด๋ฆฌ', '๋์œผ๋กœ', '์š”์•ฝ',
'ํ•œ ์ค„ ์š”์•ฝ', '์ •๋ฆฌํ•˜์ž๋ฉด', '์ด์ •๋ฆฌ', '๊ธ€์„ ๋งˆ์น˜๋ฉฐ',
'์ด์ƒ์œผ๋กœ', '์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค', '์ฐธ๊ณ ํ•˜์„ธ์š”', '๋„์›€์ด ๋˜์…จ๊ธธ',
'์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”', '๋‹ค์Œ ๊ธ€์—์„œ', '๋„์›€์ด ๋˜์—ˆ๊ธธ',
'์ฆ๊ฑฐ์šด ํ•˜๋ฃจ ๋˜์„ธ์š”', '๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค'
]
# ๋ฌธ๋‹จ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌ
lines = text.split('\n')
result_lines = []
for line in lines:
if "๋‹ค์Œ ์„น์…˜์—์„œ๋Š”" in line:
parts = line.split("๋‹ค์Œ ์„น์…˜์—์„œ๋Š”")
if parts[0].strip():
result_lines.append(parts[0].strip())
else:
# ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์ œ๊ฑฐ (๊ตฌ๋‘์  ํฌํ•จ)
for phrase in unwanted_phrases:
# ๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„ ์•ž๋’ค์˜ ๊ตฌ๋‘์ ๊ณผ ๊ณต๋ฐฑ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ œ๊ฑฐ
pattern = rf'(\b{re.escape(phrase)}\b[\s,.!?]*)|([,.!?]*\b{re.escape(phrase)}\b)'
line = re.sub(pattern, '', line)
# ๋ฌธ์žฅ ๋‚ด ์ž”์—ฌ ๊ณต๋ฐฑ ๋ฐ ๊ตฌ๋‘์  ์ •๋ฆฌ
line = re.sub(r'\s{2,}', ' ', line) # ์—ฐ์† ๊ณต๋ฐฑ ์ œ๊ฑฐ
line = line.strip() # ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ
result_lines.append(line)
return '\n'.join(result_lines)
def convert_to_html(text):
"""๋งˆํฌ๋‹ค์šด ํ˜•์‹์„ HTML๋กœ ๋ณ€ํ™˜"""
text = re.sub(r'^\s*[-*]\s+', '', text, flags=re.MULTILINE)
text = re.sub(r'^\s*\d+\.\s+', '', text, flags=re.MULTILINE)
text = re.sub(r'^\s*#{1,6}\s+', '', text, flags=re.MULTILINE)
return markdown2.markdown(text)
def format_blog_post(blog_post, query="", with_title=False):
"""๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ํฌ๋งทํŒ… ํ•จ์ˆ˜ - ์†Œ์ œ๋ชฉ ๊ฐ•ํ™” ๋ฒ„์ „"""
blog_post = re.sub(r'^#+\s+', '', blog_post, flags=re.MULTILINE)
blog_post = re.sub(r'^\d+\.\s+', '', blog_post, flags=re.MULTILINE)
blog_post = re.sub(r'^[\*\-]\s+', '', blog_post, flags=re.MULTILINE)
# ์ฒซ ์ค„(์›๋ณธ ์ œ๋ชฉ)๊ณผ ๋น„์Šทํ•œ ํŒจํ„ด์ด ์žˆ๋‹ค๋ฉด ์ œ๊ฑฐ
lines = blog_post.split('\n')
if lines and len(lines) > 0:
first_line = lines[0].strip()
# ์ฒซ ์ค„์ด ์ œ๋ชฉ์ธ ๊ฒฝ์šฐ, ๋น„์Šทํ•œ ๋‚ด์šฉ์˜ ๋ผ์ธ์„ ๋ชจ๋‘ ์ œ๊ฑฐ
if first_line and len(first_line) > 5:
# ์ฒซ ์ค„๊ณผ ์œ ์‚ฌํ•œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ๋ผ์ธ ์ฐพ์•„ ์ œ๊ฑฐ
filtered_lines = []
for line in lines:
# ์ฒซ ์ค„๊ณผ ์œ ์‚ฌํ•˜๋ฉด ์ œ๊ฑฐ
if line.strip() and (first_line in line or line in first_line):
continue
filtered_lines.append(line)
lines = filtered_lines
# ๋„์ž…๋ถ€, ๊ฒฐ๋ก  ์†Œ์ œ๋ชฉ ํŒจํ„ด
intro_pattern = r'(?i)๋„์ž…๋ถ€\s*[:]?\s*(.*?)$'
conclusion_pattern = r'(?i)๊ฒฐ๋ก \s*[:]?\s*(.*?)$'
# ๋„์ž…๋ถ€, ๊ฒฐ๋ก  ์†Œ์ œ๋ชฉ ์ œ๊ฑฐ
filtered_lines = []
for line in lines:
if re.match(intro_pattern, line) or re.match(conclusion_pattern, line):
continue
filtered_lines.append(line)
lines = filtered_lines
# ๋ณธ๋ก  ์†Œ์ œ๋ชฉ ํŒจํ„ด ๊ฐ•ํ™”
section_patterns = [
r'^๋ณธ๋ก \d+\s*[:]?\s*(.*?)$', # ๋ณธ๋ก 1: ๋‚ด์šฉ ํŒจํ„ด
r'^.{5,50}์˜ [๊ฐ€-ํžฃ\s]+$', # ~์˜ ~ ํŒจํ„ด
r'^[๊ฐ€-ํžฃ\s]{5,30}(์ด๋ž€|์ด๋ž€\?|์ด๋ž€\s๋ฌด์—‡์ธ๊ฐ€|์ด๋ž€\s๋ฌด์—‡์ผ๊นŒ)[\?\s]*$', # ~์ด๋ž€? ํŒจํ„ด
r'^[๊ฐ€-ํžฃ\s]{5,50}\s[-โ€“]\s.{5,30}$', # ๊ฐ•์กฐ ํ‘œํ˜„ ํŒจํ„ด (์˜ˆ: ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ• - ์‹ค์ฒœํ•˜๊ธฐ)
r'^[๊ฐ€-ํžฃA-Za-z\s]{10,50}[\.!\?]$', # ๊ธด ๋ฌธ์žฅ์œผ๋กœ ๋œ ์†Œ์ œ๋ชฉ ํŒจํ„ด
]
formatted_lines = []
in_paragraph = False
# ๋ณธ๋ก  ์„น์…˜ ๋ฒˆํ˜ธ ์ถ”์ 
section_number = 1
for i, line in enumerate(lines):
line = line.strip()
if not line:
if in_paragraph:
formatted_lines.append("</p>")
in_paragraph = False
formatted_lines.append("<br>")
continue
# ๋‹ค์Œ ์ค„๊ณผ ์ด์ „ ์ค„์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
prev_empty = i == 0 or not lines[i-1].strip()
next_empty = i == len(lines) - 1 or not lines[i+1].strip()
# ์†Œ์ œ๋ชฉ์ธ์ง€ ์ฒดํฌ
is_subtitle = False
clean_subtitle = line
# ํŒจํ„ด ๋งค์นญ์œผ๋กœ ์†Œ์ œ๋ชฉ ํ™•์ธ
for pattern in section_patterns:
if re.match(pattern, line):
is_subtitle = True
# ๋ณธ๋ก X: ํŒจํ„ด์ธ ๊ฒฝ์šฐ ์ •๋ฆฌ
if "๋ณธ๋ก " in line:
clean_subtitle = re.sub(r'^๋ณธ๋ก \d+\s*[:]?\s*', '', line)
break
# ํŒจํ„ด์— ๋งค์นญ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค์Œ ๊ทœ์น™์œผ๋กœ ์†Œ์ œ๋ชฉ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
if not is_subtitle:
# ์•ž๋’ค ์ค„์ด ๋น„์–ด์žˆ๊ณ , ๊ธธ์ด๊ฐ€ ์งง์€(5-50์ž) ๋ฌธ์žฅ์€ ์†Œ์ œ๋ชฉ์œผ๋กœ ์ฒ˜๋ฆฌ
if prev_empty and next_empty and 5 <= len(line) <= 50:
is_subtitle = True
# ์ด์ „์— ์žˆ๋˜ ์†Œ์ œ๋ชฉ๋“ค๊ณผ ๋น„์Šทํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ๋„ ์†Œ์ œ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ
elif section_number > 1 and prev_empty and 5 <= len(line) <= 50:
is_subtitle = True
if is_subtitle and clean_subtitle.strip():
if in_paragraph:
formatted_lines.append("</p>")
in_paragraph = False
# ์†Œ์ œ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์งง์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
if not clean_subtitle.strip() or len(clean_subtitle.strip()) < 2:
clean_subtitle = f"์ฃผ์š” ํฌ์ธํŠธ {section_number}"
# ์†Œ์ œ๋ชฉ ํ˜•์‹ ๊ฐ•ํ™” - ํ•ญ์ƒ ๋ณผ๋“œ์ฒ˜๋ฆฌ์™€ ์Šคํƒ€์ผ๋ง ์ ์šฉ
formatted_lines.append(
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>'
)
section_number += 1
else:
# ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ
if not in_paragraph:
formatted_lines.append("<p>")
in_paragraph = True
content = html.escape(line)
bold_content = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', content)
formatted_lines.append(bold_content)
if in_paragraph:
formatted_lines.append("</p>")
return '\n'.join(formatted_lines)
# -------------------------------
# ์Šคํƒ€์ผ ๋ฐ ํ”„๋กฌํ”„ํŠธ ๊ฐ€์ด๋“œ ํ•จ์ˆ˜
# -------------------------------
def get_style_prompt(style="์นœ๊ทผํ•œ"):
"""๋ธ”๋กœ๊ทธ ๊ธ€์˜ ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐ˜ํ™˜"""
prompts = {
"์นœ๊ทผํ•œ": """
[์นœ๊ทผํ•œ ์ƒํ’ˆ๋ฆฌ๋ทฐ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
1. ํ†ค๊ณผ ์–ด์กฐ
- ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
- ์ƒํ’ˆ์— ๋Œ€ํ•œ ๊ด€์‹ฌ๊ณผ ํ˜ธ๊ธฐ์‹ฌ์„ ๋‹ด์€ ํ‘œํ˜„ ์‚ฌ์šฉ
- ์‹ค์ œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์ƒํ•œ ๋ฌ˜์‚ฌ
2. ๋ฌธ์žฅ ๋ฐ ์–ดํˆฌ
- ๋ฐ˜๋“œ์‹œ 'ํ•ด์š”์ฒด'๋กœ ์ž‘์„ฑ, ์ ˆ๋Œ€ '์Šต๋‹ˆ๋‹ค'์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ
- '~์š”'๋กœ ๋๋‚˜๋„๋ก ์ž‘์„ฑ, '~๋‹ค'๋กœ ๋๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๋ผ
- ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
- ์ ์ ˆํ•œ ๊ฐ์ • ํ‘œํ˜„๊ณผ ๊ณต๊ฐ๋Œ€ ํ˜•์„ฑ
3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
- ์ƒํ’ˆ ๊ด€๋ จ ์ „๋ฌธ ์šฉ์–ด๋Š” ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
- ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํ’ˆ ํŠน์„ฑ๊ณผ ๊ฒฝํ—˜ ๋ฌ˜์‚ฌ
- ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋А๋‚Œ ์ฃผ๊ธฐ (์˜ˆ: "์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?", "์ด๋Ÿฐ ๊ฒฝํ—˜ ์žˆ์œผ์‹ ๊ฐ€์š”?")
- ๊ตฌ์ฒด์  ์‚ฌ๋ก€์™€ ์‹ค์ œ ๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•œ ํŒ ์ œ๊ณต
4. ์ •๋ณด ์ „๋‹ฌ ๋ฐฉ์‹
- ๊ฐœ์ธ์ ์ธ ๊ด€์ ์— ๋…น์—ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ •๋ณด ์ „๋‹ฌ
- ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์‹œ์„ ์œผ๋กœ ์ƒํ’ˆ ๋ฌ˜์‚ฌ
- ๋…์ž๊ฐ€ ์‹ค์ œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์  ์ •๋ณด ์ œ๊ณต (๊ฐ€๊ฒฉ, ๊ตฌ๋งค์ฒ˜, ์‚ฌ์šฉ๋ฒ•, ํŒ ๋“ฑ)
5. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
- ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ์‹ค์ œ ํ™œ์šฉ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์ด๋‚˜ ์กฐ์–ธ ์ œ๊ณต
์ฃผ์˜์‚ฌํ•ญ: ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”์ฒด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •๋ณด์˜ ์งˆ๊ณผ ๋‚ด์šฉ์˜ ๊นŠ์ด๋ฅผ ์žƒ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค
""",
"์ผ๋ฐ˜": """
[์ผ๋ฐ˜์ ์ธ ์ƒํ’ˆ๋ฆฌ๋ทฐ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
1. ํ†ค๊ณผ ์–ด์กฐ
- ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
- ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")
- ์ƒํ’ˆ ์ •๋ณด ์ „๋‹ฌ ์ค‘์‹ฌ์˜ ๋ช…ํ™•ํ•œ ์–ดํˆฌ
2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
- ๋ช…ํ™•ํ•œ ์ƒํ’ˆ ์†Œ๊ฐœ๋กœ ์‹œ์ž‘
- ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ (๊ฐœ์š” โ†’ ๋””์ž์ธ โ†’ ๊ธฐ๋Šฅ โ†’ ์„ฑ๋Šฅ โ†’ ๊ฐ€๊ฒฉ ๋“ฑ)
- ํ•ต์‹ฌ ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
- ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ
3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
- ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
- ํ•„์š”์‹œ ์ „๋ฌธ ์šฉ์–ด์— ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
- ๊ฐ๊ด€์ ์ธ ์ƒํ’ˆ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 
- ๊ท ํ˜• ์žกํžŒ ์‹œ๊ฐ์—์„œ ์ƒํ’ˆ์˜ ์žฅ๋‹จ์  ์ œ์‹œ
4. ์ •๋ณด ์ „๋‹ฌ ๋ฐฉ์‹
- ์ƒํ’ˆ์˜ ๊ธฐ๋ณธ ์ •๋ณด์™€ ํŠน์ง• ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณต
- ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ์™€ ํ™œ์šฉ๋ฒ• ํฌํ•จ
- ์ตœ์‹  ์ƒํ’ˆ ์ •๋ณด์™€ ๋™ํ–ฅ ์ฐธ๊ณ 
5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
- ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ
- ์‹ค์šฉ์ ์ธ ๊ตฌ๋งค ๋ฐ ์‚ฌ์šฉ ํŒ ์ œ๊ณต
์ฃผ์˜์‚ฌํ•ญ: ๊ฐ๊ด€์  ์ •๋ณด ์ œ๊ณต์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋˜, ๋…์ž์˜ ๊ตฌ๋งค ๊ฒฐ์ •๊ณผ ํ™œ์šฉ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋งฅ๋ฝ๊ณผ ์„ค๋ช…์„ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•œ๋‹ค
""",
"์ „๋ฌธ์ ์ธ": """
[์ „๋ฌธ์ ์ธ ์ƒํ’ˆ๋ฆฌ๋ทฐ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]
1. ํ†ค๊ณผ ๊ตฌ์กฐ
- ๊ณต์‹์ ์ด๊ณ  ์ „๋ฌธ์ ์ธ ํ†ค ์‚ฌ์šฉ
- ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
- ๋ช…ํ™•ํ•œ ์„œ๋ก (์ƒํ’ˆ ๊ฐœ์š”), ๋ณธ๋ก (์ƒ์„ธ ๋ถ„์„), ๊ฒฐ๋ก (์ข…ํ•ฉ ํ‰๊ฐ€) ๊ตฌ์กฐ
- ์ฒด๊ณ„์ ์ธ ์ƒํ’ˆ ์ •๋ณด ์ „๊ฐœ
- ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
- ์ƒํ’ˆ์˜ ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ, ์ œ์กฐ์‚ฌ ์ •๋ณด, ๊ฐœ๋ฐœ ๋™ํ–ฅ ๋“ฑ ์‹ฌ์ธต์  ์ •๋ณด ํฌํ•จ
- ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
- ์ƒํ’ˆ ๊ด€๋ จ ์ „๋ฌธ ์šฉ์–ด ์ ์ ˆํžˆ ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
- ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ํ‰๊ฐ€ ์ œ๊ณต
- ๋‹ค์–‘ํ•œ ๊ด€์ ์—์„œ ์ƒํ’ˆ ๋ถ„์„
3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
- ํ†ต๊ณ„, ์‚ฌ์–‘ ์ •๋ณด, ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ ๋“ฑ ๊ฐ๊ด€์  ๋ฐ์ดํ„ฐ ํ™œ์šฉ
- ์ƒํ’ˆ ๋ถ„์„์„ ์œ„ํ•œ ์ฒด๊ณ„์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์‹œ
- ๊ฐ๊ด€์  ์ •๋ณด์™€ ์ „๋ฌธ๊ฐ€ ๊ด€์ ์˜ ๊ท ํ˜•
4. ์ „๋ฌธ์  ์ •๋ณด ์ œ๊ณต
- ์ตœ์‹  ๊ธฐ์ˆ  ๋™ํ–ฅ ๋ฐ ํ˜์‹  ๋ถ„์„
- ๊ธฐ์ˆ ์ , ์‹ค์šฉ์  ๋งฅ๋ฝ์—์„œ์˜ ์ƒํ’ˆ ๋ถ„์„
- ์ƒํ’ˆ ๊ด€๋ จ ์Ÿ์ ๊ณผ ๊ณ ๋ ค์‚ฌํ•ญ ์†Œ๊ฐœ
- ์ฒด๊ณ„์ ์ธ ๊ตฌ๋งค ์˜์‚ฌ๊ฒฐ์ • ์ ‘๊ทผ๋ฒ• ์ œ์‹œ
์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ๊ณผ ๊นŠ์ด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์šฉ์–ด์™€ ์„ค๋ช…์„ ํ†ตํ•ด ์ ‘๊ทผ์„ฑ์„ ๋†’์ธ๋‹ค
"""
}
return prompts.get(style, prompts["์นœ๊ทผํ•œ"])
def get_category_outline_prompt(category="์ผ๋ฐ˜"):
"""์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ"""
prompts = {
"์ผ๋ฐ˜": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์†Œ์ฃผ์ œ(Outline) ์ƒ์„ฑ ๊ทœ์น™]
[์‹œ์Šคํ…œ ์—ญํ• ]
๋‹น์‹ ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ „๋ฌธ ์ƒํ’ˆ ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ฑฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ œํ’ˆ์„ ๊ฐ๊ด€์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์ •์งํ•œ ํ‰๊ฐ€๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋งŽ์€ ๋…์ž๋“ค์˜ ์‹ ๋ขฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
[๋ถ„์„ ๋‹จ๊ณ„]
1. ์ฐธ๊ณ  ์ž๋ฃŒ 3๊ฐœ๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์ œํ’ˆ์˜ ํ•ต์‹ฌ ํŠน์ง•๊ณผ ์ค‘์š” ์ •๋ณด ํŒŒ์•…
2. ์ œํ’ˆ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ํŠน์„ฑ ์‹๋ณ„ (์ „์ž๊ธฐ๊ธฐ, ๊ฐ€์ „์ œํ’ˆ, ๋ทฐํ‹ฐ, ํŒจ์…˜, ์‹ํ’ˆ, ์œก์•„์šฉํ’ˆ, ์ธํ…Œ๋ฆฌ์–ด ๋“ฑ)
3. ๋ฆฌ๋ทฐ์˜ ํ•ต์‹ฌ์ด ๋  5๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ํŒŒ์•… (๋””์ž์ธ, ์„ฑ๋Šฅ, ๊ฐ€์„ฑ๋น„, ์‚ฌ์šฉ์„ฑ, ๋‚ด๊ตฌ์„ฑ ๋“ฑ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋งž๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉ)
[์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ ์›์น™]
1. ๋„์ž…๋ถ€(1๊ฐœ) - ์ œํ’ˆ์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ํฅ๋ฏธ๋กœ์šด ์ œ๋ชฉ์œผ๋กœ ์‹œ์ž‘
2. ๋ณธ๋ก (4-5๊ฐœ) - ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ์ œํ’ˆ์˜ ํ•ต์‹ฌ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ๋‹ด์€ ์†Œ์ œ๋ชฉ
- ์ œํ’ˆ ๊ธฐ๋ณธ ์ •๋ณด ๋ฐ ์ŠคํŽ™
- ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•ต์‹ฌ ์„ฑ๋Šฅ/ํŠน์ง• ํ‰๊ฐ€ (์ „์ž์ œํ’ˆ์ด๋ฉด ์„ฑ๋Šฅ, ํ™”์žฅํ’ˆ์ด๋ฉด ํšจ๊ณผ, ์˜๋ฅ˜๋ฉด ์ฐฉ์šฉ๊ฐ ๋“ฑ)
- ์‹ค์ œ ์‚ฌ์šฉ ๊ฒฝํ—˜๊ณผ ์ฒด๊ฐ ํ’ˆ์งˆ
- ๋น„์Šทํ•œ ์ œํ’ˆ๊ณผ์˜ ๋น„๊ต ๋ถ„์„
- ๊ฐ€๊ฒฉ ๋Œ€๋น„ ๊ฐ€์น˜ ํ‰๊ฐ€
- (์œ„ ํ•ญ๋ชฉ๋“ค์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ •)
- ๊ฒฐ๋ก (1๊ฐœ) - ์ „์ฒด ํ‰๊ฐ€๋ฅผ ์š”์•ฝํ•˜๊ณ  ๊ตฌ๋งค ์ถ”์ฒœ๋„๋ฅผ ๋‹ด์€ ์ œ๋ชฉ
[ํ•ต์‹ฌ ์ง€์นจ]
1. ์™„์ „ํžˆ ํ•œ๊ตญ์–ด๋กœ๋งŒ ์ž‘์„ฑํ•  ๊ฒƒ
2. ์†Œ์ œ๋ชฉ์€ ์ตœ๋Œ€ 30์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
3. ๋…์ž์˜ ๊ตฌ๋งค ๊ฒฐ์ •์— ๋„์›€์„ ์ฃผ๋Š” ์‹ค์šฉ์ ์ธ ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "๋†€๋ผ์šด ๋ฐฐํ„ฐ๋ฆฌ ์„ฑ๋Šฅ", "์˜ˆ์ƒ ๋ฐ–์˜ ๋‹จ์ ", "์•Œ์•„๋‘๋ฉด ์ข‹์€ ํ™œ์šฉ๋ฒ•")
4. ์ œํ’ˆ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋งž๋Š” ํ•ต์‹ฌ ํ‰๊ฐ€ ์š”์†Œ๊ฐ€ ์†Œ์ œ๋ชฉ์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑ
5. ํ‚ค์›Œ๋“œ๋Š” ์†Œ์ œ๋ชฉ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (๋ณธ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฐธ๊ณ ์‚ฌํ•ญ์œผ๋กœ๋งŒ ํ™œ์šฉ)
6. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์€ ๋„์ž…๋ถ€(1) + ๋ณธ๋ก (์ตœ๋Œ€ 5๊ฐœ) + ๊ฒฐ๋ก (1)์œผ๋กœ ๊ตฌ์„ฑ
7. ๋‹ค์–‘ํ•œ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ
[์ถœ๋ ฅ ํ˜•์‹]
1. ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋งž๋Š” ํ•ต์‹ฌ ํŠน์ง•๊ณผ ํ‰๊ฐ€ ์š”์†Œ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ
2. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ:(๊ฐ ํ•ญ๋ชฉ๋‹น 1๋ฒˆ ์—”ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์นธ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋กํ•˜๋ผ.)
3. ๋„์ž…๋ถ€: 1๊ฐœ (์ œํ’ˆ ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ํฅ๋ฏธ๋กœ์šด ์ œ๋ชฉ)
4. ๋ณธ๋ก : 4-5๊ฐœ (์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋งž๋Š” ํ•ต์‹ฌ ํ‰๊ฐ€ ์š”์†Œ๋ฅผ ๋ฐ˜์˜ํ•œ ์ œ๋ชฉ)
5. ๊ฒฐ๋ก : 1๊ฐœ (์ „์ฒด ํ‰๊ฐ€ ์š”์•ฝ ๋ฐ ๊ตฌ๋งค ์ถ”์ฒœ ์ œ๋ชฉ)
6. ์†Œ์ œ๋ชฉ์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑ
7. ํ‚ค์›Œ๋“œ์— ๋งž์ถ”์ง€ ๋ง๊ณ , ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ํŠน์ง•๊ณผ ํ‰๊ฐ€ ์š”์†Œ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ
8. ์˜ˆ์‹œ ํ˜•์‹ (์ฐธ๊ณ ์šฉ์ผ ๋ฟ, ๋‚ด์šฉ์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ฐธ๊ณ  ์ž๋ฃŒ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ):
- ๋„์ž…๋ถ€: [์ œํ’ˆ ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์  ์†Œ๊ฐœ ์ œ๋ชฉ]
- ๋ณธ๋ก 1: [์ œํ’ˆ ๊ธฐ๋ณธ ์ •๋ณด/์ŠคํŽ™ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 2: [ํ•ต์‹ฌ ์„ฑ๋Šฅ/ํŠน์ง• ํ‰๊ฐ€ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 3: [์‹ค์ œ ์‚ฌ์šฉ ๊ฒฝํ—˜/์ฒด๊ฐ ํ’ˆ์งˆ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 4: [๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ๋น„๊ต ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 5: [๊ฐ€๊ฒฉ ๋Œ€๋น„ ๊ฐ€์น˜ ํ‰๊ฐ€ ๊ด€๋ จ ์ œ๋ชฉ] (ํ•„์š”์‹œ)
- ๊ฒฐ๋ก : [์ข…ํ•ฉ ํ‰๊ฐ€ ๋ฐ ๊ตฌ๋งค ์ถ”์ฒœ ์ œ๋ชฉ]
""",
"๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์†Œ์ฃผ์ œ(Outline) ์ƒ์„ฑ ๊ทœ์น™ - ๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•]
[์‹œ์Šคํ…œ ์—ญํ• ]
๋‹น์‹ ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ „๋ฌธ ์ƒํ’ˆ ๊ธฐ๋Šฅ ๋ถ„์„๊ฐ€์ž…๋‹ˆ๋‹ค. ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ์„ ์‹ฌ์ธต์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ž์„ธํžˆ ๋ถ„์„ํ•˜์—ฌ ๋งŽ์€ ๋…์ž๋“ค์˜ ์‹ ๋ขฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
[๋ถ„์„ ๋‹จ๊ณ„]
1. ์ฐธ๊ณ  ์ž๋ฃŒ 3๊ฐœ๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•˜์—ฌ ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ํŒŒ์•…
2. ์ œํ’ˆ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ฃผ์š” ๊ธฐ๋Šฅ ํŠน์„ฑ ์‹๋ณ„ (๊ธฐ์ˆ ์  ํŠน์ง•, ํ˜์‹ ์  ๊ธฐ๋Šฅ, ์ฐจ๋ณ„ํ™” ์š”์†Œ ๋“ฑ)
3. ๋ฆฌ๋ทฐ์˜ ํ•ต์‹ฌ์ด ๋  5๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ ์š”์†Œ ํŒŒ์•… (ํ•ต์‹ฌ ์„ฑ๋Šฅ, ์ฃผ์š” ๊ธฐ๋Šฅ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค, ๊ธฐ์ˆ ์  ํ•œ๊ณ„, ํŠน์ˆ˜ ๊ธฐ๋Šฅ ๋“ฑ)
[์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ ์›์น™]
1. ๋„์ž…๋ถ€(1๊ฐœ) - ์ œํ’ˆ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์  ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ์ œ๋ชฉ์œผ๋กœ ์‹œ์ž‘
2. ๋ณธ๋ก (4-5๊ฐœ) - ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ์ œํ’ˆ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ์„ ๋‹ด์€ ์†Œ์ œ๋ชฉ
- ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์ž‘๋™ ์›๋ฆฌ์™€ ๊ธฐ์ˆ ์  ํŠน์ง•
- ์‹ค์ œ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์™€ ์„ฑ๋Šฅ ์ธก์ • ๋ฐ์ดํ„ฐ
- ์ผ์ƒ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ์˜ ๊ธฐ๋Šฅ ํšจ์œจ์„ฑ
- ๊ธฐ๋Šฅ์  ํ•œ๊ณ„์ ๊ณผ ๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ
- ๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ๊ธฐ๋Šฅ์  ์ฐจ๋ณ„์ 
- (์œ„ ํ•ญ๋ชฉ๋“ค์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ •)
3. ๊ฒฐ๋ก (1๊ฐœ) - ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ์ „์ฒด ํ‰๊ฐ€๋ฅผ ์š”์•ฝํ•˜๊ณ  ํ™œ์šฉ ๊ฐ€์น˜๋ฅผ ๋‹ด์€ ์ œ๋ชฉ
[ํ•ต์‹ฌ ์ง€์นจ]
1. ์™„์ „ํžˆ ํ•œ๊ตญ์–ด๋กœ๋งŒ ์ž‘์„ฑํ•  ๊ฒƒ
2. ์†Œ์ œ๋ชฉ์€ ์ตœ๋Œ€ 30์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
3. ๊ธฐ๋Šฅ์˜ ์‹ค์งˆ์  ๊ฐ€์น˜์™€ ์„ฑ๋Šฅ์„ ๊ฐ•์กฐํ•˜๋Š” ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "๋†€๋ผ์šด ์ฒ˜๋ฆฌ ์†๋„์˜ ๋น„๋ฐ€", "์ˆจ๊ฒจ์ง„ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์™„์ „ ๋ถ„์„", "์‹ค์ธก ํ…Œ์ŠคํŠธ๋กœ ๋ณธ ์„ฑ๋Šฅ ํ•œ๊ณ„")
4. ๊ธฐ์ˆ ์  ์ •ํ™•์„ฑ๊ณผ ๊ฐ๊ด€์  ์„ฑ๋Šฅ ํ‰๊ฐ€๊ฐ€ ์†Œ์ œ๋ชฉ์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑ
5. ํ‚ค์›Œ๋“œ๋Š” ์†Œ์ œ๋ชฉ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (๋ณธ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฐธ๊ณ ์‚ฌํ•ญ์œผ๋กœ๋งŒ ํ™œ์šฉ)
6. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์€ ๋„์ž…๋ถ€(1) + ๋ณธ๋ก (์ตœ๋Œ€ 5๊ฐœ) + ๊ฒฐ๋ก (1)์œผ๋กœ ๊ตฌ์„ฑ
7. ๋‹ค์–‘ํ•œ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธฐ๋Šฅ ํ‰๊ฐ€์— ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ
[์ถœ๋ ฅ ํ˜•์‹]
1. ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ ์š”์†Œ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ
2. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ:(๊ฐ ํ•ญ๋ชฉ๋‹น 1๋ฒˆ ์—”ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์นธ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋กํ•˜๋ผ.)
3. ๋„์ž…๋ถ€: 1๊ฐœ (์ œํ’ˆ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์  ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ์ œ๋ชฉ)
4. ๋ณธ๋ก : 4-5๊ฐœ (ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ ํ‰๊ฐ€ ์š”์†Œ๋ฅผ ๋ฐ˜์˜ํ•œ ์ œ๋ชฉ)
5. ๊ฒฐ๋ก : 1๊ฐœ (๊ธฐ๋Šฅ ์ค‘์‹ฌ ํ‰๊ฐ€ ์š”์•ฝ ๋ฐ ํ™œ์šฉ ๊ฐ€์น˜ ์ œ๋ชฉ)
6. ์†Œ์ œ๋ชฉ์€ ์ œํ’ˆ์˜ ๊ธฐ๋Šฅ์  ํŠน์ง•๊ณผ ์„ฑ๋Šฅ์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑ
7. ํ‚ค์›Œ๋“œ์— ๋งž์ถ”์ง€ ๋ง๊ณ , ์ฐธ๊ณ  ์ž๋ฃŒ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ
8. ์˜ˆ์‹œ ํ˜•์‹ (์ฐธ๊ณ ์šฉ์ผ ๋ฟ, ๋‚ด์šฉ์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์ฐธ๊ณ  ์ž๋ฃŒ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ):
- ๋„์ž…๋ถ€: [ํ•ต์‹ฌ ๊ธฐ๋Šฅ ํŠน์ง•๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์  ์†Œ๊ฐœ ์ œ๋ชฉ]
- ๋ณธ๋ก 1: [์ฃผ์š” ๊ธฐ๋Šฅ ์ž‘๋™ ์›๋ฆฌ/๊ธฐ์ˆ  ์†Œ๊ฐœ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 2: [์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ/๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 3: [์‹ค์ œ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ ํšจ์œจ์„ฑ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 4: [๊ธฐ๋Šฅ์  ํ•œ๊ณ„/๊ฐœ์„ ์  ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 5: [๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ๊ธฐ๋Šฅ ๋น„๊ต ๊ด€๋ จ ์ œ๋ชฉ] (ํ•„์š”์‹œ)
- ๊ฒฐ๋ก : [๊ธฐ๋Šฅ ์ค‘์‹ฌ ์ข…ํ•ฉ ํ‰๊ฐ€ ๋ฐ ํ™œ์šฉ ๊ฐ€์น˜ ์ œ๋ชฉ]
""",
"๊ณ ๊ฐ๋ฐ˜์‘ํ˜•": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์†Œ์ฃผ์ œ(Outline) ์ƒ์„ฑ ๊ทœ์น™ - ๊ณ ๊ฐ๋ฐ˜์‘ํ˜•]
[์‹œ์Šคํ…œ ์—ญํ• ]
๋‹น์‹ ์€ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ๊ณ ๊ฐ ๋ฐ˜์‘ ๋ถ„์„ ์ „๋ฌธ ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ฑฐ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋‹ค์–‘ํ•œ ํ‰๊ฐ€๋ฅผ ์ˆ˜์ง‘ยท๋ถ„์„ํ•˜์—ฌ ์ œํ’ˆ์˜ ์ง„์ •ํ•œ ๊ฐ€์น˜์™€ ํ•œ๊ณ„์ ์„ ๊ฐ๊ด€์ ์œผ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ๋งŽ์€ ๋…์ž๋“ค์˜ ์‹ ๋ขฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
[๋ถ„์„ ๋‹จ๊ณ„]
1. ์ฐธ๊ณ  ์ž๋ฃŒ์™€ ์‹ค์ œ ๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•˜์—ฌ ์ œํ’ˆ์— ๋Œ€ํ•œ ์ฃผ์š” ํ‰๊ฐ€ ๊ฒฝํ–ฅ์„ฑ ํŒŒ์•…
2. ์ œํ’ˆ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ํŠน์„ฑ์— ๋งž๋Š” ๊ณ ๊ฐ ๋ฐ˜์‘ ํŒจํ„ด ์‹๋ณ„ (๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ค‘์š” ํ‰๊ฐ€ ์š”์†Œ)
3. ๋ฆฌ๋ทฐ์˜ ํ•ต์‹ฌ์ด ๋  5๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ํŒŒ์•…:
- ๊ณ ๊ฐ๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰ํ•œ ์žฅ์ 
- ๋ฐ˜๋ณต์ ์œผ๋กœ ์ง€์ ๋˜๋Š” ๋‹จ์ 
- ์˜ˆ์ƒ์„ ๋›ฐ์–ด๋„˜๋Š” ํŠน์ด์ (๊ธ์ •/๋ถ€์ •)
- ๊ตฌ๋งค์ž ์œ ํ˜•๋ณ„ ๋งŒ์กฑ๋„ ์ฐจ์ด
- ๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ ๋น„๊ตํ•œ ๊ณ ๊ฐ ์ธ์‹
[์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ ์›์น™]
1. ๋„์ž…๋ถ€(1๊ฐœ) - ๊ณ ๊ฐ ๋ฐ˜์‘ ์ „์ฒด ๊ฒฝํ–ฅ์„ฑ๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ์ œ๋ชฉ์œผ๋กœ ์‹œ์ž‘
2. ๋ณธ๋ก (4-5๊ฐœ) - ๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ํ‰๊ฐ€ ์š”์†Œ์™€ ๊ฒฝํ–ฅ์„ฑ์„ ๋‹ด์€ ์†Œ์ œ๋ชฉ
- ๊ณ ๊ฐ๋“ค์ด ๊ฐ€์žฅ ๋†’์ด ํ‰๊ฐ€ํ•˜๋Š” ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜
- ์‚ฌ์šฉ์ž๋“ค์ด ๊ณตํ†ต์ ์œผ๋กœ ์ง€์ ํ•˜๋Š” ์•„์‰ฌ์šด ์ 
- ์‹ค์ œ ์‚ฌ์šฉ ๊ฒฝํ—˜์—์„œ ๋‚˜ํƒ€๋‚œ ์˜ˆ์ƒ ์™ธ ํŠน์ด์ 
- ์‚ฌ์šฉ์ž ์œ ํ˜•/๋ชฉ์ ์— ๋”ฐ๋ฅธ ๋งŒ์กฑ๋„ ์ฐจ์ด ๋ถ„์„
- ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ํ‰๊ฐ€ ๋ณ€ํ™” ๋˜๋Š” ๋‚ด๊ตฌ์„ฑ ์ด์Šˆ
- (์œ„ ํ•ญ๋ชฉ๋“ค์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ๊ณ ๊ฐ ๋ฐ˜์‘ ํŒจํ„ด์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ •)
3. ๊ฒฐ๋ก (1๊ฐœ) - ๊ณ ๊ฐ ํ‰๊ฐ€ ๊ฒฝํ–ฅ์„ฑ์„ ์ข…ํ•ฉํ•˜๊ณ  ๊ตฌ๋งค ์ ํ•ฉ์„ฑ์„ ์ œ์‹œํ•˜๋Š” ์ œ๋ชฉ
[ํ•ต์‹ฌ ์ง€์นจ]
1. ์™„์ „ํžˆ ํ•œ๊ตญ์–ด๋กœ๋งŒ ์ž‘์„ฑํ•  ๊ฒƒ
2. ์†Œ์ œ๋ชฉ์€ ์ตœ๋Œ€ 30์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ
3. ์‹ค์ œ ๊ณ ๊ฐ ๋ฐ˜์‘์„ ๊ฐ๊ด€์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "90%์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ •ํ•œ", "์˜์™ธ๋กœ ๋งŽ์€ ๋ถˆ๋งŒ์ด ๋‚˜์˜จ", "์žฅ๊ธฐ ์‚ฌ์šฉ์ž๋“ค์ด ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์ ")
4. ๊ณ ๊ฐ ํ‰๊ฐ€์˜ ์ฃผ์š” ๊ฒฝํ–ฅ์„ฑ๊ณผ ํŠน์ด์ ์ด ์†Œ์ œ๋ชฉ์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑ
5. ํ‚ค์›Œ๋“œ๋Š” ์†Œ์ œ๋ชฉ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ (๋ณธ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฐธ๊ณ ์‚ฌํ•ญ์œผ๋กœ๋งŒ ํ™œ์šฉ)
6. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์€ ๋„์ž…๋ถ€(1) + ๋ณธ๋ก (์ตœ๋Œ€ 5๊ฐœ) + ๊ฒฐ๋ก (1)์œผ๋กœ ๊ตฌ์„ฑ
7. ๋‹ค์–‘ํ•œ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ณ ๊ฐ ๋ฐ˜์‘ ํŒจํ„ด์— ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ
[์ถœ๋ ฅ ํ˜•์‹]
1. ๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๋ถ„์„์„ ํ†ตํ•ด ์ œํ’ˆ์— ๋Œ€ํ•œ ์ฃผ์š” ํ‰๊ฐ€ ๊ฒฝํ–ฅ์„ฑ๊ณผ ํŠน์ด์ ์„ ํŒŒ์•…ํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์•„์›ƒ๋ผ์ธ ๊ตฌ์„ฑ
2. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ:(๊ฐ ํ•ญ๋ชฉ๋‹น 1๋ฒˆ ์—”ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์นธ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋กํ•˜๋ผ.)
3. ๋„์ž…๋ถ€: 1๊ฐœ (๊ณ ๊ฐ ๋ฐ˜์‘ ์ „์ฒด ๊ฒฝํ–ฅ์„ฑ๊ณผ ๋ฆฌ๋ทฐ ๋ชฉ์ ์„ ๋‹ด์€ ์ œ๋ชฉ)
4. ๋ณธ๋ก : 4-5๊ฐœ (๊ณ ๊ฐ ํ‰๊ฐ€์˜ ์ฃผ์š” ํŒจํ„ด๊ณผ ํŠน์ด์ ์„ ๋ฐ˜์˜ํ•œ ์ œ๋ชฉ)
5. ๊ฒฐ๋ก : 1๊ฐœ (๊ณ ๊ฐ ํ‰๊ฐ€ ์ข…ํ•ฉ ๋ฐ ๊ตฌ๋งค ์ ํ•ฉ์„ฑ ์ œ์‹œ ์ œ๋ชฉ)
6. ์†Œ์ œ๋ชฉ์€ ๊ณ ๊ฐ ๋ฐ˜์‘ ํŒจํ„ด๊ณผ ์ œํ’ˆ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑ
7. ํ‚ค์›Œ๋“œ์— ๋งž์ถ”์ง€ ๋ง๊ณ , ์‹ค์ œ ๊ณ ๊ฐ ํ‰๊ฐ€ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ํ•ต์‹ฌ ๊ฒฝํ–ฅ์„ฑ๊ณผ ํŠน์ด์  ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ
8. ์˜ˆ์‹œ ํ˜•์‹ (์ฐธ๊ณ ์šฉ์ผ ๋ฟ, ๋‚ด์šฉ์€ ์ œํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ๊ณ ๊ฐ ๋ฐ˜์‘ ํŒจํ„ด์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ):
- ๋„์ž…๋ถ€: [๊ณ ๊ฐ ๋ฐ˜์‘ ์ „์ฒด ๊ฒฝํ–ฅ์„ฑ ์†Œ๊ฐœ ์ œ๋ชฉ]
- ๋ณธ๋ก 1: [๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋œ ์žฅ์  ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 2: [๊ณตํ†ต์ ์œผ๋กœ ์ง€์ ๋œ ๋‹จ์  ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 3: [์˜ˆ์ƒ ์™ธ ํŠน์ด์ /๋†€๋ผ์šด ๋ฐœ๊ฒฌ ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 4: [์‚ฌ์šฉ์ž ์œ ํ˜•๋ณ„ ๋งŒ์กฑ๋„ ์ฐจ์ด ๊ด€๋ จ ์ œ๋ชฉ]
- ๋ณธ๋ก 5: [์žฅ๊ธฐ ์‚ฌ์šฉ ํ‰๊ฐ€/๋‚ด๊ตฌ์„ฑ ๊ด€๋ จ ์ œ๋ชฉ] (ํ•„์š”์‹œ)
- ๊ฒฐ๋ก : [๊ณ ๊ฐ ํ‰๊ฐ€ ์ข…ํ•ฉ ๋ฐ ๊ตฌ๋งค ์ ํ•ฉ์„ฑ ์ œ์‹œ ์ œ๋ชฉ]
"""
}
return prompts.get(category, prompts["์ผ๋ฐ˜"])
def get_category_blog_prompt(category="์ผ๋ฐ˜"):
"""์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ"""
prompts = {
"์ผ๋ฐ˜": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๊ทœ์น™]
[๊ธฐ๋ณธ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ
2. ๋„ˆ๋Š” ์ „๋ฌธ์ ์ธ ์ƒํ’ˆ๋ฆฌ๋ทฐ ์ฝ˜ํ…์ธ  ์ž‘๊ฐ€์ด๋‹ค. ์ฃผ์–ด์ง„ ์ฃผ์ œ์— ๋Œ€ํ•ด ํ’๋ถ€ํ•˜๊ณ  ๋งค๋ ฅ์ ์ธ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋ผ
3. ๋ฐ˜๋“œ์‹œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
4. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
5. ์ƒํ’ˆ์˜ ํŠน์žฅ์ , ๊ฐ์ข… ์ •๋ณด, ํŒ๋“ฑ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋ผ
6. ๋ฐ˜๋“œ์‹œ ๋‚ด๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜๊ณผ ๊ด€์ ์—์„œ ์ž‘์„ฑํ•˜๋ผ
[ํ…์ŠคํŠธ ์ž‘์„ฑ ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋œ ์†Œ์ฃผ์ œ(์•„์›ƒ๋ผ์ธ)์— ๋งž๊ฒŒ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ
2. ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ƒˆ๋กญ๊ฒŒ ๊ตฌ์„ฑํ•˜๋˜, ๋‹ค์Œ์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜๋ผ:
- ์ฐธ๊ณ ๊ธ€์— ์–ธ๊ธ‰๋œ ๋‹‰๋„ค์ž„, ์ด๋ฆ„, ํšŒ์‚ฌ๋ช…, ๋ธŒ๋žœ๋“œ๋ช… ๋“ฑ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ
- ์ฟ ํŒกํŒŒํŠธ๋„ˆ์Šค, ๊ด‘๊ณ , ์ œํ’ˆ ํ˜‘์ฐฌ, ์†Œ์ •์˜ ๊ธˆ์•ก์ด๋‚˜ ์‚ฌ์€ํ’ˆ์„ ๋ฐ›์•˜๋‹ค๋Š” ๋‚ด์šฉ ์ œ์™ธํ•  ๊ฒƒ
- ์ฐธ๊ณ ๊ธ€ ์ž‘์„ฑ์ž์˜ ๊ฒฝํ—˜์ด ์•„๋‹Œ ๋‚˜์˜ ์ง์ ‘ ๊ฒฝํ—˜์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•  ๊ฒƒ
3. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ
4. ์‰ฝ๊ฒŒ ์ฝํž ์ˆ˜ ์žˆ๋„๋ก ์‰ฌ์šด ์–ดํœ˜๋กœ ์ž‘์„ฑ
5. ์‹œ๊ฐ์ (๋””์ž์ธ, ์™ธ๊ด€ ๋“ฑ)์ธ ๋ถ€๋ถ„, ์ŠคํŽ™, ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ, ์‚ฌ์šฉ๊ฒฝํ—˜, ์žฅ๋‹จ์ , ๊ฐ€๊ฒฉ ๋Œ€๋น„ ์„ฑ๋Šฅ(๊ฐ€์„ฑ๋น„), ์ถ”๊ฐ€๋น„์šฉ๋“ฑ์„ ๊ณ ๋ ค
6. ๋‹ค๋ฅธ ์ œํ’ˆ๊ณผ์˜ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฐ˜์˜ํ•˜๋ผ(์ˆ˜์น˜, ๋ฐ์ดํ„ฐ ํฌํ•จ)
7. ๊ตฌ์ฒด์ ์œผ๋กœ ์ƒํ’ˆ์ด ์ฃผ๋Š” ์œ ์ต(์ผ์ƒ์ƒํ™œ, ์—…๋ฌด ๋“ฑ์—์„œ)์— ๋Œ€ํ•œ ๋ถ„์„, ํ‰๊ฐ€, ์ „ํ›„ ๋น„๊ต, ๊ฒฝํ—˜, ์ถ”์ฒœ๋“ฑ์„ ํฌํ•จ
8. ์ƒํ’ˆ์˜ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•, ์‚ฌ์šฉ ํŒ ๋“ฑ์„ ๊ณต์œ ํ•˜๋ผ
9. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ
10. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ
11. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ
12. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด", "~์— ์˜ํ•˜๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ
13. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ
14. ๊ณผ์žฅ๋œ ํ‘œํ˜„์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๋ผ
15. ์ˆ˜์ตํ˜• ๋ธ”๋กœ๊ทธ๋‚˜ ์ œํœด๋งˆ์ผ€ํŒ… ๊ด€๋ จ ํ‘œํ˜„์„ ์ผ์ฒด ๋ฐฐ์ œํ•˜๋ผ
16. ํ•ญ์ƒ ์ง์ ‘ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 1์ธ์นญ ๊ด€์ ์—์„œ ์ž‘์„ฑํ•˜๋ผ
""",
"๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๊ทœ์น™ - ๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•]
[๊ธฐ๋ณธ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ
2. ๋„ˆ๋Š” ๊ธฐ์ˆ  ์ „๋ฌธ๊ฐ€์ด์ž ์ƒํ’ˆ์˜ ๊ธฐ๋Šฅ์  ์ธก๋ฉด์— ํŠนํ™”๋œ ์ฝ˜ํ…์ธ  ์ž‘๊ฐ€์ด๋‹ค
3. ๋ฐ˜๋“œ์‹œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
4. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
5. ๋ฐ˜๋“œ์‹œ ์ƒํ’ˆ์˜ ๊ธฐ์ˆ ์  ์ธก๋ฉด๊ณผ ๊ธฐ๋Šฅ์  ์š”์†Œ์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ผ
6. ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ๋ถ„์„, ๋ฐ์ดํ„ฐ, ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜๋ผ
7. ํ•ญ์ƒ ์ง์ ‘ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 1์ธ์นญ ๊ด€์ ์—์„œ ์ž‘์„ฑํ•˜์ง€๋งŒ, ๊ฐ๊ด€์ ์ธ ๊ธฐ์ˆ  ๋ถ„์„์— ์ค‘์ ์„ ๋‘๋ผ
[ํ…์ŠคํŠธ ์ž‘์„ฑ ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋œ ์†Œ์ฃผ์ œ(์•„์›ƒ๋ผ์ธ)์— ๋งž๊ฒŒ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ
2. ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ƒˆ๋กญ๊ฒŒ ๊ตฌ์„ฑํ•˜๋˜, ๋‹ค์Œ์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜๋ผ:
- ์ฐธ๊ณ ๊ธ€์— ์–ธ๊ธ‰๋œ ๋‹‰๋„ค์ž„, ์ด๋ฆ„, ํšŒ์‚ฌ๋ช…, ๋ธŒ๋žœ๋“œ๋ช… ๋“ฑ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ
- ์ฟ ํŒกํŒŒํŠธ๋„ˆ์Šค, ๊ด‘๊ณ , ์ œํ’ˆ ํ˜‘์ฐฌ, ์†Œ์ •์˜ ๊ธˆ์•ก์ด๋‚˜ ์‚ฌ์€ํ’ˆ์„ ๋ฐ›์•˜๋‹ค๋Š” ๋‚ด์šฉ ์ œ์™ธํ•  ๊ฒƒ
- ์ฐธ๊ณ ๊ธ€ ์ž‘์„ฑ์ž์˜ ๊ฒฝํ—˜์ด ์•„๋‹Œ ๊ธฐ์ˆ  ๊ฒ€์ฆ ๊ณผ์ •๊ณผ ๋ถ„์„ ๊ฒฐ๊ณผ๋กœ ์žฌ๊ตฌ์„ฑํ•  ๊ฒƒ
3. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ
4. ๋‹ค์Œ ์š”์†Œ๋“ค์„ ๋ฐ˜๋“œ์‹œ ํฌํ•จ์‹œ์ผœ๋ผ:
- ์ •ํ™•ํ•œ ๊ธฐ์ˆ  ์‚ฌ์–‘ ๋ฐ ์ŠคํŽ™ ๋ฐ์ดํ„ฐ (CPU, GPU, ๋ฉ”๋ชจ๋ฆฌ, ์ €์žฅ ๊ณต๊ฐ„ ๋“ฑ)
- ์ƒ์„ธํ•œ ๊ธฐ๋Šฅ ์„ค๋ช… ๋ฐ ์ž‘๋™ ์›๋ฆฌ (๊ฐ ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์„ค๋ช…)
- ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ๋ฐ ์„ฑ๋Šฅ ์ธก์ • ๊ฒฐ๊ณผ (๊ตฌ์ฒด์ ์ธ ์ˆ˜์น˜๋กœ ์ œ์‹œ)
- ์ด์ „ ๋ชจ๋ธ ๋˜๋Š” ๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ์„ฑ๋Šฅ ๋น„๊ต (ํ‘œ๋‚˜ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์„ค๋ช…)
- ์‚ฌ์šฉ์ž ์„ค์ • ๋ฐ ์ตœ์ ํ™” ๋ฐฉ๋ฒ• (๊ธฐ๋Šฅ์„ ์ตœ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•)
- ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๋ฐ ์ˆจ๊ฒจ์ง„ ์„ค์ •์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…
- ๊ธฐ์ˆ ์  ํ•œ๊ณ„์™€ ๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ
5. ๊ฐ์„ฑ์ ์ธ ํ‘œํ˜„์ด๋‚˜ ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ๋ณด๋‹ค๋Š” ๊ธฐ์ˆ ์  ์‚ฌ์‹ค๊ณผ ๊ฐ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ์— ์ค‘์ ์„ ๋‘๋ผ
6. ๊ธฐ์ˆ  ์ „๋ฌธ ์šฉ์–ด๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋˜, ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ๋ง๋ถ™์—ฌ๋ผ
7. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ
8. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ
9. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ
10. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด", "~์— ์˜ํ•˜๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ
11. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ
12. ๊ณผ์žฅ๋œ ํ‘œํ˜„์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๋ผ
13. ์ˆ˜์ตํ˜• ๋ธ”๋กœ๊ทธ๋‚˜ ์ œํœด๋งˆ์ผ€ํŒ… ๊ด€๋ จ ํ‘œํ˜„์„ ์ผ์ฒด ๋ฐฐ์ œํ•˜๋ผ
""",
"๊ณ ๊ฐ๋ฐ˜์‘ํ˜•": """
[์ƒํ’ˆ๋ฆฌ๋ทฐ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๊ทœ์น™ - ๊ณ ๊ฐ๋ฐ˜์‘ํ˜•]
[๊ธฐ๋ณธ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ
2. ๋„ˆ๋Š” ๋‹ค์–‘ํ•œ ๊ณ ๊ฐ ์˜๊ฒฌ์„ ์ข…ํ•ฉํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์ „๋ฌธ ๋ฆฌ๋ทฐ์–ด์ด๋‹ค
3. ๋ฐ˜๋“œ์‹œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
4. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ
5. ๋ฐ˜๋“œ์‹œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ์‹ค์ œ ๊ฒฝํ—˜๊ณผ ์˜๊ฒฌ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ข…ํ•ฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ
6. ๋‹ค์ˆ˜์˜ ์˜๊ฒฌ์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•˜๋˜, ์†Œ์ˆ˜์˜ ์ค‘์š”ํ•œ ์˜๊ฒฌ๋„ ์ ์ ˆํžˆ ํฌํ•จํ•˜๋ผ
7. ๋ชจ๋“  ์„น์…˜์„ ๋™์ผํ•œ ํ˜•์‹์ด๋‚˜ ํŒจํ„ด์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ๋ง๊ณ , ๋‹ค์–‘ํ•œ ํ‘œํ˜„ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๋ผ
[ํ…์ŠคํŠธ ์ž‘์„ฑ ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋œ ์†Œ์ฃผ์ œ(์•„์›ƒ๋ผ์ธ)์— ๋งž๊ฒŒ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ
2. ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ƒˆ๋กญ๊ฒŒ ๊ตฌ์„ฑํ•˜๋˜, ๋‹ค์Œ์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜๋ผ:
- ์ฐธ๊ณ ๊ธ€์— ์–ธ๊ธ‰๋œ ๋‹‰๋„ค์ž„, ์ด๋ฆ„, ํšŒ์‚ฌ๋ช…, ๋ธŒ๋žœ๋“œ๋ช… ๋“ฑ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ
- ์ฟ ํŒกํŒŒํŠธ๋„ˆ์Šค, ๊ด‘๊ณ , ์ œํ’ˆ ํ˜‘์ฐฌ, ์†Œ์ •์˜ ๊ธˆ์•ก์ด๋‚˜ ์‚ฌ์€ํ’ˆ์„ ๋ฐ›์•˜๋‹ค๋Š” ๋‚ด์šฉ ์ œ์™ธํ•  ๊ฒƒ
- ์ฐธ๊ณ ๊ธ€ ์ž‘์„ฑ์ž์˜ ๊ฒฝํ—˜์„ ํฌํ•จํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ๊ฒฝํ—˜์„ ์ข…ํ•ฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ์žฌ๊ตฌ์„ฑํ•  ๊ฒƒ
3. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ
4. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ผ:
- ํ†ต๊ณ„์™€ ์ˆ˜์น˜๋ฅผ ํ™œ์šฉํ•œ ์ข…ํ•ฉ์  ์˜๊ฒฌ ์ œ์‹œ: "์‚ฌ์šฉ์ž์˜ ์•ฝ 75%๊ฐ€ ๋””์ž์ธ์— ๋งŒ์กฑํ–ˆ์œผ๋ฉฐ..."
- ์‚ฌ์šฉ์ž ์ง‘๋‹จ๋ณ„ ์˜๊ฒฌ ๋น„๊ต: "๋””์ž์ธ ์ „๊ณต์ž๋“ค์€ ๋ฏธ๋‹ˆ๋ฉ€ํ•œ ๋””์ž์ธ์„ ๋†’์ด ํ‰๊ฐ€ํ•œ ๋ฐ˜๋ฉด, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋“ค์€..."
- ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๊ฒฝํ—˜ ๋ณ€ํ™”: "๊ตฌ๋งค ์งํ›„์—๋Š” ๋†’์€ ๋งŒ์กฑ๋„๋ฅผ ๋ณด์˜€์œผ๋‚˜, 3๊ฐœ์›” ์‚ฌ์šฉ ํ›„์—๋Š”..."
- ์‹ค์ œ ์‚ฌ์šฉ ํ™˜๊ฒฝ๋ณ„ ํ‰๊ฐ€: "์‚ฌ๋ฌด์‹ค ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚ฌ์ง€๋งŒ, ์•ผ์™ธ ํ™œ๋™ ์ค‘์—๋Š”..."
- ์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŠธ๋ Œ๋“œ: "SNS์—์„œ๋Š” ์นด๋ฉ”๋ผ ๊ธฐ๋Šฅ์ด ํ™”์ œ๋ฅผ ๋ชจ์•˜์œผ๋ฉฐ..."
- ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ์ธ์šฉ: "IT ์ „๋ฌธ ๋งค์ฒด๋“ค์€ ์ฃผ๋กœ ํ”„๋กœ์„ธ์„œ ์„ฑ๋Šฅ์„ ๋†’๊ฒŒ ํ‰๊ฐ€ํ–ˆ์ง€๋งŒ..."
5. ๋ฌธ์ œ์ ์ด๋‚˜ ๋‹จ์ ์„ ์–ธ๊ธ‰ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๋ผ:
- ์ผ๊ด€๋œ ๋ฌธ์ œ์ : "๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์ง€์ ํ•œ ๋ฌธ์ œ๋Š”..."
- ์†Œ์ˆ˜ ์˜๊ฒฌ ์† ์ค‘์š”ํ•œ ์ง€์ : "์†Œ์ˆ˜์˜ ์˜๊ฒฌ์ด์ง€๋งŒ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ง€์ ์€..."
- ์ƒํ™ฉ๋ณ„ ๋‹จ์ : "ํŠน์ • ์ƒํ™ฉ์—์„œ๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์ ์œผ๋กœ๋Š”..."
- ๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ ์–ธ๊ธ‰: "์‚ฌ์šฉ์ž๋“ค์ด ์ง€์ ํ•œ ์ด ๋ฌธ์ œ๋Š” ํ–ฅํ›„ ์†Œํ”„ํŠธ์›จ์–ด ์—…๋ฐ์ดํŠธ๋กœ ๊ฐœ์„ ๋  ๊ฐ€๋Šฅ์„ฑ์ด..."
6. ์ •ํ˜•ํ™”๋œ "A vs B" ๊ตฌ์กฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ ํ๋ฆ„ ์†์—์„œ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•˜๋ผ
7. ๋งˆํฌ๋‹ค์šด ํ˜•์‹์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ
8. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด", "~์— ์˜ํ•˜๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ
9. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ
10. ๊ณผ์žฅ๋œ ํ‘œํ˜„์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๋ผ
11. ์ˆ˜์ตํ˜• ๋ธ”๋กœ๊ทธ๋‚˜ ์ œํœด๋งˆ์ผ€ํŒ… ๊ด€๋ จ ํ‘œํ˜„์„ ์ผ์ฒด ๋ฐฐ์ œํ•˜๋ผ
12. ๊ฐ ์„น์…˜๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ด€์ ์ด๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜์—ฌ ๋‚ด์šฉ์˜ ๋‹ค์–‘์„ฑ์„ ํ™•๋ณดํ•˜๋ผ
"""
}
return prompts.get(category, prompts["์ผ๋ฐ˜"])
def generate_blog_post(category, style, outline_input, references1, references2, references3):
"""ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์ „์ฒด ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ํ•จ์ˆ˜ (ํ‡ด๊ณ  ๋ฐ ํ™•์žฅ ๊ธฐ๋Šฅ ํฌํ•จ)"""
try:
# ์ฐธ๊ณ ๊ธ€ ์ค€๋น„
references = [
references1.strip() if references1.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
references2.strip() if references2.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
references3.strip() if references3.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"
]
# ์˜๋ฏธ ์žˆ๋Š” ์ฐธ๊ณ ๊ธ€๋งŒ ํ•„ํ„ฐ๋ง
references = [ref for ref in references if ref != "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"]
if not references:
return "<p>์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</p>", 0
if not outline_input.strip():
return "<p>์•„์›ƒ๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„์›ƒ๋ผ์ธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</p>", 0
# ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐ ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
category_prompt = get_category_blog_prompt(category)
style_prompt = get_style_prompt(style)
# Phase 1: ์ดˆ๊ธฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ
blog_prompt = f"""
[์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ž‘์„ฑ ์š”์ฒญ]
์นดํ…Œ๊ณ ๋ฆฌ: {category}
ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
์•„์›ƒ๋ผ์ธ:
{outline_input}
์ฐธ๊ณ ๊ธ€:
{references[0]}
{references[1] if len(references) > 1 else ""}
{references[2] if len(references) > 2 else ""}
{category_prompt}
{style_prompt}
[์†Œ์ œ๋ชฉ ์ž‘์„ฑ ๊ฐ€์ด๋“œ]
1. ๋ณธ๋ก ์˜ ๊ฐ ๋ถ€๋ถ„๋งˆ๋‹ค ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
2. ์†Œ์ œ๋ชฉ์€ 10~20์ž ๋‚ด์™ธ๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”.
3. ์†Œ์ œ๋ชฉ์€ ๋…๋ฆฝ๋œ ์ค„์— ์œ„์น˜ํ•˜๊ณ  ์•ž๋’ค์— ๋นˆ ์ค„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
4. ์†Œ์ œ๋ชฉ ์˜ˆ์‹œ: '์ƒํ’ˆ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ', '๊ฐ€๊ฒฉ ๋Œ€๋น„ ์„ฑ๋Šฅ ๋ถ„์„', '์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ๋ฐ ํ‰๊ฐ€'
[์ค‘์š” ์ž‘์„ฑ ๊ทœ์น™]
1. ๋ฐ˜๋“œ์‹œ ์œ„์˜ ์•„์›ƒ๋ผ์ธ ์ˆœ์„œ์™€ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ž‘์„ฑํ•˜๋ผ.
2. ๊ฐ ์„น์…˜์€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์„น์…˜ ์ œ๋ชฉ์„ ํฌํ•จํ•˜๋ผ.
3. ๋„์ž…๋ถ€๋Š” ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋Œ๊ณ  ์ƒํ’ˆ์„ ๋งค๋ ฅ์ ์œผ๋กœ ์†Œ๊ฐœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
4. ๋ณธ๋ก  ๊ฐ ๋ถ€๋ถ„์€ ์ƒํ’ˆ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธก๋ฉด(๋””์ž์ธ, ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ, ๊ฐ€๊ฒฉ ๋“ฑ)์„ ๋‹ค๋ฃจ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ์ •๋ณด์™€ ์˜ˆ์‹œ๋ฅผ ํฌํ•จํ•˜๋ผ.
5. ๊ฒฐ๋ก ์€ ํ•ต์‹ฌ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๊ณ  ์ตœ์ข… ์ถ”์ฒœ์ด๋‚˜ ํ†ต์ฐฐ์„ ์ œ๊ณตํ•˜๋ผ.
6. ์ „์ฒด ๊ธ€์˜ ๊ธธ์ด๋Š” ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž๊ฐ€ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
7. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ {MIN_SECTION_LENGTH}์ž ์ด์ƒ์˜ ์ถฉ๋ถ„ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
8. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
9. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
10. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
11. "์ฐธ๊ณ ๊ธ€", "์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด" ๋“ฑ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
12. "์—ฌ๋Ÿฌ๋ถ„", "๋…์ž ์—ฌ๋Ÿฌ๋ถ„" ๋“ฑ์˜ ์ง์ ‘์ ์ธ ํ˜ธ์นญ์„ ์ง€์–‘ํ•˜๋ผ.
13. ๊ณผ์žฅ๋œ ํ‘œํ˜„์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๋ผ.
14. ๊ฐ ์„น์…˜ ์‚ฌ์ด์— ์ž์—ฐ์Šค๋Ÿฌ์šด ์—ฐ๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
15. ๊ธ€์˜ ์ฒ˜์Œ์— ์ „์ฒด ๊ธ€์˜ ๋งค๋ ฅ์ ์ธ ์ œ๋ชฉ์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•˜๋ผ.
16. ๋ฐ˜๋“œ์‹œ ๊ตฌ์ฒด์ ์ธ ์ƒํ’ˆ ์ •๋ณด(๊ธฐ๋Šฅ, ์‚ฌ์–‘, ๊ฐ€๊ฒฉ, ์‚ฌ์šฉ๋ฒ•, ๊ตฌ๋งคํŒ ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋ผ.
"""
# ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํŠน๋ณ„ ์ง€์นจ ์ถ”๊ฐ€
if category == "๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•":
blog_prompt += """
[๊ธฐ๋Šฅ์ง‘์ค‘ํ˜• ํŠน๋ณ„ ์ง€์นจ]
1. ๋ฐ˜๋“œ์‹œ ๊ธฐ์ˆ  ์‚ฌ์–‘๊ณผ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฐ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ์™€ ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•˜๋ผ.
2. ๊ฐ ๊ธฐ๋Šฅ์˜ ์ž‘๋™ ์›๋ฆฌ์™€ ์‹ค์ œ ์„ฑ๋Šฅ์„ ๊ธฐ์ˆ ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ผ.
3. ๊ธฐ๋Šฅ๋ณ„๋กœ ์‚ฌ์šฉ๋ฒ•, ์„ค์ • ๋ฐฉ๋ฒ•, ์ตœ์ ํ™” ํŒ์„ ์ƒ์„ธํžˆ ์ œ๊ณตํ•˜๋ผ.
4. ๊ฒฝ์Ÿ ์ œํ’ˆ ๋˜๋Š” ์ด์ „ ๋ชจ๋ธ๊ณผ์˜ ๊ธฐ๋Šฅ ๋น„๊ต๋ฅผ ๊ตฌ์ฒด์ ์ธ ์ˆ˜์น˜์™€ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ผ.
5. ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜๋ผ.
6. ์ „๋ฌธ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ผ.
"""
elif category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•":
blog_prompt += """
[๊ณ ๊ฐ๋ฐ˜์‘ํ˜• ํŠน๋ณ„ ์ง€์นจ]
1. ๋ฐ˜๋“œ์‹œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ง‘๋‹จ(์—ฐ๋ น, ์„ฑ๋ณ„, ์‚ฌ์šฉ ๋ชฉ์  ๋“ฑ)์˜ ์˜๊ฒฌ์„ ํฌํ•จํ•˜๋ผ.
2. "์ผ๋ถ€ ์‚ฌ์šฉ์ž๋“ค์€...", "๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด...", "20๋Œ€ ์‚ฌ์šฉ์ž๋“ค์€...๋ฐ˜๋ฉด 40๋Œ€ ์‚ฌ์šฉ์ž๋“ค์€..." ๋“ฑ์˜ ํ‘œํ˜„์œผ๋กœ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ๋Œ€๋น„ํ•˜๋ผ.
3. ๊ธ์ •์  ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ถ€์ •์  ํ”ผ๋“œ๋ฐฑ์„ ๊ท ํ˜• ์žˆ๊ฒŒ ํฌํ•จํ•˜๋ผ.
4. ์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ, SNS, ๋ฆฌ๋ทฐ ์‚ฌ์ดํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ถœ์ฒ˜์˜ ์˜๊ฒฌ์„ ์ธ์šฉํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
5. ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ๊ณผ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์˜๊ฒฌ์„ ๋น„๊ตํ•˜์—ฌ ์ œ์‹œํ•˜๋ผ.
6. ์‹ค์ œ ์‚ฌ๋ก€์™€ ๊ฒฝํ—˜๋‹ด์„ ํ†ตํ•ด ์ œํ’ˆ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์„ ๋ณด์—ฌ์ฃผ๋ผ.
"""
# Gemini API ํ˜ธ์ถœ (ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์ „์ฒด ๊ธ€ ์ƒ์„ฑ)
logging.info("์ „์ฒด ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์‹œ์ž‘")
blog_content = call_gemini_api(blog_prompt, temperature=0.7)
logging.info(f"์ƒ์„ฑ๋œ ์›๋ณธ ๊ธ€ ๊ธธ์ด: {len(blog_content)}")
# ํ›„์ฒ˜๋ฆฌ
processed_content = post_process_blog(blog_content, style, category)
# HTML ๋ณ€ํ™˜ํ•˜์—ฌ ๊ธ€์ž ์ˆ˜ ์ฒดํฌ
temp_html = format_blog_post(processed_content)
soup = BeautifulSoup(temp_html, 'html.parser')
char_count = len(soup.get_text())
logging.info(f"์ดˆ๊ธฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {char_count}")
# Phase 2: ๊ธ€์ž ์ˆ˜๊ฐ€ ๋ชฉํ‘œ์— ๋ฏธ๋‹ฌํ•˜๋ฉด ํ‡ด๊ณ  ๋ฐ ํ™•์žฅ
if char_count < TARGET_CHAR_LENGTH * 0.8: # ๋ชฉํ‘œ์˜ 80% ๋ฏธ๋งŒ์ด๋ฉด ํ™•์žฅ
logging.info(f"๊ธ€์ž ์ˆ˜ ๋ถ€์กฑ ({char_count} < {TARGET_CHAR_LENGTH * 0.8}), ํ™•์žฅ ์‹œ๋„")
# ๊ฐ€์žฅ ๊ธด ์ฐธ๊ณ ๊ธ€ ์„ ํƒ
longest_ref = max(references, key=len)
expansion_prompt = f"""
[์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ํ™•์žฅ ์š”์ฒญ]
์นดํ…Œ๊ณ ๋ฆฌ: {category}
ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
์›๋ณธ ๊ธ€:
{processed_content}
์ฐธ๊ณ ๊ธ€:
{longest_ref}
๋ฌธ์ œ์ :
์ด ๊ธ€์€ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜์ธ {TARGET_CHAR_LENGTH}์ž์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜๋Š” ์•ฝ {char_count}์ž์ž…๋‹ˆ๋‹ค.
๋‚ด์šฉ์ด ๋ถ€์‹คํ•˜์—ฌ ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
{style_prompt}
[ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ]
1. ์›๋ณธ ๊ธ€์˜ ๊ตฌ์กฐ์™€ ์•„์›ƒ๋ผ์ธ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ ์„น์…˜์˜ ๋‚ด์šฉ์„ ๋Œ€ํญ ํ™•์žฅํ•˜๋ผ.
2. ๊ฐ ์„น์…˜์— ๋” ๊ตฌ์ฒด์ ์ธ ์ •๋ณด, ์˜ˆ์‹œ, ์‚ฌ๋ก€, ํ†ต๊ณ„ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋ผ.
"""
# ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ™•์žฅ ์ง€์นจ ์ถ”๊ฐ€
if category == "๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•":
expansion_prompt += """
3. ํŠนํžˆ ๋‹ค์Œ ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ์  ์ธก๋ฉด์„ ๊ฐ•ํ™”ํ•˜๋ผ:
- ๊ฐ ๊ธฐ๋Šฅ์˜ ๊ธฐ์ˆ ์  ์ž‘๋™ ์›๋ฆฌ์— ๋Œ€ํ•œ ๋” ์ƒ์„ธํ•œ ์„ค๋ช…
- ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์™€ ๊ตฌ์ฒด์ ์ธ ์„ฑ๋Šฅ ์ˆ˜์น˜
- ๊ธฐ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋‹จ๊ณ„๋ณ„ ์„ค์ • ๋ฐฉ๋ฒ•
- ๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ๊ธฐ๋Šฅ๋ณ„ ์ƒ์„ธ ๋น„๊ต
- ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ˆจ๊ฒจ์ง„ ์„ค์ •๊ณผ ๊ธฐ๋Šฅ
"""
elif category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•":
expansion_prompt += """
3. ํŠนํžˆ ๋‹ค์Œ ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ณ ๊ฐ ๋ฐ˜์‘์„ ๊ฐ•ํ™”ํ•˜๋ผ:
- ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน(ํ•™์ƒ, ์ง์žฅ์ธ, ํฌ๋ฆฌ์—์ดํ„ฐ ๋“ฑ)์˜ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ
- ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๋‹ด
- ์ƒ๋ฐ˜๋œ ์˜๊ฒฌ๋“ค ๊ฐ„์˜ ๋” ๋ช…ํ™•ํ•œ ๋Œ€๋น„
- ์ธ์šฉ ํ˜•์‹์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฐ˜์‘
- ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ๋ณ€ํ™”
"""
else:
expansion_prompt += """
3. ํŠนํžˆ ๋‹ค์Œ ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋ผ:
- ์ƒํ’ˆ ์ŠคํŽ™, ๊ธฐ๋Šฅ, ๊ฐ€๊ฒฉ, ๊ตฌ๋งค์ฒ˜, ์‚ฌ์šฉ๋ฒ• ๋“ฑ ์‹ค์šฉ์  ์ •๋ณด ์ถ”๊ฐ€
- ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค, ํ™œ์šฉ ํŒ, ์ฃผ์˜์‚ฌํ•ญ ๋“ฑ ์ถ”๊ฐ€
- ์œ ์‚ฌ ์ œํ’ˆ๊ณผ์˜ ๋น„๊ต ์ •๋ณด, ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ •๋ณด ๋“ฑ ์ถ”๊ฐ€
"""
expansion_prompt += f"""
4. ์ „์ฒด ๊ธ€์ž ์ˆ˜๋ฅผ ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ ๋‹ฌ์„ฑํ•˜๋ผ.
5. ์Šคํƒ€์ผ๊ณผ ์–ด์กฐ๋Š” ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
6. ๋งˆํฌ๋‹ค์šด ํ˜•์‹(#, *, -, 1., 2. ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•˜๋ผ.
7. ์†Œ์ œ๋ชฉ๊ณผ ๊ฒฐ๋ก ์€ ๋ฒˆํ˜ธ ์—†์ด ์ผ๋ฐ˜ ๋ฌธ์žฅ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ.
8. ๋ชฉ๋ก์€ ๋ถˆ๋ฆฟ์ด๋‚˜ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ์œผ๋กœ ์„œ์ˆ ํ•˜๋ผ.
9. "์ฐธ๊ณ ๊ธ€" ๊ด€๋ จ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.
10. ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐ˜๋ณต์ด๋‚˜ ๊ณผ์žฅ๋œ ํ‘œํ˜„์„ ํ”ผํ•˜๋ผ.
"""
# ํ™•์žฅ ์‹œ๋„
expanded_content = call_gemini_api(expansion_prompt, temperature=0.75)
processed_content = post_process_blog(expanded_content, style, category)
# ๋‹ค์‹œ ๊ธ€์ž ์ˆ˜ ์ฒดํฌ
temp_html = format_blog_post(processed_content)
soup = BeautifulSoup(temp_html, 'html.parser')
char_count = len(soup.get_text())
logging.info(f"ํ™•์žฅ ํ›„ ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {char_count}")
# Phase 3: ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•˜๋ฉด ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„
if char_count < TARGET_CHAR_LENGTH * 0.9: # ๋ชฉํ‘œ์˜ 90% ๋ฏธ๋งŒ์ด๋ฉด ์ถ”๊ฐ€ ํ™•์žฅ
logging.info(f"์—ฌ์ „ํžˆ ๊ธ€์ž ์ˆ˜ ๋ถ€์กฑ ({char_count} < {TARGET_CHAR_LENGTH * 0.9}), ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„")
additional_expansion_prompt = f"""
[์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ถ”๊ฐ€ ํ™•์žฅ ์š”์ฒญ]
์นดํ…Œ๊ณ ๋ฆฌ: {category}
ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
์›๋ณธ ๊ธ€:
{processed_content}
๋ฌธ์ œ์ :
์ด ๊ธ€์€ ์—ฌ์ „ํžˆ ๋ชฉํ‘œ ๊ธ€์ž์ˆ˜์ธ {TARGET_CHAR_LENGTH}์ž์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธ€์ž์ˆ˜๋Š” ์•ฝ {char_count}์ž์ž…๋‹ˆ๋‹ค.
[์ถ”๊ฐ€ ํ™•์žฅ ์š”๊ตฌ์‚ฌํ•ญ]
1. ๋ณธ๋ก  ๋ถ€๋ถ„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ํฌ๊ฒŒ ํ™•์žฅํ•˜๋ผ.
"""
# ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ถ”๊ฐ€ ํ™•์žฅ ์ง€์นจ
if category == "๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•":
additional_expansion_prompt += """
2. ๊ธฐ์ˆ ์  ์ธก๋ฉด์—์„œ ๋‹ค์Œ ๋‚ด์šฉ์„ ๋” ์ถ”๊ฐ€ํ•˜๋ผ:
- ๊ฐ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์„ธ๋ถ€ ์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์  ์„ค๋ช…
- ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ์ธก์ • ๋ฐ์ดํ„ฐ
- ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐ„์˜ ์ตœ์ ํ™” ๋ฐฉ์‹
- ์ˆจ๊ฒจ์ง„ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ๋‚˜ ๊ณ ๊ธ‰ ์„ค์ • ์˜ต์…˜
- ๊ธฐ๋Šฅ ์—…๋ฐ์ดํŠธ ์˜ˆ์ • ์‚ฌํ•ญ๊ณผ ํ–ฅํ›„ ๊ฐ€๋Šฅ์„ฑ
"""
elif category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•":
additional_expansion_prompt += """
2. ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ๋ฐ˜์‘ ์ธก๋ฉด์—์„œ ๋‹ค์Œ ๋‚ด์šฉ์„ ๋” ์ถ”๊ฐ€ํ•˜๋ผ:
- ๋‹ค์–‘ํ•œ ๊ตญ๊ฐ€์™€ ๋ฌธํ™”๊ถŒ์˜ ์‚ฌ์šฉ์ž ๋ฐ˜์‘ ์ฐจ์ด
- ๊ตฌ๋งค ํ›„ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๋งŒ์กฑ๋„ ๋ณ€ํ™” ์ถ”์ด
- ํŠน์ˆ˜ํ•œ ์‚ฌ์šฉ ํ™˜๊ฒฝ(๊ทนํ•œ ๊ธฐํ›„, ํŠน์ˆ˜ ์ง์—… ๋“ฑ)์—์„œ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
- ์ œํ’ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํฌ๋Ÿผ์—์„œ์˜ ์ฃผ์š” ๋…ผ์Ÿ์ 
- ๊ณต์‹ ์ง€์›ํŒ€์˜ ํ”ผ๋“œ๋ฐฑ ๋Œ€์‘์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ํ‰๊ฐ€
"""
else:
additional_expansion_prompt += """
2. ๋‹ค์Œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์„ค๋ช…๊ณผ ์‹ค์šฉ์ ์ธ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ผ:
- ์ƒํ’ˆ์˜ ํŠน์ˆ˜ํ•œ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋‚˜ ํ™œ์šฉ ์‚ฌ๋ก€
- ์ „๋ฌธ๊ฐ€๋“ค์ด ๋งํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ์ด๋‚˜ ํŒ
- ์ƒํ’ˆ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ์ด๋‚˜ ์œ ์ง€๊ด€๋ฆฌ ๋ฐฉ๋ฒ•
- ๊ตฌ๋งค ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ถ”๊ฐ€ ์š”์†Œ๋‚˜ ๋น„์šฉ
- ๊ตฌ์ฒด์ ์ธ ์ƒํ’ˆ ์ŠคํŽ™, ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ, ๊ฐ€๊ฒฉ ์ •๋ณด
"""
additional_expansion_prompt += f"""
3. ์†Œ๋น„์ž์—๊ฒŒ ์œ ์šฉํ•œ ํ•ต์‹ฌ ์ •๋ณด์™€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋ผ.
4. ์ „์ฒด ๊ธ€์ž ์ˆ˜๋ฅผ ์ตœ์†Œ {TARGET_CHAR_LENGTH}์ž ์ด์ƒ์œผ๋กœ ํ™•์žฅํ•˜๋ผ.
5. ์Šคํƒ€์ผ๊ณผ ์–ด์กฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.
6. ๋ฐ˜๋ณต๋˜๋Š” ๋‚ด์šฉ์ด๋‚˜ ์ค‘๋ณต์€ ํ”ผํ•˜๋ผ.
"""
# ์ถ”๊ฐ€ ํ™•์žฅ ์‹œ๋„ (์ด ๋ถ€๋ถ„์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•จ)
further_expanded_content = call_gemini_api(additional_expansion_prompt, temperature=0.8)
processed_content = post_process_blog(further_expanded_content, style, category)
# ์ตœ์ข… HTML ๋ณ€ํ™˜
final_html = format_blog_post(processed_content)
# ์ตœ์ข… ๊ธ€์ž ์ˆ˜ ๊ณ„์‚ฐ
soup = BeautifulSoup(final_html, 'html.parser')
final_char_count = len(soup.get_text())
logging.info(f"์ตœ์ข… ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ธ€์ž ์ˆ˜: {final_char_count}")
return final_html, final_char_count
except Exception as e:
logging.error(f"๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return f"<p>๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}</p>", 0
def post_process_blog(blog_content, style="์นœ๊ทผํ•œ", category="์ผ๋ฐ˜"):
"""๋ธ”๋กœ๊ทธ ์ปจํ…์ธ  ํ›„์ฒ˜๋ฆฌ ํ•จ์ˆ˜ - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํŠนํ™” ์ฒ˜๋ฆฌ ์ถ”๊ฐ€"""
try:
# ๋ฒˆํ˜ธ ๋ชฉ๋ก, ๋ถˆ๋ฆฟ, ํ—ค๋”ฉ ๋“ฑ ์ œ๊ฑฐ
blog_content = re.sub(r'^\d+\.\s+', '', blog_content, flags=re.MULTILINE)
blog_content = re.sub(r'^[\*\-\โ€ข]\s+', '', blog_content, flags=re.MULTILINE)
blog_content = re.sub(r'^#+\s+', '', blog_content, flags=re.MULTILINE)
# ์Šคํƒ€์ผ์— ๋”ฐ๋ฅธ ์–ดํˆฌ ์กฐ์ •
if style == "์นœ๊ทผํ•œ":
blog_content = re.sub(r'([๊ฐ€-ํžฃ]+)๊ณ ์š”', r'\1๊ตฌ์š”', blog_content)
blog_content = re.sub(r'๋‹ต๋‹ˆ๋‹ค', '์–ด์š”', blog_content)
blog_content = re.sub(r'์˜€๋‹ต๋‹ˆ๋‹ค', '์˜€์–ด์š”', blog_content)
blog_content = re.sub(r'ํ–ˆ๋‹ต๋‹ˆ๋‹ค', 'ํ–ˆ์–ด์š”', blog_content)
blog_content = re.sub(r'์Šต๋‹ˆ๋‹ค', '์š”', blog_content)
blog_content = re.sub(r'ํ•ฉ๋‹ˆ๋‹ค', 'ํ•ด์š”', blog_content)
blog_content = re.sub(r'๋ฉ๋‹ˆ๋‹ค', '๋ผ์š”', blog_content)
blog_content = re.sub(r'์ž…๋‹ˆ๋‹ค', '์ด์—์š”', blog_content)
# ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํŠนํ™” ์ฒ˜๋ฆฌ
if category == "๊ธฐ๋Šฅ์ง‘์ค‘ํ˜•":
# ๊ธฐ์ˆ  ์šฉ์–ด ๊ฐ•ํ™” ๋ฐ ๊ตฌ์ฒด์  ์ˆ˜์น˜ ๊ฐ•์กฐ
tech_terms = [
(r'์„ฑ๋Šฅ', r'๊ธฐ์ˆ ์  ์„ฑ๋Šฅ'),
(r'์†๋„', r'์ฒ˜๋ฆฌ ์†๋„'),
(r'ํ™”๋ฉด', r'๋””์Šคํ”Œ๋ ˆ์ด'),
(r'์นด๋ฉ”๋ผ', r'์ด๋ฏธ์ง€ ์„ผ์„œ ์‹œ์Šคํ…œ'),
(r'๋ฐฐํ„ฐ๋ฆฌ', r'์ „๋ ฅ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ'),
(r'์‚ฌ์šฉ', r'์šด์šฉ'),
(r'์ข‹๋‹ค', r'ํšจ์œจ์ ์ด๋‹ค'),
(r'๋น ๋ฅด๋‹ค', r'๊ณ ์„ฑ๋Šฅ์ด๋‹ค')
]
for pattern, replacement in tech_terms:
blog_content = re.sub(r'\b' + pattern + r'\b', replacement, blog_content)
# ๊ฐ๊ด€์  ๋ถ„์„ ๊ฐ•ํ™”
blog_content = re.sub(r'์ œ ์ƒ๊ฐ์—๋Š”', r'๋ถ„์„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅด๋ฉด', blog_content)
blog_content = re.sub(r'์ œ๊ฐ€ ๋ดค์„ ๋•Œ', r'๊ธฐ์ˆ ์  ๊ด€์ ์—์„œ', blog_content)
blog_content = re.sub(r'๋А๋‚Œ์ด ๋“ค์–ด์š”', r'์ธก์ •๋ฉ๋‹ˆ๋‹ค', blog_content)
# ์ˆซ์ž์™€ ๋‹จ์œ„ ์‚ฌ์ด์— ๊ณต๋ฐฑ ์ถ”๊ฐ€
blog_content = re.sub(r'(\d+)([๊ฐ€-ํžฃ]+)', r'\1 \2', blog_content)
elif category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•":
# 1. ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ง‘๋‹จ ํ‘œํ˜„ ์‚ฌ์šฉ (๋‹จ์ˆœ "์‚ฌ์šฉ์ž๋“ค"๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์ง‘๋‹จ์œผ๋กœ)
user_group_patterns = [
# ์ค‘๋ณต ํŒจํ„ด ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ถฉ๋ถ„ํžˆ ๊ธด ๋ฌธ๋งฅ๊ณผ ํ•จ๊ป˜ ํŒจํ„ด ์ •์˜
(r'(๋งŽ์€|๋Œ€๋ถ€๋ถ„์˜|์ผ๋ถ€) ์‚ฌ์šฉ์ž๋“ค์€ ([๊ฐ€-ํžฃ\s]+)ํ–ˆ', r'\1 ์‚ฌ์šฉ์ž๋“ค์€ \2ํ–ˆ'), # ๊ธฐ์กด ํŒจํ„ด ์œ ์ง€
(r'์‚ฌ์šฉ์ž๋“ค์ด ([๊ฐ€-ํžฃ\s]+)๊ณ  ์žˆ', r'20~30๋Œ€ ์‚ฌ์šฉ์ž๋“ค์ด \1๊ณ  ์žˆ'),
(r'์‚ฌ์šฉ์ž๋“ค์˜ ([๊ฐ€-ํžฃ\s]+)๊ฐ€ ๋†’', r'์ „๋ฌธ๊ฐ€์™€ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋“ค์˜ \1๊ฐ€ ๋†’'),
(r'์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ([๊ฐ€-ํžฃ\s]+)๋กœ ์ธ๊ธฐ', r'ํฌ๋ฆฌ์—์ดํ„ฐ์™€ ๋ฏธ๋””์–ด ์ œ์ž‘์ž๋“ค์—๊ฒŒ \1๋กœ ์ธ๊ธฐ'),
(r'์‚ฌ์šฉ์ž๋“ค์ด ([๊ฐ€-ํžฃ\s]+)๋ฅผ ์ง€์ ', r'์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉํ•œ ์œ ์ €๋“ค์ด \1๋ฅผ ์ง€์ ')
]
# 2. ๋‹ค์–‘ํ•œ ์˜๊ฒฌ ํ‘œํ˜„ ํŒจํ„ด (๋ฐ˜๋ณต๋˜๋Š” A vs B ํŒจํ„ด ํƒˆํ”ผ)
opinion_patterns = [
# ์ง์ ‘์  ๊ฒฝํ—˜ -> ์ข…ํ•ฉ์  ์˜๊ฒฌ์œผ๋กœ ๋ณ€ํ™˜
(r'์ €๋Š” ([๊ฐ€-ํžฃ\s]+)ํ–ˆ์–ด์š”', [
r'์‚ฌ์šฉ์ž ์„ค๋ฌธ์— ๋”ฐ๋ฅด๋ฉด ๋Œ€๋‹ค์ˆ˜๊ฐ€ \1ํ–ˆ๋‹ค๊ณ  ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค',
r'์ฃผ์š” ๋ฆฌ๋ทฐ๋“ค์„ ์ข…ํ•ฉํ•ด๋ณด๋ฉด \1ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค',
r'์‚ฌ์šฉ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์œ ์ €๋“ค์ด \1ํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค'
]),
(r'์ œ ๊ฒฝํ—˜์ƒ ([๊ฐ€-ํžฃ\s]+)๋Š” ๊ฒƒ ๊ฐ™์•„์š”', [
r'์žฅ๊ธฐ ์‚ฌ์šฉ์ž๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋ฉด \1๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค',
r'์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” \1๋Š” ์˜๊ฒฌ์ด ์ง€๋ฐฐ์ ์ž…๋‹ˆ๋‹ค',
r'์œ ํŠœ๋ธŒ์™€ ์ธ์Šคํƒ€๊ทธ๋žจ์˜ ๋ฆฌ๋ทฐ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด \1๋Š” ํ‰๊ฐ€๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค'
]),
# ๋‹จ์ˆœ ์˜๊ฒฌ ํ‘œํ˜„ -> ๋‹ค์–‘ํ•œ ๊ด€์  ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜
(r'([๊ฐ€-ํžฃ\s]+)ํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด์š”', [
r'\1ํ•˜๋‹ค๋Š” ์ ์ด ์ฃผ์š” ์žฅ์ ์œผ๋กœ ๊ผฝํž™๋‹ˆ๋‹ค',
r'\1ํ•˜๋‹ค๋Š” ํŠน์ง•์— ๋งŒ์กฑํ•œ๋‹ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ 70% ์ด์ƒ์ž…๋‹ˆ๋‹ค',
r'\1ํ•˜๋‹ค๋Š” ์ ์€ SNS์—์„œ๋„ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋Š” ํŠน์ง•์ž…๋‹ˆ๋‹ค'
]),
(r'([๊ฐ€-ํžฃ\s]+)ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์–ด์š”', [
r'\1ํ•˜๋‹ค๋Š” ์ ์€ ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋“ค์ด ๊ฐœ์„ ์„ ์š”๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค',
r'\1ํ•˜๋‹ค๋Š” ํ•œ๊ณ„์ ์€ ํŠนํžˆ ์ „๋ฌธ ์‚ฌ์šฉ์ž๋“ค ์‚ฌ์ด์—์„œ ์ง€์ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค',
r'\1ํ•˜๋‹ค๋Š” ์ ์€ ์‚ฌ์šฉ์ž ํฌ๋Ÿผ์—์„œ ์ž์ฃผ ๋…ผ์˜๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค'
])
]
# 3. ๋Œ€๋น„๋˜๋Š” ์˜๊ฒฌ ํ‘œํ˜„ ๋‹ค์–‘ํ™”
contrast_patterns = [
(r'([๊ฐ€-ํžฃ\s]+)ํ•˜์ง€๋งŒ ([๊ฐ€-ํžฃ\s]+)ํ•ฉ๋‹ˆ๋‹ค', [
r'\1ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋‚˜, ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” \2ํ•œ๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค',
r'๋Œ€์ฒด๋กœ \1ํ•˜์ง€๋งŒ, ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋“ค์€ \2ํ•œ๋‹ค๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค',
r'\1ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋‹ค์ˆ˜ ์˜๊ฒฌ์ด์ง€๋งŒ, ์ „๋ฌธ๊ฐ€๋“ค์€ \2ํ•˜๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค'
]),
(r'([๊ฐ€-ํžฃ\s]+)๋Š” ๋ฐ˜๋ฉด์— ([๊ฐ€-ํžฃ\s]+)๋Š”', [
r'\1๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ \2๋Š”',
r'\1๋Š” ๊ฒƒ์ด ์ฃผ์š” ํ”ผ๋“œ๋ฐฑ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ ๋‹ค๋ฅธ ์‚ฌ์šฉ ํ™˜๊ฒฝ์—์„œ๋Š” \2๋Š”',
r'\1๋Š” ๊ฒฝํ–ฅ์ด ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ธฐ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก \2๋Š”'
])
]
# ํŒจํ„ด ๋žœ๋ค ์ ์šฉ์„ ์œ„ํ•œ ์‹œ๋“œ ์„ค์ •
import random
random.seed(hash(blog_content[:100])) # ๋‚ด์šฉ ์ผ๋ถ€๋ฅผ ์‹œ๋“œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ ์œ ์ง€
# ํŒจํ„ด ์ ์šฉ
for pattern, replacements in opinion_patterns:
matches = re.findall(pattern, blog_content)
for match in matches:
replacement = random.choice(replacements)
blog_content = re.sub(pattern.replace(r'([๊ฐ€-ํžฃ\s]+)', re.escape(match)),
replacement.replace(r'\1', match),
blog_content, count=1)
for pattern, replacements in contrast_patterns:
for i in range(3): # ์ตœ๋Œ€ 3๋ฒˆ ์ ์šฉ
match = re.search(pattern, blog_content)
if match:
groups = match.groups()
if len(groups) == 2:
replacement = random.choice(replacements)
replacement = replacement.replace(r'\1', groups[0]).replace(r'\2', groups[1])
blog_content = re.sub(re.escape(match.group(0)), replacement, blog_content, count=1)
# ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ํŒจํ„ด ์ ์šฉ (๋งˆ์ง€๋ง‰์— ์ ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŒจํ„ด๊ณผ ์ถฉ๋Œ ๋ฐฉ์ง€)
for pattern, replacement in user_group_patterns:
blog_content = re.sub(pattern, replacement, blog_content)
# 4. ๋ฐ์ดํ„ฐ์™€ ํ†ต๊ณ„ ํ‘œํ˜„ ์ถ”๊ฐ€ (์ €๋Š” ~ํ–ˆ์–ด์š” -> ์„ค๋ฌธ์กฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด ~% ์‚ฌ์šฉ์ž๊ฐ€...)
stats_patterns = [
(r'([๊ฐ€-ํžฃ\s]+)๊ฐ€ ์ข‹์•„์š”', r'์„ค๋ฌธ์— ์ฐธ์—ฌํ•œ ์‚ฌ์šฉ์ž์˜ ์•ฝ 65%๊ฐ€ \1๊ฐ€ ์ข‹๋‹ค๊ณ  ํ‰๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค'),
(r'([๊ฐ€-ํžฃ\s]+)๊ฐ€ ํŽธ๋ฆฌํ•ด์š”', r'์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ ๋ถ„์„ ๊ฒฐ๊ณผ ์•ฝ 70%๊ฐ€ \1๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค'),
(r'([๊ฐ€-ํžฃ\s]+)๊ฐ€ ์•„์‰ฌ์›Œ์š”', r'์•ฝ 40%์˜ ์‚ฌ์šฉ์ž๊ฐ€ \1๊ฐ€ ์•„์‰ฝ๋‹ค๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค')
]
for pattern, replacement in stats_patterns:
# ์ตœ๋Œ€ 3๋ฒˆ๋งŒ ์ ์šฉํ•˜์—ฌ ๊ณผ๋„ํ•œ ํ†ต๊ณ„ ํ‘œํ˜„ ๋ฐฉ์ง€
for i in range(3):
match = re.search(pattern, blog_content)
if match:
blog_content = re.sub(pattern.replace(r'([๊ฐ€-ํžฃ\s]+)', re.escape(match.group(1))),
replacement.replace(r'\1', match.group(1)),
blog_content, count=1)
# 5. "A vs B" ํŒจํ„ด ์ค„์ด๊ธฐ
vs_pattern = r'([๊ฐ€-ํžฃ\s]+) vs ([๊ฐ€-ํžฃ\s]+)'
vs_count = len(re.findall(vs_pattern, blog_content))
if vs_count > 2: # 3๊ฐœ ์ด์ƒ์ด๋ฉด ์ผ๋ถ€ ํŒจํ„ด ๋ณ€๊ฒฝ
replacements = [
r'\1๊ณผ \2์˜ ์ฐจ์ด์ ',
r'\1 ๋˜๋Š” \2์— ๋”ฐ๋ฅธ ํ‰๊ฐ€ ์ฐจ์ด',
r'\1์„ ์„ ํ˜ธํ•˜๋Š” ์ง‘๋‹จ๊ณผ \2๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ง‘๋‹จ'
]
# vs ํŒจํ„ด ๋งค์นญ ๋ฐ ๋ณ€๊ฒฝ
matches = re.findall(vs_pattern, blog_content)
for i, match in enumerate(matches[2:]): # ์ฒ˜์Œ 2๊ฐœ๋Š” ์œ ์ง€ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋งŒ ๋ณ€๊ฒฝ
replacement = replacements[i % len(replacements)]
blog_content = re.sub(re.escape(f"{match[0]} vs {match[1]}"),
replacement.replace(r'\1', match[0]).replace(r'\2', match[1]),
blog_content, count=1)
# ๊ณผ์žฅ๋œ ํ‘œํ˜„ ์ •๋ฆฌ (๊ณตํ†ต ๋ถ€๋ถ„)
exaggerated_expressions = [
(r'ํ•„์ˆ˜์ ์ธ', r'์ค‘์š”ํ•œ'),
(r'ํ˜๋ช…์ ์ธ', r'์ค‘์š”ํ•œ'),
(r'๋†€๋ผ์šด', r'์ฃผ๋ชฉํ•  ๋งŒํ•œ'),
(r'๊ธฐ์ ์˜', r'ํšจ๊ณผ์ ์ธ'),
(r'์ตœ๊ณ ์˜', r'์ข‹์€'),
(r'์„ธ๊ณ„์ ์ธ', r'์œ ๋ช…ํ•œ'),
(r'์™„๋ฒฝํ•œ', r'์šฐ์ˆ˜ํ•œ'),
(r'๊ทน์ ์ธ', r'์ƒ๋‹นํ•œ'),
(r'๋ฌดํ•œํ•œ', r'๋งŽ์€'),
(r'์ ˆ๋Œ€์ ์ธ', r'์ƒ๋‹นํ•œ'),
(r'ํ˜์‹ ์ ์ธ', r'์ƒˆ๋กœ์šด'),
(r'ํ™˜์ƒ์ ์ธ', r'์ข‹์€'),
(r'๊ทผ๋ณธ์ ์ธ', r'๊ธฐ๋ณธ์ ์ธ'),
(r'ํš๊ธฐ์ ์ธ', r'์ค‘์š”ํ•œ'),
(r'์ „๋ก€์—†๋Š”', r'ํŠน๋ณ„ํ•œ'),
(r'์••๋„์ ์ธ', r'์ฃผ๋ชฉํ•  ๋งŒํ•œ'),
(r'ํ™ฉํ™€ํ•œ', r'์ข‹์€'),
(r'์ฒœ์ƒ์˜', r'์šฐ์ˆ˜ํ•œ'),
(r'๊ธฐ๊ฐ€ ๋ง‰ํžŒ', r'ํšจ๊ณผ์ ์ธ'),
(r'๋ํŒ์™•', r'์ตœ์ƒ์œ„'),
(r'๊ทธ ์ž์ฒด', r''),
(r'์ด .{1,10} ๊ทธ ์ž์ฒด์˜€์–ด์š”', r'์ด \1์˜€์–ด์š”'),
(r'๊ฐ€ .{1,10} ๊ทธ ์ž์ฒด์˜€์–ด์š”', r'๊ฐ€ \1์˜€์–ด์š”'),
(r'์••๋„์ ์ธ', r'์ค‘์š”ํ•œ'),
(r'์ฒœ๊ตญ', r'์ข‹์€ ๊ณณ'),
(r'ํ™ฉํ™€ํ–ˆ์–ด์š”', r'์ข‹์•˜์–ด์š”'),
(r'ํ™˜์ƒ์˜', r'์ข‹์€'),
(r'์ตœ์ ์˜', r'์ข‹์€'),
(r'์™„๋ฒฝํ•œ', r'์ข‹์€'),
(r'๊ผญ ๊ฐ€๋ด์•ผ ํ• ', r'์ถ”์ฒœํ•˜๋Š”'),
(r'๊ผญ ๋จน์–ด๋ด์•ผ ํ• ', r'์ถ”์ฒœํ•˜๋Š”'),
(r'๊ผญ ํ•ด๋ด์•ผ ํ• ', r'์ถ”์ฒœํ•˜๋Š”')
]
for pattern, replacement in exaggerated_expressions:
blog_content = re.sub(pattern, replacement, blog_content, flags=re.IGNORECASE)
blog_content = re.sub(r'์ฐธ๊ณ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด', r'์•Œ๋ ค์ง„ ๋ฐ”๋กœ๋Š”', blog_content)
blog_content = re.sub(r'์ฐธ๊ณ ๊ธ€', r'๊ด€๋ จ ์ •๋ณด', blog_content)
# ์ƒํ’ˆ ๋ฆฌ๋ทฐ ๊ด€๋ จ ํ‘œํ˜„ ์ •๋ฆฌ
product_specific_adjustments = [
(r'์‚ฌ์šฉํ•ด๋ณด์„ธ์š”', r'์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”'),
(r'๊ตฌ๋งคํ•ด๋ณด์„ธ์š”', r'๊ตฌ๋งคํ•ด ๋ณด์„ธ์š”'),
(r'๋น„๊ตํ•ด๋ณด์„ธ์š”', r'๋น„๊ตํ•ด ๋ณด์„ธ์š”'),
(r'ํ™•์ธํ•ด๋ณด์„ธ์š”', r'ํ™•์ธํ•ด ๋ณด์„ธ์š”'),
(r'์„ ํƒํ•ด๋ณด์„ธ์š”', r'์„ ํƒํ•ด ๋ณด์„ธ์š”'),
(r'ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”', r'ํ…Œ์ŠคํŠธํ•ด ๋ณด์„ธ์š”'),
(r'์†Œ๋น„์ž๋“ค์—๊ฒŒ (.*?)์„ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž๋“ค์—๊ฒŒ \1์„ ์ถ”์ฒœํ•ด์š”'),
(r'์†Œ๋น„์ž๋“ค์—๊ฒŒ (.*?)๋ฅผ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž๋“ค์—๊ฒŒ \1๋ฅผ ์ถ”์ฒœํ•ด์š”'),
(r'์†Œ๋น„์ž๋“ค์—๊ฒŒ (.*?)์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž๋“ค์—๊ฒŒ \1์„ ์ถ”์ฒœํ•ด์š”'),
(r'์†Œ๋น„์ž๋“ค์—๊ฒŒ (.*?)๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž๋“ค์—๊ฒŒ \1๋ฅผ ์ถ”์ฒœํ•ด์š”'),
(r'์†Œ๋น„์ž์—๊ฒŒ (.*?)์„ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž์—๊ฒŒ \1์„ ์ถ”์ฒœํ•ด์š”'),
(r'์†Œ๋น„์ž์—๊ฒŒ (.*?)๋ฅผ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค', r'์†Œ๋น„์ž์—๊ฒŒ \1๋ฅผ ์ถ”์ฒœํ•ด์š”')
]
for pattern, replacement in product_specific_adjustments:
blog_content = re.sub(pattern, replacement, blog_content)
return blog_content
except Exception as e:
logging.error(f"๋ธ”๋กœ๊ทธ ๊ธ€ ํ›„์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return blog_content
def generate_outline(category, style, references1, references2, references3):
"""์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ํ•จ์ˆ˜"""
try:
category_prompt = get_category_outline_prompt(category)
style_prompt = get_style_prompt(style)
# ์ฐธ๊ณ ๊ธ€ ์ •๋ณด ์ค€๋น„
references = [
references1.strip() if references1.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
references2.strip() if references2.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ",
references3.strip() if references3.strip() else "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"
]
# ์˜๋ฏธ ์žˆ๋Š” ์ฐธ๊ณ ๊ธ€๋งŒ ํ•„ํ„ฐ๋ง
meaningful_refs = [ref for ref in references if ref != "์ฐธ๊ณ  ์ž๋ฃŒ ์—†์Œ"]
if not meaningful_refs:
return "์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
outline_prompt = f"""
[์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์š”์ฒญ]
์นดํ…Œ๊ณ ๋ฆฌ: {category}
ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}
์ฐธ๊ณ ๊ธ€:
{references[0]}
{references[1] if len(meaningful_refs) > 1 else ""}
{references[2] if len(meaningful_refs) > 2 else ""}
{category_prompt}
{style_prompt}
์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์‹œ ์ถ”๊ฐ€ ์ง€์นจ:
1. ์ฐธ๊ณ ๊ธ€์˜ ํ•ต์‹ฌ ์ฃผ์ œ์™€ ๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋ผ.
2. ๊ฐ ์†Œ์ฃผ์ œ๋Š” 20์ž ์ด๋‚ด๋กœ ๋ช…ํ™•ํ•˜๊ณ  ๋งค๋ ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ผ.
3. ์ „์ฒด ์•„์›ƒ๋ผ์ธ์ด ๋…ผ๋ฆฌ์  ํ๋ฆ„๊ณผ ์ผ๊ด€์„ฑ์„ ๊ฐ€์ง€๋„๋ก ๊ตฌ์„ฑํ•˜๋ผ.
4. ๋…์ž์˜ ๊ด€์‹ฌ๊ณผ ํ˜ธ๊ธฐ์‹ฌ์„ ์œ ๋ฐœํ•˜๋Š” ์†Œ์ฃผ์ œ๋ฅผ ์„ค๊ณ„ํ•˜๋ผ.
5. ์†Œ๋น„์ž์˜ ์‹ค์งˆ์ ์ธ ํ•„์š”์™€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ฐ˜์˜ํ•œ ์†Œ์ฃผ์ œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ผ.
6. ์†Œ์ฃผ์ œ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ถœ๋ ฅํ•˜๊ณ  ์„ค๋ช…์€ ํฌํ•จํ•˜์ง€ ๋ง๋ผ.
7. ๊ฐ ์†Œ์ฃผ์ œ๋Š” ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์„ฑํ•˜๋˜, ๋„์ž…๋ถ€์™€ ๊ฒฐ๋ก ์€ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•˜๋ผ.
8. ๋ณธ๋ก ์˜ ์ฃผ์ œ๋Š” ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์„ ๋ฉด๋ฐ€ํžˆ ๋ถ„์„ํ•˜์—ฌ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ฃผ์ œ๋กœ ๊ตฌ์„ฑํ•˜๋ผ.
9. ๋ฐ˜๋“œ์‹œ ์ด 7๊ฐœ์˜ ์„น์…˜(๋„์ž…๋ถ€ 1๊ฐœ, ๋ณธ๋ก  5๊ฐœ, ๊ฒฐ๋ก  1๊ฐœ)์„ ๊ตฌ์„ฑํ•˜๋ผ.
10. ์ „์ฒด์ ์œผ๋กœ ์ƒํ’ˆ์˜ ์ฃผ์š” ํŠน์ง•, ๊ธฐ๋Šฅ, ์žฅ๋‹จ์ , ์‚ฌ์šฉ ๊ฒฝํ—˜ ๋“ฑ์„ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๋ผ.
"""
# Gemini API ํ˜ธ์ถœ
outline_result = call_gemini_api(outline_prompt, temperature=0.7)
# ๊ฒฐ๊ณผ ํ›„์ฒ˜๋ฆฌ (๋ถˆํ•„์š”ํ•œ ํ˜•์‹ ์ œ๊ฑฐ)
outline_result = re.sub(r'^\s*[-*]\s+', '', outline_result, flags=re.MULTILINE)
outline_result = re.sub(r'^\s*\d+\.\s+', '', outline_result, flags=re.MULTILINE)
return outline_result
except Exception as e:
logging.error(f"์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return f"์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
def call_gemini_api(prompt, temperature=TEMPERATURE, top_p=TOP_P):
"""Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜"""
try:
logging.info("Gemini API ํ˜ธ์ถœ ์‹œ์ž‘")
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=[prompt],
config=types.GenerateContentConfig(
max_output_tokens=MAX_TOKENS,
temperature=temperature,
top_p=top_p
)
)
logging.info("Gemini API ํ˜ธ์ถœ ์™„๋ฃŒ")
return response.text.strip()
except Exception as e:
logging.error(f"Gemini API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return f"API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
def format_filename(text):
text = re.sub(r'[^\w\s-]', '', text)
return text[:50].strip()
# API ํ•จ์ˆ˜๋“ค
def generate_outline_3(category, style, ref1, ref2, ref3):
return generate_outline(category, style, ref1, ref2, ref3)
def generate_blog_post_3(category, style, ref1, ref2, ref3, outline):
result = generate_blog_post(category, style, outline, ref1, ref2, ref3)
return result[0] # ํŠœํ”Œ์—์„œ HTML๋งŒ ๋ฐ˜ํ™˜