aliceblue11 commited on
Commit
845d9f2
·
verified ·
1 Parent(s): 6d81670

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +268 -0
app.py ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import openai
3
+ import os
4
+ from typing import Optional
5
+ from gradio_client import Client
6
+
7
+ #############################
8
+
9
+ # OpenAI API 클라이언트 설정
10
+ openai.api_key = os.getenv("OPENAI_API_KEY")
11
+ if not openai.api_key:
12
+ raise ValueError("OpenAI API 토큰(OPENAI_API_KEY)이 설정되지 않았습니다.")
13
+
14
+ def call_openai_api(
15
+ content: str,
16
+ system_message: str,
17
+ max_tokens: int,
18
+ temperature: float,
19
+ top_p: float
20
+ ) -> str:
21
+ """
22
+ OpenAI의 GPT-4o-mini 모델을 이용해 한 번의 질문(content)에 대한 답변을 반환하는 함수.
23
+ """
24
+ try:
25
+ response = openai.ChatCompletion.create(
26
+ model="gpt-4o-mini",
27
+ messages=[
28
+ {"role": "system", "content": system_message},
29
+ {"role": "user", "content": content},
30
+ ],
31
+ max_tokens=max_tokens,
32
+ temperature=temperature,
33
+ top_p=top_p,
34
+ )
35
+ assistant_message = response.choices[0].message['content']
36
+ return assistant_message
37
+ except Exception as e:
38
+ return f"오류가 발생했습니다: {str(e)}"
39
+
40
+ #############################
41
+ # 고급 설정 (OpenAI) - 코드에서만 정의 (UI에 노출 금지)
42
+ #############################
43
+
44
+ OPENAI_SYSTEM_MESSAGE = """반드시 한글로 답변할 것.
45
+ 너는 최고의 비서이다.
46
+ 내가 요구하는 것들을 최대한 자세하고 정확하게 답변하라.
47
+ ##[기본규칙]
48
+ 1. 반드시 한국어(한글)로 작성하라.
49
+ 2. 너는 가장 주목받는 마케터이며 블로그 마케팅 전문가이다.
50
+ 3. 특히 너는 '정보성(Informative)' 전문 블로그 마케팅 전문가이다.
51
+ 4. 정보 제공에 초점을 맞추어 작성한다.
52
+ ##[텍스트 작성 규칙]
53
+ 1. 소주제를 5개로 구분하여 2000자 이상되도록 작성하라.
54
+ 2. 전체 맥락을 이해하고 문장의 일관성을 유지하라.
55
+ 3. 절대로 참고글을 한문장 이상 그대로 출력하지 말 것.
56
+ 4. 주제와 상황에 맞는 적절한 어휘를 선택하라.
57
+ 5. 한글 어휘의 난이도는 쉽게 작성하라.
58
+ 6. 절대 문장의 끝에 '답니다'를 사용하지 말 것.
59
+ ###[정보성 블로그 작성 규칙]
60
+ 1. 독자가 얻고자 하는 유용한 정보와 흥미로운 정보를 제공하도록 작성하라.
61
+ 2. 독자의 공감을 이끌어내고 궁금증을 해결하도록 작성하라.
62
+ 3. 독자의 관심사를 충족시키도록 작성하라.
63
+ 4. 독자에게 이득이 되는 정보를 작성하라.
64
+ ##[제외 규칙]
65
+ 1. 반드시 비속어 및 욕설(expletive, abusive language, slang)은 제외하라.
66
+ 2. 반드시 참고글의 링크(URL)는 제외하라.
67
+ 3. 참고글에서 '링크를 확인해주세요'와 같은 링크 이동의 문구는 제외하라.
68
+ 4. 참고글에 있는 작성자, 화자, 유튜버, 기자의 이름, 애칭, 닉네임은 반드시 제외하라.
69
+ 5. 반드시 문장의 끝부분이 어색한 한국어 표현은 제외하라('예요', '답니다', '해요', '해주죠', '됐죠', '됐어요', '고요' 등.)
70
+ """
71
+
72
+ OPENAI_MAX_TOKENS = 4000
73
+ OPENAI_TEMPERATURE = 0.7
74
+ OPENAI_TOP_P = 0.95
75
+
76
+ #############################
77
+ # API 클라이언트 설정 (허깅페이스 스페이스)
78
+ #############################
79
+ blog_client = Client("Kims12/blog")
80
+ youtube_client = Client("Kims12/you")
81
+
82
+ #############################
83
+ # UI - 블로그 생성기
84
+ #############################
85
+ with gr.Blocks() as demo:
86
+ gr.Markdown("# 블로그 생성기")
87
+
88
+ # 말투바꾸기 (라디오 버튼)
89
+ tone_radio = gr.Radio(
90
+ label="말투바꾸기",
91
+ choices=["친근하게", "일반적인", "전문적인"],
92
+ value="일반적인" # 기본 선택
93
+ )
94
+
95
+ # 참조글 입력 (3개)과 API 실행 버튼
96
+ with gr.Row():
97
+ with gr.Column():
98
+ ref1 = gr.Textbox(label="참조글 1 (블로그 URL)")
99
+ fetch_button1 = gr.Button("API 실행1")
100
+ with gr.Column():
101
+ ref2 = gr.Textbox(label="참조글 2 (블로그 URL)")
102
+ fetch_button2 = gr.Button("API 실행2")
103
+ with gr.Column():
104
+ ref3 = gr.Textbox(label="참조글 3 (블로그 URL)")
105
+ fetch_button3 = gr.Button("API 실행3")
106
+
107
+ # 유튜브 대본 입력 (3개)과 API 실행 버튼
108
+ with gr.Row():
109
+ with gr.Column():
110
+ youtube1 = gr.Textbox(label="유튜브 URL 1")
111
+ fetch_youtube1 = gr.Button("유튜브 API 실행1")
112
+ with gr.Column():
113
+ youtube2 = gr.Textbox(label="유튜브 URL 2")
114
+ fetch_youtube2 = gr.Button("유튜브 API 실행2")
115
+ with gr.Column():
116
+ youtube3 = gr.Textbox(label="유튜브 URL 3")
117
+ fetch_youtube3 = gr.Button("유튜브 API 실행3")
118
+
119
+ output_box = gr.Textbox(label="결과", lines=20, interactive=False)
120
+
121
+ # 참조글1 블로그 API 실행 함수
122
+ def fetch_ref1(url: str) -> str:
123
+ if not url:
124
+ return "블로그 URL을 입력해주세요."
125
+ try:
126
+ result = blog_client.predict(
127
+ url=url,
128
+ api_name="/predict"
129
+ )
130
+ return result
131
+ except Exception as e:
132
+ return f"오류가 발생했습니다: {str(e)}"
133
+
134
+ # 참조글2 블로그 API 실행 함수
135
+ def fetch_ref2(url: str) -> str:
136
+ if not url:
137
+ return "블로그 URL을 입력해주세요."
138
+ try:
139
+ result = blog_client.predict(
140
+ url=url,
141
+ api_name="/predict"
142
+ )
143
+ return result
144
+ except Exception as e:
145
+ return f"오류가 발생했습니다: {str(e)}"
146
+
147
+ # 참조글3 블로그 API 실행 함수
148
+ def fetch_ref3(url: str) -> str:
149
+ if not url:
150
+ return "블로그 URL을 입력해주세요."
151
+ try:
152
+ result = blog_client.predict(
153
+ url=url,
154
+ api_name="/predict"
155
+ )
156
+ return result
157
+ except Exception as e:
158
+ return f"오류가 발생했습니다: {str(e)}"
159
+
160
+ # 유튜브1 대본 API 실행 함수
161
+ def fetch_youtube_ref1(url: str) -> str:
162
+ if not url:
163
+ return "유튜브 URL을 입력해주세요."
164
+ try:
165
+ result = youtube_client.predict(
166
+ youtube_url=url,
167
+ api_name="/predict"
168
+ )
169
+ return result
170
+ except Exception as e:
171
+ return f"오류가 발생했습니다: {str(e)}"
172
+
173
+ # 유튜브2 대본 API 실행 함수
174
+ def fetch_youtube_ref2(url: str) -> str:
175
+ if not url:
176
+ return "유튜브 URL을 입력해주세요."
177
+ try:
178
+ result = youtube_client.predict(
179
+ youtube_url=url,
180
+ api_name="/predict"
181
+ )
182
+ return result
183
+ except Exception as e:
184
+ return f"오류가 발생했습니다: {str(e)}"
185
+
186
+ # 유튜브3 대본 API 실행 함수
187
+ def fetch_youtube_ref3(url: str) -> str:
188
+ if not url:
189
+ return "유튜브 URL을 입력해주세요."
190
+ try:
191
+ result = youtube_client.predict(
192
+ youtube_url=url,
193
+ api_name="/predict"
194
+ )
195
+ return result
196
+ except Exception as e:
197
+ return f"오류가 발생했습니다: {str(e)}"
198
+
199
+ # 버튼 클릭 시 해당 참조글 블로그 API 실행
200
+ fetch_button1.click(
201
+ fn=fetch_ref1,
202
+ inputs=ref1,
203
+ outputs=ref1
204
+ )
205
+
206
+ fetch_button2.click(
207
+ fn=fetch_ref2,
208
+ inputs=ref2,
209
+ outputs=ref2
210
+ )
211
+
212
+ fetch_button3.click(
213
+ fn=fetch_ref3,
214
+ inputs=ref3,
215
+ outputs=ref3
216
+ )
217
+
218
+ # 버튼 클릭 시 해당 유튜브 대본 API 실행
219
+ fetch_youtube1.click(
220
+ fn=fetch_youtube_ref1,
221
+ inputs=youtube1,
222
+ outputs=youtube1
223
+ )
224
+
225
+ fetch_youtube2.click(
226
+ fn=fetch_youtube_ref2,
227
+ inputs=youtube2,
228
+ outputs=youtube2
229
+ )
230
+
231
+ fetch_youtube3.click(
232
+ fn=fetch_youtube_ref3,
233
+ inputs=youtube3,
234
+ outputs=youtube3
235
+ )
236
+
237
+ # 블로그 생성 함수
238
+ def generate_blog(tone_value: str, ref1_value: str, ref2_value: str, ref3_value: str, yt1: str, yt2: str, yt3: str) -> str:
239
+ # 프롬프트 생성
240
+ question = (
241
+ f"말투: {tone_value}\n"
242
+ f"참조글1: {ref1_value}\n"
243
+ f"참조글2: {ref2_value}\n"
244
+ f"참조글3: {ref3_value}\n"
245
+ f"유튜브 대본1: {yt1}\n"
246
+ f"유튜브 대본2: {yt2}\n"
247
+ f"유튜브 대본3: {yt3}\n"
248
+ )
249
+
250
+ # OpenAI GPT-4o-mini 모델 호출
251
+ response = call_openai_api(
252
+ content=question,
253
+ system_message=OPENAI_SYSTEM_MESSAGE,
254
+ max_tokens=OPENAI_MAX_TOKENS,
255
+ temperature=OPENAI_TEMPERATURE,
256
+ top_p=OPENAI_TOP_P
257
+ )
258
+ return response
259
+
260
+ generate_button = gr.Button("생성하기")
261
+ generate_button.click(
262
+ fn=generate_blog,
263
+ inputs=[tone_radio, ref1, ref2, ref3, youtube1, youtube2, youtube3],
264
+ outputs=output_box
265
+ )
266
+
267
+ if __name__ == "__main__":
268
+ demo.launch()