Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import openai
|
| 4 |
+
import requests
|
| 5 |
+
import logging
|
| 6 |
+
|
| 7 |
+
# ๋ก๊น
์ค์
|
| 8 |
+
logging.basicConfig(level=logging.INFO)
|
| 9 |
+
logger = logging.getLogger(__name__)
|
| 10 |
+
|
| 11 |
+
# OpenAI API ํด๋ผ์ด์ธํธ ์ค์
|
| 12 |
+
openai.api_key = os.getenv("OPENAI_API_KEY")
|
| 13 |
+
|
| 14 |
+
# ์์ฒญ์ฌํญ์ ๋ฐ๋ผ ์นดํ
๊ณ ๋ฆฌ ์์
|
| 15 |
+
CATEGORIES = [
|
| 16 |
+
"๊ณตํฌ ๋ง์ผํ
",
|
| 17 |
+
"์คํ ๋ฆฌํ
๋ง"
|
| 18 |
+
]
|
| 19 |
+
|
| 20 |
+
def get_category_prompt(category):
|
| 21 |
+
if category == "๊ณตํฌ ๋ง์ผํ
":
|
| 22 |
+
return """
|
| 23 |
+
# ๊ณตํฌ ๋ง์ผํ
์นดํผ๋ผ์ดํ
์์ฑ ๊ท์น
|
| 24 |
+
1. ๋ฐ๋์ ํ๊ธ๋ก ์ถ๋ ฅํ๋ผ.
|
| 25 |
+
2. ๋๋ ์ธ๊ณ ์ต๊ณ ์ ๊ณตํฌ ๋ง์ผํ
์นดํผ๋ผ์ดํฐ์ด๋ค.
|
| 26 |
+
3. ๋ฐ๋์ ์นดํผ๋ผ์ดํ
์ 30์ ์ด๋ด๋ก ์์ฑํ๊ณ , 10๊ฐ๋ง ์ถ๋ ฅํ๋ผ.(๋ค๋ฅธ ๋ด์ฉ ์ถ๋ ฅ ๊ธ์ง)
|
| 27 |
+
4. ๋ฐ๋์ ์
๋ ฅ๋ ์ฃผ์ ๋ก๋ง ์์ฑํ๊ณ ์์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ด์ฉ์ ๋ณด๊ฐํ๋ผ.
|
| 28 |
+
5. ๋ฐ๋์ 1 ๋ถํฐ 10๊น์ง ๋ฒํธ(๋ฆฌ์คํธํํ)๋ฅผ ๊ฐ์ด ์ถ๋ ฅํ๋ผ
|
| 29 |
+
6. ์ฌ๋๋ค์๊ฒ ๋๋ ค์์ ์ฃผ๋ฉด์, ๋์์ ์ ํ์ด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ ์ด์ ๋ฅผ ๊ฐํ๊ฒ ์ดํํ๋ผ.
|
| 30 |
+
7. ์ฌ์ฉํ์ง ์์ ๋์ ์ํ์ด๋ ์์ค์ ๊ฐ์กฐํ๋ผ.
|
| 31 |
+
8. ๊ฐ์ ์ ์ธ ๋จ์ด์ ํํ์ ์ฌ์ฉํ์ฌ ๋
์์ ๋ถ์์ ์ฆํญ์ํค๋ผ
|
| 32 |
+
9. ์ ํ/์๋น์ค์ ์ค์์ฑ๊ณผ ๊ทธ๊ฒ์ด ์์ ๋์ ๊ทน๋จ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ๋ผ.
|
| 33 |
+
์์:
|
| 34 |
+
- ์ค์ฟผํธ ํ ๋ ์ด ๋์ ํ๋ฉด ๋ฌด๋ฆ ๋ถ์ ์ต๋๋ค
|
| 35 |
+
- ์ฑ
์ ์ฝ๋ ์ฌ๋์ด ๊ฐ๋ํ ํ๋ฅ 98%์ธ ์ด์
|
| 36 |
+
- ์ ์ ํ์ ์ถ์ํ ๋ ์คํจํ๋ 7 ๊ฐ์ง ์น๋ช
์ ์ค์
|
| 37 |
+
- ์์
๋ฏธ๋์ด๋ฅผ ์๋ชป ์ฌ์ฉํ๋ฉด ๊ธฐ์
์ด ๋งํ ์ ์๋ ์ด์
|
| 38 |
+
- ์ด ์ฑ ์ ์ฐ๋ฉด ํดํน ๋นํ ํ๋ฅ 80% ์ฆ๊ฐ
|
| 39 |
+
- ์ด ๋ณดํ ์์ผ๋ฉด ์ฌ๊ณ ์ ํ์ฐ ์๊ธฐ ์จ๋ค
|
| 40 |
+
- ์ถฉ๊ฒฉ! ์ด ์ ํฌ๋ฆผ ์ ๋ฐ๋ฅด๋ฉด ํผ๋ถ์ ์ํ 500% ์ฆ๊ฐ
|
| 41 |
+
- ๊ฐ์ต๊ธฐ 2์ผ๋ง ๊ด๋ฆฌํ์ง ์์๋ "์ธ๊ท ๋ฒ๋ฒ
"
|
| 42 |
+
- ๋ฐ๋ค ํ๊ฒฝ์ค์ผ, ์ํ์ผ๋ก ๋๋์์จ๋ค. ํ๋ผ์คํฑ ์ฌ์ฉ ์ด๋๋ก ๊ด์ฐฎ์๊ฐ์?
|
| 43 |
+
- "๋งฅ์ฃผ ํ์์ด๋ผ๋ ๋ ๋ง๋ค ์ ์ด ๋ก๊ธด๋ค๋ฉด? ์ด๊ฒ ์์ฌํด์ผ"
|
| 44 |
+
"""
|
| 45 |
+
|
| 46 |
+
elif category == "์คํ ๋ฆฌํ
๋ง":
|
| 47 |
+
return """
|
| 48 |
+
# ์คํ ๋ฆฌํ
๋ง ์นดํผ๋ผ์ดํ
์์ฑ ๊ท์น
|
| 49 |
+
1. ๋ฐ๋์ ํ๊ธ๋ก ์ถ๋ ฅํ๋ผ.
|
| 50 |
+
2. ๋๋ ์ธ๊ณ ์ต๊ณ ์ ์คํ ๋ฆฌํ
๋ง ๋ง์ผํ
์นดํผ๋ผ์ดํฐ์ด๋ค.
|
| 51 |
+
3. ๋ฐ๋์ ์นดํผ๋ผ์ดํ
์ 30์ ์ด๋ด๋ก ์์ฑํ๊ณ , 10๊ฐ๋ง ์ถ๋ ฅํ๋ผ.(๋ค๋ฅธ ๋ด์ฉ ์ถ๋ ฅ ๊ธ์ง)
|
| 52 |
+
4. ๋ฐ๋์ ์
๋ ฅ๋ ์ฃผ์ ๋ก๋ง ์์ฑํ๊ณ ์์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ด์ฉ์ ๋ณด๊ฐํ๋ผ.
|
| 53 |
+
5. ๋ฐ๋์ 1 ๋ถํฐ 10๊น์ง ๋ฒํธ(๋ฆฌ์คํธํํ)๋ฅผ ๊ฐ์ด ์ถ๋ ฅํ๋ผ
|
| 54 |
+
6. ์ ํ/์๋น์ค์ ๊ด๋ จ๋ ์งง๊ณ ํฅ๋ฏธ๋ก์ด ์ด์ผ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ผ.
|
| 55 |
+
7. ๊ณ ๊ฐ์ด ๊ณต๊ฐํ ์ ์๋ ์ํฉ์ด๋ ์บ๋ฆญํฐ๋ฅผ ์ค์ ํ๋ผ.
|
| 56 |
+
8. ์ด์ผ๊ธฐ๋ฅผ ํตํด ์ ํ/์๋น์ค์ ๊ฐ์น๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ ๋ฌํ๋ผ.
|
| 57 |
+
์์:
|
| 58 |
+
- ํ ์ด๋ถ์ ๊ฟ์์ ์์๋ ํ์ ์ ์ธ ๋์์ฅ๋น
|
| 59 |
+
- 100๋
๋ ๊ฐ์กฑ ๋ ์ํผ๋ก ๋ง๋ ์์ ์ผ
|
| 60 |
+
- ์ฐ์ฃผ ๋นํ์ฌ์ ์์ด๋์ด๋ก ํ์ํ ์ด๊ฒฝ๋ ์ฌํท
|
| 61 |
+
- ํ ๋จธ๋์ 100๋
๋ ๋น๋ฐ ๋ ์ํผ๋ก ๋ง๋ ๊ฑด๊ฐํ ์ง๋ฐฅ ๊ฐ์
|
| 62 |
+
- ํ๋ง๋ผ์ผ ๋ฑ์ฐ๊ฐ์ ๊ณ ๋ฏผ์์ ์์๋ ํ์ ์ ์ด๊ฒฝ๋ ๋ฐฐ๋ญ
|
| 63 |
+
- ๋ชฝ๊ณจ ์ ๋ชฉ๋ฏผ์ ์ฒ๋
์งํ๋ฅผ ๋ด์ ์นํ๊ฒฝ ์คํ ์บ ํ ํ
ํธ
|
| 64 |
+
- ๋ฐ๋ค๋ฅผ ์ฌ๋ํ ํด์์๋ฌผํ์์ ํ์ ์ ์ธ ํด์ ์ ํ ๊ธฐ์
|
| 65 |
+
- 20๋
๋ถ๋ฉด์ฆ ํ์๊ฐ ์ง์ ๊ฐ๋ฐํ ๊ฟ์ ์ ๋ ์ค๋งํธ ๋ฒ ๊ฐ
|
| 66 |
+
- ๊ธธ๊ณ ์์ด 100๋ง๋ฆฌ๋ฅผ ๊ตฌ์กฐํ ์์์ฌ์ ๋ฐ๋ ค๋๋ฌผ ๊ฑด๊ฐ๊ด๋ฆฌ ์ฑ
|
| 67 |
+
- ํ ์๋ ์ฅ์ ์ธ ํ๊ฐ์ ๊ฟ์ ์ด๋ค์ค ์ฒจ๋จ ๊ทธ๋ฆผ ๋๊ตฌ
|
| 68 |
+
"""
|
| 69 |
+
|
| 70 |
+
def call_api_sync(content, system_message, max_tokens, temperature, top_p):
|
| 71 |
+
response = requests.post(
|
| 72 |
+
"https://api.openai.com/v1/chat/completions",
|
| 73 |
+
headers={"Authorization": f"Bearer {openai.api_key}"},
|
| 74 |
+
json={
|
| 75 |
+
"model": "gpt-4o-mini",
|
| 76 |
+
"messages": [
|
| 77 |
+
{"role": "system", "content": system_message},
|
| 78 |
+
{"role": "user", "content": content},
|
| 79 |
+
],
|
| 80 |
+
"max_tokens": max_tokens,
|
| 81 |
+
"temperature": temperature,
|
| 82 |
+
"top_p": top_p,
|
| 83 |
+
}
|
| 84 |
+
)
|
| 85 |
+
result = response.json()
|
| 86 |
+
return result['choices'][0]['message']['content']
|
| 87 |
+
|
| 88 |
+
def generate_copywriting(categories, topic):
|
| 89 |
+
max_tokens = 1000
|
| 90 |
+
temperature = 0.8
|
| 91 |
+
top_p = 0.95
|
| 92 |
+
|
| 93 |
+
results = {}
|
| 94 |
+
for category in categories:
|
| 95 |
+
prompt = get_category_prompt(category)
|
| 96 |
+
user_content = f"์ฃผ์ : {topic}"
|
| 97 |
+
copywriting = call_api_sync(user_content, prompt, max_tokens, temperature, top_p)
|
| 98 |
+
results[category] = copywriting
|
| 99 |
+
return results
|
| 100 |
+
|
| 101 |
+
# Gradio ์ธํฐํ์ด์ค ๋ถ๋ถ
|
| 102 |
+
with gr.Blocks() as iface:
|
| 103 |
+
gr.Markdown("# AI ์นดํผ๋ผ์ดํ
์์ฑ๊ธฐ")
|
| 104 |
+
|
| 105 |
+
with gr.Column():
|
| 106 |
+
# ์ ํ ๊ธฐ๋ฅ ์ ๊ฑฐ
|
| 107 |
+
topic = gr.Textbox(lines=1, label="์ฃผ์ ๋ฅผ ์
๋ ฅํ์ธ์")
|
| 108 |
+
|
| 109 |
+
generate_btn = gr.Button("์นดํผ๋ผ์ดํ
์์ฑํ๊ธฐ")
|
| 110 |
+
|
| 111 |
+
status = gr.Markdown("์ค๋น๋จ")
|
| 112 |
+
|
| 113 |
+
output_boxes = {}
|
| 114 |
+
with gr.Column():
|
| 115 |
+
for category in CATEGORIES:
|
| 116 |
+
output_box = gr.Textbox(label=category, visible=True)
|
| 117 |
+
output_boxes[category] = output_box
|
| 118 |
+
|
| 119 |
+
def validate_and_generate(topic):
|
| 120 |
+
try:
|
| 121 |
+
results = generate_copywriting(CATEGORIES, topic)
|
| 122 |
+
logger.debug(f"Generated results: {results}")
|
| 123 |
+
|
| 124 |
+
outputs = []
|
| 125 |
+
for category in CATEGORIES:
|
| 126 |
+
if category in results:
|
| 127 |
+
outputs.append(gr.update(value=results[category]))
|
| 128 |
+
else:
|
| 129 |
+
outputs.append(gr.update(value=""))
|
| 130 |
+
|
| 131 |
+
return [gr.update(value="์นดํผ๋ผ์ดํ
์์ฑ์ด ์๋ฃ๋์์ต๋๋ค.")] + outputs
|
| 132 |
+
except Exception as e:
|
| 133 |
+
logger.error(f"Error during copywriting generation: {str(e)}")
|
| 134 |
+
return [gr.update(value=f"์ค๋ฅ ๋ฐ์: {str(e)}")] + [gr.update(value="") for _ in CATEGORIES]
|
| 135 |
+
|
| 136 |
+
generate_btn.click(
|
| 137 |
+
fn=validate_and_generate,
|
| 138 |
+
inputs=[topic],
|
| 139 |
+
outputs=[status] + [output_boxes[category] for category in CATEGORIES]
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
# ์ธํฐํ์ด์ค ์คํ
|
| 143 |
+
iface.launch()
|