ssboost commited on
Commit
2070c47
ยท
verified ยท
1 Parent(s): 7c34f04

Create visit_review_blog.py

Browse files
Files changed (1) hide show
  1. 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)