AIRider's picture
Upload 2 files
1a4221b verified
raw
history blame
36.3 kB
import gradio as gr
import random
import os
import re
from huggingface_hub import InferenceClient
from youtube_transcript_api import YouTubeTranscriptApi, NoTranscriptFound
from fpdf import FPDF
from fpdf.enums import XPos, YPos
from datetime import datetime
# ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ ํ•จ์ˆ˜
def create_client(model_name):
return InferenceClient(model_name, token=os.getenv("HF_TOKEN"))
client = create_client("CohereForAI/c4ai-command-r-plus")
# API ํ˜ธ์ถœ ํ•จ์ˆ˜
def call_api(content, system_message, max_tokens, temperature, top_p):
messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}]
random_seed = random.randint(0, 1000000)
response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed)
return response.choices[0].message.content
# ์ •๋ณด ๋ถ„์„ ํ•จ์ˆ˜
def analyze_info(category, style, transcripts):
transcript_list = transcripts.split("\n\n---\n\n")
analyzed_content = f"์„ ํƒํ•œ ์นดํ…Œ๊ณ ๋ฆฌ: {category}\n์„ ํƒํ•œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}\n\n"
for i, transcript in enumerate(transcript_list, 1):
analyzed_content += f"์œ ํŠœ๋ธŒ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ {i}:\n{transcript}\n\n"
return analyzed_content
# ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ƒ์„ฑ ํ•จ์ˆ˜
def generate_blog_post(category, style, transcripts, category_prompt, style_prompt, max_tokens, temperature, top_p):
full_content = analyze_info(category, style, transcripts)
combined_prompt = f"{category_prompt}\n\n{style_prompt}\n\n{full_content}"
modified_text = call_api(combined_prompt, "", max_tokens, temperature, top_p)
return modified_text.replace('\n', '\n\n')
# ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ ์š”์•ฝ ํ•จ์ˆ˜
def summarize_transcript(transcripts, system_message, max_tokens, temperature, top_p):
summary = call_api(transcripts, system_message, max_tokens, temperature, top_p)
return summary
# ์œ ํŠœ๋ธŒ ๋น„๋””์˜ค ID ์ถ”์ถœ ํ•จ์ˆ˜
def get_video_id(youtube_url):
video_id_match = re.search(r"(?<=v=)[^#&?]*", youtube_url) or re.search(r"(?<=youtu.be/)[^#&?]*", youtube_url)
return video_id_match.group(0) if video_id_match else None
# ์œ ํŠœ๋ธŒ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ ์ถ”์ถœ ํ•จ์ˆ˜
def get_transcript(youtube_url):
video_id = get_video_id(youtube_url)
if not video_id:
return "Invalid YouTube URL. Please enter a valid URL."
language_order = ['ko', 'en', 'ja', 'zh-Hans', 'pt', 'es', 'it', 'fr', 'de', 'ru']
for lang in language_order:
try:
transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=[lang])
return f"Transcript in {lang}:\n\n{' '.join([entry['text'] for entry in transcript])}"
except NoTranscriptFound:
continue
except Exception as e:
return f"Error: {str(e)}"
return "No transcript available in the specified languages."
# ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ”„๋กฌํ”„ํŠธ ํ•จ์ˆ˜
def get_blog_post_prompt(category):
if category == "์ผ๋ฐ˜ํ˜•":
return """
#์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™(์ผ๋ฐ˜ํ˜•_v4)
##[๊ธฐ๋ณธ ๊ทœ์น™]
1.ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•˜๋˜, ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ํ‘œํ˜„ ์‚ฌ์šฉ
2.์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ผ๊ด€๋œ ๋ธ”๋กœ๊ทธ ๊ธ€๋กœ ์žฌ๊ตฌ์„ฑ
3. ๊ฐ ์„น์…˜์€ ์ตœ์†Œ 400์ž ์ด์ƒ ์ž‘์„ฑํ•˜๊ณ  ์ตœ์ข… ๊ธ€์˜ ๊ธธ์ด๋Š” 3000์ž ์ด์ƒ์œผ๋กœ ์ž‘์„ฑ
4. ์ถ”์ฒœ ์ œ๋ชฉ 3๊ฐ€์ง€, ๋„์ž…๋ถ€, ๋ณธ๋ก (์†Œ์ฃผ์ œ ํฌํ•จ), ๊ฒฐ๋ก ์˜ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•  ๊ฒƒ(๋‹ค๋ฅธ ๊ตฌ์กฐ ์ถœ๋ ฅ๊ธˆ์ง€)
5. ์ฃผ์ œ์— ๋งž๋Š” ๋…์ฐฝ์ ์ธ ๊ฐ€์ƒ ํ•„์ž ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•  ๊ฒƒ(ํ•„๋ช… ๋ณ„๋„ ์ถœ๋ ฅ ๊ธˆ์ง€)
6. ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์— ๋งž๊ฒŒ ๋งํˆฌ, ์–ดํˆฌ, ์–ดํœ˜๋ฅผ ์กฐ์ •ํ•  ๊ฒƒ
##[ํฌ์ŠคํŒ… ๊ตฌ์กฐ]
###[์ถ”์ฒœ ์ œ๋ชฉ]
1. ํ†ตํ•ฉ๋œ ์ฃผ์ œ๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ๋…์ž์˜ ํฅ๋ฏธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ œ๋ชฉ 3๊ฐ€์ง€ ์ œ์‹œ
###[๋„์ž…๋ถ€]
1. ์—ฌ๋Ÿฌ ์˜์ƒ์˜ ๊ณตํ†ต ์ฃผ์ œ๋‚˜ ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๊ฐœ
2. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ์š”์†Œ(์งˆ๋ฌธ, ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค, ํ†ต๊ณ„, ๊ณต๊ฐ๋Œ€ ํ˜•์„ฑ ๋“ฑ)๋กœ ์‹œ์ž‘
3. ๊ธ€์—์„œ ๋‹ค๋ฃฐ ์ฃผ์š” ๋‚ด์šฉ์„ ๊ฐ„๋žตํžˆ ์†Œ๊ฐœ
###[๋ณธ๋ก ]
1. ์ฃผ์ œ๋ณ„ ํ†ตํ•ฉ ๋ถ„์„
- ๊ณตํ†ต ์ฃผ์ œ๋‚˜ ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ค‘์‹ฌ์œผ๋กœ ์„น์…˜ ๊ตฌ์„ฑ
- ๊ฐ ์˜์ƒ์˜ ๊ด€์ ์ด๋‚˜ ์ •๋ณด๋ฅผ ๋น„๊ต/๋Œ€์กฐํ•˜๋ฉฐ ์ข…ํ•ฉ
- ์„น์…˜ ๊ฐ„ ์ž์—ฐ์Šค๋Ÿฌ์šด ์—ฐ๊ฒฐ๊ณผ ํ๋ฆ„ ์œ ์ง€
2. ๋…ํŠนํ•œ ์ธ์‚ฌ์ดํŠธ ๊ฐ•์กฐ
- ๊ฐ ์˜์ƒ์—์„œ ์ œ์‹œ๋œ ๊ณ ์œ ํ•œ ๊ด€์ ์ด๋‚˜ ์ •๋ณด ๊ฐ•์กฐ
- ํ•„์š”์‹œ ๋ฐฐ๊ฒฝ ์ •๋ณด, ์˜ˆ์‹œ, ๊ด€๋ จ ํ†ต๊ณ„ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‚ด์šฉ ๋ณด๊ฐ•
3. ๋ฐ์ดํ„ฐ ๋ฐ ์˜ˆ์‹œ ํ†ตํ•ฉ
- ์—ฌ๋Ÿฌ ๋Œ€๋ณธ์—์„œ ์ œ์‹œ๋œ ๋ฐ์ดํ„ฐ๋‚˜ ์˜ˆ์‹œ๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ ์ œ์‹œ
- ๋…์ž๊ฐ€ ๊ณต๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‚˜ ์‚ฌ๋ก€ ํฌํ•จ
4. ์‹œ๊ฐ„์  ํ๋ฆ„ ๋˜๋Š” ๋ฐœ์ „ ๊ณผ์ • ๋ฐ˜์˜
- ์ฃผ์ œ์— ๊ด€ํ•œ ์‹œ๊ฐ„์  ๋ณ€ํ™”๋‚˜ ๋ฐœ์ „ ๊ณผ์ •์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์„ค๋ช…
###[๊ฒฐ๋ก ]
1. ํ†ตํ•ฉ๋œ ๋‚ด์šฉ์˜ ํ•ต์‹ฌ ํฌ์ธํŠธ ์š”์•ฝ
2. ๋…์ž์—๊ฒŒ ๊ด€๋ จ ํ–‰๋™์ด๋‚˜ ์ƒ๊ฐ์˜ ๋ณ€ํ™” ์œ ๋„
3. ์ถ”๊ฐ€ ํƒ๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ์ฃผ์ œ๋‚˜ ํ–ฅํ›„ ์ „๋ง ์ œ์‹œ
##[์ตœ์ ํ™” ์ „๋žต]
1. SEO ์ตœ์ ํ™”
- ํ†ตํ•ฉ๋œ ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ์ฃผ์š” ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๋ชฉ, ์†Œ์ œ๋ชฉ, ๋ณธ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จ
- ๊ฒ€์ƒ‰ ์˜๋„์— ๋ถ€ํ•ฉํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋‚ด์šฉ ๊ตฌ์„ฑ
2. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋ฌธ์žฅ ์‚ฌ์šฉ
- ์ ์ ˆํ•œ ๋‹จ๋ฝ ๊ตฌ๋ถ„๊ณผ ์—ฌ๋ฐฑ ํ™œ์šฉ
3. ๋…์ž ์ฐธ์—ฌ ์œ ๋„
- ๋…์ž์˜ ๊ฒฝํ—˜์ด๋‚˜ ์˜๊ฒฌ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ๊ด€๋ จ ์ •๋ณด๋‚˜ ์ถ”๊ฐ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
##[๊ต์ • ๋ฐ ํŽธ์ง‘]
1. ๋งž์ถค๋ฒ•, ๋ฌธ๋ฒ•, ์–ดํœ˜ ์‚ฌ์šฉ์˜ ์ •ํ™•์„ฑ ํ™•์ธ
2. ๋ฌธ์ฒด์™€ ํ†ค์˜ ์ผ๊ด€์„ฑ ์œ ์ง€
3. ์ „์ฒด ๊ธ€์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„๊ณผ ๊ตฌ์กฐ ์ ๊ฒ€
4. 'ํ•„์ž'๋ผ๋Š” ํ‘œํ˜„ ์ œ์™ธ
5. ์œ ํŠœ๋ธŒ ๊ด€๋ จ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๋ธ”๋กœ๊ทธ ํ˜•์‹์— ๋งž๊ฒŒ ์กฐ์ •
6. ์œ ํŠœ๋ธŒ ํŠน์ • ์šฉ์–ด(์˜ˆ: '๊ตฌ๋…', '์ข‹์•„์š”', '์•Œ๋ฆผ', '๋‹ค์Œ ์˜์ƒ' ๋“ฑ) ์‚ฌ์šฉ ๊ธˆ์ง€
7. '์œ ํŠœ๋ฒ„', 'YouTuber' ๋“ฑ์˜ ํ‘œํ˜„์„ '์ œ์ž‘์ž' ๋˜๋Š” '์ง„ํ–‰์ž' ๊ฐ™์€ ๋‹ค๋ฅธ ํ‘œํ˜„์œผ๋กœ ๋Œ€์ฒด
8. ์ฑ„๋„๋ช…, ์ œ์ž‘์ž ์‹ค๋ช… ๋“ฑ ๊ฐœ์ธ ์ •๋ณด ์ œ์™ธ
##[์ฃผ์˜์‚ฌํ•ญ]
1. ๋Œ€๋ณธ์˜ ์ง์ ‘์ ์ธ ์ธ์šฉ ๊ธˆ์ง€, ๋‚ด์šฉ์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์ž‘์„ฑ
2. ์ƒ์ถฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ณต์ •ํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ณ  ๊ฐ€๋Šฅํ•œ ์„ค๋ช… ์ œ์‹œ
"""
elif category == "์ •๋ณด์„ฑ":
return """
#์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™(์ •๋ณด์„ฑ_v4)
##[๊ธฐ๋ณธ ์›์น™]
1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ
2. ์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€๋กœ ์žฌ๊ตฌ์„ฑํ•˜๋ผ
3. ์ตœ์ข… ๊ธ€์˜ ๊ธธ์ด๋Š” 3000-4000์ž ์‚ฌ์ด๋กœ ์ž‘์„ฑ
4. ์ถ”์ฒœ์ œ๋ชฉ3๊ฐ€์ง€, ๋„์ž…๋ถ€, ๋ณธ๋ก , ๊ฒฐ๋ก ์˜ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ
5. ๊ฐ๊ด€์ ์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ†ค์œผ๋กœ ์ž‘์„ฑ
6. ์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํฌ๊ด„์ ์ด๊ณ  ๋…์ฐฝ์ ์ธ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ž‘์„ฑ
##[ํฌ์ŠคํŒ… ๊ตฌ์กฐ]
###[์ถ”์ฒœ์ œ๋ชฉ]
1. ์ฃผ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋‚ด๊ณ  ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋Š” ์ œ๋ชฉ 3๊ฐ€์ง€๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์ถœ๋ ฅํ•˜๋ผ
2. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ผ(์˜ˆ: "์•Œ์•„๋‘๋ฉด ์œ ์šฉํ•œ ~", "์ „๋ฌธ๊ฐ€๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ~")
##[๋„์ž…๋ถ€]
1. ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ๊ณผ ์ผ์ƒ์ƒํ™œ์—์„œ์˜ ๊ด€๋ จ์„ฑ ์„ค๋ช…
2. ๋‹ค๋ฃฐ ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋žตํžˆ ์†Œ๊ฐœ
3. ๋…์ž๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ์ •๋ณด๋‚˜ ์ด์  ์ œ์‹œ
4. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ์š”์†Œ(์งˆ๋ฌธ, ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค, ํ†ต๊ณ„, ๊ณต๊ฐ๋Œ€ ํ˜•์„ฑ ๋“ฑ)๋กœ ์‹œ์ž‘
###[๋ณธ๋ก ]
1. ์ฃผ์ œ์— ๋”ฐ๋ผ 4~6๊ฐœ์˜ ์ฃผ์š” ์„น์…˜์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋ผ.
2. ์ž‘์„ฑ๋œ ๊ธ€์ด 2500์ž ์ด์ƒ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ
3. ๊ฐ ์„น์…˜์€ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•˜๋ผ
4. ์ •๋ณด์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ๋‚ด์šฉ์˜ ๊นŠ์ด์™€ ์ˆœ์„œ ์กฐ์ •ํ•˜๋ผ
5. ๊ฐ ์„น์…˜์€ ์ฃผ์ œ์˜ ํ•ต์‹ฌ ์ธก๋ฉด์„ ๋‹ค๋ฃจ๋„๋กํ•œ๋‹ค.
###[๊ฒฐ๋ก ]
1. ์ฃผ์š” ํฌ์ธํŠธ ์š”์•ฝ
2. ๋…์ž์—๊ฒŒ ์‹ค์šฉ์ ์ธ ์กฐ์–ธ์ด๋‚˜ ํ–‰๋™ ์ง€์นจ ์ œ๊ณต
3. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ ๋„ํ•˜๋Š” ์งˆ๋ฌธ์ด๋‚˜ call-to-action ํฌํ•จ
4. ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ํ–ฅํ›„ ์ „๋ง์ด๋‚˜ ์ถ”์„ธ ๊ฐ„๋‹จํžˆ ์–ธ๊ธ‰
##[์ตœ์ ํ™” ์ „๋žต]
###[SEO ์ตœ์ ํ™”]
1. ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ํ‚ค์›Œ๋“œ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จ (ํ‚ค์›Œ๋“œ ๋ฐ€๋„ 2-3% ์œ ์ง€)
2. ๊ฒ€์ƒ‰ ์˜๋„์— ๋ถ€ํ•ฉํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋‚ด์šฉ ๊ตฌ์„ฑ
###[๊ฐ€๋…์„ฑ ํ–ฅ์ƒ]
1. ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ๊ณผ ๋‹จ๋ฝ ๊ตฌ๋ถ„ ์‚ฌ์šฉ
2. ํ•„์š”์‹œ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋‚˜ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ ์‚ฌ์šฉ
##[์ฃผ์˜์‚ฌํ•ญ]
1. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์ค‘ ํ•˜๋‚˜์— ์น˜์šฐ์นœ ๋‚ด์šฉ ๊ธˆ์ง€, ๊ฐ๊ด€์ ์ด๊ณ  ๊ณต์ •ํ•œ ์ •๋ณด ์ œ๊ณต
2. ์ตœ์‹  ์ •๋ณด ์‚ฌ์šฉ, ์ž‘์„ฑ ์‹œ์  ๋ช…์‹œ
3. ๋ณต์žกํ•œ ์ „๋ฌธ ์šฉ์–ด๋‚˜ ๊ฐœ๋…์€ ์ผ๋ฐ˜ ๋…์ž๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ฒŒ ์„ค๋ช…
4. ์œ ํŠœ๋ธŒ ๊ด€๋ จ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๋ธ”๋กœ๊ทธ ํ˜•์‹์— ๋งž๊ฒŒ ์กฐ์ •
5. ์œ ํŠœ๋ธŒ ํŠน์ • ์šฉ์–ด(์˜ˆ: '๊ตฌ๋…', '์ข‹์•„์š”', '์•Œ๋ฆผ', '๋‹ค์Œ ์˜์ƒ' ๋“ฑ) ์‚ฌ์šฉ ๊ธˆ์ง€
6. '์œ ํŠœ๋ฒ„', 'YouTuber' ๋“ฑ์˜ ํ‘œํ˜„์„ '์ œ์ž‘์ž' ๋˜๋Š” '์ง„ํ–‰์ž' ๊ฐ™์€ ๋‹ค๋ฅธ ํ‘œํ˜„์œผ๋กœ ๋Œ€์ฒด
7. ์ฑ„๋„๋ช…, ์ œ์ž‘์ž ์‹ค๋ช… ๋“ฑ ๊ฐœ์ธ ์ •๋ณด ์ œ์™ธ
"""
elif category == "1๊ฐœ ์ƒํ’ˆ ์ถ”์ฒœํ˜•":
return """
#์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™(์ถ”์ฒœํ˜•_v4)
##[๊ธฐ๋ณธ ๊ทœ์น™]
1. ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•˜๋˜, ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ํ‘œํ˜„ ์‚ฌ์šฉ
2. ์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ƒํ’ˆ์— ์ง‘์ค‘๋œ ์ถ”์ฒœ ๋ธ”๋กœ๊ทธ ๊ธ€๋กœ ์žฌ๊ตฌ์„ฑ
3. ์ตœ์ข… ๊ธ€์˜ ๊ธธ์ด๋Š” 3000์ž ์ด์ƒ์œผ๋กœ ์ž‘์„ฑ
4. ์ถ”์ฒœ ์ œ๋ชฉ, ๋„์ž…๋ถ€, ๋ณธ๋ก , ๊ฒฐ๋ก ์˜ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ
5. ์ฃผ์ œ์— ๋งž๋Š” ๋…์ฐฝ์ ์ธ ๊ฐ€์ƒ ํ•„์ž ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ
6. ์ „๋ฌธ์„ฑ๊ณผ ๊ฐ๊ด€์„ฑ์„ ๊ฐ–์ถ˜ ํ†ค์œผ๋กœ ์ž‘์„ฑ
##[ํฌ์ŠคํŒ… ๊ตฌ์กฐ]
###[์ถ”์ฒœ ์ œ๋ชฉ]
1. ์ œํ’ˆ์˜ ํ•ต์‹ฌ ์žฅ์ ์ด๋‚˜ ํŠน์ง•์„ ๊ฐ•์กฐํ•˜๋Š” ์ œ๋ชฉ
2. ๋…์ž์˜ ํ˜ธ๊ธฐ์‹ฌ์„ ์ž๊ทนํ•˜๋Š” ์งˆ๋ฌธํ˜• ์ œ๋ชฉ
3. ์ œํ’ˆ์˜ ํ˜์‹ ์„ฑ์ด๋‚˜ ์ฐจ๋ณ„์ ์„ ๋ถ€๊ฐ์‹œํ‚ค๋Š” ์ œ๋ชฉ
4. ์ถ”์ฒœ์ œ๋ชฉ 3๊ฐ€์ง€๋งŒ ์ถœ๋ ฅํ•˜๋ผ(๋‹ค๋ฅธ๊ตฌ์กฐ, ์„ค๋ช… ์ถœ๋ ฅ๊ธˆ์ง€)
###[๋„์ž…๋ถ€]
1. ์ œํ’ˆ์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ์‹œ์žฅ์—์„œ์˜ ์œ„์น˜ ์†Œ๊ฐœ
2. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ์š”์†Œ(๋ฌธ์ œ ์ œ๊ธฐ, ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค ๋“ฑ) ํฌํ•จ
3. ๋ฆฌ๋ทฐ์˜ ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋žตํžˆ ์˜ˆ๊ณ 
###[๋ณธ๋ก ]
- ๋‹ค์Œ ์š”์†Œ๋“ค์„ ์ฃผ์ œ์— ๋งž๊ฒŒ ์„ ํƒ์ ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ๋งž๋Š” ์ฃผ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ์ ํ•ฉํ•œ ์ฃผ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ
- ๋‹จ, ์ถฉ๋ถ„ํ•œ ์–‘(3000-4000์ž)์˜ ๊ธ€์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก ์„น์…˜์„ ์„ค์ •ํ•˜๋ผ.
- ๊ฐ ์„น์…˜์€ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ •๋ณด์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ๋‚ด์šฉ์˜ ๊นŠ์ด์™€ ์ˆœ์„œ, ์†Œ์ œ๋ชฉ ์กฐ์ •ํ•˜๋ผ
1. ์ œํ’ˆ ๊ฐœ์š”
- ๊ธฐ๋ณธ ์ŠคํŽ™ ๋ฐ ์ฃผ์š” ๊ธฐ๋Šฅ ์„ค๋ช…
- ๊ฒฝ์Ÿ ์ œํ’ˆ๊ณผ์˜ ์ฐจ๋ณ„์  ๊ฐ•์กฐ
2. ๋””์ž์ธ ๋ฐ build quality
- ์™ธ๊ด€ ๋””์ž์ธ ๋ฐ ๋งˆ๊ฐ ํ’ˆ์งˆ ํ‰๊ฐ€
- ๋ฌด๊ฒŒ, ํฌ๊ธฐ ๋“ฑ ํœด๋Œ€์„ฑ ๊ด€๋ จ ์ •๋ณด
3. ์„ฑ๋Šฅ ๋ถ„์„
- ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ƒ์„ธ ์„ค๋ช… (ํ•„์š”์‹œ ๊ทธ๋ž˜ํ”„๋‚˜ ํ‘œ ํ™œ์šฉ)
- ์‹ค์ œ ์‚ฌ์šฉ ๊ฒฝํ—˜ ๊ธฐ๋ฐ˜์˜ ์„ฑ๋Šฅ ํ‰๊ฐ€
- ๋ฐœ์—ด ๋ฐ ์†Œ์Œ ๊ด€๋ จ ์ •๋ณด
4. ๋ฐฐํ„ฐ๋ฆฌ ์„ฑ๋Šฅ
- ๋ฐฐํ„ฐ๋ฆฌ ์ง€์† ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
- ์ถฉ์ „ ์†๋„ ๋ฐ ๋ฐฐํ„ฐ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์„ค๋ช…
5. ํŠน์ˆ˜ ๊ธฐ๋Šฅ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด
- AI ๊ธฐ๋Šฅ ๋“ฑ ์ œํ’ˆ๋งŒ์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ ์ƒ์„ธ ์„ค๋ช…
- ์ œ์กฐ์‚ฌ ์ „์šฉ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์œ ์šฉ์„ฑ ํ‰๊ฐ€
6. ์‚ฌ์šฉ ๊ฒฝํ—˜
- ํ‚ค๋ณด๋“œ, ํŠธ๋ž™ํŒจ๋“œ, ๋””์Šคํ”Œ๋ ˆ์ด ๋“ฑ ์‚ฌ์šฉ๊ฐ ํ‰๊ฐ€
- ์ผ์ƒ์ ์ธ ์ž‘์—… ๋ฐ ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ์—์„œ์˜ ์‚ฌ์šฉ ๊ฒฝํ—˜ ๊ณต์œ 
7. ํ˜ธํ™˜์„ฑ ๋ฐ ํ™•์žฅ์„ฑ
- ์†Œํ”„ํŠธ์›จ์–ด ํ˜ธํ™˜์„ฑ ์ด์Šˆ ์„ค๋ช…
- ํฌํŠธ ๋ฐ ์—ฐ๊ฒฐ์„ฑ ๊ด€๋ จ ์ •๋ณด
8. ๊ฐ€๊ฒฉ ๋ฐ ๊ฒฝ์Ÿ๋ ฅ
- ๊ฐ€๊ฒฉ๋Œ€ ๋น„ ์„ฑ๋Šฅ ํ‰๊ฐ€
- ์œ ์‚ฌ ์ œํ’ˆ๊ณผ์˜ ๋น„๊ต ๋ถ„์„
###[๊ฒฐ๋ก ]
1. ์ œํ’ˆ์˜ ํ•ต์‹ฌ ์žฅ๋‹จ์  ์š”์•ฝ
2. ์ ํ•ฉํ•œ ์‚ฌ์šฉ์ž ์œ ํ˜• ์ œ์‹œ
3. ์ตœ์ข… ์ถ”์ฒœ ์˜๊ฒฌ ๋ฐ ๊ตฌ๋งค ์กฐ์–ธ
##[์ตœ์ ํ™” ์ „๋žต]
1. SEO ์ตœ์ ํ™”
- ์ œํ’ˆ๋ช…, ์ฃผ์š” ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ ๊ด€๋ จ ํ‚ค์›Œ๋“œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จ
- ๊ฒ€์ƒ‰ ์˜๋„์— ๋ถ€ํ•ฉํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋‚ด์šฉ ๊ตฌ์„ฑ
2. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ์œผ๋กœ ์ •๋ณด ๊ตฌ๋ถ„
- ์ค‘์š” ์ •๋ณด๋Š” ๊ตต์€ ๊ธ€์”จ๋‚˜ ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
- ํ•„์š”์‹œ ํ‘œ๋‚˜ ์ฐจํŠธ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ์‹œ๊ฐํ™”
3. ๋…์ž ์ฐธ์—ฌ ์œ ๋„
- ์ œํ’ˆ ์‚ฌ์šฉ ๊ฒฝํ—˜์ด๋‚˜ ์˜๊ฒฌ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ์ถ”๊ฐ€ ์ •๋ณด๋‚˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
##[์ฃผ์˜์‚ฌํ•ญ]
1. ๊ฐ๊ด€์ ์ด๊ณ  ๊ณต์ •ํ•œ ๋ฆฌ๋ทฐ ์ œ๊ณต, ๊ณผ๋„ํ•œ ํ™๋ณด์„ฑ ํ‘œํ˜„ ์ž์ œ
2. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋ฐ ์กฐ๊ฑด์„ ๋ช…ํ™•ํžˆ ๋ช…์‹œ
3. ๊ฐ€๊ฒฉ ์ •๋ณด ๋“ฑ์€ ์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€์ž„์„ ๋ช…์‹œ
4. ์œ ํŠœ๋ธŒ ๊ด€๋ จ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๋ธ”๋กœ๊ทธ ํ˜•์‹์— ๋งž๊ฒŒ ์กฐ์ •
5. ์ „๋ฌธ ์šฉ์–ด๋‚˜ ๊ธฐ์ˆ ์  ํŠน์ง• ์„ค๋ช… ์‹œ ์ผ๋ฐ˜ ๋…์ž๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…
6. ์ œํ’ˆ์˜ ํ•œ๊ณ„์ ์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋„ ๊ท ํ˜•์žˆ๊ฒŒ ๋‹ค๋ฃธ
"""
elif category == "ํ๋ ˆ์ด์…˜ํ˜•":
return """
#์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™(ํ๋ ˆ์ด์…˜ํ˜•_v3)
##[๊ธฐ๋ณธ ๊ทœ์น™]
1. ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•˜๋˜, ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ํ‘œํ˜„ ์‚ฌ์šฉํ•˜๋ผ
2. ์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ๋Œ€๋ณธ์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ƒํ’ˆ ์ถ”์ฒœ ๋ธ”๋กœ๊ทธ ๊ธ€๋กœ ์žฌ๊ตฌ์„ฑ
3. ๋ฐ˜๋“œ์‹œ ๊ฐ ์„น์…˜์€ ์ตœ์†Œ 400์ž ์ด์ƒ ์ž‘์„ฑํ•˜๊ณ  ์ตœ์ข… ๊ธ€์˜ ๊ธธ์ด๋Š” 3000์ž ์ด์ƒ์œผ๋กœ ์ž‘์„ฑ
4. ์ถ”์ฒœ ์ œ๋ชฉ, ๋„์ž…๋ถ€, ๋ณธ๋ก (์ œํ’ˆ ์œ ํ˜• ๋น„๊ต, ์„ ์ • ๊ธฐ์ค€, ์ถ”์ฒœ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ), ๊ฒฐ๋ก ์˜ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ
5. ์ฃผ์ œ์— ๋งž๋Š” ๋…์ฐฝ์ ์ธ ๊ฐ€์ƒ ํ•„์ž ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ
6. ๊ฐ๊ด€์ ์ด๊ณ  ์ •๋ณด ์ œ๊ณต์— ์ค‘์ ์„ ๋‘” ํ†ค์œผ๋กœ ์ž‘์„ฑ
##[ํฌ์ŠคํŒ… ๊ตฌ์กฐ]
###[์ถ”์ฒœ ์ œ๋ชฉ]
1. ์ถ”์ฒœ์ œ๋ชฉ 3๊ฐ€์ง€๋งŒ ์ถœ๋ ฅํ•˜๋ผ(๋‹ค๋ฅธ๊ตฌ์กฐ, ์„ค๋ช… ์ถœ๋ ฅ๊ธˆ์ง€)
2. ๋…์ž์˜ ํ˜ธ๊ธฐ์‹ฌ์„ ์ž๊ทนํ•˜๋Š” ํฅ๋ฏธ๋กœ์šด ์ œ๋ชฉ ์‚ฌ์šฉ
3. ์ œํ’ˆ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์„ ๊ฐ•์กฐํ•˜๋Š” ์ œ๋ชฉ
4. ๋น„๊ต๋‚˜ ๋Œ€์กฐ๋ฅผ ํ™œ์šฉํ•œ ์ œ๋ชฉ
5. ์งˆ๋ฌธ ํ˜•์‹์ด๋‚˜ ๋„์ „์ ์ธ ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ œ๋ชฉ
6. ์ˆซ์ž๋‚˜ ์ˆœ์œ„๋ฅผ ํ™œ์šฉํ•œ ์ œ๋ชฉ (ํ•„์š”์‹œ)
7. ๋…์ž์ธต์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ์ œ๋ชฉ
8. "Best X" ๋˜๋Š” "Top Y" ํ˜•์‹์˜ ์ œ๋ชฉ๋„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ผ
9. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ œ๋ชฉ
###[๋„์ž…๋ถ€]
1. ์ถ”์ฒœ ์ฃผ์ œ์˜ ํ•„์š”์„ฑ๊ณผ ์„ ํƒ์˜ ์–ด๋ ค์›€ ์†Œ๊ฐœ
2. ๊ธ€์˜ ๋ชฉ์  ์„ค๋ช… (์ œํ’ˆ ์œ ํ˜• ๋น„๊ต ๋ฐ ์ถ”์ฒœ ์ œํ’ˆ ์†Œ๊ฐœ)
3. ๋…์ž์˜ ๊ด€์‹ฌ์„ ๋„๋Š” ์š”์†Œ ํฌํ•จ (์˜ˆ: ๊ณ„์ ˆ์  ์š”์ธ, ์ƒํ™œ ๊ฐœ์„  ํšจ๊ณผ ๋“ฑ)
###[๋ณธ๋ก ]
- ๋‹ค์Œ ์š”์†Œ๋“ค์„ ์ฃผ์ œ์— ๋งž๊ฒŒ ์„ ํƒ์ ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ๋งž๋Š” ์ฃผ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ์ ํ•ฉํ•œ ์ฃผ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ
- ๋‹จ, ์ถฉ๋ถ„ํ•œ ์–‘(3000-4000์ž)์˜ ๊ธ€์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก ์„น์…˜์„ ์„ค์ •ํ•˜๋ผ.
- ๊ฐ ์„น์…˜์€ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ •๋ณด์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ๋‚ด์šฉ์˜ ๊นŠ์ด์™€ ์ˆœ์„œ ์กฐ์ •
1. ์ œํ’ˆ ์œ ํ˜•๋ณ„ ๋น„๊ต
- ๊ฐ ์œ ํ˜•์˜ ์žฅ๋‹จ์  ๋ถ„์„
- ์‚ฌ์šฉ ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์ ํ•ฉ์„ฑ ์„ค๋ช…
2. ์ œํ’ˆ ์„ ์ • ๊ธฐ์ค€ ์ƒ์„ธ ์„ค๋ช…
- ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ์„ฑ๋Šฅ ์„ค๋ช…
- ์‚ฌ์šฉ ํŽธ์˜์„ฑ ๊ณ ๋ ค ์‚ฌํ•ญ
- ๊ฐ€๊ฒฉ ๋ฐ ์œ ์ง€ ๋น„์šฉ ๋ถ„์„
3. ์ถ”์ฒœ ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ (3-5๊ฐœ)
- ์ œํ’ˆ๋ช…๊ณผ ํ•ต์‹ฌ ํŠน์ง• ์†Œ๊ฐœ
- ๊ฐ ์ œํ’ˆ์˜ ์žฅ๋‹จ์  ์ƒ์„ธ ์„ค๋ช…
- ์ ํ•ฉํ•œ ์‚ฌ์šฉ์ž ์œ ํ˜• ์ œ์‹œ
4. ๋ธŒ๋žœ๋“œ ๋ฐ ๋ชจ๋ธ ๋ผ์ธ์—… ์„ค๋ช… (ํ•„์š”์‹œ)
- ์ฃผ์š” ๋ธŒ๋žœ๋“œ์˜ ์ œํ’ˆ ๋ผ์ธ ์†Œ๊ฐœ
- ๋ชจ๋ธ๋ณ„ ์ฐจ์ด์  ๋ฐ ํŠน์ง• ์„ค๋ช…
###[๊ฒฐ๋ก ]
1. ์ถ”์ฒœ ์ œํ’ˆ ์š”์•ฝ ๋ฐ ์ตœ์ข… ์„ ํƒ ๊ฐ€์ด๋“œ
2. ๊ตฌ๋งค ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ถ”๊ฐ€ ์‚ฌํ•ญ ์•ˆ๋‚ด
3. ํ–ฅํ›„ ๊ธฐ์ˆ  ๋ฐœ์ „ ๋ฐฉํ–ฅ์ด๋‚˜ ํŠธ๋ Œ๋“œ ์ œ์‹œ (์žˆ์„ ๊ฒฝ์šฐ)
##[์ตœ์ ํ™” ์ „๋žต]
1. SEO ์ตœ์ ํ™”
- ์ถ”์ฒœ ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ์ฃผ์š” ํ‚ค์›Œ๋“œ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จ
- ๊ฒ€์ƒ‰ ์˜๋„์— ๋ถ€ํ•ฉํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋‚ด์šฉ ๊ตฌ์„ฑ
2. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋ฌธ์žฅ ์‚ฌ์šฉ
- ์ ์ ˆํ•œ ๋‹จ๋ฝ ๊ตฌ๋ถ„๊ณผ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ํ™œ์šฉ
- ํ•„์š”์‹œ ํ‘œ๋‚˜ ์ฐจํŠธ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ์‹œ๊ฐํ™”
3. ๋…์ž ์ฐธ์—ฌ ์œ ๋„
- ๋…์ž์˜ ๊ฒฝํ—˜์ด๋‚˜ ์˜๊ฒฌ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ๊ด€๋ จ ์ •๋ณด๋‚˜ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
##[์ฃผ์˜์‚ฌํ•ญ]
1. ๊ฐ๊ด€์ ์ด๊ณ  ๊ณต์ •ํ•œ ๋น„๊ต ๋ถ„์„ ์ œ๊ณต
2. ๊ณผ๋„ํ•œ ํ™๋ณด์„ฑ ํ‘œํ˜„ ์ž์ œ
3. ๊ฐ€๊ฒฉ ์ •๋ณด ๋“ฑ์€ ์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€์ž„์„ ๋ช…์‹œ
4. ์œ ํŠœ๋ธŒ ๊ด€๋ จ ํ‘œํ˜„ ์ œ๊ฑฐ ๋ฐ ๋ธ”๋กœ๊ทธ ํ˜•์‹์— ๋งž๊ฒŒ ์กฐ์ •
5. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ํŠน์ • ๊ฐœ์ธ์˜ ์‹ค๋ช…์ด๋‚˜ ์ฑ„๋„๋ช… ์–ธ๊ธ‰ ๊ธˆ์ง€
6. ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ๋“œ์™€ ๊ฐ€๊ฒฉ๋Œ€์˜ ์ œํ’ˆ์„ ํฌํ•จํ•˜์—ฌ ํŽธํ–ฅ์„ฑ ๋ฐฉ์ง€
7. ์ „๋ฌธ ์šฉ์–ด๋‚˜ ๊ธฐ์ˆ ์  ํŠน์ง• ์„ค๋ช… ์‹œ ์ผ๋ฐ˜ ๋…์ž๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…
"""
# ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ ํ•จ์ˆ˜
def get_style_prompt(style):
prompts = {
"์นœ๊ทผํ•œ": """
#์นœ๊ทผํ•œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
1. ํ†ค๊ณผ ์–ด์กฐ
- ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
- ๋…์ž๋ฅผ "์—ฌ๋Ÿฌ๋ถ„" ๋˜๋Š” "๋…์ž๋‹˜๋“ค"๋กœ ์ง€์นญ
- ์ ์ ˆํ•œ ์ด๋ชจ์ง€๋ฅผ sparseํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์นœ๊ทผ๊ฐ ํ‘œํ˜„
2. ๋ฌธ์žฅ ๋ฐ ๋‚ด์šฉ ๊ตฌ์„ฑ
- ์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฌธ์žฅ ์œ„์ฃผ๋กœ ์ž‘์„ฑ
- ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
- '~๋‹ˆ๋‹ค', '~ํ–ˆ์ฃ '๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ.
- ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ด๋‚˜ ์ผํ™”๋กœ ์‹œ์ž‘
- ์‹ค์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒ ์ œ๊ณต
- ๋…์ž์˜ ๊ณต๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€ ํฌํ•จ
3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
- ์ „๋ฌธ ์šฉ์–ด ๋Œ€์‹  ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
- ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฐœ๋… ์„ค๋ช…
- ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋Š๋‚Œ ์ฃผ๊ธฐ
4. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
- ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ๋ฅผ ๋…๋ คํ•˜๋Š” ๋ฌธ๊ตฌ ์‚ฌ์šฉ
5. ์ด๋ชจ์ง€ ํ™œ์šฉ
- ์ฃผ์š” ํฌ์ธํŠธ๋‚˜ ์ƒˆ๋กœ์šด ์„น์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ๊ด€๋ จ ์ด๋ชจ์ง€ ์‚ฌ์šฉ
- ์ „์ฒด ๊ธ€์—์„œ 3-5๊ฐœ ์ •๋„์˜ ์ด๋ชจ์ง€๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ณผ๋„ํ•˜์ง€ ์•Š๊ฒŒ ์œ ์ง€
6. ๋งˆ๋ฌด๋ฆฌ
- ์นœ๊ทผํ•˜๊ณ  ๊ฒฉ๋ คํ•˜๋Š” ํ†ค์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ
- ๋‹ค์Œ ํฌ์ŠคํŒ…์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ ์œ ๋ฐœ
์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๊ฐ€๋ฒผ์šด ํ†ค์€ ์ง€์–‘ํ•˜๊ณ , ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋Š” ์„ ์—์„œ ์นœ๊ทผํ•จ ์œ ์ง€
์˜ˆ์‹œ:
"์—ฌ๋Ÿฌ๋ถ„, ์˜ค๋Š˜ ํ•˜๋ฃจ๋Š” ์–ด๋– ์…จ๋‚˜์š”? ๐Ÿ˜Š ์ €๋Š” ์˜ค๋Š˜ ์žฌ๋ฏธ์žˆ๋Š” ๊ฒฝํ—˜์„ ํ–ˆ์–ด์š”. ๋ฐ”๋กœ '๋ฏธ๋‹ˆ๋ฉ€ ๋ผ์ดํ”„'์— ๋„์ „ํ•ด๋ณธ ๊ฑด๋ฐ์š”. ์ฒ˜์Œ์—๋Š” ์ข€ ๋ง‰๋ง‰ํ–ˆ์ง€๋งŒ, ์ƒ๊ฐ๋ณด๋‹ค ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์ด์—ˆ์–ด์š”! ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•œ๋ฒˆ ๋”ฐ๋ผํ•ด๋ณด์‹œ๊ฒ ์–ด์š”? ์ œ๊ฐ€ ์•Œ๊ฒŒ ๋œ ๊ฟ€ํŒ๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”.
""",
"์ผ๋ฐ˜":"""#์ผ๋ฐ˜์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
1. ํ†ค๊ณผ ์–ด์กฐ
- ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
- ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")
2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
- ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์ œ์‹œ๋กœ ์‹œ์ž‘
- ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ
- ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
- ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ
3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
- ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
- ํ•„์š”์‹œ ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
- ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 
4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
- ๋ถˆ๋ฆฟ ํฌ์ธํŠธ๋‚˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ๊ตฌ์กฐํ™”
- ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๊ตต์€ ๊ธ€์”จ๋‚˜ ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
- ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
- ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ
6. ๋งˆ๋ฌด๋ฆฌ
- ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋‹จํžˆ ์š”์•ฝ
- ์ถ”๊ฐ€ ์ •๋ณด์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๋”ฑ๋”ฑํ•˜๊ฑฐ๋‚˜ ์ง€๋ฃจํ•˜์ง€ ์•Š๋„๋ก ๊ท ํ˜• ์œ ์ง€
์˜ˆ์‹œ:
"์ตœ๊ทผ ํ™˜๊ฒฝ ๋ฌธ์ œ๊ฐ€ ๋Œ€๋‘๋˜๋ฉด์„œ '์ œ๋กœ ์›จ์ด์ŠคํŠธ' ๋ผ์ดํ”„์Šคํƒ€์ผ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๋†’์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋กœ ์›จ์ด์ŠคํŠธ๋ž€ ์ผ์ƒ์ƒํ™œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์ƒํ™œ ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ œ๋กœ ์›จ์ด์ŠคํŠธ์˜ ๊ฐœ๋…, ์‹ค์ฒœ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํšจ๊ณผ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ œ๋กœ ์›จ์ด์ŠคํŠธ์˜ ์ •์˜๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๋ฉด...
""",
"์ „๋ฌธ์ ์ธ": """
#์ „๋ฌธ์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
1. ํ†ค๊ณผ ๊ตฌ์กฐ
- ๊ณต์‹์ ์ด๊ณ  ํ•™์ˆ ์ ์ธ ํ†ค ์‚ฌ์šฉํ•˜๋˜ ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ
- ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
- ๋ช…ํ™•ํ•œ ์„œ๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก  ๊ตฌ์กฐ
- ์ฒด๊ณ„์ ์ธ ๋…ผ์  ์ „๊ฐœ
- ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
- ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ •ํ™•ํžˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์žฅ ๊ตฌ์กฐ ์‚ฌ์šฉ
- ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
- ํ•ด๋‹น ๋ถ„์•ผ์˜ ์ „๋ฌธ ์šฉ์–ด ์ ๊ทน ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
- ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ์‚ฌ๊ณ  ์ „๊ฐœ
- ๋‹ค์–‘ํ•œ ๊ด€์  ์ œ์‹œ ๋ฐ ๋น„๊ต
3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
- ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜ ์ธ์šฉ
- ํ•„์š”์‹œ ๊ฐ์ฃผ๋‚˜ ์ฐธ๊ณ ๋ฌธํ—Œ ๋ชฉ๋ก ํฌํ•จ
- ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ํ…์ŠคํŠธ๋กœ ๋ช…ํ™•ํžˆ ์„ค๋ช…
4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
- ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ์‚ฌ์šฉ
- ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‚˜ ์šฉ์–ด๋Š” ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
- ๊ธด ์ธ์šฉ๋ฌธ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„
5. ๋งˆ๋ฌด๋ฆฌ
- ํ•ต์‹ฌ ๋…ผ์  ์žฌ๊ฐ•์กฐ
- ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ์ด๋‚˜ ์‹ค๋ฌด์  ํ•จ์˜ ์ œ์‹œ
์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์ค€์€ ์ง€์–‘
์˜ˆ์‹œ:
"๋ณธ ์—ฐ๊ตฌ์—์„œ๋Š” ์ธ๊ณต์ง€๋Šฅ(AI)์˜ ์œค๋ฆฌ์  ํ•จ์˜์— ๋Œ€ํ•ด ๊ณ ์ฐฐํ•œ๋‹ค. ํŠนํžˆ, ์ž์œจ์ฃผํ–‰ ์ž๋™์ฐจ์˜ ์˜์‚ฌ๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œค๋ฆฌ์  ๋”œ๋ ˆ๋งˆ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค. Bonnefon et al. (2016)์˜ ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด, ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ง๋ฉดํ•  ์ˆ˜ ์žˆ๋Š” ์œค๋ฆฌ์  ์„ ํƒ์˜ ๋ณต์žก์„ฑ์ด ์ง€์ ๋œ ๋ฐ” ์žˆ๋‹ค. ๋ณธ๊ณ ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์œค๋ฆฌ์  ๋”œ๋ ˆ๋งˆ๋ฅผ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ด€์ ์—์„œ ๋ถ„์„ํ•œ๋‹ค: 1) ๊ณต๋ฆฌ์ฃผ์˜์  ์ ‘๊ทผ, 2) ์˜๋ฌด๋ก ์  ์ ‘๊ทผ, 3) ๋• ์œค๋ฆฌ์  ์ ‘๊ทผ. ๊ฐ ์ ‘๊ทผ๋ฒ•์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ต ๋ถ„์„ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰์˜ ์œค๋ฆฌ์  ์˜์‚ฌ๊ฒฐ์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์•ˆํ•˜๊ณ ์ž ํ•œ๋‹ค...
"""
}
return prompts.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ")
# ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ์„ค๋ช… ํ•จ์ˆ˜
def get_style_description(style):
descriptions = {
"์นœ๊ทผํ•œ": "๋…์ž์™€ ๊ฐ€๊นŒ์šด ์นœ๊ตฌ์ฒ˜๋Ÿผ ๋Œ€ํ™”ํ•˜๋Š” ๋“ฏํ•œ ์นœ๊ทผํ•œ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
"์ผ๋ฐ˜": "์ผ๋ฐ˜์ ์ด๊ณ  ์ค‘๋ฆฝ์ ์ธ ํ†ค์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
"์ „๋ฌธ์ ์ธ": "์ „๋ฌธ๊ฐ€์˜ ์‹œ๊ฐ์—์„œ ๊นŠ์ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค."
}
return descriptions.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜์„ธ์š”.")
# ํ”„๋กฌํ”„ํŠธ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜
def update_prompts_and_description(category, style):
blog_post_prompt = get_blog_post_prompt(category)
style_prompt = get_style_prompt(style)
style_description = get_style_description(style)
return blog_post_prompt, style_prompt, style_description
def format_filename(text):
text = re.sub(r'[^\w\s-]', '', text)
return text[:50].strip()
def extract_first_recommended_title(blog_post):
section_match = re.search(r'(?:#+\s*)?์ถ”์ฒœ\s*์ œ๋ชฉ:?\s*\n([\s\S]*?)(?=\n(?:#+|$)|$)', blog_post, re.IGNORECASE)
if section_match:
section_content = section_match.group(1)
title_match = re.search(r'(?:^|\n)\s*(?:\d+\.|-|\*|\โ€ข)?\s*(.*?)(?=\n|$)', section_content)
if title_match:
title = title_match.group(1).strip()
print(f"Extracted title: {title}")
return title
print("No title found")
return "๋ธ”๋กœ๊ทธ_๊ธ€"
class PDF(FPDF):
def __init__(self):
super().__init__()
self.add_font("NanumGothic", "", "NanumGothic.ttf")
self.add_font("NanumGothicBold", "", "NanumGothicBold.ttf")
self.add_font("NanumGothicExtraBold", "", "NanumGothicExtraBold.ttf")
self.add_font("NanumGothicLight", "", "NanumGothicLight.ttf")
def header(self):
# ํ—ค๋”๋ฅผ ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค
pass
def footer(self):
self.set_y(-15)
self.set_font('NanumGothicLight', '', 8)
self.cell(0, 10, f'Page {self.page_no()}', 0, new_x=XPos.RIGHT, new_y=YPos.TOP, align='C')
def save_to_pdf(summary, blog_post, file_type):
pdf = PDF()
pdf.set_auto_page_break(auto=True, margin=15)
pdf.add_page()
pdf.set_font("NanumGothicExtraBold", size=16)
pdf.cell(0, 10, "์š”์•ฝ", new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='C')
pdf.ln(5)
pdf.set_font("NanumGothic", size=11)
pdf.multi_cell(0, 6, summary)
pdf.add_page()
pdf.set_font("NanumGothicExtraBold", size=16)
pdf.cell(0, 10, "๋ธ”๋กœ๊ทธ ๊ธ€", new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='C')
pdf.ln(5)
lines = blog_post.split('\n')
for line in lines:
if line.strip() == '':
pdf.ln(3) # ๋นˆ ์ค„์€ ์ž‘์€ ๊ฐ„๊ฒฉ๋งŒ ์ถ”๊ฐ€
elif line.startswith('#'): # ์ œ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ
pdf.set_font("NanumGothicBold", size=14)
pdf.multi_cell(0, 8, line.lstrip('#').strip())
pdf.ln(2)
elif line.startswith('##'): # ๋ถ€์ œ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ
pdf.set_font("NanumGothicBold", size=12)
pdf.multi_cell(0, 7, line.lstrip('#').strip())
pdf.ln(2)
else:
pdf.set_font("NanumGothic", size=11)
pdf.multi_cell(0, 6, line.strip())
pdf.ln(1)
title = extract_first_recommended_title(blog_post)
today_date = datetime.now().strftime("%Y%m%d")
filename = f"{today_date}_{format_filename(title)}.pdf"
print(f"Saving PDF as: {filename}")
pdf.output(filename)
return filename
# Gradio ์ธํ„ฐํŽ˜์ด์Šค์šฉ PDF ์ €์žฅ ํ•จ์ˆ˜
def save_content_to_pdf(summary, blog_post):
filename = save_to_pdf(summary, blog_post, "๋ธ”๋กœ๊ทธ")
return filename
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
title = "์œ ํŠœ๋ธŒ๋กœ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ"
with gr.Blocks() as demo:
gr.Markdown(f"# {title}")
# 1๋‹จ๊ณ„: ์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ
gr.Markdown("### 1๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
category = gr.Radio(choices=["์ผ๋ฐ˜ํ˜•","์ •๋ณด์„ฑ", "1๊ฐœ ์ƒํ’ˆ ์ถ”์ฒœํ˜•", "ํ๋ ˆ์ด์…˜ํ˜•"], label="ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ", value="์ผ๋ฐ˜ํ˜•")
# ๊ตฌ๋ถ„์„  ์ถ”๊ฐ€
gr.Markdown("---\n\n")
# 2๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ์„ ํƒ
gr.Markdown("### 2๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
style = gr.Radio(choices=["์นœ๊ทผํ•œ", "์ผ๋ฐ˜", "์ „๋ฌธ์ ์ธ"], label="ํฌ์ŠคํŒ… ์Šคํƒ€์ผ", value="์นœ๊ทผํ•œ")
style_description = gr.Markdown(f"{get_style_description('์นœ๊ทผํ•œ')}", elem_id="style-description")
# ๊ตฌ๋ถ„์„  ์ถ”๊ฐ€
gr.Markdown("---\n\n")
# 3๋‹จ๊ณ„: ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”
gr.Markdown("### 3๋‹จ๊ณ„: ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
with gr.Row():
youtube_url1 = gr.Textbox(label="YouTube URL 1", placeholder="์ฒซ ๋ฒˆ์งธ ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
youtube_url2 = gr.Textbox(label="YouTube URL 2", placeholder="๋‘ ๋ฒˆ์งธ ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
youtube_url3 = gr.Textbox(label="YouTube URL 3", placeholder="์„ธ ๋ฒˆ์งธ ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
# ์ˆจ๊ฒจ์ง„ ํ…์ŠคํŠธ๋ฐ•์Šค (์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด์ง€ ์•Š์Œ)
combined_urls = gr.Textbox(visible=False)
transcript_output = gr.Textbox(label="์œ ํŠœ๋ธŒ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ", lines=10)
# ์œ ํŠœ๋ธŒ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ํ•จ์ˆ˜
def combine_and_get_transcripts(url1, url2, url3):
urls = [url for url in [url1, url2, url3] if url.strip()]
combined = ",".join(urls)
all_transcripts = []
for url in urls:
transcript = get_transcript(url.strip())
all_transcripts.append(transcript)
return combined, "\n\n---\n\n".join(all_transcripts)
# ์ž…๋ ฅ ๋ณ€๊ฒฝ ์‹œ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ ์—…๋ฐ์ดํŠธ
for url_input in [youtube_url1, youtube_url2, youtube_url3]:
url_input.change(
fn=combine_and_get_transcripts,
inputs=[youtube_url1, youtube_url2, youtube_url3],
outputs=[combined_urls, transcript_output]
)
# ์š”์•ฝ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
gr.Markdown("### ์š”์•ฝ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ", elem_id="step-title")
with gr.Accordion("์š”์•ฝ๊ธ€ ์„ค์ •", open=False):
summary_system_message = gr.Textbox(
label="์š”์•ฝ๊ธ€ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€",
value="""
#์œ ํŠœ๋ธŒ ๋Œ€๋ณธ ์š”์•ฝ ๊ทœ์น™
1. ๋ชฉ์ 
๊ฐ€. ์ž…๋ ฅ๋œ ์—ฌ๋Ÿฌ ์œ ํŠœ๋ธŒ ์˜์ƒ ๋Œ€๋ณธ์„ ๋ถ„์„ํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ข…ํ•ฉ์ ์ธ ์š”์•ฝ ๋ณด๊ณ ์„œ ์ž‘์„ฑ
๋‚˜. ํ•ต์‹ฌ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐํ™”๋œ ํ˜•์‹์œผ๋กœ ์ œ์‹œ
๋‹ค. ๊ณตํ†ต ์ฃผ์ œ๋‚˜ ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ค‘์‹ฌ์œผ๋กœ ํ†ตํ•ฉ๋œ ์ธ์‚ฌ์ดํŠธ ์ œ๊ณต
2. ๊ตฌ์กฐ ๋ฐ ํ˜•์‹
๊ฐ€. ์ „์ฒด ๊ตฌ์กฐ
- ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๋…ผ๋ฆฌ์  ์„น์…˜์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์„ฑ
- ๊ฐ ์„น์…˜์— ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์†Œ์ œ๋ชฉ ๋ถ€์—ฌ
๋‚˜. ๋งˆํฌ๋‹ค์šด ํ˜•์‹ ์‚ฌ์šฉ
- ์„น์…˜ ๊ตฌ๋ถ„์„ ์œ„ํ•ด '1.', '2.' ๋“ฑ์˜ ์ˆซ์ž ์‚ฌ์šฉ
- ํ•˜์œ„ ํ•ญ๋ชฉ์€ '๊ฐ€.', '๋‚˜.' ๋“ฑ์˜ ํ•œ๊ธ€ ๋ฌธ์ž ์‚ฌ์šฉ
๋‹ค. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๊ฐ„๊ฒฐํ•œ ๋ฌธ์žฅ๊ณผ ๋‹จ๋ฝ ์‚ฌ์šฉํ•˜๋˜ ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์€ ์ž์„ธํžˆ ์ž‘์„ฑ
- ํ•„์š”์‹œ ๋ถˆ๋ฆฟ ํฌ์ธํŠธ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ๋‚˜์—ด
3. ๋‚ด์šฉ ๊ตฌ์„ฑ
๊ฐ€. ์ข…ํ•ฉ ๊ฐœ์š”
- ๋ถ„์„ํ•œ ์˜์ƒ๋“ค์˜ ๊ณตํ†ต ์ฃผ์ œ ๋˜๋Š” ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€ ์†Œ๊ฐœ
- ๊ฐ ์˜์ƒ์˜ ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๊ฐ„๋žตํžˆ ๋‚˜์—ด
๋‚˜. ์ฃผ์ œ๋ณ„ ํ†ตํ•ฉ ๋ถ„์„
- ๊ณตํ†ต ์ฃผ์ œ๋‚˜ ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ค‘์‹ฌ์œผ๋กœ ์„น์…˜ ๊ตฌ์„ฑ
- ๊ฐ ์˜์ƒ์˜ ๊ด€์ ์ด๋‚˜ ์ •๋ณด๋ฅผ ๋น„๊ต/๋Œ€์กฐํ•˜๋ฉฐ ์ข…ํ•ฉ
๋‹ค. ๋…ํŠนํ•œ ์ธ์‚ฌ์ดํŠธ
- ๊ฐ ์˜์ƒ์—์„œ ์ œ์‹œ๋œ ๊ณ ์œ ํ•œ ๊ด€์ ์ด๋‚˜ ์ •๋ณด ๊ฐ•์กฐ
๋ผ. ๋ฐ์ดํ„ฐ ๋ฐ ์˜ˆ์‹œ ํ†ตํ•ฉ
- ์—ฌ๋Ÿฌ ์˜์ƒ์—์„œ ์ œ์‹œ๋œ ๋ฐ์ดํ„ฐ๋‚˜ ์˜ˆ์‹œ๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ ์ œ์‹œ
๋งˆ. ์ข…ํ•ฉ ๊ฒฐ๋ก 
- ๋ถ„์„๋œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ „์ฒด์ ์ธ ๊ฒฐ๋ก  ๋„์ถœ
4. ์šฉ์–ด ๋ฐ ํ‘œํ˜„
๊ฐ€. '์œ ํŠœ๋ฒ„', 'YouTuber' ๋“ฑ์˜ ํ‘œํ˜„์„ '์ œ์ž‘์ž' ๋˜๋Š” '์ง„ํ–‰์ž' ๊ฐ™์€ ๋‹ค๋ฅธ ํ‘œํ˜„์œผ๋กœ ๋Œ€์ฒด
๋‚˜. ์ฑ„๋„๋ช…, ์ œ์ž‘์ž ์‹ค๋ช… ๋“ฑ ๊ฐœ์ธ ์ •๋ณด ์ œ์™ธ
๋‹ค. ์œ ํŠœ๋ธŒ ํŠน์ • ์šฉ์–ด(์˜ˆ: '๊ตฌ๋…', '์ข‹์•„์š”', '์•Œ๋ฆผ', '๋‹ค์Œ ์˜์ƒ' ๋“ฑ) ์‚ฌ์šฉ ๊ธˆ์ง€
5. ๊ฐ๊ด€์„ฑ ๋ฐ ์ •ํ™•์„ฑ
๊ฐ€. ๋Œ€๋ณธ ๋‚ด์šฉ์„ ๊ฐ๊ด€์ ์œผ๋กœ ์š”์•ฝ, ๊ฐœ์ธ์  ํ•ด์„ ์ตœ์†Œํ™”
๋‚˜. ์‚ฌ์‹ค ๊ด€๊ณ„๋‚˜ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๋Šฅํ•œ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
6. ๋งˆ๋ฌด๋ฆฌ
๊ฐ€. ์š”์•ฝ์˜ ๋์— ์ „์ฒด ๋‚ด์šฉ์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ •๋ฆฌ
๋‚˜. ํ•„์š”์‹œ ์ถ”๊ฐ€ ์ •๋ณด๋‚˜ ๊ด€๋ จ ์ฃผ์ œ ์ œ์•ˆ
""",
lines=15,
visible=True
)
summary_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=7000, value=5000, step=1000)
summary_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.7, step=0.05)
summary_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
summarize_btn = gr.Button("์š”์•ฝ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ")
summary_output = gr.Textbox(label="์š”์•ฝ๋œ ๊ธ€", lines=10)
def generate_summary(transcript, system_message, max_tokens, temperature, top_p):
summary = summarize_transcript(transcript, system_message, max_tokens, temperature, top_p)
return summary
summarize_btn.click(
fn=generate_summary,
inputs=[transcript_output, summary_system_message, summary_max_tokens, summary_temperature, summary_top_p],
outputs=[summary_output]
)
# ๊ตฌ๋ถ„์„  ์ถ”๊ฐ€
gr.Markdown("---\n\n")
# 4๋‹จ๊ณ„: ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ
gr.Markdown("### 4๋‹จ๊ณ„: ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ", elem_id="step-title")
gr.HTML("<span style='color: grey;'>[์ƒ์„ฑํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”]</span>")
with gr.Accordion("๋ธ”๋กœ๊ทธ ๊ธ€ ์„ค์ •", open=False):
blog_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_blog_post_prompt("์ผ๋ฐ˜ํ˜•"), lines=20, visible=True)
style_prompt_hidden = gr.Textbox(label="์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ", value=get_style_prompt("์นœ๊ทผํ•œ"), lines=10, visible=False) # ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
blog_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=12000, value=8000, step=1000)
blog_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
blog_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
generate_btn = gr.Button("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ")
blog_output = gr.Textbox(label="์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€", lines=30)
def generate_blog_content(category, style, transcripts, category_prompt, style_prompt, max_tokens, temperature, top_p):
blog_post = generate_blog_post(category, style, transcripts, category_prompt, style_prompt, max_tokens, temperature, top_p)
return blog_post
generate_btn.click(
fn=generate_blog_content,
inputs=[category, style, transcript_output, blog_system_message, style_prompt_hidden, blog_max_tokens, blog_temperature, blog_top_p],
outputs=[blog_output]
)
# PDF ์ €์žฅ ๋ฒ„ํŠผ ์ถ”๊ฐ€
save_pdf_btn = gr.Button("PDF๋กœ ์ €์žฅํ•˜๊ธฐ")
pdf_output = gr.File(label="์ƒ์„ฑ๋œ PDF ํŒŒ์ผ")
save_pdf_btn.click(
fn=save_content_to_pdf,
inputs=[summary_output, blog_output],
outputs=[pdf_output]
)
# ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์Šคํƒ€์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ”„๋กฌํ”„ํŠธ ์—…๋ฐ์ดํŠธ
def update_prompts_and_description(category, style):
blog_post_prompt = get_blog_post_prompt(category)
style_prompt = get_style_prompt(style)
style_description = get_style_description(style)
return blog_post_prompt, style_prompt, style_description
category.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[blog_system_message, style_prompt_hidden, style_description])
style.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[blog_system_message, style_prompt_hidden, style_description])
demo.launch()
# CSS ์Šคํƒ€์ผ ์ถ”๊ฐ€
gr.HTML("""
<style>
#step-title {
font-size: 1.7em;
font-weight: bold;
}
#style-description {
font-size: 1.2em;
}
</style>
""")