SUHHHH commited on
Commit
84e39e9
·
verified ·
1 Parent(s): 360f1c3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -103
app.py CHANGED
@@ -3,25 +3,16 @@ import openai
3
  import os
4
  import requests
5
  from typing import Optional
6
- from gradio_client import Client
7
 
8
  #############################
9
-
10
  # OpenAI API 클라이언트 설정
 
 
11
  openai.api_key = os.getenv("OPENAI_API_KEY")
12
  if not openai.api_key:
13
  raise ValueError("OpenAI API 토큰(OPENAI_API_KEY)이 설정되지 않았습니다.")
14
 
15
- def call_openai_api(
16
- content: str,
17
- system_message: str,
18
- max_tokens: int,
19
- temperature: float,
20
- top_p: float
21
- ) -> str:
22
- """
23
- OpenAI의 GPT-4o-mini 모델을 이용해 한 번의 질문(content)에 대한 답변을 반환하는 함수.
24
- """
25
  try:
26
  response = openai.ChatCompletion.create(
27
  model="gpt-4o-mini",
@@ -33,114 +24,69 @@ def call_openai_api(
33
  temperature=temperature,
34
  top_p=top_p,
35
  )
36
- assistant_message = response.choices[0].message['content']
37
- return assistant_message
38
  except Exception as e:
39
- return f"오류가 발생했습니다: {str(e)}"
40
 
41
  #############################
42
- # 고급 설정 (OpenAI) - 코드에서만 정의 (UI에 노출 금지)
43
  #############################
44
 
45
- OPENAI_SYSTEM_MESSAGE = """반드시 한글로 답변할 것.
46
- 너는 최고의 비서이다.
47
- 내가 요구하는 것들을 최대한 자세하고 정확하게 답변하라.
48
- ##[기본규칙]
49
- 1. 반드시 한국어(한글)로 작성하라.
50
- 2. 너는 가장 주목받는 마케터이며 블로그 마케팅 전문가이다.
51
- 3. 특히 너는 '정보성(Informative)' 전문 블로그 마케팅 전문가이다.
52
- 4. 정보 제공에 초점을 맞추어 작성한다.
53
- ##[텍스트 작성 규칙]
54
- 1. 소주제를 5개로 구분하여 2000자 이상되도록 작성하라.
55
- 2. 전체 맥락을 이해하고 문장의 일관성을 유지하라.
56
- 3. 절대로 참고글을 한문장 이상 그대로 출력하지 말 것.
57
- 4. 주제와 상황에 맞는 적절한 어휘를 선택하라.
58
- 5. 한글 어휘의 난이도는 쉽게 작성하라.
59
- 6. 절대 문장의 끝에 '답니다'를 사용하지 말 것.
60
- ###[정보성 블로그 작성 규칙]
61
- 1. 독자가 얻고자 하는 유용한 정보와 흥미로운 정보를 제공하도록 작성하라.
62
- 2. 독자의 공감을 이끌어내고 궁금증을 해결하도록 작성하라.
63
- 3. 독자의 관심사를 충족시키도록 작성하라.
64
- 4. 독자에게 이득이 되는 정보를 작성하라.
65
- ##[제외 규칙]
66
- 1. 반드시 비속어 및 욕설(expletive, abusive language, slang)은 제외하라.
67
- 2. 반드시 참고글의 링크(URL)는 제외하라.
68
- 3. 참고글에서 '링크를 확인해주세요'와 같은 링크 이동의 문구는 제외하라.
69
- 4. 참고글에 있는 작성자, 화자, 유튜버, 기자의 이름, 애칭, 닉네임은 반드시 제외하라.
70
- 5. 반드시 문장의 끝부분이 어색한 한국어 표현은 제외하라('예요', '답니다', '해요', '해주죠', '됐죠', '됐어요', '고요' 등.)
71
- """
72
-
73
- OPENAI_MAX_TOKENS = 4000
74
- OPENAI_TEMPERATURE = 0.7
75
- OPENAI_TOP_P = 0.95
76
 
77
  #############################
78
- # API 클라이언트 설정 (허깅페이스 스페이스)
79
  #############################
80
- client = Client("Kims12/blog")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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")
99
- fetch_button1 = gr.Button("참조글 1 API 실행")
100
- fetch_button1.click(
101
- fn=lambda url: client.predict(url=url, api_name="/predict") if url else "URL을 입력해주세요.",
102
- inputs=ref1,
103
- outputs=ref1
104
- )
105
- with gr.Column():
106
- ref2 = gr.Textbox(label="참조글 2")
107
- fetch_button2 = gr.Button("참조글 2 API 실행")
108
- fetch_button2.click(
109
- fn=lambda url: client.predict(url=url, api_name="/predict") if url else "URL을 입력해주세요.",
110
- inputs=ref2,
111
- outputs=ref2
112
- )
113
- with gr.Column():
114
- ref3 = gr.Textbox(label="참조글 3")
115
- fetch_button3 = gr.Button("참조글 3 API 실행")
116
- fetch_button3.click(
117
- fn=lambda url: client.predict(url=url, api_name="/predict") if url else "URL을 입력해주세요.",
118
- inputs=ref3,
119
- outputs=ref3
120
- )
121
 
122
- output_box = gr.Textbox(label="결과", lines=20, interactive=False)
 
 
 
123
 
124
- # 블로그 생성 함수
125
- def generate_blog(tone_value: str, ref1_value: str, ref2_value: str, ref3_value: str) -> str:
126
- # 프롬프트 생성
127
- question = (
128
- f"말투: {tone_value}\n"
129
- f"참조글1: {ref1_value}\n"
130
- f"참조글2: {ref2_value}\n"
131
- f"참조글3: {ref3_value}\n"
132
- )
133
-
134
- # OpenAI GPT-4o-mini 모델 호출
135
- response = call_openai_api(
136
- content=question,
137
- system_message=OPENAI_SYSTEM_MESSAGE,
138
- max_tokens=OPENAI_MAX_TOKENS,
139
- temperature=OPENAI_TEMPERATURE,
140
- top_p=OPENAI_TOP_P
141
- )
142
- return response
143
 
 
144
  generate_button = gr.Button("생성하기")
145
  generate_button.click(
146
  fn=generate_blog,
 
3
  import os
4
  import requests
5
  from typing import Optional
 
6
 
7
  #############################
 
8
  # OpenAI API 클라이언트 설정
9
+ #############################
10
+
11
  openai.api_key = os.getenv("OPENAI_API_KEY")
12
  if not openai.api_key:
13
  raise ValueError("OpenAI API 토큰(OPENAI_API_KEY)이 설정되지 않았습니다.")
14
 
15
+ def call_openai_api(content: str, system_message: str, max_tokens: int, temperature: float, top_p: float) -> str:
 
 
 
 
 
 
 
 
 
16
  try:
17
  response = openai.ChatCompletion.create(
18
  model="gpt-4o-mini",
 
24
  temperature=temperature,
25
  top_p=top_p,
26
  )
27
+ return response.choices[0].message['content']
 
28
  except Exception as e:
29
+ return f"오류 발생: {str(e)}"
30
 
31
  #############################
32
+ # API 요청 함수
33
  #############################
34
 
35
+ def fetch_ref(url: str) -> str:
36
+ if not url:
37
+ return "URL을 입력해주세요."
38
+ try:
39
+ response = requests.post("https://kims12-blog.hf.space/predict", json={"url": url})
40
+ response.raise_for_status()
41
+ return response.json() # JSON 결과 반환
42
+ except Exception as e:
43
+ return f"API 호출 오류: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  #############################
46
+ # 블로그 생성기
47
  #############################
48
+
49
+ def generate_blog(tone_value: str, ref1_value: str, ref2_value: str, ref3_value: str) -> str:
50
+ tone_messages = {
51
+ "친근하게": "친근하고 편안한 대화 스타일로 작성합니다.",
52
+ "일반적인": "중립적이고 깔끔한 스타일로 작성합니다.",
53
+ "전문적인": "전문적이고 신뢰감을 주는 스타일로 작성합니다.",
54
+ }
55
+ tone_system_message = f"{tone_messages.get(tone_value, '')}\n"
56
+
57
+ # OpenAI API 호출
58
+ prompt = f"말투: {tone_value}\n참조글1: {ref1_value}\n참조글2: {ref2_value}\n참조글3: {ref3_value}\n"
59
+ return call_openai_api(
60
+ content=prompt,
61
+ system_message=tone_system_message,
62
+ max_tokens=4000,
63
+ temperature=0.7,
64
+ top_p=0.95
65
+ )
66
 
67
  #############################
68
+ # UI 구성
69
  #############################
70
+
71
  with gr.Blocks() as demo:
72
  gr.Markdown("# 블로그 생성기")
73
 
74
+ tone_radio = gr.Radio(["친근하게", "일반적인", "전문적인"], label="말투 선택", value="일반적인")
75
+ ref1 = gr.Textbox(label="참조글 1 URL")
76
+ ref2 = gr.Textbox(label="참조글 2 URL")
77
+ ref3 = gr.Textbox(label="참조글 3 URL")
78
+ output_box = gr.Textbox(label="생성된 블로그", lines=20, interactive=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
+ # API 호출 버튼
81
+ fetch_button1 = gr.Button("참조글 1 API 실행")
82
+ fetch_button2 = gr.Button("참조글 2 API 실행")
83
+ fetch_button3 = gr.Button("참조글 3 API 실행")
84
 
85
+ fetch_button1.click(fn=fetch_ref, inputs=ref1, outputs=ref1)
86
+ fetch_button2.click(fn=fetch_ref, inputs=ref2, outputs=ref2)
87
+ fetch_button3.click(fn=fetch_ref, inputs=ref3, outputs=ref3)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
+ # 블로그 생성 버튼
90
  generate_button = gr.Button("생성하기")
91
  generate_button.click(
92
  fn=generate_blog,