Spaces:
Runtime error
Runtime error
| 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 fpdf import FPDF | |
| 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 # Gemini API ์ต๋ ํ ํฐ ์ | |
| TEMPERATURE = 0.75 # Gemini API ์จ๋ ๊ฐ | |
| TOP_P = 0.95 # Gemini API top_p ๊ฐ | |
| # Pretendard ํฐํธ ํ์ผ ๊ฒฝ๋ก | |
| FONT_REGULAR_PATH = os.path.join("Pretendard-Regular.otf") | |
| FONT_BOLD_PATH = os.path.join("Pretendard-Bold.otf") | |
| # 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)}" | |
| # PDF ํด๋์ค ์ ์ | |
| class PDF(FPDF): | |
| def __init__(self): | |
| super().__init__() | |
| self.add_font("Pretendard", "", FONT_REGULAR_PATH, uni=True) | |
| self.add_font("Pretendard", "B", FONT_BOLD_PATH, uni=True) | |
| def header(self): | |
| self.set_font("Pretendard", "", 10) | |
| def footer(self): | |
| self.set_y(-15) | |
| self.set_font("Pretendard", "", 8) | |
| self.cell(0, 10, f'Page {self.page_no()}', align='C') | |
| def save_to_pdf(blog_post, user_topic=""): | |
| try: | |
| logging.info("PDF ์์ฑ ์์") | |
| pdf = PDF() | |
| pdf.add_page() | |
| soup = BeautifulSoup(blog_post, 'html.parser') | |
| title = soup.h1.text.strip() if soup.h1 else user_topic or "์ํ ๋ฆฌ๋ทฐ" | |
| logging.info(f"PDF ์ ๋ชฉ ์ค์ : {title}") | |
| page_width = pdf.w - 2 * pdf.l_margin | |
| image_width = page_width | |
| image_url1 = "https://finalendai.com/wp-content/uploads/2024/10/pdf-banner-top.png" | |
| image_url2 = "https://finalendai.com/wp-content/uploads/2024/10/pdf-banner-bottom.png" | |
| logging.info("์๋จ ์ด๋ฏธ์ง ์ฝ์ ์๋") | |
| try: | |
| with urlopen(image_url1) as response: | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp_file: | |
| tmp_file.write(response.read()) | |
| tmp_file_path = tmp_file.name | |
| img_width, img_height = Image.open(tmp_file_path).size | |
| ratio = img_height / img_width | |
| image_height = image_width * ratio | |
| x = (pdf.w - image_width) / 2 | |
| y = pdf.get_y() | |
| pdf.link(x, y, image_width, image_height, "https://finalendai.com") | |
| pdf.image(tmp_file_path, x=x, y=y, w=image_width) | |
| pdf.ln(image_height + 10) | |
| os.unlink(tmp_file_path) | |
| logging.info("์๋จ ์ด๋ฏธ์ง ์ฝ์ ์๋ฃ") | |
| except Exception as e: | |
| logging.error(f"์๋จ ์ด๋ฏธ์ง ์ฝ์ ์ค ์ค๋ฅ: {str(e)}") | |
| pdf.set_font("Pretendard", "B", 16) | |
| pdf.multi_cell(0, 10, title, align='C') | |
| pdf.ln(10) | |
| logging.info("PDF ๋ณธ๋ฌธ ๋ด์ฉ ์ถ๊ฐ ์์") | |
| pdf.set_font("Pretendard", "", 12) | |
| for tag in soup.find_all(["h2", "h3", "p", "ul", "li"]): | |
| tag_text = tag.get_text().strip() | |
| logging.info(f"์ถ๊ฐ ์ค์ธ ๋ณธ๋ฌธ ๋ด์ฉ [{tag.name}]: {tag_text}") | |
| if tag.name == "h2": | |
| pdf.set_font("Pretendard", "B", 14) | |
| pdf.multi_cell(0, 8, tag_text) | |
| pdf.ln(4) | |
| elif tag.name == "h3": | |
| pdf.set_font("Pretendard", "B", 12) | |
| pdf.multi_cell(0, 6, tag_text) | |
| pdf.ln(3) | |
| elif tag.name == "p": | |
| pdf.set_font("Pretendard", "", 12) | |
| pdf.multi_cell(0, 8, tag_text) | |
| pdf.ln(4) | |
| elif tag.name in ["ul", "li"]: | |
| pdf.set_font("Pretendard", "", 12) | |
| pdf.multi_cell(0, 8, f"โข {tag_text}") | |
| pdf.ln(4) | |
| logging.info("PDF ๋ณธ๋ฌธ ๋ด์ฉ ์ถ๊ฐ ์๋ฃ") | |
| logging.info("ํ๋จ ์ด๋ฏธ์ง ์ฝ์ ์๋") | |
| try: | |
| with urlopen(image_url2) as response: | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp_file: | |
| tmp_file.write(response.read()) | |
| tmp_file_path = tmp_file.name | |
| if pdf.get_y() + image_height > pdf.page_break_trigger: | |
| pdf.add_page() | |
| x = (pdf.w - image_width) / 2 | |
| y = pdf.get_y() | |
| pdf.link(x, y, image_width, image_height, "https://finalendai.com/story/") | |
| pdf.image(tmp_file_path, x=x, y=y, w=image_width) | |
| os.unlink(tmp_file_path) | |
| logging.info("ํ๋จ ์ด๋ฏธ์ง ์ฝ์ ์๋ฃ") | |
| except Exception as e: | |
| logging.error(f"ํ๋จ ์ด๋ฏธ์ง ์ฝ์ ์ค ์ค๋ฅ: {str(e)}") | |
| now = datetime.now(ZoneInfo("Asia/Seoul")) | |
| filename = f"{now.strftime('%y%m%d_%H%M')}_{format_filename(title)}.pdf" | |
| pdf.output(filename) | |
| logging.info(f"PDF ํ์ผ ์ ์ฅ ์๋ฃ: {filename}") | |
| return filename | |
| except Exception as e: | |
| logging.error(f"PDF ์์ฑ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}") | |
| return None | |
| def format_filename(text): | |
| text = re.sub(r'[^\w\s-]', '', text) | |
| return text[:50].strip() | |
| def save_content_to_pdf(blog_post, user_topic=""): | |
| return save_to_pdf(blog_post, user_topic) | |
| # ------------------------------- | |
| # Gradio ์ธํฐํ์ด์ค ๊ตฌ์ฑ | |
| # ------------------------------- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# ์ํ ๋ฆฌ๋ทฐ ๋ธ๋ก๊ทธ ํฌ์คํ ์์ฑ๊ธฐ") | |
| gr.Markdown("### 1๋จ๊ณ: ํฌ์คํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ง์ ํด์ฃผ์ธ์", elem_id="step-title") | |
| category = gr.Radio(choices=["์ผ๋ฐ", "๊ธฐ๋ฅ์ง์คํ", "๊ณ ๊ฐ๋ฐ์ํ"], label="ํฌ์คํ ์นดํ ๊ณ ๋ฆฌ", value="์ผ๋ฐ") | |
| gr.Markdown("---\n\n") | |
| gr.Markdown("### 2๋จ๊ณ: ํฌ์คํ ์คํ์ผ์ ์ ํํด์ฃผ์ธ์", elem_id="step-title") | |
| style = gr.Radio(choices=["์น๊ทผํ", "์ผ๋ฐ", "์ ๋ฌธ์ ์ธ"], label="ํฌ์คํ ์คํ์ผ", value="์น๊ทผํ") | |
| gr.Markdown("---\n\n") | |
| gr.Markdown("### 3๋จ๊ณ: ์ฐธ๊ณ ๊ธ์ ์ ๋ ฅํ์ธ์", elem_id="step-title") | |
| references1 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 1", placeholder="์ฐธ๊ณ ํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10) | |
| references2 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 2", placeholder="์ฐธ๊ณ ํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10) | |
| references3 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 3", placeholder="์ฐธ๊ณ ํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10) | |
| gr.Markdown("---\n\n") | |
| gr.Markdown("### 4๋จ๊ณ: ์์๋ผ์ธ์ ์์ฑํด์ฃผ์ธ์", elem_id="step-title") | |
| gr.HTML("<span style='color: grey;'>[์ฐธ๊ณ ๊ธ์ ๋ด์ฉ์ ๋ฐ๋ผ ์๋์ผ๋ก ์์๋ผ์ธ์ด ์์ฑ๋ฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ง์ ์์ ํ์ธ์]</span>") | |
| outline_generate_btn = gr.Button("์์๋ผ์ธ ์์ฑํ๊ธฐ") | |
| outline_result = gr.Textbox(label="์์๋ผ์ธ ๊ฒฐ๊ณผ", lines=15) | |
| outline_input = gr.Textbox(label="์์ฑํ ์์๋ผ์ธ์ ์ ๋ ฅํด์ฃผ์ธ์", placeholder="์์ฑ๋ ์์๋ผ์ธ ๋ณต์ฌ, ์์ ํด์ ์ฌ์ฉํ์ธ์", lines=10) | |
| outline_generate_btn.click( | |
| fn=generate_outline, | |
| inputs=[category, style, references1, references2, references3], | |
| outputs=[outline_result] | |
| ) | |
| gr.Markdown("---\n\n") | |
| gr.Markdown("### 5๋จ๊ณ: ๊ธ ์์ฑํ๊ธฐ", elem_id="step-title") | |
| gr.HTML("<span style='color: grey;'>[์์๋ผ์ธ์ ํ์ธํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์์ ํ ํ ๊ธ์ ์์ฑํ์ธ์]</span>") | |
| generate_btn = gr.Button("๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ") | |
| output = gr.HTML(label="์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ") | |
| char_count = gr.Number(label="๊ธ์ ์", precision=0) | |
| generate_btn.click( | |
| fn=generate_blog_post, | |
| inputs=[category, style, outline_input, references1, references2, references3], | |
| outputs=[output, char_count], | |
| show_progress=True | |
| ) | |
| save_pdf_btn = gr.Button("PDF๋ก ์ ์ฅํ๊ธฐ") | |
| pdf_output = gr.File(label="์์ฑ๋ PDF ํ์ผ") | |
| save_pdf_btn.click( | |
| fn=save_content_to_pdf, | |
| inputs=[output, category], | |
| outputs=[pdf_output], | |
| show_progress=True | |
| ) | |
| gr.HTML(""" | |
| <style> | |
| #step-title { | |
| font-size: 1.7em; | |
| font-weight: bold; | |
| } | |
| </style> | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch() |