ginipick commited on
Commit
f6e3821
·
verified ·
1 Parent(s): 2013128

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -30
app.py CHANGED
@@ -37,7 +37,7 @@ test_parquet_content = load_parquet('test.parquet')
37
 
38
  def respond(
39
  message,
40
- history: List[Tuple[str, str]],
41
  system_message="", # 기본값 추가
42
  max_tokens=4000, # 기본값 변경
43
  temperature=0.7, # 기본값 유지
@@ -57,12 +57,11 @@ def respond(
57
  system_message += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
58
  message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트 해보라고 출력하라."
59
  elif message.lower() == "test.parquet 실행":
60
- # 현재 Parquet 내용은 상태 변수에서 가져와야 함
61
- # 여기서는 예시로 'parquet_content'가 history에 있다고 가정
62
  parquet_content = ""
63
  for item in history:
64
- if isinstance(item, tuple) and item[0].startswith("Parquet"):
65
- parquet_content = item[1]
66
  break
67
  system_message += f"\n\ntest.parquet 파일 내용:\n```markdown\n{parquet_content}\n```"
68
  message = "test.parquet 파일에 대한 내용을 학습하였고, 관련 설명 및 Q&A를 진행할 준비가 되어있다. 궁금한 점이 있으면 물어보라."
@@ -71,11 +70,8 @@ def respond(
71
 
72
  # 시스템 메시지와 사용자 메시지 결합
73
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
74
- for val in history:
75
- if isinstance(val, tuple) and val[0]:
76
- messages.append({"role": "user", "content": val[0]})
77
- if isinstance(val, tuple) and val[1]:
78
- messages.append({"role": "assistant", "content": val[1]})
79
  messages.append({"role": "user", "content": message})
80
 
81
  response = ""
@@ -94,10 +90,10 @@ def respond(
94
  except Exception as e:
95
  yield f"추론 중 오류가 발생했습니다: {str(e)}"
96
 
97
- def upload_csv(file):
98
  try:
99
  # CSV 파일 읽기 (구분자 콤마)
100
- df = pd.read_csv(file, sep=',')
101
 
102
  # CSV 파일의 컬럼 확인
103
  required_columns = {'id', 'text', 'label', 'metadata'}
@@ -115,7 +111,7 @@ def upload_csv(file):
115
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
116
 
117
  # Parquet 파일로 변환
118
- parquet_filename = os.path.splitext(os.path.basename(file))[0] + '.parquet'
119
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
120
 
121
  # Parquet 파일 로드
@@ -125,10 +121,10 @@ def upload_csv(file):
125
  except Exception as e:
126
  return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", None
127
 
128
- def upload_parquet(file):
129
  try:
130
  # Parquet 파일 읽기
131
- df = pd.read_parquet(file, engine='pyarrow')
132
 
133
  # 데이터프레임을 Markdown으로 변환
134
  parquet_content = df.to_markdown(index=False)
@@ -137,10 +133,37 @@ def upload_parquet(file):
137
  except Exception as e:
138
  return f"Parquet 파일 업로드 중 오류가 발생했습니다: {str(e)}", None, None
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  css = """
141
  footer {
142
  visibility: hidden;
143
  }
 
 
 
 
 
 
144
  """
145
 
146
  # Gradio Blocks 인터페이스 설정
@@ -149,7 +172,7 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
149
 
150
  with gr.Tab("챗봇"):
151
  gr.Markdown("### LLM과 대화하기")
152
- chatbot = gr.Chatbot(label="챗봇")
153
  msg = gr.Textbox(label="메시지 입력")
154
  send = gr.Button("전송")
155
 
@@ -163,16 +186,16 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
163
  def handle_message(message, history, system_message, max_tokens, temperature, top_p):
164
  # Update history with user message
165
  history = history or []
166
- history.append((message, None))
167
  # Generate response
168
  response = ""
169
  try:
170
  for token in respond(message, history, system_message, max_tokens, temperature, top_p):
171
  response = token
172
  # Update history with assistant response
173
- history[-1] = (message, response)
174
  except Exception as e:
175
- history[-1] = (message, f"추론 중 오류가 발생했습니다: {str(e)}")
176
  return history, ""
177
 
178
  send.click(
@@ -192,13 +215,13 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
192
  download_button = gr.File(label="Parquet 파일 다운로드", type="binary", interactive=False)
193
 
194
  # 업로드 버튼 클릭 시 실행할 함수
195
- def handle_csv_upload(file):
196
- message, parquet_filename = upload_csv(file)
197
  if parquet_filename:
198
- # 파일을 다운로드할 수 있도록 경로 설정
199
  with open(parquet_filename, "rb") as f:
200
  data = f.read()
201
- return message, load_parquet(parquet_filename), data
202
  else:
203
  return message, "", None
204
 
@@ -222,8 +245,8 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
222
  # 상태를 저장할 Hidden State
223
  parquet_data_state = gr.State()
224
 
225
- def handle_parquet_upload(file):
226
- message, parquet_content, parquet_json = upload_parquet(file)
227
  if parquet_json:
228
  return message, parquet_preview_chat.update(value=parquet_content), parquet_data_state.update(value=parquet_json)
229
  else:
@@ -234,9 +257,9 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
234
  inputs=parquet_upload,
235
  outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
236
  )
237
-
238
  gr.Markdown("### LLM과 대화하기")
239
- chatbot_data_upload = gr.Chatbot(label="챗봇 데이터 업로드")
240
  msg_data_upload = gr.Textbox(label="메시지 입력")
241
  send_data_upload = gr.Button("전송")
242
 
@@ -244,16 +267,16 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
244
  def handle_message_data_upload(message, history, system_message, max_tokens, temperature, top_p, parquet_data):
245
  # Update history with user message
246
  history = history or []
247
- history.append((message, None))
248
  # Generate response
249
  response = ""
250
  try:
251
  for token in respond(message, history, system_message, max_tokens, temperature, top_p):
252
  response = token
253
  # Update history with assistant response
254
- history[-1] = (message, response)
255
  except Exception as e:
256
- history[-1] = (message, f"추론 중 오류가 발생했습니다: {str(e)}")
257
  return history, ""
258
 
259
  send_data_upload.click(
@@ -262,6 +285,29 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
262
  outputs=[chatbot_data_upload, msg_data_upload]
263
  )
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  gr.Markdown("## 주의 사항")
266
  gr.Markdown("""
267
  - **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다. CSV 파일은 반드시 **콤마(`,`)**로 구분되어야 합니다.
@@ -269,6 +315,7 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css) as demo:
269
  - **LLM과의 대화**: 변환된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
270
  - **Parquet 다운로드**: 변환된 Parquet 파일을 다운로드하려면 변환된 파일 옆의 다운로드 링크를 클릭하세요.
271
  - **챗봇 데이터 업로드**: 챗봇 데이터 업로드 탭에서 Parquet 파일을 업로드하면 해당 데이터를 기반으로 질문과 답변을 진행할 수 있습니다.
 
272
  """)
273
 
274
  gr.Markdown("### Gradio 인터페이스를 사용하여 LLM 모델과 상호작용하세요!")
 
37
 
38
  def respond(
39
  message,
40
+ history: List[dict],
41
  system_message="", # 기본값 추가
42
  max_tokens=4000, # 기본값 변경
43
  temperature=0.7, # 기본값 유지
 
57
  system_message += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
58
  message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트 해보라고 출력하라."
59
  elif message.lower() == "test.parquet 실행":
60
+ # Parquet 내용 참조
 
61
  parquet_content = ""
62
  for item in history:
63
+ if item['role'] == 'assistant' and 'test.parquet 파일 내용' in item['content']:
64
+ parquet_content = item['content'].split("```markdown\n")[1].split("\n```")[0]
65
  break
66
  system_message += f"\n\ntest.parquet 파일 내용:\n```markdown\n{parquet_content}\n```"
67
  message = "test.parquet 파일에 대한 내용을 학습하였고, 관련 설명 및 Q&A를 진행할 준비가 되어있다. 궁금한 점이 있으면 물어보라."
 
70
 
71
  # 시스템 메시지와 사용자 메시지 결합
72
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
73
+ for chat in history:
74
+ messages.append({"role": chat['role'], "content": chat['content']})
 
 
 
75
  messages.append({"role": "user", "content": message})
76
 
77
  response = ""
 
90
  except Exception as e:
91
  yield f"추론 중 오류가 발생했습니다: {str(e)}"
92
 
93
+ def upload_csv(file_path):
94
  try:
95
  # CSV 파일 읽기 (구분자 콤마)
96
+ df = pd.read_csv(file_path, sep=',')
97
 
98
  # CSV 파일의 컬럼 확인
99
  required_columns = {'id', 'text', 'label', 'metadata'}
 
111
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
112
 
113
  # Parquet 파일로 변환
114
+ parquet_filename = os.path.splitext(os.path.basename(file_path))[0] + '.parquet'
115
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
116
 
117
  # Parquet 파일 로드
 
121
  except Exception as e:
122
  return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", None
123
 
124
+ def upload_parquet(file_path):
125
  try:
126
  # Parquet 파일 읽기
127
+ df = pd.read_parquet(file_path, engine='pyarrow')
128
 
129
  # 데이터프레임을 Markdown으로 변환
130
  parquet_content = df.to_markdown(index=False)
 
133
  except Exception as e:
134
  return f"Parquet 파일 업로드 중 오류가 발생했습니다: {str(e)}", None, None
135
 
136
+ def text_to_parquet(text):
137
+ try:
138
+ # 텍스트를 DataFrame으로 변환 (예시: 각 줄을 새로운 행으로)
139
+ data = [line.split(',') for line in text.strip().split('\n')]
140
+ df = pd.DataFrame(data, columns=['id', 'text', 'label', 'metadata'])
141
+
142
+ # Parquet 파일로 변환
143
+ parquet_filename = 'text_to_parquet.parquet'
144
+ df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
145
+
146
+ # Parquet 파일 로드
147
+ parquet_content = load_parquet(parquet_filename)
148
+
149
+ # 파일 데이터를 읽어 바이너리로 반환
150
+ with open(parquet_filename, "rb") as f:
151
+ data = f.read()
152
+
153
+ return f"{parquet_filename} 파일이 성공적으로 변환되었습니다.", parquet_content, (parquet_filename, data)
154
+ except Exception as e:
155
+ return f"텍스트 변환 중 오류가 발생했습니다: {str(e)}", "", None
156
+
157
  css = """
158
  footer {
159
  visibility: hidden;
160
  }
161
+ .chatbot-container {
162
+ height: 600px;
163
+ }
164
+ .chatbot-container .message {
165
+ font-size: 14px;
166
+ }
167
  """
168
 
169
  # Gradio Blocks 인터페이스 설정
 
172
 
173
  with gr.Tab("챗봇"):
174
  gr.Markdown("### LLM과 대화하기")
175
+ chatbot = gr.Chatbot(label="챗봇", elem_id="chatbot-container")
176
  msg = gr.Textbox(label="메시지 입력")
177
  send = gr.Button("전송")
178
 
 
186
  def handle_message(message, history, system_message, max_tokens, temperature, top_p):
187
  # Update history with user message
188
  history = history or []
189
+ history.append({"role": "user", "content": message})
190
  # Generate response
191
  response = ""
192
  try:
193
  for token in respond(message, history, system_message, max_tokens, temperature, top_p):
194
  response = token
195
  # Update history with assistant response
196
+ history.append({"role": "assistant", "content": response})
197
  except Exception as e:
198
+ history.append({"role": "assistant", "content": f"추론 중 오류가 발생했습니다: {str(e)}"})
199
  return history, ""
200
 
201
  send.click(
 
215
  download_button = gr.File(label="Parquet 파일 다운로드", type="binary", interactive=False)
216
 
217
  # 업로드 버튼 클릭 시 실행할 함수
218
+ def handle_csv_upload(file_path):
219
+ message, parquet_filename = upload_csv(file_path)
220
  if parquet_filename:
221
+ # 파일을 다운로드할 수 있도록 바이너리 데이터로 읽기
222
  with open(parquet_filename, "rb") as f:
223
  data = f.read()
224
+ return message, load_parquet(parquet_filename), (parquet_filename, data)
225
  else:
226
  return message, "", None
227
 
 
245
  # 상태를 저장할 Hidden State
246
  parquet_data_state = gr.State()
247
 
248
+ def handle_parquet_upload(file_path):
249
+ message, parquet_content, parquet_json = upload_parquet(file_path)
250
  if parquet_json:
251
  return message, parquet_preview_chat.update(value=parquet_content), parquet_data_state.update(value=parquet_json)
252
  else:
 
257
  inputs=parquet_upload,
258
  outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
259
  )
260
+
261
  gr.Markdown("### LLM과 대화하기")
262
+ chatbot_data_upload = gr.Chatbot(label="챗봇 데이터 업로드", elem_id="chatbot-data-upload")
263
  msg_data_upload = gr.Textbox(label="메시지 입력")
264
  send_data_upload = gr.Button("전송")
265
 
 
267
  def handle_message_data_upload(message, history, system_message, max_tokens, temperature, top_p, parquet_data):
268
  # Update history with user message
269
  history = history or []
270
+ history.append({"role": "user", "content": message})
271
  # Generate response
272
  response = ""
273
  try:
274
  for token in respond(message, history, system_message, max_tokens, temperature, top_p):
275
  response = token
276
  # Update history with assistant response
277
+ history.append({"role": "assistant", "content": response})
278
  except Exception as e:
279
+ history.append({"role": "assistant", "content": f"추론 중 오류가 발생했습니다: {str(e)}"})
280
  return history, ""
281
 
282
  send_data_upload.click(
 
285
  outputs=[chatbot_data_upload, msg_data_upload]
286
  )
287
 
288
+ with gr.Tab("텍스트 to csv to parquet 변화"):
289
+ gr.Markdown("### 텍스트를 입력하면 CSV로 변환 후 Parquet으로 자동 전환됩니다.")
290
+ with gr.Row():
291
+ with gr.Column():
292
+ text_input = gr.Textbox(label="텍스트 입�� (각 행은 `id,text,label,metadata` 형식으로 입력)", lines=10)
293
+ convert_button = gr.Button("변환 및 다운로드")
294
+ convert_status = gr.Textbox(label="변환 상태", interactive=False)
295
+ parquet_preview_convert = gr.Markdown(label="Parquet 파일 미리보기")
296
+ download_parquet_convert = gr.File(label="Parquet 파일 다운로드", type="binary", interactive=False)
297
+
298
+ def handle_text_to_parquet(text):
299
+ message, parquet_content, file_data = text_to_parquet(text)
300
+ if file_data:
301
+ return message, parquet_content, file_data
302
+ else:
303
+ return message, "", None
304
+
305
+ convert_button.click(
306
+ handle_text_to_parquet,
307
+ inputs=text_input,
308
+ outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
309
+ )
310
+
311
  gr.Markdown("## 주의 사항")
312
  gr.Markdown("""
313
  - **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다. CSV 파일은 반드시 **콤마(`,`)**로 구분되어야 합니다.
 
315
  - **LLM과의 대화**: 변환된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
316
  - **Parquet 다운로드**: 변환된 Parquet 파일을 다운로드하려면 변환된 파일 옆의 다운로드 링크를 클릭하세요.
317
  - **챗봇 데이터 업로드**: 챗봇 데이터 업로드 탭에서 Parquet 파일을 업로드하면 해당 데이터를 기반으로 질문과 답변을 진행할 수 있습니다.
318
+ - **텍스트 to csv to parquet**: 네 번째 탭에서 텍스트를 입력하면 자동으로 CSV로 변환되고, 다시 Parquet 파일로 전환되어 다운로드할 수 있습니다.
319
  """)
320
 
321
  gr.Markdown("### Gradio 인터페이스를 사용하여 LLM 모델과 상호작용하세요!")