Create visit_review_blog.py
Browse files- visit_review_blog.py +512 -0
visit_review_blog.py
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from bs4 import BeautifulSoup
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
from zoneinfo import ZoneInfo
|
| 6 |
+
import tempfile
|
| 7 |
+
import requests
|
| 8 |
+
import re
|
| 9 |
+
import logging
|
| 10 |
+
from PIL import Image
|
| 11 |
+
from urllib.request import urlopen
|
| 12 |
+
import io
|
| 13 |
+
|
| 14 |
+
# google-genai ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
|
| 15 |
+
from google import genai
|
| 16 |
+
|
| 17 |
+
# ๋ก๊น
์ค์
|
| 18 |
+
logging.basicConfig(level=logging.WARNING)
|
| 19 |
+
logger = logging.getLogger(__name__)
|
| 20 |
+
logger.setLevel(logging.INFO)
|
| 21 |
+
|
| 22 |
+
# ํ๊ฒฝ๋ณ์๋ฅผ ํตํด Gemini API ํค๋ฅผ ๊ฐ์ ธ์ด
|
| 23 |
+
API_KEY = os.getenv("GEMINI_API_KEY")
|
| 24 |
+
if API_KEY is None:
|
| 25 |
+
raise ValueError("GENAI_API_KEY ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.")
|
| 26 |
+
client = genai.Client(api_key=API_KEY)
|
| 27 |
+
|
| 28 |
+
# Gemini API๋ฅผ ํธ์ถํ๋ ํจ์ (Gemini๋ max_tokens, temperature, top_p ํ๋ผ๋ฏธํฐ ์์ด ํ๋กฌํํธ๋ฅผ ๊ฒฐํฉํ์ฌ ์์ฒญ)
|
| 29 |
+
def call_api(content, system_message, max_tokens=None, temperature=None, top_p=None):
|
| 30 |
+
try:
|
| 31 |
+
prompt = system_message + "\n" + content
|
| 32 |
+
response = client.models.generate_content(
|
| 33 |
+
model="gemini-2.0-flash",
|
| 34 |
+
contents=prompt
|
| 35 |
+
)
|
| 36 |
+
return response.text.strip()
|
| 37 |
+
except Exception as e:
|
| 38 |
+
logger.error(f"API ํธ์ถ ์ค๋ฅ: {str(e)}")
|
| 39 |
+
return f"Gemini API Error: {str(e)}"
|
| 40 |
+
|
| 41 |
+
def analyze_info(data):
|
| 42 |
+
return (f"์ ํํ ์นดํ
๊ณ ๋ฆฌ: {data['category']}\n"
|
| 43 |
+
f"์ ํํ ํฌ์คํ
์คํ์ผ: {data['style']}\n"
|
| 44 |
+
f"์ฐธ๊ณ ๊ธ1: {data['references1']}\n"
|
| 45 |
+
f"์ฐธ๊ณ ๊ธ2: {data['references2']}\n"
|
| 46 |
+
f"์ฐธ๊ณ ๊ธ3: {data['references3']}\n")
|
| 47 |
+
|
| 48 |
+
def generate_outline(category, style, references1, references2, references3, photo_recommendations):
|
| 49 |
+
data = {
|
| 50 |
+
'category': category,
|
| 51 |
+
'style': style,
|
| 52 |
+
'references1': references1,
|
| 53 |
+
'references2': references2,
|
| 54 |
+
'references3': references3,
|
| 55 |
+
'photo_recommendations': photo_recommendations
|
| 56 |
+
}
|
| 57 |
+
full_content = analyze_info(data)
|
| 58 |
+
logger.info(f"์์๋ผ์ธ ์์ฑ์ ์ํ ์ ์ฒด ๋ด์ฉ: {full_content}")
|
| 59 |
+
|
| 60 |
+
system_prompt = get_outline_prompt(data['category']) + "\n\n" + get_style_prompt(data['style'])
|
| 61 |
+
user_prompt = f"{full_content}\n\n์ฌ์ง ํค์๋: {photo_recommendations}"
|
| 62 |
+
modified_text = call_api(user_prompt, system_prompt, 2000, 0.7, 0.95)
|
| 63 |
+
|
| 64 |
+
# API ์ค๋ฅ ํ์ธ
|
| 65 |
+
if modified_text is None or modified_text.startswith("Gemini API Error"):
|
| 66 |
+
logger.error(f"์์๋ผ์ธ ์์ฑ ์ค API ์ค๋ฅ: {modified_text}")
|
| 67 |
+
raise Exception(f"์์๋ผ์ธ ์์ฑ API ์ค๋ฅ: {modified_text}")
|
| 68 |
+
|
| 69 |
+
# ๋ถํ์ํ ๋น ์ค ์ ๊ฑฐ: ์ฐ์๋๋ ๊ฐํ ๋ฌธ์๋ฅผ ๋จ์ผ ๊ฐํ์ผ๋ก ๋ณ๊ฒฝ
|
| 70 |
+
modified_text = re.sub(r'\n\s*\n', '\n', modified_text)
|
| 71 |
+
|
| 72 |
+
logger.info(f"Generated outline: {modified_text}")
|
| 73 |
+
return modified_text
|
| 74 |
+
|
| 75 |
+
def remove_unwanted_phrases(text):
|
| 76 |
+
unwanted_phrases = [
|
| 77 |
+
'์ฌ๋ฌ๋ถ', '์ต๊ทผ', '๋ง์ง๋ง์ผ๋ก', '๊ฒฐ๋ก ์ ์ผ๋ก', '๊ฒฐ๊ตญ',
|
| 78 |
+
'์ข
ํฉ์ ์ผ๋ก', '๋ฐ๋ผ์', '๋ง๋ฌด๋ฆฌ', '์์ฝ'
|
| 79 |
+
]
|
| 80 |
+
words = re.findall(r'\S+|\n', text)
|
| 81 |
+
result_words = [word for word in words if not any(phrase in word for phrase in unwanted_phrases)]
|
| 82 |
+
return ' '.join(result_words).replace(' \n ', '\n').replace(' \n', '\n').replace('\n ', '\n')
|
| 83 |
+
|
| 84 |
+
def format_sentences(text):
|
| 85 |
+
"""
|
| 86 |
+
๊ธด ๋ฌธ์ฅ์ 3~6๊ฐ ๋จ์ด ๋จ์๋ก ๋ถ๋ฆฌํ๋ ํจ์ (ํ๊ตญ์ด์ ์ต์ ํ)
|
| 87 |
+
"""
|
| 88 |
+
if text is None:
|
| 89 |
+
return "" # text๊ฐ None์ธ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด ๋ฐํ
|
| 90 |
+
|
| 91 |
+
# ๋ฌธ์ฅ ๋จ์๋ก ๋ถ๋ฆฌ
|
| 92 |
+
sentences = re.split(r'(?<=[.!?])\s+', text)
|
| 93 |
+
formatted_sentences = []
|
| 94 |
+
|
| 95 |
+
for sentence in sentences:
|
| 96 |
+
# ๋ฌธ์ฅ์ด ์ถฉ๋ถํ ๊ธธ ๊ฒฝ์ฐ๋ง ๋ถ๋ฆฌ ์ฒ๋ฆฌ
|
| 97 |
+
if len(sentence) > 20: # ๋ ์งง์ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์ ์ง
|
| 98 |
+
# ๋์ด์ฐ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ์ด ๋ถ๋ฆฌ
|
| 99 |
+
words = sentence.split()
|
| 100 |
+
|
| 101 |
+
if len(words) <= 4: # ์ด๋ฏธ 6๋จ์ด ์ดํ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉ
|
| 102 |
+
formatted_sentences.append(sentence)
|
| 103 |
+
continue
|
| 104 |
+
|
| 105 |
+
chunk = []
|
| 106 |
+
word_count = 0
|
| 107 |
+
|
| 108 |
+
for word in words:
|
| 109 |
+
chunk.append(word)
|
| 110 |
+
word_count += 1
|
| 111 |
+
|
| 112 |
+
# ํ๊ธ์ ์์ด๋ณด๋ค ํ ๋จ์ด๊ฐ ๋ ๊ธธ๊ธฐ ๋๋ฌธ์, ๋จ์ด ์๋ฅผ 4~7๊ฐ๋ก ์กฐ์
|
| 113 |
+
if word_count >= 4 and (word_count >= 7 or re.search(r'[,;:]$', word)):
|
| 114 |
+
formatted_sentences.append(' '.join(chunk))
|
| 115 |
+
chunk = []
|
| 116 |
+
word_count = 0
|
| 117 |
+
|
| 118 |
+
# ๋จ์ ๋จ์ด๋ค ์ฒ๋ฆฌ
|
| 119 |
+
if chunk:
|
| 120 |
+
formatted_sentences.append(' '.join(chunk))
|
| 121 |
+
else:
|
| 122 |
+
formatted_sentences.append(sentence)
|
| 123 |
+
|
| 124 |
+
return "\n".join(formatted_sentences)
|
| 125 |
+
|
| 126 |
+
def extract_keywords(text, top_n=5):
|
| 127 |
+
from sklearn.feature_extraction.text import CountVectorizer
|
| 128 |
+
vectorizer = CountVectorizer(stop_words='english', ngram_range=(1,2))
|
| 129 |
+
count_matrix = vectorizer.fit_transform([text])
|
| 130 |
+
terms = vectorizer.get_feature_names_out()
|
| 131 |
+
counts = count_matrix.sum(axis=0).A1
|
| 132 |
+
term_counts = sorted(zip(terms, counts), key=lambda x: x[1], reverse=True)
|
| 133 |
+
return [term for term, count in term_counts[:top_n]]
|
| 134 |
+
|
| 135 |
+
def get_outline_prompt(category):
|
| 136 |
+
if category == "๋ฐฉ๋ฌธํ๊ธฐํ":
|
| 137 |
+
return """
|
| 138 |
+
## ์์คํ
์ญํ
|
| 139 |
+
๋น์ ์ ์๋
๊ฐ์ ๊ฒฝํ์ ๊ฐ์ง ์ ๋ฌธ ๋ฐฉ๋ฌธ ๋ฆฌ๋ทฐ ๋ธ๋ก๊ฑฐ์
๋๋ค. ๋ง์ง, ์นดํ, ์์, ๊ด๊ด์ง ๋ฑ ๋ค์ํ ์ฅ์์ ๋ํ ์์ํ ๋ฆฌ๋ทฐ๋ก ๋ง์ ๋
์๋ค์ ์ ๋ขฐ๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
|
| 140 |
+
## ๋ถ์ ๋จ๊ณ
|
| 141 |
+
1. ์ฐธ๊ณ ๊ธ 3๊ฐ๋ฅผ ์ฒ ์ ํ ๋ถ์ํ์ฌ ํต์ฌ ์ฃผ์ ์ ์ค์ ์ ๋ณด ํ์
|
| 142 |
+
2. ๋ฐฉ๋ฌธํ ์ฅ์์ ์ ํ๊ณผ ํน์ฑ ์๋ณ (์๋น, ์นดํ, ์์, ๊ด๊ด์ง ๋ฑ)
|
| 143 |
+
3. ๋ฆฌ๋ทฐ์ ํต์ฌ์ด ๋ 5๊ฐ์ง ์ฃผ์ ์์ ํ์
(๋ถ์๊ธฐ, ๋ง, ์๋น์ค, ๊ฐ๊ฒฉ, ํน๋ณํจ ๋ฑ)
|
| 144 |
+
## ์์๋ผ์ธ ๊ตฌ์ฑ ์์น
|
| 145 |
+
1. ๋์
๋ถ(1๊ฐ) - ํธ๊ธฐ์ฌ์ ์๊ทนํ๋ ์ ๋ชฉ์ผ๋ก ์์
|
| 146 |
+
2. ๋ณธ๋ก (4-5๊ฐ) - ์ฐธ๊ณ ๊ธ ๋ถ์์ ํตํด ๋ฐ๊ฒฌํ ์ฅ์/๊ฒฝํ์ ํต์ฌ ๊ฐ์น์ ํน์ง์ ๋ด์ ์์ ๋ชฉ
|
| 147 |
+
* ์ฐธ๊ณ ๊ธ์์ ๊ฐ์ฅ ๊ฐ์กฐ๋๋ ํน์ง์ด๋ ์ฅ์
|
| 148 |
+
* ๋ฐฉ๋ฌธ์๋ค์ด ๊ฐ์ฅ ๊ด์ฌ์ ๊ฐ์ง ๋งํ ์์
|
| 149 |
+
* ์ฐจ๋ณํ๋ ๊ฒฝํ์ด๋ ๋
ํนํ ํน์ฑ
|
| 150 |
+
* ์ค์ฉ์ ์ธ ์ ๋ณด๋ ์์๋๋ฉด ์ข์ ํ
|
| 151 |
+
* (์ ํญ๋ชฉ๋ค์ ์์์ผ ๋ฟ, ์ฐธ๊ณ ๊ธ ๋ถ์์ ํตํด ์์ ๋กญ๊ฒ ๊ฒฐ์ )
|
| 152 |
+
3. ๊ฒฐ๋ก (1๊ฐ) - ์ ์ฒด ๊ฒฝํ์ ์์ฝํ๋ ๋งค๋ ฅ์ ์ธ ์ ๋ชฉ
|
| 153 |
+
## ํต์ฌ ์ง์นจ
|
| 154 |
+
- **์์ ํ ํ๊ตญ์ด๋ก๋ง ์์ฑ**ํ ๊ฒ
|
| 155 |
+
- ์์ ๋ชฉ์ **์ต๋ 30์ ์ด๋ด**๋ก ๊ฐ๊ฒฐํ๊ฒ ์์ฑ
|
| 156 |
+
- ํธ๊ธฐ์ฌ์ ์๊ทนํ๋ ํํ ์ฌ์ฉ (์: "๊ผญ ์์์ผ ํ ", "๋๋ผ์ด", "์จ๊ฒจ์ง")
|
| 157 |
+
- ์ฅ์์ ๊ฐ์ฅ ๋งค๋ ฅ์ ์ธ ํฌ์ธํธ๊ฐ ์์ ๋ชฉ์ ๋ฐ์๋๋๋ก ๊ตฌ์ฑ
|
| 158 |
+
- **์ฌ์ง ํค์๋๋ ์์ ๋ชฉ ๊ฒฐ์ ์ ์ํฅ์ ์ฃผ์ง ์์** (๋ณธ๋ฌธ ์์ฑ ์ ์ฐธ๊ณ ์ฌํญ์ผ๋ก๋ง ํ์ฉ)
|
| 159 |
+
- ์ ์ฒด ์์๋ผ์ธ์ ๋์
๋ถ(1) + ๋ณธ๋ก (์ต๋ 5๊ฐ) + ๊ฒฐ๋ก (1)์ผ๋ก ๊ตฌ์ฑ
|
| 160 |
+
## ์ถ๋ ฅ ํ์
|
| 161 |
+
* ์ฐธ๊ณ ๊ธ ๋ถ์์ ํตํด ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ฃผ์ ์ ํน์ง์ ํ์
ํ์ฌ ์์ ๋กญ๊ฒ ์์๋ผ์ธ ๊ตฌ์ฑ
|
| 162 |
+
* ํ์ง๋ง ๋ฐ๋์ ๋ค์ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ๊ฒ:(๊ฐ ํญ๋ชฉ๋น 1๋ฒ์ํฐ๋ฅผ ์ ์ฉํ์ ๋น์นธ์ด ๋์ค์ง ์๋๋กํ๋ผ.)
|
| 163 |
+
- ๋์
๋ถ: 1๊ฐ (ํธ๊ธฐ์ฌ์ ์๊ทนํ๋ ํฅ๋ฏธ๋ก์ด ์ ๋ชฉ)
|
| 164 |
+
- ๋ณธ๋ก : 4-5๊ฐ (์ฅ์/๊ฒฝํ์ ๊ฐ์ฅ ์ค์ํ ํน์ง์ ๋ฐ์ํ ์ ๋ชฉ)
|
| 165 |
+
- ๊ฒฐ๋ก : 1๊ฐ (์ ์ฒด ๊ฒฝํ ์์ฝ ์ ๋ชฉ)
|
| 166 |
+
* ์์ ๋ชฉ์ ์ฅ์์ ์ค์ ๊ฒฝํ๊ณผ ํน์ง์ ๋ง๊ฒ ์์ ๋กญ๊ฒ ๊ตฌ์ฑ
|
| 167 |
+
* ์ฌ์ง ํค์๋์ ๋ง์ถ์ง ๋ง๊ณ , ์ฐธ๊ณ ๊ธ ๋ถ์์ ํตํด ๋ฐ๊ฒฌํ ํต์ฌ ๊ฐ์น์ ํน์ง ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ
|
| 168 |
+
์์ ํ์ (์ฐธ๊ณ ์ฉ์ผ ๋ฟ, ๋ด์ฉ์ ์ฐธ๊ณ ๊ธ์ ๋ฐ๋ผ ์์ ํ ๋ฌ๋ผ์ง ์ ์์):
|
| 169 |
+
๋์
๋ถ: [ํฅ๋ฏธ๋ก์ด ๋์
์ ๋ชฉ]
|
| 170 |
+
๋ณธ๋ก 1: [ํต์ฌ ํน์ง/์ฅ์ ๊ด๋ จ ์ ๋ชฉ]
|
| 171 |
+
๋ณธ๋ก 2: [๋ ๋ค๋ฅธ ์ฃผ์ ํน์ง ๊ด๋ จ ์ ๋ชฉ]
|
| 172 |
+
๋ณธ๋ก 3: [์ฐจ๋ณํ ์์ ๊ด๋ จ ์ ๋ชฉ]
|
| 173 |
+
๋ณธ๋ก 4: [์ ์ฉํ ์ ๋ณด/ํ ๊ด๋ จ ์ ๋ชฉ]
|
| 174 |
+
๋ณธ๋ก 5: [์ถ๊ฐ ํน์ง/์ ๋ณด ๊ด๋ จ ์ ๋ชฉ] (ํ์์)
|
| 175 |
+
๊ฒฐ๋ก : [์ ์ฒด ๊ฒฝํ ์์ฝ ์ ๋ชฉ]
|
| 176 |
+
"""
|
| 177 |
+
|
| 178 |
+
def get_blog_post_prompt(category):
|
| 179 |
+
if category == "๋ฐฉ๋ฌธํ๊ธฐํ":
|
| 180 |
+
return """
|
| 181 |
+
# ๋ฐฉ๋ฌธํ๊ธฐํ ๋ธ๋ก๊ทธ ์ฝํ
์ธ ์์ฑ ์์คํ
[v2.0]
|
| 182 |
+
## ์์คํ
์ญํ
|
| 183 |
+
๋น์ ์ ์๋ง ๋ช
์ ํ๋ก์๋ฅผ ๋ณด์ ํ ์ธ๊ธฐ ๋ฐฉ๋ฌธ ๋ฆฌ๋ทฐ ๋ธ๋ก๊ฑฐ์
๋๋ค. ์์ํ ํ์ฅ๊ฐ๊ณผ ๋ํ
์ผํ ์ ๋ณด ์ ๊ณต์ผ๋ก ๋
์๋ค์๊ฒ ์ค์ ๋ฐฉ๋ฌธํ ๋ฏํ ๊ฒฝํ์ ์ ๋ฌํ๋ ์ ๋ฌธ๊ฐ์
๋๋ค.
|
| 184 |
+
## ์ฝํ
์ธ ์์ฑ ์์น
|
| 185 |
+
### 1. ๊ธ์ ๊ตฌ์กฐ
|
| 186 |
+
- **๋์
๋ถ** (์ ์ฒด ๊ธ์ 10-15%):
|
| 187 |
+
* ์ฅ์ ์๊ฐ ๋ฐ ๋ฐฉ๋ฌธ ๊ณ๊ธฐ
|
| 188 |
+
* ์ฒซ์ธ์๊ณผ ๊ธฐ๋๊ฐ ํํ
|
| 189 |
+
* ์์น์ ๋ณด์ ํจ๊ป "[์ง๋ ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ์ธ์]" ๋ช
์
|
| 190 |
+
* ๊ธธ์ด: 500์ ์ด์
|
| 191 |
+
- **๋ณธ๋ก ** (์ ์ฒด ๊ธ์ 70-80%):
|
| 192 |
+
* ์์๋ผ์ธ์ ๊ฐ ์์ ๋ชฉ์ ๋ง์ถ ์์ธ ๋ด์ฉ
|
| 193 |
+
* ์ฅ์์ ๋ถ์๊ธฐ, ์ ํ/์๋น์ค ํ์ง, ๊ฐ๊ฒฉ, ์๋น์ค ๋ฑ ํต์ฌ ์์ ์์ธ ์ค๋ช
|
| 194 |
+
* ์ค์ ๊ฒฝํ ๊ธฐ๋ฐ์ ์์ํ ํํ
|
| 195 |
+
* ๊ฐ ์น์
์ 400-600์ ์์ค์ผ๋ก ๊ท ํ์๊ฒ ์์ฑ
|
| 196 |
+
* ๊ธธ์ด: 2500์ ์ด์
|
| 197 |
+
- **๊ฒฐ๋ก ** (์ ์ฒด ๊ธ์ 10-15%):
|
| 198 |
+
* ์ ์ฒด ๊ฒฝํ ์์ฝ ๋ฐ ์ถ์ฒ ์ด์
|
| 199 |
+
* ์ถ๊ฐ ํ์ด๋ ๋ฐฉ๋ฌธ ์ ์ฐธ๊ณ ์ฌํญ
|
| 200 |
+
* ๊ธธ์ด: 400์ ์ด์
|
| 201 |
+
### 2. ์ฌ์ง ์ฝ์
์ง์นจ
|
| 202 |
+
- ์ฌ์ง ํค์๋๋ **๋ด์ฉ์ ๋ง๊ฒ** ๋ณธ๋ฌธ ์ค๊ฐ์ ์์ฐ์ค๋ฝ๊ฒ ์ฝ์
|
| 203 |
+
- ์ฌ์ง ํค์๋๋ ๋ด์ฉ๊ณผ ๊ด๋ จ ์์ ๋๋ง ์ฌ์ฉํ๊ณ , ์ต์ง๋ก ๋ชจ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์
|
| 204 |
+
- ์ฌ์ง ํค์๋๋ ๋๊ดํธ๋ก ํ์: [ํค์๋]
|
| 205 |
+
- ์ฌ์ง ํค์๋ ์๋ค๋ก ๋น ์ค ์ฝ์
|
| 206 |
+
- ์ฌ์ง ํค์๋๋ ์์ ๋ชฉ์ด๋ ๋ด์ฉ ๊ตฌ์ฑ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ, ๊ธ์ ์์ฐ์ค๋ฌ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ ์ ํ ์์น์๋ง ์ฝ์
|
| 207 |
+
- ๊ธ์ ๋ด์ฉ๊ณผ ๋ง์ง ์๋ ์ฌ์ง ํค์๋๋ ๊ณผ๊ฐํ ์๋ต
|
| 208 |
+
- ์ฌ์ง ํค์๋๊ฐ ์๊ฑฐ๋ ์ฌ์ฉํ์ง ์์๋ ๊ธ์ ํ๋ฆฌํฐ๋ ์์ฑ๋์๋ ์ ํ ์ํฅ ์์
|
| 209 |
+
### 3. ๊ธ์ฐ๊ธฐ ์คํ์ผ
|
| 210 |
+
- ํ ๋ฌธ์ฅ์ 2-3 ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์ค๋ฐ๊ฟํ์ฌ ๊ฐ๋
์ฑ ํฅ์
|
| 211 |
+
- ์์ ๋ชฉ์ ๋ณผ๋์ฒด๋ก ๊ตฌ๋ถํ๊ณ ์ ํ์ ๋น ์ค ์ฝ์
|
| 212 |
+
- ๊ฐ๊ด์ ์ฌ์ค๊ณผ ์ฃผ๊ด์ ๊ฒฝํ์ ๊ท ํ๏ฟฝ๏ฟฝ๏ฟฝ๊ฒ ํผํฉ
|
| 213 |
+
- ํต์ฌ ์ฅ์ ๊ณผ ๋จ์ ์ ์์งํ๊ฒ ํํ
|
| 214 |
+
- ๊ณผ์ฅ๋ ํํ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๋ํ
์ผ๋ก ์ ๋ขฐ๊ฐ ํ์ฑ
|
| 215 |
+
- ๊ฐ ๋ฌธ๋จ ์ฌ์ด์ ์ ์ ํ ๋น ์ค์ ์ฝ์
ํ์ฌ ๊ฐ๋
์ฑ ๋์
|
| 216 |
+
- ๊ธด ๋ฌธ๋จ์ 2-3๊ฐ์ ์์ ๋ฌธ๋จ์ผ๋ก ๋๋์ด ์ฝ๊ธฐ ํธํ๊ฒ ๊ตฌ์ฑ
|
| 217 |
+
### 4. ์ฝํ
์ธ ํ์ง ๊ธฐ์ค
|
| 218 |
+
- ์ค์ ๊ฒฝํํ ๋ฏํ ๋ํ
์ผํ ๋ฌ์ฌ
|
| 219 |
+
- ๋ชจ๋ ๊ฐ๊ฐ(์๊ฐ, ์ฒญ๊ฐ, ๋ฏธ๊ฐ, ํ๊ฐ, ์ด๊ฐ)์ ํ์ฉํ ํํ
|
| 220 |
+
- ๊ฐ๊ฒฉ, ์์
์๊ฐ, ํน๋ณ ํํ ๋ฑ ์ค์ฉ์ ์ ๋ณด ํฌํจ
|
| 221 |
+
- ํน๋ณํ ํ์ด๋ ์๋ฉด ์ ์ฉํ ์ ๋ณด ์ ๊ณต
|
| 222 |
+
- ์ ์ฒด ๊ธธ์ด: ์ต์ 3000์์์ด์
|
| 223 |
+
### 5.์ถ๋ ฅ ํ์ ์๊ตฌ์ฌํญ
|
| 224 |
+
- ์์ ๋ชฉ์ ๋ณผ๋์ฒด๋ก ํ์ํ๊ณ ์ ํ์ ๋น ์ค ์ฝ์
|
| 225 |
+
- ๋ชจ๋ ํ
์คํธ๋ ๊ฐ์ด๋ฐ ์ ๋ ฌ
|
| 226 |
+
- ๋ฌธ์ฅ์ 2-3๊ฐ ๋จ์๋ก ์ค๋ฐ๊ฟํ์ฌ ๊ฐ๋
์ฑ ํ๋ณด
|
| 227 |
+
- ๊ฐ ๋ฌธ๋จ ์ฌ์ด์๋ ๋ฐ๋์ ๋น ์ค ์ฝ์
|
| 228 |
+
- ์ฌ์ง ํค์๋๋ ํ์ํ ์์น์๋ง ๋๊ดํธ๋ก ํ์ํ๊ณ ์ ํ์ ๋น ์ค ์ฝ์
|
| 229 |
+
- ๋ชจ๋ ๋จ๋ฝ์ ์ ์ ํ ๊ธธ์ด๋ก ๊ท ํ์๊ฒ ๊ตฌ์ฑ
|
| 230 |
+
- ํนํ ์ค์ํ ๋ด์ฉ์ด๋ ๊ฐ์กฐํ๊ณ ์ถ์ ๋ถ๋ถ์ ๋ฌธ์ฅ ๋จ์๋ก ์ค๋ฐ๊ฟํ์ฌ ์๊ฐ์ ์ํฉํธ ๊ฐํ
|
| 231 |
+
- ์ฐธ๊ณ ๊ธ์ ๋ด์ฉ์ ํ ๋๋ก ์๋กญ๊ฒ ๊ตฌ์ฑํ๋, ๋ค์์ ๋ฐ๋์ ์ค์ํ๋ผ:
|
| 232 |
+
- ์ฐธ๊ณ ๊ธ์ ์ธ๊ธ๋ ๋๋ค์, ์ด๋ฆ, ํ์ฌ๋ช
, ๋ธ๋๋๋ช
๋ฑ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ๋ง๊ณ ๋ค๋ฅธ ๋ช
์นญ์ผ๋ก ๋ณ๊ฒฝํ๋ผ.
|
| 233 |
+
- ์ฟ ํกํํธ๋์ค, ๊ด๊ณ , ์ ํ ํ์ฐฌ, ์์ ์ ๊ธ์ก์ด๋ ์ฌ์ํ์ ๋ฐ์๋ค๋ ๋ด์ฉ ์ ์ธํ ๊ฒ
|
| 234 |
+
- ์ฐธ๊ณ ๊ธ ์์ฑ์์ ๊ฒฝํ์ด ์๋ ๋์ ์ง์ ๊ฒฝํ์ผ๋ก ์ฌ๊ตฌ์ฑํ ๊ฒ
|
| 235 |
+
"""
|
| 236 |
+
|
| 237 |
+
def get_style_prompt(style):
|
| 238 |
+
prompts = {
|
| 239 |
+
"์น๊ทผํ": """
|
| 240 |
+
# ์น๊ทผํ ๋ธ๋ก๊ทธ ๊ธ์ฐ๊ธฐ ์คํ์ผ ํ๋กํ
|
| 241 |
+
## ํค & ๋ณด์ด์ค
|
| 242 |
+
- ๋
์์ ๋ํํ๋ ๋ฏํ ์น๊ทผํ๊ณ ํธ์ํ ์ดํฌ
|
| 243 |
+
- '~ํด์', '~๋ค์', '~์ธ ๊ฒ ๊ฐ์์' ๋ฑ ๊ตฌ์ด์ฒด ํํ ์ ๊ทน ํ์ฉ
|
| 244 |
+
- ๊ฐ์ ๊ณผ ๋๋์ ์์งํ๊ฒ ํํํ๋ ๊ฐ์ธ์ ์ธ ์ด์กฐ
|
| 245 |
+
- ๊ฐํ์ฌ๋ฅผ ์ ์ ํ ํ์ฉ (์: ์~, ์ ๋ง!, ใ
ใ
)
|
| 246 |
+
- ์ด๋ชจํฐ์ฝ์ ์ฌ์ฉํ์ง๋ง๋ผ
|
| 247 |
+
## ๋ฌธ์ฒด & ๋ฌธ๋ฒ
|
| 248 |
+
- **ํด์์ฒด ์ ์ฉ**: ๋ชจ๋ ๋ฌธ์ฅ์ '~ํฉ๋๋ค'๊ฐ ์๋ '~ํด์'๋ก ์ข
๊ฒฐ
|
| 249 |
+
- ์งง๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์ฅ ๊ตฌ์กฐ๋ก ์ฝ๊ธฐ ์ฝ๊ฒ ๊ตฌ์ฑ
|
| 250 |
+
- ์ง๋ฌธํ ๋ฌธ์ฅ์ผ๋ก ๋
์์ ๊ณต๊ฐ ์ ๋ (์: "์ฌ๋ฌ๋ถ๋ ๊ทธ๋ ์ง ์๋์?")
|
| 251 |
+
- ๊ฐ์ธ์ ๊ฒฝํ์ ์์ฐ์ค๋ฝ๊ฒ ๊ณต์ ํ๋ 1์ธ์นญ ์์
|
| 252 |
+
## ์ดํ & ํํ
|
| 253 |
+
- ์ผ์์ ์ด๊ณ ์ฌ์ด ๋จ์ด ์ ํ (์ ๋ฌธ์ฉ์ด ์ฌ์ฉ ์ ํ์ด์ ์ค๋ช
)
|
| 254 |
+
- ์ง๊ด์ ์ธ ๋น์ ์ ์์๋ก ์ค๋ช
(์: "๋ง์น ๊ตฌ๋ฆ ์๋ฅผ ๊ฑท๋ ๋ฏํ ๋๋์ด์์ด์")
|
| 255 |
+
- ์์ํ ๊ฐ๊ฐ์ ํํ์ผ๋ก ํ์ฅ๊ฐ ์ ๋ฌ
|
| 256 |
+
- ๊ณผ์ฅ๋ ํํ๋ณด๋ค๋ ์์งํ ๋๋ ์ค์ฌ์ ์์
|
| 257 |
+
## ๋
์์์ ๊ด๊ณ
|
| 258 |
+
- ๋
์๋ฅผ '์ฌ๋ฌ๋ถ'์ผ๋ก ์ง์นญํ๋ฉฐ ์น๊ทผ๊ฐ ํ์ฑ
|
| 259 |
+
- ๋
์์ ์
์ฅ์ ๊ณ ๋ คํ ๊ณต๊ฐ๋ ํ์ฑ ํํ ์ฌ์ฉ
|
| 260 |
+
- ๋
์์๊ฒ ์ง์ ๋ง์ ๊ฑฐ๋ ๋ฏํ ๋ํํ ๋ฌธ์ฒด
|
| 261 |
+
- ์ ๋ณด ์ ๋ฌ๊ณผ ํจ๊ป ๊ฐ์ธ์ ์ธ ํ์ด๋ ์กฐ์ธ ์ ๊ณต
|
| 262 |
+
## ์์ ๋ฌธ์ฅ
|
| 263 |
+
"์ฌ๊ธฐ ๋ถ์๊ธฐ๊ฐ ์ ๋ง ์ข๋๋ผ๊ณ ์.
|
| 264 |
+
์์ํ ์กฐ๋ช
๊ณผ ์ฐจ๋ถํ ์์
์ด
|
| 265 |
+
๋ง์์ ํธ์ํ๊ฒ ํด์คฌ์ด์.
|
| 266 |
+
๊ฐ๊ฒฉ์ ์กฐ๊ธ ์๋ ํธ์ด์ง๋ง
|
| 267 |
+
๊ทธ๋งํผ ๊ฐ์น ์๋ ๊ฒฝํ์ด์๋ต๋๋ค.
|
| 268 |
+
๋ค์์ ๋ฐฉ๋ฌธํ์ค ๋๋
|
| 269 |
+
ํ์ผ ์คํ๊ฐ ํ์ ํด์ ์ถ์ฒํด์!"
|
| 270 |
+
""",
|
| 271 |
+
|
| 272 |
+
"์ผ๋ฐ": """
|
| 273 |
+
# ๊ท ํ ์กํ ๋ธ๋ก๊ทธ ๊ธ์ฐ๊ธฐ ์คํ์ผ ํ๋กํ
|
| 274 |
+
## ํค & ๋ณด์ด์ค
|
| 275 |
+
- ๊ฐ๊ด์ ์ ๋ณด์ ์ฃผ๊ด์ ์๊ฒฌ์ด ๊ท ํ์ ์ด๋ฃฌ ์ค๋ฆฝ์ ์ด์กฐ
|
| 276 |
+
- ์ ์คํ๊ณ ์์ ๋ฐ๋ฅธ ์ดํฌ๋ก ์ ๋ขฐ๊ฐ ํ์ฑ
|
| 277 |
+
- ๊ณผ์ฅ๋ ํํ์ด๋ ๊ฐ์ ํํ ์์
|
| 278 |
+
- ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์ฅ์ผ๋ก ํต์ฌ ์ ๋ณด ์ ๋ฌ
|
| 279 |
+
## ๋ฌธ์ฒด & ๋ฌธ๋ฒ
|
| 280 |
+
- 'ํฉ๋๋ค/์ต๋๋ค' ์ข
๊ฒฐ์ด๋ฏธ ์ฌ์ฉ์ผ๋ก ๋จ์ ํ ์ธ์
|
| 281 |
+
- ๋
ผ๋ฆฌ์ ๊ตฌ์กฐ์ ๋ช
ํํ ํ๋ฆ์ ๊ฐ์ง ๋ฌธ์ฅ ๊ตฌ์ฑ
|
| 282 |
+
- ๋ฌธ๋ฒ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ณ ์ ์ ๋ ํํ ์ฌ์ฉ
|
| 283 |
+
- ์ ์ ํ ๊ธธ์ด์ ๋จ๋ฝ์ผ๋ก ๊ฐ๋
์ฑ ํ๋ณด
|
| 284 |
+
## ์ดํ & ํํ
|
| 285 |
+
- ์ผ๋ฐ ๋
์๊ฐ ์ดํดํ ์ ์๋ ์์ค์ ์ดํ ์ ํ
|
| 286 |
+
- ์ ๋ฌธ ์ฉ์ด ์ฌ์ฉ ์ ๊ฐ๋ตํ ์ค๋ช
์ ๊ณต
|
| 287 |
+
- ๊ตฌ์ฒด์ ์ธ ์์น์ ์ฌ์ค ์ค์ฌ์ ์ค๋ช
|
| 288 |
+
- ๋น๊ต์ ๋์กฐ๋ฅผ ํตํ ๋ช
ํํ ์ ๋ณด ์ ๋ฌ
|
| 289 |
+
## ๋
์์์ ๊ด๊ณ
|
| 290 |
+
- ์ ์ ํ ๊ฑฐ๋ฆฌ๊ฐ ์ ์ง๋ก ์ ๋ขฐ์ฑ ํ๋ณด
|
| 291 |
+
- ๋
์๋ฅผ ์ํ ์ ์ฉํ ์ ๋ณด ์ค์ฌ ๊ตฌ์ฑ
|
| 292 |
+
- ์ง์ ์ ์ธ ์ถ์ฒ์ด๋ ์๊ฒฌ ์ ์ ์ ๊ทผ๊ฑฐ ํจ๊ป ์ ๊ณต
|
| 293 |
+
- ๋
์๊ฐ ์ค์ค๋ก ํ๋จํ ์ ์๋ ๊ฐ๊ด์ ์ ๋ณด ์ ๊ณต
|
| 294 |
+
## ์์ ๋ฌธ์ฅ
|
| 295 |
+
"์ด ๋ ์คํ ๋์ 2020๋
์ ์คํํ
|
| 296 |
+
๋ชจ๋ ์ดํ๋ฆฌ์ ๋ค์ด๋์
๋๋ค.
|
| 297 |
+
๋ด๋ถ๋ 50์ ๊ท๋ชจ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ
|
| 298 |
+
ํ๋ผ์ด๋นํ ๊ณต๊ฐ๋ ๋ง๋ จ๋์ด ์์ต๋๋ค.
|
| 299 |
+
๊ฐ๊ฒฉ๋๋ 1์ธ๋น 3๋ง์์์ 5๋ง์ ์ ์ผ๋ก
|
| 300 |
+
๋ค๋ฅธ ์ดํ๋ฆฌ์ ๋ ์คํ ๋๊ณผ ๋น๊ตํ์ ๋
|
| 301 |
+
์ค์์๊ถ์ ์ํฉ๋๋ค.
|
| 302 |
+
ํนํ ์์ฒด ์ ์ํ๋ ํ์คํ ๋ฉด์ด
|
| 303 |
+
์ด ๊ณณ์ ์ฐจ๋ณ์ ์
๋๋ค."
|
| 304 |
+
""",
|
| 305 |
+
|
| 306 |
+
"์ ๋ฌธ์ ์ธ": """
|
| 307 |
+
# ์ ๋ฌธ๊ฐํ ๋ธ๋ก๊ทธ ๊ธ์ฐ๊ธฐ ์คํ์ผ ํ๋กํ
|
| 308 |
+
## ํค & ๋ณด์ด์ค
|
| 309 |
+
- ๊น์ด ์๋ ์ง์๊ณผ ๊ฒฝํ์ด ๋๊ปด์ง๋ ์ ๋ฌธ์ ์ด์กฐ
|
| 310 |
+
- ๊ฐ๊ด์ ์ฌ์ค๊ณผ ๋ถ์์ ๊ด์ ์ด ๋๋ณด์ด๋ ๋
ผ๋ฆฌ์ ์์
|
| 311 |
+
- ๊ถ์ ์๊ณ ์ค๋๋ ฅ ์๋ ์ดํฌ๋ก ์ ๏ฟฝ๏ฟฝ๊ฐ ํ์ฑ
|
| 312 |
+
- ์ ์ ๋ ํํ๊ณผ ์ฒด๊ณ์ ์ธ ๊ตฌ์ฑ์ผ๋ก ์ ๋ฌธ์ฑ ๊ฐ์กฐ
|
| 313 |
+
## ๋ฌธ์ฒด & ๋ฌธ๋ฒ
|
| 314 |
+
- ์ ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์ฅ ๊ตฌ์กฐ
|
| 315 |
+
- ๋ณต์กํ ๊ฐ๋
๋ ๋ช
ํํ ์ ๋ฌํ๋ ๋
ผ๋ฆฌ์ ํ๋ฆ
|
| 316 |
+
- ์ ๋ฌธ ์ฉ์ด์ ์ ์ ํ ํ์ฉ๊ณผ ์ค๋ช
|
| 317 |
+
- ํ์ ์ ๊ธ์ฐ๊ธฐ์ ๊ฐ๊น์ด ์ฒด๊ณ์ ๋ฌธ๋จ ๊ตฌ์ฑ
|
| 318 |
+
## ์ดํ & ํํ
|
| 319 |
+
- ํด๋น ๋ถ์ผ์ ์ ๋ฌธ ์ฉ์ด์ ๊ฐ๋
์ ๊ทน ํ์ฉ
|
| 320 |
+
- ๊ตฌ์ฒด์ ์ธ ์์น์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ค๋ช
|
| 321 |
+
- ๋น๊ต ๋ถ์๊ณผ ํ๊ฐ๋ฅผ ์ํ ์ ๋ฌธ์ ๊ธฐ์ค ์ ์
|
| 322 |
+
- ์ ํํ ์ธ์ฉ๊ณผ ์ฐธ์กฐ๋ฅผ ํตํ ์ ๋ขฐ์ฑ ํ๋ณด
|
| 323 |
+
## ๋
์์์ ๊ด๊ณ
|
| 324 |
+
- ์ ๋ฌธ๊ฐ๋ก์ ์ง์๊ณผ ํต์ฐฐ๋ ฅ ๊ณต์
|
| 325 |
+
- ๊ฐ๊ด์ ํ๊ฐ์ ์ ๋ฌธ์ ์กฐ์ธ ์ ๊ณต
|
| 326 |
+
- ๋
์์ ์ง์ ํธ๊ธฐ์ฌ์ ์๊ทนํ๋ ์ฌ์ธต ๋ถ์
|
| 327 |
+
- ์
๊ณ ํธ๋ ๋๋ ์ ๋ฌธ์ ๊ด์ ์์์ ํ๊ฐ ์ ์
|
| 328 |
+
## ์์ ๋ฌธ์ฅ
|
| 329 |
+
"๋ณธ ๋ ์คํ ๋์ ๋ฏธ์๋ฆฐ ์ถ์ ์
ฐํ๊ฐ
|
| 330 |
+
์ดํ๋ฆฌ์ ํด์ง์ ์ ์๋ฅผ ์ ๋ณด์ด๋ ๊ณต๊ฐ์
๋๋ค.
|
| 331 |
+
ํนํ 72์๊ฐ ์ ์จ ์์ฑํ ๋์ฐ๋ฅผ
|
| 332 |
+
ํ๋์์ 90์ด๊ฐ ๊ตฌ์๋ด๋ ๋ํด๋ฆฌ ๋ฐฉ์์ ํผ์๋
|
| 333 |
+
๊ตญ๋ด ์ต๊ณ ์์ค์ผ๋ก ํ๊ฐ๋ฐ๊ณ ์์ต๋๋ค.
|
| 334 |
+
์์ฌ๋ฃ๋ 100% ์ ๊ธฐ๋ ์ธ์ฆ์ ๋ฐ์
|
| 335 |
+
์ง์ญ ๋๊ฐ์์ ์ง์ก๋๋ฉฐ,
|
| 336 |
+
์์ธ ํ์ด๋ง์ ์ํ ์๋ฏ๋ฆฌ์์ ์ ๋ฌธ์ ์ธ ํ๋ ์ด์
์ด
|
| 337 |
+
์์ฌ ๊ฒฝํ์ ํ์ธต ๋ ํ๋ถํ๊ฒ ํฉ๋๋ค."
|
| 338 |
+
"""
|
| 339 |
+
}
|
| 340 |
+
return prompts.get(style, "ํฌ์คํ
์คํ์ผ ํ๋กฌํํธ")
|
| 341 |
+
|
| 342 |
+
def generate_blog_post(category, style, references1, references2, references3, outline, photo_recommendations):
|
| 343 |
+
try:
|
| 344 |
+
logger.info("1. ๋ฐ์ดํฐ ์ค๋น")
|
| 345 |
+
data = {
|
| 346 |
+
'category': category,
|
| 347 |
+
'style': style,
|
| 348 |
+
'references1': references1,
|
| 349 |
+
'references2': references2,
|
| 350 |
+
'references3': references3,
|
| 351 |
+
'outline': outline,
|
| 352 |
+
'photo_recommendations': photo_recommendations
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
logger.info("2. ํ๋กฌํํธ ์ค๋น")
|
| 356 |
+
system_prompt = get_blog_post_prompt(data['category'])
|
| 357 |
+
style_prompt = get_style_prompt(data['style'])
|
| 358 |
+
|
| 359 |
+
# ์์ ๋ ์ ์ ํ๋กฌํํธ - ๊ฐ ์ค๋น 4~7๋จ์ด ์ง์
|
| 360 |
+
user_prompt = f"""
|
| 361 |
+
**๋ฐ๋์ 3000์ ์ด์ ์์ฑํ๋ผ**
|
| 362 |
+
์ฐธ๊ณ ๊ธ1: {data['references1']}
|
| 363 |
+
์ฐธ๊ณ ๊ธ2: {data['references2']}
|
| 364 |
+
์ฐธ๊ณ ๊ธ3: {data['references3']}
|
| 365 |
+
์์๋ผ์ธ: {data['outline']}
|
| 366 |
+
์ฌ์ง ํค์๋: {data['photo_recommendations']}
|
| 367 |
+
๊ธ ์์ฑ ํ์ ๊ท์น:
|
| 368 |
+
1. ๊ฐ ๋ฌธ์ฅ์ 4~7๋จ์ด ๋จ์๋ก ์ค๋ฐ๊ฟํ์ฌ ์์ฑํ ๊ฒ
|
| 369 |
+
2. ์ฌ์ง ํค์๋๋ [ํค์๋] ํํ๋ก ์๋ค์ ๋น ์ค์ ์ถ๊ฐํ ๊ฒ
|
| 370 |
+
3. ์์ ๋ชฉ์ ๋ณผ๋์ฒด๋ก ํ์ํ๊ณ ์ ํ์ ๋น ์ค ์ฝ์
ํ ๊ฒ
|
| 371 |
+
4. ๋ชจ๋ ํ
์คํธ๋ ๊ฐ์ด๋ฐ ์ ๋ ฌ๋ก ์์ฑํ ๊ฒ
|
| 372 |
+
5. ๋ฌธ๋จ ์ฌ์ด์๋ ๋ฐ๋์ ๋น ์ค์ ๋ฃ์ ๊ฒ
|
| 373 |
+
"""
|
| 374 |
+
|
| 375 |
+
logger.info("3. ๊ธ ์์ฑ ์์")
|
| 376 |
+
full_post = call_api(
|
| 377 |
+
user_prompt,
|
| 378 |
+
system_prompt + "\n" + style_prompt,
|
| 379 |
+
max_tokens=15000,
|
| 380 |
+
temperature=0.7,
|
| 381 |
+
top_p=0.95
|
| 382 |
+
)
|
| 383 |
+
|
| 384 |
+
# API ํธ์ถ ์๋ต ํ์ธ
|
| 385 |
+
if full_post is None or full_post.startswith("Gemini API Error"):
|
| 386 |
+
error_msg = "API ์๋ต ์์" if full_post is None else full_post
|
| 387 |
+
logger.error(f"๋ธ๋ก๊ทธ ๊ธ ์์ฑ API ์ค๋ฅ: {error_msg}")
|
| 388 |
+
return f"<p style='color: red;'>๊ธ ์์ฑ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {error_msg}</p>"
|
| 389 |
+
|
| 390 |
+
logger.info(f"Gemini๊ฐ ์์ฑํ ์๋ณธ ๊ธ ๊ธธ์ด: {len(full_post)}")
|
| 391 |
+
|
| 392 |
+
logger.info("4. ๋ถํ์ํ ๋ฌธ๊ตฌ ์ ๊ฑฐ ๋ฐ ํ
์คํธ ํ์ ์กฐ์ ")
|
| 393 |
+
# ๋ถํ์ํ ๋ฌธ๊ตฌ ์ ๊ฑฐ
|
| 394 |
+
filtered_post = remove_unwanted_phrases(full_post).lstrip()
|
| 395 |
+
|
| 396 |
+
# ํ์ํ ๊ฒฝ์ฐ ๋ฌธ์ฅ์ 4~7๋จ์ด ๋จ์๋ก ์ถ๊ฐ ํฌ๋งทํ
|
| 397 |
+
formatted_post = format_sentences(filtered_post)
|
| 398 |
+
|
| 399 |
+
# ์ฌ์ง ํค์๋ ํจํด ์๋ค๋ก ๋น ์ค ์ถ๊ฐ
|
| 400 |
+
pattern = r'(\[[\w\s๊ฐ-ํฃ]+\])'
|
| 401 |
+
processed_text = re.sub(pattern, r'\n\n\1\n\n', formatted_post)
|
| 402 |
+
# ์ค๋ณต๋ ๋น ์ค ์ ๋ฆฌ
|
| 403 |
+
processed_text = re.sub(r'\n{3,}', '\n\n', processed_text)
|
| 404 |
+
|
| 405 |
+
logger.info("5. HTML ๋ณํ")
|
| 406 |
+
html_post = convert_to_html(processed_text)
|
| 407 |
+
|
| 408 |
+
logger.info("6. ์ต์ข
๊ฒฐ๊ณผ ๋ฐํ")
|
| 409 |
+
return html_post
|
| 410 |
+
except Exception as e:
|
| 411 |
+
logger.error(f"๊ธ ์์ฑ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
| 412 |
+
return f"<p style='color: red;'>๊ธ ์์ฑ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}</p>"
|
| 413 |
+
|
| 414 |
+
def convert_to_html(text):
|
| 415 |
+
if text is None:
|
| 416 |
+
return "<p>ํ
์คํธ ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.</p>"
|
| 417 |
+
|
| 418 |
+
lines = text.split('\n')
|
| 419 |
+
html_lines = []
|
| 420 |
+
in_paragraph = False
|
| 421 |
+
|
| 422 |
+
for i, line in enumerate(lines):
|
| 423 |
+
line = line.strip()
|
| 424 |
+
|
| 425 |
+
# ๋น ์ค ์ฒ๋ฆฌ
|
| 426 |
+
if not line:
|
| 427 |
+
if in_paragraph:
|
| 428 |
+
html_lines.append("</p>")
|
| 429 |
+
in_paragraph = False
|
| 430 |
+
html_lines.append("<br>")
|
| 431 |
+
continue
|
| 432 |
+
|
| 433 |
+
# ์ฌ์ง ํค์๋ ์ฒ๋ฆฌ (๋๊ดํธ๋ก ๋ ํ
์คํธ)
|
| 434 |
+
if re.match(r'^\[[\w\s๊ฐ-ํฃ]+\]$', line):
|
| 435 |
+
if in_paragraph:
|
| 436 |
+
html_lines.append("</p>")
|
| 437 |
+
in_paragraph = False
|
| 438 |
+
|
| 439 |
+
html_lines.append("<br>")
|
| 440 |
+
html_lines.append(f"<p style='text-align: center; font-weight: bold; color: #0066cc; margin: 15px 0; font-size: 1.1em;'>{line}</p>")
|
| 441 |
+
html_lines.append("<br>")
|
| 442 |
+
continue
|
| 443 |
+
|
| 444 |
+
# ํค๋ ์ฒ๋ฆฌ
|
| 445 |
+
if line.startswith('####'):
|
| 446 |
+
if in_paragraph:
|
| 447 |
+
html_lines.append("</p>")
|
| 448 |
+
in_paragraph = False
|
| 449 |
+
|
| 450 |
+
html_lines.append(f"<h4 style='text-align: center; margin: 20px 0;'>{line[4:].strip()}</h4>")
|
| 451 |
+
elif line.startswith('###'):
|
| 452 |
+
if in_paragraph:
|
| 453 |
+
html_lines.append("</p>")
|
| 454 |
+
in_paragraph = False
|
| 455 |
+
|
| 456 |
+
html_lines.append(f"<h3 style='text-align: center; margin: 20px 0;'>{line[3:].strip()}</h3>")
|
| 457 |
+
elif line.startswith('##'):
|
| 458 |
+
if in_paragraph:
|
| 459 |
+
html_lines.append("</p>")
|
| 460 |
+
in_paragraph = False
|
| 461 |
+
|
| 462 |
+
html_lines.append(f"<h2 style='text-align: center; margin: 25px 0; color: #2c3e50;'>{line[2:].strip()}</h2>")
|
| 463 |
+
elif line.startswith('#'):
|
| 464 |
+
if in_paragraph:
|
| 465 |
+
html_lines.append("</p>")
|
| 466 |
+
in_paragraph = False
|
| 467 |
+
|
| 468 |
+
html_lines.append(f"<h1 style='text-align: center; margin: 30px 0; color: #2c3e50;'>{line[1:].strip()}</h1>")
|
| 469 |
+
# ๋ฆฌ์คํธ ์์ดํ
์ฒ๋ฆฌ
|
| 470 |
+
elif line.startswith('- '):
|
| 471 |
+
if in_paragraph:
|
| 472 |
+
html_lines.append("</p>")
|
| 473 |
+
in_paragraph = False
|
| 474 |
+
|
| 475 |
+
html_lines.append(f"<li style='text-align: center; list-style: none; margin: 5px 0;'>{line[2:]}</li>")
|
| 476 |
+
# ์ผ๋ฐ ํ
์คํธ ์ฒ๋ฆฌ - ๋จ๋ฝ ํ์ ์ ์ง
|
| 477 |
+
else:
|
| 478 |
+
# ๋ณผ๋์ฒด ์ฒ๋ฆฌ
|
| 479 |
+
line = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', line)
|
| 480 |
+
|
| 481 |
+
# ์์ ๋ชฉ ์ฒ๋ฆฌ (๋ณผ๋์ฒด๋ก ์์ํ๋ ๊ฒฝ์ฐ)
|
| 482 |
+
if line.startswith('<strong>') and line.endswith('</strong>'):
|
| 483 |
+
if in_paragraph:
|
| 484 |
+
html_lines.append("</p>")
|
| 485 |
+
in_paragraph = False
|
| 486 |
+
|
| 487 |
+
html_lines.append(f"<h3 style='text-align: center; margin: 20px 0; color: #34495e;'>{line}</h3>")
|
| 488 |
+
else:
|
| 489 |
+
# ์ผ๋ฐ ํ
์คํธ๋ ๋จ๋ฝ์ผ๋ก ์ฒ๋ฆฌ
|
| 490 |
+
if not in_paragraph:
|
| 491 |
+
html_lines.append("<p style='text-align: center; margin: 8px 0; line-height: 1.8;'>")
|
| 492 |
+
in_paragraph = True
|
| 493 |
+
|
| 494 |
+
html_lines.append(f"{line}<br>")
|
| 495 |
+
|
| 496 |
+
# ๋ง์ง๋ง ๋จ๋ฝ ๋ซ๊ธฐ
|
| 497 |
+
if in_paragraph:
|
| 498 |
+
html_lines.append("</p>")
|
| 499 |
+
|
| 500 |
+
html_content = f"""
|
| 501 |
+
<div style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto; padding: 20px;">
|
| 502 |
+
{"".join(html_lines)}
|
| 503 |
+
</div>
|
| 504 |
+
"""
|
| 505 |
+
return html_content
|
| 506 |
+
|
| 507 |
+
# API ํจ์๋ค
|
| 508 |
+
def generate_outline_5(category, style, ref1, ref2, ref3, photo_recommendations):
|
| 509 |
+
return generate_outline(category, style, ref1, ref2, ref3, photo_recommendations)
|
| 510 |
+
|
| 511 |
+
def generate_blog_post_5(category, style, ref1, ref2, ref3, outline, photo_recommendations):
|
| 512 |
+
return generate_blog_post(category, style, ref1, ref2, ref3, outline, photo_recommendations)
|