Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
from bs4 import BeautifulSoup | |
from requests.adapters import HTTPAdapter | |
from requests.packages.urllib3.util.retry import Retry | |
import re | |
import time | |
import random | |
import os | |
from huggingface_hub import InferenceClient | |
def setup_session(): | |
try: | |
session = requests.Session() | |
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504]) | |
session.mount('https://', HTTPAdapter(max_retries=retries)) | |
return session | |
except Exception as e: | |
return None | |
def generate_naver_search_url(query): | |
base_url = "https://search.naver.com/search.naver?" | |
params = {"ssc": "tab.blog.all", "sm": "tab_jum", "query": query} | |
url = base_url + "&".join(f"{key}={value}" for key, value in params.items()) | |
return url | |
def crawl_blog_content(url, session): | |
try: | |
headers = { | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", | |
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Connection": "keep-alive", | |
"Referer": "https://search.naver.com/search.naver", | |
} | |
# ๋๋ค ๋๋ ์ด ์ถ๊ฐ | |
delay = random.uniform(1, 2) | |
time.sleep(delay) | |
response = session.get(url, headers=headers) | |
if response.status_code != 200: | |
return "" | |
soup = BeautifulSoup(response.content, "html.parser") | |
content = soup.find("div", attrs={'class': 'se-main-container'}) | |
if content: | |
return clean_text(content.get_text()) | |
else: | |
return "" | |
except Exception as e: | |
return "" | |
def crawl_naver_search_results(url, session): | |
try: | |
headers = { | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", | |
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Connection": "keep-alive", | |
"Referer": "https://search.naver.com/search.naver", | |
} | |
response = session.get(url, headers=headers) | |
if response.status_code != 200: | |
return [] | |
soup = BeautifulSoup(response.content, "html.parser") | |
results = [] | |
count = 0 | |
for li in soup.find_all("li", class_=re.compile("bx.*")): | |
if count >= 10: | |
break | |
for div in li.find_all("div", class_="detail_box"): | |
for div2 in div.find_all("div", class_="title_area"): | |
title = div2.text.strip() | |
for a in div2.find_all("a", href=True): | |
link = a["href"] | |
if "blog.naver" in link: | |
link = link.replace("https://", "https://m.") | |
results.append({"์ ๋ชฉ": title, "๋งํฌ": link}) | |
count += 1 | |
if count >= 10: | |
break | |
if count >= 10: | |
break | |
if count >= 10: | |
break | |
return results | |
except Exception as e: | |
return [] | |
def clean_text(text): | |
text = re.sub(r'\s+', ' ', text).strip() | |
return text | |
def create_client(model_name): | |
return InferenceClient(model_name, token=os.getenv("HF_TOKEN")) | |
client = create_client("CohereForAI/c4ai-command-r-plus") | |
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) | |
modified_text = response.choices[0].message.content | |
return modified_text | |
def analyze_info(category, topic, references1, references2, references3): | |
return f"์ ํํ ์นดํ ๊ณ ๋ฆฌ: {category}\n๋ธ๋ก๊ทธ ์ฃผ์ : {topic}\n์ฐธ๊ณ ๊ธ1: {references1}\n์ฐธ๊ณ ๊ธ2: {references2}\n์ฐธ๊ณ ๊ธ3: {references3}" | |
def suggest_title(category, topic, references1, references2, references3, system_message, max_tokens, temperature, top_p): | |
full_content = analyze_info(category, topic, references1, references2, references3) | |
modified_text = call_api(full_content, system_message, max_tokens, temperature, top_p) | |
return modified_text | |
def generate_outline(category, topic, references1, references2, references3, title, system_message, max_tokens, temperature, top_p): | |
full_content = analyze_info(category, topic, references1, references2, references3) | |
content = f"{full_content}\nTitle: {title}" | |
modified_text = call_api(content, system_message, max_tokens, temperature, top_p) | |
return modified_text | |
def generate_blog_post(category, topic, references1, references2, references3, title, outline, system_message, max_tokens, temperature, top_p): | |
full_content = analyze_info(category, topic, references1, references2, references3) | |
content = f"{full_content}\nTitle: {title}\nOutline: {outline}" | |
modified_text = call_api(content, system_message, max_tokens, temperature, top_p) | |
formatted_text = modified_text.replace('\n', '\n\n') | |
return formatted_text | |
def fetch_references(topic): | |
search_url = generate_naver_search_url(topic) | |
session = setup_session() | |
if session is None: | |
return "Failed to set up session.", "", "", "" | |
results = crawl_naver_search_results(search_url, session) | |
if not results: | |
return "No results found.", "", "", "" | |
# ์์ 10๊ฐ์ ๋ธ๋ก๊ทธ ์ค ๋๋ค์ผ๋ก 3๊ฐ ์ ํ | |
selected_results = random.sample(results, 3) | |
references1_content = f"์ ๋ชฉ: {selected_results[0]['์ ๋ชฉ']}\n๋ด์ฉ: {crawl_blog_content(selected_results[0]['๋งํฌ'], session)}" | |
references2_content = f"์ ๋ชฉ: {selected_results[1]['์ ๋ชฉ']}\n๋ด์ฉ: {crawl_blog_content(selected_results[1]['๋งํฌ'], session)}" | |
references3_content = f"์ ๋ชฉ: {selected_results[2]['์ ๋ชฉ']}\n๋ด์ฉ: {crawl_blog_content(selected_results[2]['๋งํฌ'], session)}" | |
return "์ฐธ๊ณ ๊ธ ์์ฑ ์๋ฃ", references1_content, references2_content, references3_content | |
def get_title_prompt(category): | |
if (category == "์ผ๋ฐ"): | |
return """ | |
#๋ธ๋ก๊ทธ ์ ๋ชฉ ์์ฑ ๊ท์น | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '์ ๋ณด์ฑ(Informative)' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
4. ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[๋ธ๋ก๊ทธ ์ ๋ชฉ ์์ฑ ๊ท์น] | |
1. ๋ธ๋ก๊ทธ ์ ๋ชฉ 10๊ฐ๋ฅผ ์์ฑํ๊ณ ์ ๋ชฉ 10๊ฐ๋ง ์ถ๋ ฅํ๋ผ. | |
2. ์ ๋ชฉ์ 40์ ์ด๋ด๋ก ์์ฑํ๋ผ. | |
3. ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ์ ๋ง์ถฐ ๋ธ๋ก๊ทธ ์ ๋ชฉ 10๊ฐ๋ฅผ ์์ฑํ๋ผ. | |
4. ๋ฐ๋์ ํต์ฌํค์๋(Topic)๊ฐ ๋ฌธ์ฅ ์์ชฝ์ ๋ค์ด๊ฐ๋๋ก ์์ฑํ๋ผ. | |
5. ํต์ฌ ํค์๋์ ์ฐ๊ด์ฑ ๋์ ์ฃผ์ ๋ฅผ ํฌํจํ์ฌ ์์ฑํ๋ผ. | |
""" | |
elif (category == "๊ฑด๊ฐ ์ํ"): | |
return """ | |
#๋ธ๋ก๊ทธ ์ ๋ชฉ ์์ฑ ๊ท์น(๊ฑด๊ฐ ์ํ) | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '๊ฑด๊ฐ, ์ํ ์ ๋ณด' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํฐ์ด๋ค. | |
4. ์ ํํ๊ณ ์ ๋ฌธ์ ์ธ ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[๋ธ๋ก๊ทธ ์ ๋ชฉ ์์ฑ ๊ท์น] | |
1. ๋ธ๋ก๊ทธ ์ ๋ชฉ 10๊ฐ๋ฅผ ์์ฑํ๊ณ ์ ๋ชฉ 10๊ฐ๋ง ์ถ๋ ฅํ๋ผ. | |
2. ์ ๋ชฉ์ 40์ ์ด๋ด๋ก ์์ฑํ๋ผ. | |
3. ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ์ ๋ง์ถฐ ๋ธ๋ก๊ทธ ์ ๋ชฉ 10๊ฐ๋ฅผ ์์ฑํ๋ผ. | |
4. ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ธ๋ก๊ทธ ์ฃผ์ , ํต์ฌํค์๋(Topic)๊ฐ ๋ฌธ์ฅ ์์ชฝ์ ๋ค์ด๊ฐ๋๋ก ์ ๋ชฉ์ ์์ฑํ๋ผ. | |
5. ์ฐธ๊ณ ๊ธ์ ๋ถ์ํ์ฌ ๋ ์๋ค์ด ๊ฑด๊ฐํ ์ํ์ ์ ์งํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋ผ. | |
""" | |
def get_outline_prompt(category): | |
if (category == "์ผ๋ฐ"): | |
return """ | |
#๋ธ๋ก๊ทธ ์์ฃผ์ (Subtitle) ์์ฑ ๊ท์น | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '์ ๋ณด์ฑ(Informative)' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
4. ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[์์ฃผ์ ์์ฑ๊ท์น] | |
1. [๊ธฐ๋ณธ๊ท์น]์ ๊ธฐ๋ณธ ์ ์ฉํ๋ผ. | |
2. ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๊ธฐ ์ํ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
3. ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ๊ณผ ๋ธ๋ก๊ทธ ์ฃผ์ , ์ ๋ชฉ์ ๋ฐํ์ผ๋ก ํต์ฌ ์ฃผ์ ๋ฅผ ํ์ ํ์ฌ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
4. ์ ์ฒด ๋งฅ๋ฝ์ ๋ง๊ฒ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
5. ์์ ๋ชฉ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก 20์ ๋ด์ธ๋ก ์์ฑํ๋ผ. | |
6. ๋ ์๊ฐ ์ป๊ณ ์ ํ๋ ์ ๋ณด์ ํฅ๋ฏธ๋ก์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
7. ์์ฃผ์ ์ ๋ณธ๋ก ์ ๋ด์ฉ์ด ์ถฉ๋ถํ ์์ฑ๋ ์ ์๋ ์์ฃผ์ ๋ก ์ค์ ํ๋ผ. | |
8. ๋ฐ๋์ [์์ฃผ์ ๊ตฌ์ฑ]์ ๋ง๊ฒ ์ถ๋ ฅํ๋ผ. | |
##[์์ฃผ์ ๊ตฌ์ฑ] | |
1. ๋ฐ๋์ [๋์ ๋ถ] - 1๊ฐ, [๋ณธ๋ก 1~5] - 5๊ฐ, [๊ฒฐ๋ก ] - 1๊ฐ๋ก ๊ตฌ์ฑํ์ฌ ์ถ๋ ฅํ๋ผ. | |
2. ๋ฐ๋์ [๋์ ๋ถ]์ [๊ฒฐ๋ก ]์ ์ ๋ชฉ์ด ์ค๋ณต๋์ง ์๋๋ก ์์ฑํ๋ผ. | |
""" | |
elif (category == "๊ฑด๊ฐ ์ํ"): | |
return """ | |
#๋ธ๋ก๊ทธ ์์ฃผ์ (Subtitle) ์์ฑ ๊ท์น(๊ฑด๊ฐ ์ํ) | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '๊ฑด๊ฐ, ์ํ ์ ๋ณด' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํฐ์ด๋ค. | |
4. ์ ํํ๊ณ ์ ๋ฌธ์ ์ธ ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[์์ฃผ์ ์์ฑ๊ท์น] | |
1. [๊ธฐ๋ณธ๊ท์น]์ ๊ธฐ๋ณธ ์ ์ฉํ๋ผ. | |
2. ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๊ธฐ ์ํ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
3. ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ๊ณผ ๋ธ๋ก๊ทธ ์ฃผ์ , ์ ๋ชฉ์ ๋ฐํ์ผ๋ก ํต์ฌ ์ฃผ์ ๋ฅผ ํ์ ํ์ฌ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
4. ์ ์ฒด ๋งฅ๋ฝ์ ๋ง๊ฒ ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
5. ์์ ๋ชฉ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก 20์ ๋ด์ธ๋ก ์์ฑํ๋ผ. | |
6. ๋ ์๊ฐ ์ป๊ณ ์ ํ๋ ์ ํํ ์ ๋ณด์ ๊ฑด๊ฐํ ์ํ์ ์ ์งํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์์ฃผ์ ๋ฅผ ์์ฑํ๋ผ. | |
7. ์์ฃผ์ ์ ๋ณธ๋ก ์ ๋ด์ฉ์ด ์ถฉ๋ถํ ์์ฑ๋ ์ ์๋ ์์ฃผ์ ๋ก ์ค์ ํ๋ผ. | |
8. ๋ฐ๋์ [์์ฃผ์ ๊ตฌ์ฑ]์ ๋ง์ถฐ ์์ฃผ์ ๋ง ์ถ๋ ฅํ๋ผ. | |
##[์์ฃผ์ ๊ตฌ์ฑ] | |
1. ๋ฐ๋์ [๋์ ๋ถ] - 1๊ฐ, [๋ณธ๋ก 1~5] - 5๊ฐ, [๊ฒฐ๋ก ] - 1๊ฐ๋ก ๊ตฌ์ฑํ์ฌ ์ถ๋ ฅํ๋ผ. | |
2. ๋ฐ๋์ [๋์ ๋ถ]์ [๊ฒฐ๋ก ]์ ์ ๋ชฉ์ด ์ค๋ณต๋์ง ์๋๋ก ์์ฑํ๋ผ. | |
""" | |
def get_blog_post_prompt(category): | |
if (category == "์ผ๋ฐ"): | |
return """ | |
#๋ธ๋ก๊ทธ ํ ์คํธ ์์ฑ ๊ท์น | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '์ ๋ณด์ฑ(Informative)' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
4. ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[ํ ์คํธ ์์ฑ ๊ท์น] | |
1. ๋ฐ๋์ ์ ๋ ฅ๋ [์์ฃผ์ ]์ ๋ง๊ฒ ํ ์คํธ๋ฅผ ์์ฑํ๋ผ. | |
2. ์์ฃผ์ ์ [๋ณธ๋ก ] 5๊ฐ๋ฅผ ๊ฐ๊ฐ 350์ ์ด์์ผ๋ก ์์ฑํ๋ผ. | |
3. ๋ฐ๋์ ์ ์ฒด๊ธ์ด 2100์ ์ด์ ๋๋๋ก ์์ฑํ๋ผ. | |
4. ์ ์ฒด ๋งฅ๋ฝ์ ์ดํดํ๊ณ ๋ฌธ์ฅ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ผ. | |
5. ์ฃผ์ ์ ๋ง๋ ๋๋ค์, ํ๋ฅด์๋๋ฅผ ์ ์ฉํ์ฌ ์์ฑํ๋ผ. | |
6. ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ์ ์ดํฌ๋ฅผ ๋ฐ์ํ๋, [ํฌ์คํ ์คํ์ผ]์ ๋ง๊ฒ ์ ์ฉํ๋ผ. | |
7. ์ ๋๋ก ์ฐธ๊ณ ๊ธ์ ํ๋ฌธ์ฅ ์ด์ ๊ทธ๋๋ก ์ถ๋ ฅํ์ง ๋ง ๊ฒ. | |
8. ์ฃผ์ ์ ์ํฉ์ ๋ง๋ ์ ์ ํ ์ดํ๋ฅผ ์ ํํ๋ผ. | |
9. ํ๊ธ ์ดํ์ ๋์ด๋๋ ์ฝ๊ฒ ์์ฑํ๋ผ. | |
""" | |
elif (category == "๊ฑด๊ฐ ์ํ"): | |
return """ | |
#๋ธ๋ก๊ทธ ํ ์คํธ ์์ฑ ๊ท์น(๊ฑด๊ฐ ์ํ) | |
##[๊ธฐ๋ณธ๊ท์น] | |
1. ๋ฐ๋์ ํ๊ตญ์ด(ํ๊ธ)๋ก ์์ฑํ๋ผ. | |
2. ๋๋ ๊ฐ์ฅ ์ฃผ๋ชฉ๋ฐ๋ ๋ง์ผํฐ์ด๋ฉฐ ๋ธ๋ก๊ทธ ๋ง์ผํ ์ ๋ฌธ๊ฐ์ด๋ค. | |
3. ํนํ ๋๋ '๊ฑด๊ฐ, ์ํ ์ ๋ณด' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํฐ์ด๋ค. | |
4. ์ ํํ๊ณ ์ ๋ฌธ์ ์ธ ์ ๋ณด ์ ๊ณต์ ์ด์ ์ ๋ง์ถ์ด ์์ฑํ๋ค. | |
##[ํ ์คํธ ์์ฑ ๊ท์น] | |
1. ๋ฐ๋์ ์ ๋ ฅ๋ [์์ฃผ์ ]์ ๋ง์ถฐ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ผ. | |
2. ๋ฐ๋์ ์ ๋ ฅ๋ [์์ฃผ์ ]๋ ๋ณ๊ฒฝํ์ง ๋ง๊ณ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ผ. | |
3. ์์ฃผ์ ์ [๋์ ๋ถ]๋ ๊ฐ๋ณ๊ฒ ์์ฑํ๋ ๊ณต๊ฐ๊ณผ ํฅ๋ฏธ, ๋ฌธ์ ์ ๊ธฐ, ๊ธ์ ๋ชฉ์ , ๋ณธ๋ฌธ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋ ์ ํ๋ฌธ์ฅ๋ฑ์ ์ถ๋ ฅํ๋ผ. | |
4. ์์ฃผ์ ์ [๋ณธ๋ก ] 5๊ฐ์ ๋ด์ฉ์ด ๊ฐ๊ฐ 350์ ์ด์์ด ๋๋๋ก ์์ฑํ๋ผ. | |
5. ๋ฐ๋์ ์ ์ฒด๊ธ์ด 2100์ ์ด์์ด ๋๋๋ก ์์ฑํ๋ผ. | |
6. ์ ์ฒด ๋งฅ๋ฝ์ ์ดํดํ๊ณ ๋ฌธ์ฅ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์์ฃผ์ ์ ๋ด์ฉ์ด ์ค๋ณต๋์ง ์๋๋ก ์์ฑํ๋ผ. | |
7. ์ฐธ๊ณ ๊ธ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋ง๋ ๋๋ค์, ํ๋ฅด์๋๋ฅผ ์ ์ฉํ์ฌ ์์ฑํ๋ผ. | |
8. ์ดํฌ๋ ์ ๊ณต๋ ์ฐธ๊ณ ๊ธ์ ์ดํฌ๋ฅผ ๋ฐ์ํ๋, '๊ฑด๊ฐ, ์ํ ์ ๋ณด' ์ ๋ฌธ ๋ธ๋ก๊ทธ ๋ง์ผํฐ๋ก์ ์์ฑํ๋ผ. | |
9. ์ ๋๋ก ์ฐธ๊ณ ๊ธ์ ํ๋ฌธ์ฅ ์ด์ ๊ทธ๋๋ก ์ถ๋ ฅํ์ง ๋ง ๊ฒ. | |
10. ์ฃผ์ ์ ์ํฉ์ ๋ง๋ ์ ์ ํ ์ดํ๋ฅผ ์ ํํ๋ผ. | |
###[์ ๋ณด์ฑ ๋ธ๋ก๊ทธ ์์ฑ ๊ท์น] | |
1. ๋ ์๊ฐ ์ป๊ณ ์ ํ๋ ์ ํํ ์ ๋ณด์ ๊ฑด๊ฐํ ์ํ์ ์ ์งํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์์ฃผ์ ์ ๋ง๊ฒ ๋ด์ฉ์ ์์ฑํ๋ผ. | |
2. ๋ ์์ ๊ณต๊ฐ์ ์ด๋์ด๋ด๊ณ ๊ถ๊ธ์ฆ์ ํด๊ฒฐํ๋๋ก ์์ฑํ๋ผ. | |
3. ๋ ์์ ๊ด์ฌ์ฌ๋ฅผ ์ถฉ์กฑ์ํค๋๋ก ์์ฑํ๋ผ. | |
4. ๋ ์์๊ฒ ์ด๋์ด ๋๋ ์ ๋ณด๋ฅผ ์์ฑํ๋ผ. | |
##[์ ์ธ ๊ท์น] | |
1. ๋ฐ๋์ ์ฐธ๊ณ ๊ธ์ ๋งํฌ(URL)๋ ์ ์ธํ๋ผ. | |
2. ์ฐธ๊ณ ๊ธ์์ '๋งํฌ๋ฅผ ํ์ธํด์ฃผ์ธ์'์ ๊ฐ์ ๋งํฌ ์ด๋์ ๋ฌธ๊ตฌ๋ ์ ์ธํ๋ผ. | |
3. ์ฐธ๊ณ ๊ธ์ ์๋ ์์ฑ์, ํ์, ์ ํ๋ฒ, ๊ธฐ์(Writer, speaker, YouTuber, reporter)์ ์ด๋ฆ, ์ ์นญ, ๋๋ค์(Name, Nkickname)์ ๋ฐ๋์ ์ ์ธํ๋ผ. | |
""" | |
# Gradio ์ธํฐํ์ด์ค ๊ตฌ์ฑ | |
title = "์นดํ ๊ณ ๋ฆฌ๋ณ ๋ธ๋ก๊ทธ ๊ธ ์์ฑ๊ธฐ(TestV.)" | |
def update_prompts(category): | |
title_prompt = get_title_prompt(category) | |
outline_prompt = get_outline_prompt(category) | |
blog_post_prompt = get_blog_post_prompt(category) | |
return title_prompt, outline_prompt, blog_post_prompt | |
with gr.Blocks() as demo: | |
gr.Markdown(f"# {title}") | |
# 1๋จ๊ณ | |
gr.Markdown("### 1๋จ๊ณ : ํฌ์คํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ง์ ํด์ฃผ์ธ์") | |
category = gr.Radio(choices=["์ผ๋ฐ", "๊ฑด๊ฐ ์ํ"], label="ํฌ์คํ ์นดํ ๊ณ ๋ฆฌ", value="์ผ๋ฐ") | |
# 2๋จ๊ณ | |
gr.Markdown("### 2๋จ๊ณ : ๋ธ๋ก๊ทธ ์ฃผ์ , ๋๋ ํค์๋๋ฅผ ์์ธํ ์ ๋ ฅํ์ธ์") | |
topic = gr.Textbox(label="๋ธ๋ก๊ทธ ์ฃผ์ (์์: ์ค์ง์ด ๋ฌด์นจํ(X), ์ค์ง์ด ๋ฌด์นจํ ๋ ์ํผ(O))", placeholder="์์: ์ฌํ์ง ์ถ์ฒ(X), 8์ ๊ตญ๋ด ์ฌํ์ง ์ถ์ฒ(O)") | |
# 3๋จ๊ณ: ์ฐธ๊ณ ๊ธ์ ์ํ ๋ณ์๋ค ๋ฏธ๋ฆฌ ์ ์ | |
references1 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 1", placeholder="์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ ํฌ์คํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10, visible=False) | |
references2 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 2", placeholder="์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ ํฌ์คํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10, visible=False) | |
references3 = gr.Textbox(label="์ฐธ๊ณ ๊ธ 3", placeholder="์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ ํฌ์คํ ๊ธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์", lines=10, visible=False) | |
# ์งํ ์ํฉ ํ์๋ฅผ ์ํ ์ถ๋ ฅ ํ ์คํธ๋ฐ์ค | |
progress_output = gr.Textbox(label="์งํ ์ํฉ", lines=2, visible=True) | |
# ์ฐธ๊ณ ๊ธ ๊ฐ์ ธ์ค๊ธฐ ๋ฒํผ | |
fetch_references_btn = gr.Button("์ฐธ๊ณ ๊ธ ์์ฑํ๊ธฐ") | |
fetch_references_btn.click(fn=fetch_references, inputs=[topic], outputs=[progress_output, references1, references2, references3]) | |
# ์ฐธ๊ณ ๊ธ ๋ค์ ๋ฃ๊ธฐ ๋ฒํผ | |
refill_btn = gr.Button("์ฐธ๊ณ ๊ธ ๋ค์ ๋ฃ๊ธฐ") | |
refill_btn.click(fn=fetch_references, inputs=[topic], outputs=[progress_output, references1, references2, references3]) | |
# 5๋จ๊ณ: ๋ธ๋ก๊ทธ ์ ๋ชฉ์ ์ ๋ ฅํ์ธ์ | |
gr.Markdown("### 5๋จ๊ณ : ๋ธ๋ก๊ทธ ์ ๋ชฉ์ ์ ๋ ฅํ์ธ์") | |
with gr.Accordion("์ ๋ชฉ ์ค์ ", visible=False): | |
title_system_message = gr.Textbox(label="์์คํ ๋ฉ์์ง", value=get_title_prompt("์ผ๋ฐ"), lines=15) | |
title_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=5000, step=1000) | |
title_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1) | |
title_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05) | |
title_btn = gr.Button("์ ๋ชฉ ์ถ์ฒํ๊ธฐ") | |
title_suggestions = gr.Textbox(label="์ ๋ชฉ ์ถ์ฒ", lines=10) | |
title_btn.click(fn=suggest_title, inputs=[category, topic, references1, references2, references3, title_system_message, title_max_tokens, title_temperature, title_top_p], outputs=[title_suggestions]) | |
gr.HTML("<span style='color: grey;'>[์ ๋ชฉ ์ถ์ฒ ํญ๋ชฉ์ ์ฐธ๊ณ ํ์ฌ ํ๋๋ฅผ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค.]</span>") | |
blog_title = gr.Textbox(label="๋ธ๋ก๊ทธ ์ ๋ชฉ", placeholder="๋ธ๋ก๊ทธ ์ ๋ชฉ์ ์ ๋ ฅํด์ฃผ์ธ์") | |
# 6๋จ๊ณ: ์์๋ผ์ธ์ ์ ํด์ฃผ์ธ์ | |
gr.Markdown("### 6๋จ๊ณ : ์์๋ผ์ธ์ ์์ฑํด์ฃผ์ธ์") | |
gr.HTML("<span style='color: grey;'>[์์๋ผ์ธ์์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ์์ ํด์ ์ฌ์ฉํด์ฃผ์ธ์]</span>") | |
with gr.Accordion("์์๋ผ์ธ ์ค์ ", visible=False): | |
outline_system_message = gr.Textbox(label="์์คํ ๋ฉ์์ง", value=get_outline_prompt("์ผ๋ฐ"), lines=20) | |
outline_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=6000, step=1000) | |
outline_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1) | |
outline_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05) | |
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, topic, references1, references2, references3, blog_title, outline_system_message, outline_max_tokens, outline_temperature, outline_top_p], outputs=[outline_result]) | |
# 7๋จ๊ณ: ๊ธ ์์ฑํ๊ธฐ | |
gr.Markdown("### 7๋จ๊ณ : ๊ธ ์์ฑํ๊ธฐ") | |
gr.HTML("<span style='color: grey;'>[์์๋ผ์ธ ๋ณ ํ ์คํธ๋์ ์ ํ๊ณ ๊ธ ์์ฑํ๊ธฐ ๋ฒํผ์ ์ ํํด์ฃผ์ธ์]</span>") | |
with gr.Accordion("๋ธ๋ก๊ทธ ๊ธ ์ค์ ", visible=False): | |
blog_system_message = gr.Textbox(label="์์คํ ๋ฉ์์ง", value=get_blog_post_prompt("์ผ๋ฐ"), lines=20) | |
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("๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ") | |
output = gr.Textbox(label="์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ", lines=30) | |
generate_btn.click(fn=generate_blog_post, inputs=[category, topic, references1, references2, references3, blog_title, outline_input, blog_system_message, blog_max_tokens, blog_temperature, blog_top_p], outputs=[output]) | |
category.change(fn=update_prompts, inputs=category, outputs=[title_system_message, outline_system_message, blog_system_message]) | |
demo.launch() | |