Kims12 commited on
Commit
c96ecc0
ยท
verified ยท
1 Parent(s): f598c30

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +143 -0
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()