SUHHHH commited on
Commit
b5c90b3
·
verified ·
1 Parent(s): 8dccd86

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +146 -71
app.py CHANGED
@@ -1,15 +1,12 @@
1
  import gradio as gr
2
  import openai
3
  import os
4
- import requests
5
- from bs4 import BeautifulSoup
6
- from gradio_client import Client
7
  from typing import Optional
 
8
 
9
- #############################
10
- # OpenAI API 클라이언트 설정
11
  #############################
12
 
 
13
  openai.api_key = os.getenv("OPENAI_API_KEY")
14
  if not openai.api_key:
15
  raise ValueError("OpenAI API 토큰(OPENAI_API_KEY)이 설정되지 않았습니다.")
@@ -21,6 +18,9 @@ def call_openai_api(
21
  temperature: float,
22
  top_p: float
23
  ) -> str:
 
 
 
24
  try:
25
  response = openai.ChatCompletion.create(
26
  model="gpt-4o-mini",
@@ -32,89 +32,164 @@ def call_openai_api(
32
  temperature=temperature,
33
  top_p=top_p,
34
  )
35
- return response.choices[0].message['content']
 
36
  except Exception as e:
37
- return f"오류 발생: {str(e)}"
38
 
39
  #############################
40
- # 네이버 블로그 스크래핑
41
  #############################
42
 
43
- def scrape_from_api(url: str) -> str:
44
- try:
45
- client = Client("Kims12/blog")
46
- result = client.predict(url=url, api_name="/predict")
47
- return result
48
- except Exception as e:
49
- return f"API 호출 오류: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  #############################
52
- # 블로그 생성기
53
  #############################
 
54
 
55
- def generate_blog(tone_value: str, topic_value: str, ref1_url: str, ref2_url: str, ref3_url: str) -> str:
56
- tone_messages = {
57
- "친근하게": "친근하고 편안한 대화 스타일로 작성합니다.",
58
- "일반적인": "중립적이고 깔끔한 스타일로 작성합니다.",
59
- "전문적인": "전문적이고 신뢰감을 주는 스타일로 작성합니다.",
60
- }
61
- tone_system_message = f"{tone_messages.get(tone_value, '')}\n"
62
-
63
- ref1_content = scrape_from_api(ref1_url)
64
- ref2_content = scrape_from_api(ref2_url)
65
- ref3_content = scrape_from_api(ref3_url)
66
-
67
- prompt = (
68
- f"말투: {tone_value}\n"
69
- f"주제: {topic_value}\n"
70
- f"참조글1: {ref1_content}\n"
71
- f"참조글2: {ref2_content}\n"
72
- f"참조글3: {ref3_content}\n"
73
  )
74
 
75
- return call_openai_api(
76
- content=prompt,
77
- system_message=tone_system_message,
78
- max_tokens=4000,
79
- temperature=0.7,
80
- top_p=0.95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  )
82
 
83
- #############################
84
- # UI 구성
85
- #############################
 
 
86
 
87
- with gr.Blocks() as demo:
88
- with gr.Tabs():
89
- with gr.TabItem("블로그 생성기"):
90
- gr.Markdown("# 블로그 생성기")
91
-
92
- tone_radio = gr.Radio(["친근하게", "일반적인", "전문적인"], label="말투 선택", value="일반적인")
93
- topic_input = gr.Textbox(label="주제 입력")
94
- ref1 = gr.Textbox(label="참조글 1 URL")
95
- ref2 = gr.Textbox(label="참조글 2 URL")
96
- ref3 = gr.Textbox(label="참조글 3 URL")
97
- output_box = gr.Textbox(label="생성된 블로그", lines=20, interactive=False)
98
-
99
- generate_button = gr.Button("생성하기")
100
- generate_button.click(
101
- fn=generate_blog,
102
- inputs=[tone_radio, topic_input, ref1, ref2, ref3],
103
- outputs=output_box
104
- )
105
 
106
- with gr.TabItem("참조글 API 테스트"):
107
- gr.Markdown("# 참조글 스크래핑 테스트")
 
 
 
 
 
 
 
108
 
109
- url_input = gr.Textbox(label="블로그 URL")
110
- api_output = gr.Textbox(label="스크래핑 결과", lines=20, interactive=False)
 
 
 
 
 
 
 
111
 
112
- scrape_button = gr.Button("스크래핑 실행")
113
- scrape_button.click(
114
- fn=scrape_from_api,
115
- inputs=url_input,
116
- outputs=api_output
117
- )
118
 
119
  if __name__ == "__main__":
120
  demo.launch()
 
 
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)이 설정되지 않았습니다.")
 
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",
 
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
+ client = Client("Kims12/blog")
80
 
81
+ #############################
82
+ # UI - 블로그 생성기
83
+ #############################
84
+ with gr.Blocks() as demo:
85
+ gr.Markdown("# 블로그 생성기")
86
+
87
+ # 말투바꾸기 (라디오 버튼)
88
+ tone_radio = gr.Radio(
89
+ label="말투바꾸기",
90
+ choices=["친근하게", "일반적인", "전문적인"],
91
+ value="일반적인" # 기본 선택
 
 
 
 
 
 
 
92
  )
93
 
94
+ # 참조글 ��력 (3개)과 API 실행 버튼
95
+ with gr.Row():
96
+ with gr.Column():
97
+ ref1 = gr.Textbox(label="참조글 1")
98
+ fetch_button1 = gr.Button("API 실행1")
99
+ with gr.Column():
100
+ ref2 = gr.Textbox(label="참조글 2")
101
+ fetch_button2 = gr.Button("API 실행2")
102
+ with gr.Column():
103
+ ref3 = gr.Textbox(label="참조글 3")
104
+ fetch_button3 = gr.Button("API 실행3")
105
+
106
+ output_box = gr.Textbox(label="결과", lines=20, interactive=False)
107
+
108
+ # 참조글1 API 실행 함수
109
+ def fetch_ref1(url: str) -> str:
110
+ if not url:
111
+ return "URL을 입력해주세요."
112
+ try:
113
+ result = client.predict(
114
+ url=url,
115
+ api_name="/predict"
116
+ )
117
+ return result
118
+ except Exception as e:
119
+ return f"오류가 발생했습니다: {str(e)}"
120
+
121
+ # 참조글2 API 실행 함수
122
+ def fetch_ref2(url: str) -> str:
123
+ if not url:
124
+ return "URL을 입력해주세요."
125
+ try:
126
+ result = 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
+ # 참조글3 API 실행 함수
135
+ def fetch_ref3(url: str) -> str:
136
+ if not url:
137
+ return "URL을 입력해주세요."
138
+ try:
139
+ result = 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
+ # 버튼 클릭 시 해당 참조글 API 실행
148
+ fetch_button1.click(
149
+ fn=fetch_ref1,
150
+ inputs=ref1,
151
+ outputs=ref1
152
  )
153
 
154
+ fetch_button2.click(
155
+ fn=fetch_ref2,
156
+ inputs=ref2,
157
+ outputs=ref2
158
+ )
159
 
160
+ fetch_button3.click(
161
+ fn=fetch_ref3,
162
+ inputs=ref3,
163
+ outputs=ref3
164
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
165
 
166
+ # 블로그 생성 함수
167
+ def generate_blog(tone_value: str, ref1_value: str, ref2_value: str, ref3_value: str) -> str:
168
+ # 프롬프트 생성
169
+ question = (
170
+ f"말투: {tone_value}\n"
171
+ f"참조글1: {ref1_value}\n"
172
+ f"참조글2: {ref2_value}\n"
173
+ f"참조글3: {ref3_value}\n"
174
+ )
175
 
176
+ # OpenAI GPT-4o-mini 모델 호출
177
+ response = call_openai_api(
178
+ content=question,
179
+ system_message=OPENAI_SYSTEM_MESSAGE,
180
+ max_tokens=OPENAI_MAX_TOKENS,
181
+ temperature=OPENAI_TEMPERATURE,
182
+ top_p=OPENAI_TOP_P
183
+ )
184
+ return response
185
 
186
+ generate_button = gr.Button("생성하기")
187
+ generate_button.click(
188
+ fn=generate_blog,
189
+ inputs=[tone_radio, ref1, ref2, ref3],
190
+ outputs=output_box
191
+ )
192
 
193
  if __name__ == "__main__":
194
  demo.launch()
195
+