aliceblue11 commited on
Commit
660d467
·
verified ·
1 Parent(s): f706b9e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +339 -30
app.py CHANGED
@@ -118,7 +118,109 @@ def respond_chatgpt_qna(
118
  top_p: float,
119
  openai_token: str
120
  ):
121
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
  #############################
124
  # [기본코드] UI 부분 - 수정/삭제 불가
@@ -151,7 +253,70 @@ with gr.Blocks() as demo:
151
  placeholder="DeepSeek API 토큰을 입력하세요..."
152
  )
153
 
154
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  #################
156
  # Cohere Command R+ 탭
157
  #################
@@ -166,33 +331,9 @@ with gr.Blocks() as demo:
166
 
167
  with gr.Accordion("고급 설정 (Cohere)", open=False):
168
  cohere_system_message = gr.Textbox(
169
- value="""
170
- ##[기본규칙]
171
- 1. 반드시 한국어(한글)로 작성하라.
172
- 2. 너는 가장 주목받는 마케터이며 블로그 마케팅 전문가이다.
173
- 3. 특히 너는 '정보성(Informative)' 전문 블로그 마케팅 전문가이다.
174
- 4. 정보 제공에 초점을 맞추어 작성한다.
175
-
176
- ##[텍스트 작성 규칙]
177
- 1. 소주제를 5개로 구분하여 2000자 이상되도록 작성하라.
178
- 2. 전체 맥락을 이해하고 문장의 일관성을 유지하라.
179
- 3. 절대로 참고글을 한문장 이상 그대로 출력하지 말 것.
180
- 4. 주제와 상황에 맞는 적절한 어휘를 선택하라.
181
- 5. 한글 어휘의 난이도는 쉽게 작성하라.
182
- 6. 절대 문장의 끝에 '답니다'를 사용하지 말 것.
183
-
184
- ###[정보성 블로그 작성 규칙]
185
- 1. 독자가 얻고자 하는 유용한 정보와 흥미로운 정보를 제공하도록 작성하라.
186
- 2. 독자의 공감을 이끌어내고 궁금증을 해결하도록 작성하라.
187
- 3. 독자의 관심사를 충족시키도록 작성하라.
188
- 4. 독자에게 이득이 되는 정보를 작성하라.
189
-
190
- ##[제외 규칙]
191
- 1. 반드시 비속어 및 욕설(expletive, abusive language, slang)은 제외하라.
192
- 2. 반드시 참고글의 링크(URL)는 제외하라.
193
- 3. 참고글에서 '링크를 확인해주세요'와 같은 링크 이동의 문구는 제외하라.
194
- 4. 참고글에 있는 작성자, 화자, 유튜버, 기자(Writer, speaker, YouTuber, reporter)의 이름, 애칭, 닉네임(Name, Nkickname)은 반드시 제외하라.
195
- 5. 반드시 문장의 끝부분이 어색한 한국어 표현은 제외하라('예요', '답니다', '해요', '해주죠', '됐죠', '됐어요', '고요' 등.)
196
  """,
197
  label="System Message",
198
  lines=3
@@ -227,7 +368,175 @@ with gr.Blocks() as demo:
227
  outputs=cohere_answer_output
228
  )
229
 
230
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
 
232
  #############################
233
  # 메인 실행부
 
118
  top_p: float,
119
  openai_token: str
120
  ):
121
+ """
122
+ ChatGPT(OpenAI) 모델을 이용해 한 번의 질문(question)에 대한 답변을 반환하는 함수.
123
+ """
124
+ if not openai_token:
125
+ return "OpenAI API 토큰이 필요합니다."
126
+
127
+ openai.api_key = openai_token
128
+
129
+ messages = [
130
+ {"role": "system", "content": system_message},
131
+ {"role": "user", "content": question}
132
+ ]
133
+
134
+ try:
135
+ response = openai.ChatCompletion.create(
136
+ model="gpt-4o-mini", # 필요한 경우 변경
137
+ messages=messages,
138
+ max_tokens=max_tokens,
139
+ temperature=temperature,
140
+ top_p=top_p,
141
+ )
142
+ assistant_message = response.choices[0].message['content']
143
+ return assistant_message
144
+ except Exception as e:
145
+ return f"오류가 발생했습니다: {str(e)}"
146
+
147
+
148
+ def respond_deepseek_qna(
149
+ question: str,
150
+ system_message: str,
151
+ max_tokens: int,
152
+ temperature: float,
153
+ top_p: float,
154
+ deepseek_token: str
155
+ ):
156
+ """
157
+ DeepSeek 모델을 이용해 한 번의 질문(question)에 대한 답변을 반환하는 함수.
158
+ """
159
+ if not deepseek_token:
160
+ return "DeepSeek API 토큰이 필요합니다."
161
+
162
+ openai.api_key = deepseek_token
163
+ openai.api_base = "https://api.deepseek.com/v1"
164
+
165
+ messages = [
166
+ {"role": "system", "content": system_message},
167
+ {"role": "user", "content": question}
168
+ ]
169
+
170
+ try:
171
+ response = openai.ChatCompletion.create(
172
+ model="deepseek-chat",
173
+ messages=messages,
174
+ max_tokens=max_tokens,
175
+ temperature=temperature,
176
+ top_p=top_p,
177
+ )
178
+ assistant_message = response.choices[0].message['content']
179
+ return assistant_message
180
+ except Exception as e:
181
+ return f"오류가 발생했습니다: {str(e)}"
182
+
183
+
184
+ def respond_claude_qna(
185
+ question: str,
186
+ system_message: str,
187
+ max_tokens: int,
188
+ temperature: float,
189
+ top_p: float,
190
+ claude_api_key: str
191
+ ) -> str:
192
+ """
193
+ Claude API를 사용한 개선된 응답 생성 함수
194
+ """
195
+ if not claude_api_key:
196
+ return "Claude API 토큰이 필요합니다."
197
+
198
+ try:
199
+ client = anthropic.Anthropic(api_key=claude_api_key)
200
+
201
+ # 메시지 생성
202
+ message = client.messages.create(
203
+ model="claude-3-haiku-20240307",
204
+ max_tokens=max_tokens,
205
+ temperature=temperature,
206
+ system=system_message,
207
+ messages=[
208
+ {
209
+ "role": "user",
210
+ "content": question
211
+ }
212
+ ]
213
+ )
214
+
215
+ return message.content[0].text
216
+
217
+ except anthropic.APIError as ae:
218
+ return f"Claude API 오류: {str(ae)}"
219
+ except anthropic.RateLimitError:
220
+ return "요청 한도를 초과했습니다. 잠시 후 다시 시도해주세요."
221
+ except Exception as e:
222
+ return f"예상치 못한 오류가 발생했습니다: {str(e)}"
223
+
224
 
225
  #############################
226
  # [기본코드] UI 부분 - 수정/삭제 불가
 
253
  placeholder="DeepSeek API 토큰을 입력하세요..."
254
  )
255
 
256
+ #################
257
+ # 일반 모델 탭
258
+ #################
259
+ with gr.Tab("일반 모델"):
260
+ # 모델명 선택
261
+ model_name = gr.Radio(
262
+ choices=list(MODELS.keys()),
263
+ label="Language Model (HuggingFace)",
264
+ value="Zephyr 7B Beta"
265
+ )
266
+
267
+ # 입력1 ~ 입력5 (세로로 하나씩)
268
+ input1 = gr.Textbox(label="입력1", lines=1)
269
+ input2 = gr.Textbox(label="입력2", lines=1)
270
+ input3 = gr.Textbox(label="입력3", lines=1)
271
+ input4 = gr.Textbox(label="입력4", lines=1)
272
+ input5 = gr.Textbox(label="입력5", lines=1)
273
+
274
+ # 결과
275
+ answer_output = gr.Textbox(label="결과", lines=5, interactive=False)
276
+
277
+ # 고급 설정 - System Message를 Max Tokens 위로 이동
278
+ with gr.Accordion("고급 설정 (일반 모델)", open=False):
279
+ system_message = gr.Textbox(
280
+ value="""반드시 한글로 답변할 것.
281
+ 너는 최고의 비서이다.
282
+ 내가 요구하는것들을 최대한 자세하고 정확하게 답변하라.
283
+ """,
284
+ label="System Message",
285
+ lines=3
286
+ )
287
+ max_tokens = gr.Slider(minimum=0, maximum=2000, value=500, step=100, label="Max Tokens")
288
+ temperature = gr.Slider(minimum=0.1, maximum=2.0, value=0.7, step=0.05, label="Temperature")
289
+ top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p")
290
+
291
+ submit_button = gr.Button("전송")
292
+
293
+ def merge_and_call_hf(i1, i2, i3, i4, i5, m_name, mt, temp, top_p_, sys_msg, hf_token):
294
+ # 입력1~5를 공백 기준으로 합쳐서 question 구성
295
+ question = " ".join([i1, i2, i3, i4, i5])
296
+ return respond_hf_qna(
297
+ question=question,
298
+ model_name=m_name,
299
+ max_tokens=mt,
300
+ temperature=temp,
301
+ top_p=top_p_,
302
+ system_message=sys_msg,
303
+ hf_token=hf_token
304
+ )
305
+
306
+ submit_button.click(
307
+ fn=merge_and_call_hf,
308
+ inputs=[
309
+ input1, input2, input3, input4, input5,
310
+ model_name,
311
+ max_tokens,
312
+ temperature,
313
+ top_p,
314
+ system_message,
315
+ hf_token_box
316
+ ],
317
+ outputs=answer_output
318
+ )
319
+
320
  #################
321
  # Cohere Command R+ 탭
322
  #################
 
331
 
332
  with gr.Accordion("고급 설정 (Cohere)", open=False):
333
  cohere_system_message = gr.Textbox(
334
+ value="""반드시 한글로 답변할 것.
335
+ 너는 최고의 비서이다.
336
+ 내가 요구하는것들을 최대한 자세하고 정확하게 답변하라.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
  """,
338
  label="System Message",
339
  lines=3
 
368
  outputs=cohere_answer_output
369
  )
370
 
371
+ #################
372
+ # ChatGPT 탭
373
+ #################
374
+ with gr.Tab("gpt-4o-mini"):
375
+ chatgpt_input1 = gr.Textbox(label="입력1", lines=1)
376
+ chatgpt_input2 = gr.Textbox(label="입력2", lines=1)
377
+ chatgpt_input3 = gr.Textbox(label="입력3", lines=1)
378
+ chatgpt_input4 = gr.Textbox(label="입력4", lines=1)
379
+ chatgpt_input5 = gr.Textbox(label="입력5", lines=1)
380
+
381
+ chatgpt_answer_output = gr.Textbox(label="결과", lines=5, interactive=False)
382
+
383
+ with gr.Accordion("고급 설정 (ChatGPT)", open=False):
384
+ chatgpt_system_message = gr.Textbox(
385
+ value="""반드시 한글로 답변할 것.
386
+ 너는 ChatGPT, OpenAI에서 개발한 언어 모델이다.
387
+ 내가 요구하는 것을 최대한 자세하고 정확하게 답변하라.
388
+ """,
389
+ label="System Message",
390
+ lines=3
391
+ )
392
+ chatgpt_max_tokens = gr.Slider(minimum=100, maximum=4000, value=2000, step=100, label="Max Tokens")
393
+ chatgpt_temperature = gr.Slider(minimum=0.1, maximum=2.0, value=0.7, step=0.05, label="Temperature")
394
+ chatgpt_top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-P")
395
+
396
+ chatgpt_submit_button = gr.Button("전송")
397
+
398
+ def merge_and_call_chatgpt(i1, i2, i3, i4, i5, sys_msg, mt, temp, top_p_, openai_token):
399
+ question = " ".join([i1, i2, i3, i4, i5])
400
+ return respond_chatgpt_qna(
401
+ question=question,
402
+ system_message=sys_msg,
403
+ max_tokens=mt,
404
+ temperature=temp,
405
+ top_p=top_p_,
406
+ openai_token=openai_token
407
+ )
408
+
409
+ chatgpt_submit_button.click(
410
+ fn=merge_and_call_chatgpt,
411
+ inputs=[
412
+ chatgpt_input1, chatgpt_input2, chatgpt_input3, chatgpt_input4, chatgpt_input5,
413
+ chatgpt_system_message,
414
+ chatgpt_max_tokens,
415
+ chatgpt_temperature,
416
+ chatgpt_top_p,
417
+ openai_token_box
418
+ ],
419
+ outputs=chatgpt_answer_output
420
+ )
421
+
422
+ #################
423
+ # Claude 탭
424
+ #################
425
+ with gr.Tab("claude-3-haiku"):
426
+ claude_input1 = gr.Textbox(label="입력1", lines=1)
427
+ claude_input2 = gr.Textbox(label="입력2", lines=1)
428
+ claude_input3 = gr.Textbox(label="입력3", lines=1)
429
+ claude_input4 = gr.Textbox(label="입력4", lines=1)
430
+ claude_input5 = gr.Textbox(label="입력5", lines=1)
431
+
432
+ claude_answer_output = gr.Textbox(label="결과", interactive=False, lines=5)
433
+
434
+ with gr.Accordion("고급 설정 (Claude)", open=False):
435
+ claude_system_message = gr.Textbox(
436
+ label="System Message",
437
+ value="""반드시 한글로 답변할 것.
438
+ 너는 Anthropic에서 개발한 클로드이다.
439
+ 최대한 정확하고 친절하게 답변하라.""",
440
+ lines=3
441
+ )
442
+ claude_max_tokens = gr.Slider(
443
+ minimum=100,
444
+ maximum=4000,
445
+ value=2000,
446
+ step=100,
447
+ label="Max Tokens"
448
+ )
449
+ claude_temperature = gr.Slider(
450
+ minimum=0.1,
451
+ maximum=2.0,
452
+ value=0.7,
453
+ step=0.05,
454
+ label="Temperature"
455
+ )
456
+ claude_top_p = gr.Slider(
457
+ minimum=0.1,
458
+ maximum=1.0,
459
+ value=0.95,
460
+ step=0.05,
461
+ label="Top-p"
462
+ )
463
+
464
+ claude_submit_button = gr.Button("전송")
465
+
466
+ def merge_and_call_claude(i1, i2, i3, i4, i5, sys_msg, mt, temp, top_p_, claude_key):
467
+ question = " ".join([i1, i2, i3, i4, i5])
468
+ return respond_claude_qna(
469
+ question=question,
470
+ system_message=sys_msg,
471
+ max_tokens=mt,
472
+ temperature=temp,
473
+ top_p=top_p_,
474
+ claude_api_key=claude_key
475
+ )
476
+
477
+ claude_submit_button.click(
478
+ fn=merge_and_call_claude,
479
+ inputs=[
480
+ claude_input1, claude_input2, claude_input3, claude_input4, claude_input5,
481
+ claude_system_message,
482
+ claude_max_tokens,
483
+ claude_temperature,
484
+ claude_top_p,
485
+ claude_token_box
486
+ ],
487
+ outputs=claude_answer_output
488
+ )
489
+
490
+ #################
491
+ # DeepSeek 탭
492
+ #################
493
+ with gr.Tab("DeepSeek-V3"):
494
+ deepseek_input1 = gr.Textbox(label="입력1", lines=1)
495
+ deepseek_input2 = gr.Textbox(label="입력2", lines=1)
496
+ deepseek_input3 = gr.Textbox(label="입력3", lines=1)
497
+ deepseek_input4 = gr.Textbox(label="입력4", lines=1)
498
+ deepseek_input5 = gr.Textbox(label="입력5", lines=1)
499
+
500
+ deepseek_answer_output = gr.Textbox(label="결과", lines=5, interactive=False)
501
+
502
+ with gr.Accordion("고급 설정 (DeepSeek)", open=False):
503
+ deepseek_system_message = gr.Textbox(
504
+ value="""반드시 한글로 답변할 것.
505
+ 너는 DeepSeek-V3, 최고의 언어 모델이다.
506
+ 내가 요구하는 것을 최대한 자세하고 정확하게 답변하라.
507
+ """,
508
+ label="System Message",
509
+ lines=3
510
+ )
511
+ deepseek_max_tokens = gr.Slider(minimum=100, maximum=4000, value=2000, step=100, label="Max Tokens")
512
+ deepseek_temperature = gr.Slider(minimum=0.1, maximum=2.0, value=0.7, step=0.05, label="Temperature")
513
+ deepseek_top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-P")
514
+
515
+ deepseek_submit_button = gr.Button("전송")
516
+
517
+ def merge_and_call_deepseek(i1, i2, i3, i4, i5, sys_msg, mt, temp, top_p_, deepseek_token):
518
+ question = " ".join([i1, i2, i3, i4, i5])
519
+ return respond_deepseek_qna(
520
+ question=question,
521
+ system_message=sys_msg,
522
+ max_tokens=mt,
523
+ temperature=temp,
524
+ top_p=top_p_,
525
+ deepseek_token=deepseek_token
526
+ )
527
+
528
+ deepseek_submit_button.click(
529
+ fn=merge_and_call_deepseek,
530
+ inputs=[
531
+ deepseek_input1, deepseek_input2, deepseek_input3, deepseek_input4, deepseek_input5,
532
+ deepseek_system_message,
533
+ deepseek_max_tokens,
534
+ deepseek_temperature,
535
+ deepseek_top_p,
536
+ deepseek_token_box
537
+ ],
538
+ outputs=deepseek_answer_output
539
+ )
540
 
541
  #############################
542
  # 메인 실행부