ginipick commited on
Commit
d8a457b
β€’
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
+