ginipick commited on
Commit
d8a457b
·
verified ·
1 Parent(s): dea516f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -122
app.py CHANGED
@@ -30,54 +30,47 @@ fashion_code = load_code('fashion.cod')
30
  uhdimage_code = load_code('uhdimage.cod')
31
  MixGEN_code = load_code('mgen.cod')
32
 
33
- # 초기 Parquet 파일 로드 (기존 test.parquet)
34
- test_parquet_content = load_parquet('test.parquet')
35
-
36
  def respond(
37
  message: str,
38
  history: List[Dict[str, str]],
39
  system_message: str = "",
40
- max_tokens: int = 4000,
41
  temperature: float = 0.7,
42
  top_p: float = 0.9,
 
43
  ) -> str:
44
  # 시스템 프롬프트 설정
45
- system_prefix = """반드시 한글로 답변할 것. 너는 주어진 소스코드를 기반으로 "서비스 사용 설명 및 안내, Q&A를 하는 역할이다". 아주 친절하고 자세하게 4000토큰 이상 Markdown 형식으로 작성하라. 너는 코드를 기반으로 사용 설명 및 질의 응답을 진행하며, 이용자에게 도움을 주어야 한다. 이용자가 궁금해할 만한 내용에 친절하게 알려주도록 하라. 코드 전체 내용에 대해서는 보안을 유지하고, 키 값 및 엔드포인트와 구체적인 모델은 공개하지 마라."""
46
 
47
  # 특정 명령어 처리
48
  if message.lower() == "패션 코드 실행":
49
  system_prefix += f"\n\n패션 코드 내용:\n```python\n{fashion_code}\n```"
50
- message = "패션 가상피팅에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://aiqcamp-fash.hf.space)을 통해 테스트해보라고 출력하라."
51
  elif message.lower() == "uhd 이미지 코드 실행":
52
  system_prefix += f"\n\nUHD 이미지 코드 내용:\n```python\n{uhdimage_code}\n```"
53
- message = "UHD 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-ultpixgen.hf.space)을 통해 테스트해보라고 출력하라."
54
  elif message.lower() == "mixgen 코드 실행":
55
  system_prefix += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
56
- message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트해보라고 출력하라."
57
- elif message.lower() == "test.parquet 실행":
58
- # history에서 parquet_content 찾기
59
- parquet_content = ""
60
- for item in history:
61
- if item['role'] == 'assistant' and 'test.parquet 파일 내용' in item['content']:
62
- try:
63
- parquet_content = item['content'].split("```markdown\n")[1].split("\n```")[0]
64
- except IndexError:
65
- parquet_content = ""
66
- break
67
- system_prefix += f"\n\ntest.parquet 파일 내용:\n```markdown\n{parquet_content}\n```"
68
- message = "test.parquet 파일에 대한 내용을 학습하였고, 관련 설명 및 Q&A를 진행할 준비가 되어있다. 궁금한 점이 있으면 물어보라."
69
  elif message.lower() == "csv 업로드":
70
  message = "CSV 파일을 업로드하려면 두 번째 탭을 사용하세요."
71
 
 
 
 
 
 
 
 
72
  # 시스템 메시지와 대화 기록 결합
73
  messages = [{"role": "system", "content": system_prefix}]
74
  for chat in history:
75
  messages.append({"role": chat['role'], "content": chat['content']})
76
  messages.append({"role": "user", "content": message})
77
 
78
- response = ""
79
  try:
80
  # 모델에 메시지 전송 및 응답 받기
 
81
  for msg in hf_client.chat_completion(
82
  messages,
83
  max_tokens=max_tokens,
@@ -116,14 +109,11 @@ def upload_csv(file_path: str) -> Tuple[str, str]:
116
  parquet_filename = os.path.splitext(os.path.basename(file_path))[0] + '.parquet'
117
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
118
 
119
- # Parquet 파일 내용 미리보기
120
- parquet_content = load_parquet(parquet_filename)
121
-
122
  return f"{parquet_filename} 파일이 성공적으로 업로드되고 변환되었습니다.", parquet_filename
123
  except Exception as e:
124
  return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", ""
125
 
126
- def upload_parquet(file_path: str) -> Tuple[str, str, Dict]:
127
  try:
128
  # Parquet 파일 읽기
129
  df = pd.read_parquet(file_path, engine='pyarrow')
@@ -131,9 +121,12 @@ def upload_parquet(file_path: str) -> Tuple[str, str, Dict]:
131
  # Markdown으로 변환하여 미리보기
132
  parquet_content = df.head(10).to_markdown(index=False)
133
 
134
- return "Parquet 파일이 성공적으로 업로드되었습니다.", parquet_content, df.to_json()
 
 
 
135
  except Exception as e:
136
- return f"Parquet 파일 업로드 중 오류가 발생했습니다: {str(e)}", "", {}
137
 
138
  def text_to_parquet(text: str) -> Tuple[str, str, str]:
139
  try:
@@ -178,12 +171,34 @@ textarea, input[type="text"] {
178
  with gr.Blocks(css=css) as demo:
179
  gr.Markdown("# LLM 서비스 인터페이스")
180
 
181
- # 첫 번째 탭: 챗봇
182
- with gr.Tab("챗봇"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  gr.Markdown("### LLM과 대화하기")
184
- chatbot = gr.Chatbot(label="챗봇", type="messages", elem_id="chatbot-container")
185
- msg = gr.Textbox(label="메시지 입력", placeholder="여기에 메시지를 입력하세요...", elem_id="input-text")
186
- send = gr.Button("전송")
187
 
188
  with gr.Accordion("시스템 프롬프트 및 옵션 설정", open=False):
189
  system_message = gr.Textbox(label="System Message", value="너는 AI 조언자 역할이다.")
@@ -191,49 +206,33 @@ with gr.Blocks(css=css) as demo:
191
  temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
192
  top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
193
 
194
- # 챗봇 메시지 처리 함수
195
- def handle_message(message, history, system_message, max_tokens, temperature, top_p):
196
  history = history or []
 
197
  try:
198
  # 응답 생성
199
- response_gen = respond(message, history, system_message, max_tokens, temperature, top_p)
200
- response = ""
201
  for partial in response_gen:
202
- response = partial # 최종 응답
203
- # 사용자의 메시지와 어시스턴트의 응답을 히스토리에 추가
204
- history.append({"role": "user", "content": message})
205
- history.append({"role": "assistant", "content": response})
 
 
 
206
  except Exception as e:
207
  response = f"추론 중 오류가 발생했습니다: {str(e)}"
208
- history.append({"role": "user", "content": message})
209
  history.append({"role": "assistant", "content": response})
210
- return history, ""
211
 
212
- send.click(
213
- handle_message,
214
- inputs=[msg, chatbot, system_message, max_tokens, temperature, top_p],
215
- outputs=[chatbot, msg]
 
216
  )
217
 
218
- # 예제 복원
219
- with gr.Accordion("예제", open=False):
220
- gr.Examples(
221
- examples=[
222
- ["패션 코드 실행"],
223
- ["UHD 이미지 코드 실행"],
224
- ["MixGEN 코드 실행"],
225
- ["test.parquet 실행"],
226
- ["상세한 사용 방법을 마치 화면을 보면서 설명하듯이 4000 토큰 이상 자세히 설명하라"],
227
- ["FAQ 20건을 상세하게 작성하라. 4000토큰 이상 사용하라."],
228
- ["사용 방법과 차별점, 특징, 강점을 중심으로 4000 토큰 이상 유튜브 영상 스크립트 형태로 작성하라"],
229
- ["본 서비스를 SEO 최적화하여 블로그 포스트(배경 및 필요성, 기존 유사 서비스와 비교하여 특장점, 활용처, 가치, 기대효과, 결론을 포함)로 4000 토큰 이상 작성하라"],
230
- ["특허 출원에 활용할 기술 및 비즈니스모델 측면을 포함하여 특허 출원서 구성에 맞게 혁신적인 창의 발명 내용을 중심으로 4000 토큰 이상 작성하라."],
231
- ["계속 이어서 답변하라"],
232
- ],
233
- inputs=msg,
234
- label="예제 선택",
235
- )
236
-
237
  # 두 번째 탭: 데이터 변환
238
  with gr.Tab("데이터 변환"):
239
  gr.Markdown("### CSV 파일 업로드 및 Parquet 변환")
@@ -258,9 +257,6 @@ with gr.Blocks(css=css) as demo:
258
  inputs=csv_file,
259
  outputs=[upload_status, parquet_preview, download_button]
260
  )
261
-
262
- gr.Markdown("### 기존 Parquet 파일")
263
- gr.Markdown(f"**test.parquet 파일 내용:**\n```markdown\n{test_parquet_content}\n```")
264
 
265
  # 세 번째 탭: 텍스트 to csv to parquet 변환
266
  with gr.Tab("텍스트 to csv to parquet 변환"):
@@ -290,66 +286,14 @@ with gr.Blocks(css=css) as demo:
290
  outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
291
  )
292
 
293
- # 네 번째 탭: 챗봇 데이터 업로드
294
- with gr.Tab("챗봇 데이터 업로드"):
295
- gr.Markdown("### Parquet 파일 업로드 및 질문하기")
296
- with gr.Row():
297
- with gr.Column():
298
- parquet_upload = gr.File(label="Parquet 파일 업로드", type="filepath")
299
- parquet_upload_button = gr.Button("업로드")
300
- parquet_upload_status = gr.Textbox(label="업로드 상태", interactive=False)
301
- parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
302
- parquet_data_state = gr.State()
303
-
304
- def handle_parquet_upload(file_path: str):
305
- message, parquet_content, parquet_json = upload_parquet(file_path)
306
- if parquet_json:
307
- return message, parquet_content, parquet_json
308
- else:
309
- return message, "", {}
310
-
311
- parquet_upload_button.click(
312
- handle_parquet_upload,
313
- inputs=parquet_upload,
314
- outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
315
- )
316
-
317
- gr.Markdown("### LLM과 대화하기")
318
- chatbot_data_upload = gr.Chatbot(label="챗봇 데이터 업로드", type="messages", elem_id="chatbot-data-upload")
319
- msg_data_upload = gr.Textbox(label="메시지 입력", placeholder="여기에 메시지를 입력하세요...")
320
- send_data_upload = gr.Button("전송")
321
-
322
- def handle_message_data_upload(message: str, history: List[Dict[str, str]], system_message: str, max_tokens: int, temperature: float, top_p: float, parquet_data: Dict):
323
- history = history or []
324
- try:
325
- # Parquet 데이터를 활용할 수 있는 로직 추가 가능
326
- response_gen = respond(message, history, system_message, max_tokens, temperature, top_p)
327
- response = ""
328
- for partial in response_gen:
329
- response = partial
330
- # 사용자의 메시지와 어시스턴트의 응답을 히스토리에 추가
331
- history.append({"role": "user", "content": message})
332
- history.append({"role": "assistant", "content": response})
333
- except Exception as e:
334
- response = f"추론 중 오류가 발생했습니다: {str(e)}"
335
- history.append({"role": "user", "content": message})
336
- history.append({"role": "assistant", "content": response})
337
- return history, ""
338
-
339
- send_data_upload.click(
340
- handle_message_data_upload,
341
- inputs=[msg_data_upload, chatbot_data_upload, system_message, max_tokens, temperature, top_p, parquet_data_state],
342
- outputs=[chatbot_data_upload, msg_data_upload]
343
- )
344
-
345
  # 주의 사항
346
  gr.Markdown("## 주의 사항")
347
  gr.Markdown("""
348
  - **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다. CSV 파일은 반드시 **콤마(`,`)**로 구분되어야 합니다.
349
  - **Parquet 미리보기**: 업로드된 Parquet 파일의 첫 10개 행이 미리보기로 표시됩니다.
350
- - **LLM과의 대화**: 변환된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
351
  - **Parquet 다운로드**: 변환된 Parquet 파일을 다운로드하려면 변환된 파일 옆의 다운로드 링크를 클릭하세요.
352
- - **챗봇 데이터 업로드**: 챗봇 데이터 업로드 탭에서 Parquet 파일을 업로드하면 해당 데이터를 기반으로 질문과 답변을 진행할 수 있습니다.
353
  - **텍스트 to csv to parquet**: 세 번째 탭에서 텍스트를 입력하면 자동으로 CSV로 변환되고, 다시 Parquet 파일로 전환되어 다운로드할 수 있습니다.
354
  """)
355
 
@@ -360,3 +304,4 @@ if __name__ == "__main__":
360
 
361
 
362
 
 
 
30
  uhdimage_code = load_code('uhdimage.cod')
31
  MixGEN_code = load_code('mgen.cod')
32
 
 
 
 
33
  def respond(
34
  message: str,
35
  history: List[Dict[str, str]],
36
  system_message: str = "",
37
+ max_tokens: int = 1000,
38
  temperature: float = 0.7,
39
  top_p: float = 0.9,
40
+ parquet_data: Dict = None
41
  ) -> str:
42
  # 시스템 프롬프트 설정
43
+ system_prefix = """반드시 한글로 답변할 것. 너는 주어진 소스코드를 기반으로 "서비스 사용 설명 및 안내, Q&A를 하는 역할이다". 아주 친절하고 자세하게 Markdown 형식으로 작성하라. 너는 코드를 기반으로 사용 설명 및 질의 응답을 진행하며, 이용자에게 도움을 주어야 한다. 이용자가 궁금해할 만한 내용에 친절하게 알려주도록 하라. 코드 전체 내용에 대해서는 보안을 유지하고, 키 값 및 엔드포인트와 구체적인 모델은 공개하지 마라."""
44
 
45
  # 특정 명령어 처리
46
  if message.lower() == "패션 코드 실행":
47
  system_prefix += f"\n\n패션 코드 내용:\n```python\n{fashion_code}\n```"
48
+ message = "패션 가상피팅에 대한 내용을 학습하였고, 설명할 준비가 되어있습니다. 서비스 URL(https://aiqcamp-fash.hf.space)을 통해 테스트해보세요."
49
  elif message.lower() == "uhd 이미지 코드 실행":
50
  system_prefix += f"\n\nUHD 이미지 코드 내용:\n```python\n{uhdimage_code}\n```"
51
+ message = "UHD 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있습니다. 서비스 URL(https://openfree-ultpixgen.hf.space)을 통해 테스트해보세요."
52
  elif message.lower() == "mixgen 코드 실행":
53
  system_prefix += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
54
+ message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있습니다. 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트해보세요."
 
 
 
 
 
 
 
 
 
 
 
 
55
  elif message.lower() == "csv 업로드":
56
  message = "CSV 파일을 업로드하려면 두 번째 탭을 사용하세요."
57
 
58
+ # Parquet 데이터 포함
59
+ if parquet_data:
60
+ df = pd.read_json(parquet_data)
61
+ parquet_content = df.head(10).to_markdown(index=False)
62
+ system_prefix += f"\n\n업로드된 Parquet 파일 내용:\n```markdown\n{parquet_content}\n```"
63
+ message = "업로드된 Parquet 파일에 대한 내용을 학습하였습니다. 관련하여 궁금한 점이 있으면 물어보세요."
64
+
65
  # 시스템 메시지와 대화 기록 결합
66
  messages = [{"role": "system", "content": system_prefix}]
67
  for chat in history:
68
  messages.append({"role": chat['role'], "content": chat['content']})
69
  messages.append({"role": "user", "content": message})
70
 
 
71
  try:
72
  # 모델에 메시지 전송 및 응답 받기
73
+ response = ""
74
  for msg in hf_client.chat_completion(
75
  messages,
76
  max_tokens=max_tokens,
 
109
  parquet_filename = os.path.splitext(os.path.basename(file_path))[0] + '.parquet'
110
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
111
 
 
 
 
112
  return f"{parquet_filename} 파일이 성공적으로 업로드되고 변환되었습니다.", parquet_filename
113
  except Exception as e:
114
  return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", ""
115
 
116
+ def upload_parquet(file_path: str) -> Tuple[str, str, str]:
117
  try:
118
  # Parquet 파일 읽기
119
  df = pd.read_parquet(file_path, engine='pyarrow')
 
121
  # Markdown으로 변환하여 미리보기
122
  parquet_content = df.head(10).to_markdown(index=False)
123
 
124
+ # DataFrame을 JSON으로 변환
125
+ parquet_json = df.to_json()
126
+
127
+ return "Parquet 파일이 성공적으로 업로드되었습니다.", parquet_content, parquet_json
128
  except Exception as e:
129
+ return f"Parquet 파일 업로드 중 오류가 발생했습니다: {str(e)}", "", ""
130
 
131
  def text_to_parquet(text: str) -> Tuple[str, str, str]:
132
  try:
 
171
  with gr.Blocks(css=css) as demo:
172
  gr.Markdown("# LLM 서비스 인터페이스")
173
 
174
+ # 첫 번째 탭: 챗봇 데이터 업로드 (이전 네 번째 탭)
175
+ with gr.Tab("챗봇 데이터 업로드"):
176
+ gr.Markdown("### Parquet 파일 업로드 및 질문하기")
177
+ with gr.Row():
178
+ with gr.Column():
179
+ parquet_upload = gr.File(label="Parquet 파일 업로드", type="filepath")
180
+ parquet_upload_button = gr.Button("업로드")
181
+ parquet_upload_status = gr.Textbox(label="업로드 상태", interactive=False)
182
+ parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
183
+ parquet_data_state = gr.State()
184
+
185
+ def handle_parquet_upload(file_path: str):
186
+ message, parquet_content, parquet_json = upload_parquet(file_path)
187
+ if parquet_json:
188
+ return message, parquet_content, parquet_json
189
+ else:
190
+ return message, "", ""
191
+
192
+ parquet_upload_button.click(
193
+ handle_parquet_upload,
194
+ inputs=parquet_upload,
195
+ outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
196
+ )
197
+
198
  gr.Markdown("### LLM과 대화하기")
199
+ chatbot_data_upload = gr.Chatbot(label="챗봇", type="messages", elem_id="chatbot-data-upload")
200
+ msg_data_upload = gr.Textbox(label="메시지 입력", placeholder="여기에 메시지를 입력하세요...")
201
+ send_data_upload = gr.Button("전송")
202
 
203
  with gr.Accordion("시스템 프롬프트 및 옵션 설정", open=False):
204
  system_message = gr.Textbox(label="System Message", value="너는 AI 조언자 역할이다.")
 
206
  temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
207
  top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
208
 
209
+ def handle_message_data_upload(message: str, history: List[Dict[str, str]], system_message: str, max_tokens: int, temperature: float, top_p: float, parquet_data: str):
 
210
  history = history or []
211
+ history.append({"role": "user", "content": message})
212
  try:
213
  # 응답 생성
214
+ response_gen = respond(message, history, system_message, max_tokens, temperature, top_p, parquet_data)
215
+ partial_response = ""
216
  for partial in response_gen:
217
+ partial_response = partial
218
+ # 어시스턴트의 마지막 메시지를 업데이트하여 스트리밍 효과 제공
219
+ if len(history) > 0 and history[-1]['role'] == 'assistant':
220
+ history[-1]['content'] = partial_response
221
+ else:
222
+ history.append({"role": "assistant", "content": partial_response})
223
+ yield history, ""
224
  except Exception as e:
225
  response = f"추론 중 오류가 발생했습니다: {str(e)}"
 
226
  history.append({"role": "assistant", "content": response})
227
+ yield history, ""
228
 
229
+ send_data_upload.click(
230
+ handle_message_data_upload,
231
+ inputs=[msg_data_upload, chatbot_data_upload, system_message, max_tokens, temperature, top_p, parquet_data_state],
232
+ outputs=[chatbot_data_upload, msg_data_upload],
233
+ queue=True
234
  )
235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  # 두 번째 탭: 데이터 변환
237
  with gr.Tab("데이터 변환"):
238
  gr.Markdown("### CSV 파일 업로드 및 Parquet 변환")
 
257
  inputs=csv_file,
258
  outputs=[upload_status, parquet_preview, download_button]
259
  )
 
 
 
260
 
261
  # 세 번째 탭: 텍스트 to csv to parquet 변환
262
  with gr.Tab("텍스트 to csv to parquet 변환"):
 
286
  outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
287
  )
288
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  # 주의 사항
290
  gr.Markdown("## 주의 사항")
291
  gr.Markdown("""
292
  - **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다. CSV 파일은 반드시 **콤마(`,`)**로 구분되어야 합니다.
293
  - **Parquet 미리보기**: 업로드된 Parquet 파일의 첫 10개 행이 미리보기로 표시됩니다.
294
+ - **LLM과의 대화**: 업로드된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
295
  - **Parquet 다운로드**: 변환된 Parquet 파일을 다운로드하려면 변환된 파일 옆의 다운로드 링크를 클릭하세요.
296
+ - **챗봇 데이터 업로드**: 번째 탭에서 Parquet 파일을 업로드하면 해당 데이터를 기반으로 질문과 답변을 진행할 수 있습니다.
297
  - **텍스트 to csv to parquet**: 세 번째 탭에서 텍스트를 입력하면 자동으로 CSV로 변환되고, 다시 Parquet 파일로 전환되어 다운로드할 수 있습니다.
298
  """)
299
 
 
304
 
305
 
306
 
307
+