ginipick commited on
Commit
3c698c1
β€’
1 Parent(s): d2fa590

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -35
app.py CHANGED
@@ -5,7 +5,9 @@ import pandas as pd
5
  from typing import List, Dict, Tuple
6
 
7
  # μΆ”λ‘  API ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
8
- hf_client = InferenceClient("CohereForAI/c4ai-command-r-plus-08-2024", token=os.getenv("HF_TOKEN"))
 
 
9
 
10
  def load_code(filename: str) -> str:
11
  try:
@@ -42,13 +44,11 @@ def respond(
42
  # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
43
  system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ λ‹΅λ³€ν•  것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
44
 
45
-
46
  # Parquet 데이터 포함
47
  if parquet_data:
48
  df = pd.read_json(parquet_data)
49
  parquet_content = df.head(10).to_markdown(index=False)
50
  system_prefix += f"\n\nμ—…λ‘œλ“œλœ Parquet 파일 λ‚΄μš©:\n```markdown\n{parquet_content}\n```"
51
- message = "μ—…λ‘œλ“œλœ Parquet νŒŒμΌμ— λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ΄€λ ¨ν•˜μ—¬ κΆκΈˆν•œ 점이 있으면 λ¬Όμ–΄λ³΄μ„Έμš”."
52
 
53
  # μ‹œμŠ€ν…œ λ©”μ‹œμ§€μ™€ λŒ€ν™” 기둝 κ²°ν•©
54
  messages = [{"role": "system", "content": system_prefix}]
@@ -77,26 +77,20 @@ def upload_csv(file_path: str) -> Tuple[str, str]:
77
  try:
78
  # CSV 파일 읽기
79
  df = pd.read_csv(file_path, sep=',')
80
-
81
  # ν•„μˆ˜ 컬럼 확인
82
  required_columns = {'id', 'text', 'label', 'metadata'}
83
  available_columns = set(df.columns)
84
  missing_columns = required_columns - available_columns
85
-
86
  if missing_columns:
87
  return f"CSV νŒŒμΌμ— λ‹€μŒ ν•„μˆ˜ 컬럼이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€: {', '.join(missing_columns)}", ""
88
-
89
  # 데이터 ν΄λ Œμ§•
90
  df.drop_duplicates(inplace=True)
91
  df.fillna('', inplace=True)
92
-
93
  # 데이터 μœ ν˜• μ΅œμ ν™”
94
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
95
-
96
  # Parquet 파일둜 λ³€ν™˜
97
  parquet_filename = os.path.splitext(os.path.basename(file_path))[0] + '.parquet'
98
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
99
-
100
  return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜κ³  λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_filename
101
  except Exception as e:
102
  return f"CSV 파일 μ—…λ‘œλ“œ 및 λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", ""
@@ -105,13 +99,10 @@ def upload_parquet(file_path: str) -> Tuple[str, str, str]:
105
  try:
106
  # Parquet 파일 읽기
107
  df = pd.read_parquet(file_path, engine='pyarrow')
108
-
109
  # Markdown으둜 λ³€ν™˜ν•˜μ—¬ 미리보기
110
  parquet_content = df.head(10).to_markdown(index=False)
111
-
112
  # DataFrame을 JSON으둜 λ³€ν™˜
113
  parquet_json = df.to_json()
114
-
115
  return "Parquet 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content, parquet_json
116
  except Exception as e:
117
  return f"Parquet 파일 μ—…λ‘œλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", "", ""
@@ -121,17 +112,13 @@ def text_to_parquet(text: str) -> Tuple[str, str, str]:
121
  # ν…μŠ€νŠΈλ₯Ό DataFrame으둜 λ³€ν™˜ (각 행은 콀마둜 ꡬ뢄)
122
  data = [line.split(',') for line in text.strip().split('\n')]
123
  df = pd.DataFrame(data, columns=['id', 'text', 'label', 'metadata'])
124
-
125
  # 데이터 μœ ν˜• μ΅œμ ν™”
126
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
127
-
128
  # Parquet 파일둜 λ³€ν™˜
129
  parquet_filename = 'text_to_parquet.parquet'
130
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
131
-
132
  # Parquet 파일 λ‚΄μš© 미리보기
133
  parquet_content = load_parquet(parquet_filename)
134
-
135
  return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content, parquet_filename
136
  except Exception as e:
137
  return f"ν…μŠ€νŠΈ λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", "", ""
@@ -142,7 +129,7 @@ footer {
142
  visibility: hidden;
143
  }
144
  #chatbot-container, #chatbot-data-upload {
145
- height: 600px;
146
  overflow-y: scroll;
147
  }
148
  #chatbot-container .message, #chatbot-data-upload .message {
@@ -153,21 +140,35 @@ textarea, input[type="text"] {
153
  background-color: #ffffff; /* 흰색 λ°°κ²½ */
154
  color: #000000; /* 검정색 κΈ€μž */
155
  }
 
 
 
 
 
 
 
 
 
156
  """
157
 
158
  # Gradio Blocks μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
159
  with gr.Blocks(css=css) as demo:
160
- gr.Markdown("# My RAG: LLM이 λ‚˜λ§Œμ˜ λ°μ΄ν„°λ‘œ ν•™μŠ΅ν•œ μ½˜ν…μΈ  생성/λ‹΅λ³€")
161
- gr.Markdown("### 1) λ‚˜λ§Œμ˜ 데이터λ₯Ό ν…μŠ€νŠΈλ‘œ μž…λ ₯ν•˜κ±°λ‚˜ CSVλ₯Ό μ—…λ‘œλ“œν•˜μ—¬ Parquet 포맷 데이터셋 μžλ™ λ³€ν™˜ν•©λ‹ˆλ‹€.")
162
- gr.Markdown("### 2) Parquet 포맷 데이터셋을 μ—…λ‘œλ“œν•˜λ©΄, LLM이 맞좀 ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬ 응닡을 μ‹œμž‘ν•©λ‹ˆλ‹€.")
163
- gr.Markdown("### Tip) '예제'λ₯Ό 톡해 λ‹€μ–‘ν•œ ν™œμš© 방법을 μ²΄ν—˜ν•˜κ³  μ‘μš©ν•΄ λ³΄μ„Έμš”.")
164
-
 
 
 
165
  # 첫 번째 νƒ­: 챗봇 데이터 μ—…λ‘œλ“œ (νƒ­ 이름 λ³€κ²½: "My 데이터셋+LLM")
166
  with gr.Tab("My 데이터셋+LLM"):
167
  gr.Markdown("### Parquet 파일 μ—…λ‘œλ“œ 및 μ§ˆλ¬Έν•˜κΈ°")
168
  with gr.Row():
169
  with gr.Column():
170
- parquet_upload = gr.File(label="Parquet 파일 μ—…λ‘œλ“œ", type="filepath")
 
 
171
  parquet_upload_button = gr.Button("μ—…λ‘œλ“œ")
172
  parquet_upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
173
  parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
@@ -197,33 +198,65 @@ with gr.Blocks(css=css) as demo:
197
  temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
198
  top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
199
 
200
- 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):
 
 
 
 
 
 
 
 
201
  history = history or []
202
- history.append({"role": "user", "content": message})
203
  try:
204
  # 응닡 생성
205
- response_gen = respond(message, history, system_message, max_tokens, temperature, top_p, parquet_data)
 
 
206
  partial_response = ""
207
  for partial in response_gen:
208
  partial_response = partial
209
- # μ–΄μ‹œμŠ€ν„΄νŠΈμ˜ λ§ˆμ§€λ§‰ λ©”μ‹œμ§€λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ 슀트리밍 효과 제곡
210
- if len(history) > 0 and history[-1]['role'] == 'assistant':
211
- history[-1]['content'] = partial_response
212
- else:
213
- history.append({"role": "assistant", "content": partial_response})
214
- yield history, ""
 
 
 
215
  except Exception as e:
216
  response = f"μΆ”λ‘  쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
 
217
  history.append({"role": "assistant", "content": response})
218
  yield history, ""
219
 
220
  send_data_upload.click(
221
  handle_message_data_upload,
222
- inputs=[msg_data_upload, chatbot_data_upload, system_message, max_tokens, temperature, top_p, parquet_data_state],
 
 
 
 
 
 
 
 
223
  outputs=[chatbot_data_upload, msg_data_upload],
224
  queue=True
225
  )
226
 
 
 
 
 
 
 
 
 
 
 
 
227
  # 두 번째 νƒ­: 데이터 λ³€ν™˜ (νƒ­ 이름 λ³€κ²½: "CSV to My 데이터셋")
228
  with gr.Tab("CSV to My 데이터셋"):
229
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
@@ -277,8 +310,8 @@ with gr.Blocks(css=css) as demo:
277
  outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
278
  )
279
 
280
-
281
- gr.Markdown("### [email protected]")
282
 
283
  if __name__ == "__main__":
284
  demo.launch()
 
 
5
  from typing import List, Dict, Tuple
6
 
7
  # μΆ”λ‘  API ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
8
+ hf_client = InferenceClient(
9
+ "CohereForAI/c4ai-command-r-plus-08-2024", token=os.getenv("HF_TOKEN")
10
+ )
11
 
12
  def load_code(filename: str) -> str:
13
  try:
 
44
  # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
45
  system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ λ‹΅λ³€ν•  것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
46
 
 
47
  # Parquet 데이터 포함
48
  if parquet_data:
49
  df = pd.read_json(parquet_data)
50
  parquet_content = df.head(10).to_markdown(index=False)
51
  system_prefix += f"\n\nμ—…λ‘œλ“œλœ Parquet 파일 λ‚΄μš©:\n```markdown\n{parquet_content}\n```"
 
52
 
53
  # μ‹œμŠ€ν…œ λ©”μ‹œμ§€μ™€ λŒ€ν™” 기둝 κ²°ν•©
54
  messages = [{"role": "system", "content": system_prefix}]
 
77
  try:
78
  # CSV 파일 읽기
79
  df = pd.read_csv(file_path, sep=',')
 
80
  # ν•„μˆ˜ 컬럼 확인
81
  required_columns = {'id', 'text', 'label', 'metadata'}
82
  available_columns = set(df.columns)
83
  missing_columns = required_columns - available_columns
 
84
  if missing_columns:
85
  return f"CSV νŒŒμΌμ— λ‹€μŒ ν•„μˆ˜ 컬럼이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€: {', '.join(missing_columns)}", ""
 
86
  # 데이터 ν΄λ Œμ§•
87
  df.drop_duplicates(inplace=True)
88
  df.fillna('', inplace=True)
 
89
  # 데이터 μœ ν˜• μ΅œμ ν™”
90
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
 
91
  # Parquet 파일둜 λ³€ν™˜
92
  parquet_filename = os.path.splitext(os.path.basename(file_path))[0] + '.parquet'
93
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
 
94
  return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜κ³  λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_filename
95
  except Exception as e:
96
  return f"CSV 파일 μ—…λ‘œλ“œ 및 λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", ""
 
99
  try:
100
  # Parquet 파일 읽기
101
  df = pd.read_parquet(file_path, engine='pyarrow')
 
102
  # Markdown으둜 λ³€ν™˜ν•˜μ—¬ 미리보기
103
  parquet_content = df.head(10).to_markdown(index=False)
 
104
  # DataFrame을 JSON으둜 λ³€ν™˜
105
  parquet_json = df.to_json()
 
106
  return "Parquet 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content, parquet_json
107
  except Exception as e:
108
  return f"Parquet 파일 μ—…λ‘œλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", "", ""
 
112
  # ν…μŠ€νŠΈλ₯Ό DataFrame으둜 λ³€ν™˜ (각 행은 콀마둜 ꡬ뢄)
113
  data = [line.split(',') for line in text.strip().split('\n')]
114
  df = pd.DataFrame(data, columns=['id', 'text', 'label', 'metadata'])
 
115
  # 데이터 μœ ν˜• μ΅œμ ν™”
116
  df = df.astype({'id': 'int32', 'text': 'string', 'label': 'category', 'metadata': 'string'})
 
117
  # Parquet 파일둜 λ³€ν™˜
118
  parquet_filename = 'text_to_parquet.parquet'
119
  df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
 
120
  # Parquet 파일 λ‚΄μš© 미리보기
121
  parquet_content = load_parquet(parquet_filename)
 
122
  return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content, parquet_filename
123
  except Exception as e:
124
  return f"ν…μŠ€νŠΈ λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", "", ""
 
129
  visibility: hidden;
130
  }
131
  #chatbot-container, #chatbot-data-upload {
132
+ height: 700px;
133
  overflow-y: scroll;
134
  }
135
  #chatbot-container .message, #chatbot-data-upload .message {
 
140
  background-color: #ffffff; /* 흰색 λ°°κ²½ */
141
  color: #000000; /* 검정색 κΈ€μž */
142
  }
143
+ /* 파일 μ—…λ‘œλ“œ μ˜μ—­ 높이 쑰절 */
144
+ #parquet-upload-area {
145
+ max-height: 150px;
146
+ overflow-y: auto;
147
+ }
148
+ /* 초기 μ„€λͺ… 글씨 크기 쑰절 */
149
+ #initial-description {
150
+ font-size: 14px;
151
+ }
152
  """
153
 
154
  # Gradio Blocks μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
155
  with gr.Blocks(css=css) as demo:
156
+ gr.Markdown("# My RAG: LLM이 λ‚˜λ§Œμ˜ λ°μ΄ν„°λ‘œ ν•™μŠ΅ν•œ μ½˜ν…μΈ  생성/λ‹΅λ³€", elem_id="initial-description")
157
+ gr.Markdown(
158
+ "### 1) λ‚˜λ§Œμ˜ 데이터λ₯Ό ν…μŠ€νŠΈλ‘œ μž…λ ₯ν•˜κ±°λ‚˜ CSVλ₯Ό μ—…λ‘œλ“œν•˜μ—¬ Parquet 포맷 데이터셋 μžλ™ λ³€ν™˜ν•©λ‹ˆλ‹€.\n"
159
+ "### 2) Parquet 포맷 데이터셋을 μ—…λ‘œλ“œν•˜λ©΄, LLM이 맞좀 ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬ 응닡을 μ‹œμž‘ν•©λ‹ˆλ‹€.\n"
160
+ "### Tip) '예제'λ₯Ό 톡해 λ‹€μ–‘ν•œ ν™œμš© 방법을 μ²΄ν—˜ν•˜κ³  μ‘μš©ν•΄ λ³΄μ„Έμš”.",
161
+ elem_id="initial-description"
162
+ )
163
+
164
  # 첫 번째 νƒ­: 챗봇 데이터 μ—…λ‘œλ“œ (νƒ­ 이름 λ³€κ²½: "My 데이터셋+LLM")
165
  with gr.Tab("My 데이터셋+LLM"):
166
  gr.Markdown("### Parquet 파일 μ—…λ‘œλ“œ 및 μ§ˆλ¬Έν•˜κΈ°")
167
  with gr.Row():
168
  with gr.Column():
169
+ parquet_upload = gr.File(
170
+ label="Parquet 파일 μ—…λ‘œλ“œ", type="filepath", elem_id="parquet-upload-area"
171
+ )
172
  parquet_upload_button = gr.Button("μ—…λ‘œλ“œ")
173
  parquet_upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
174
  parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
 
198
  temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
199
  top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
200
 
201
+ def handle_message_data_upload(
202
+ message: str,
203
+ history: List[Dict[str, str]],
204
+ system_message: str,
205
+ max_tokens: int,
206
+ temperature: float,
207
+ top_p: float,
208
+ parquet_data: str
209
+ ):
210
  history = history or []
 
211
  try:
212
  # 응닡 생성
213
+ response_gen = respond(
214
+ message, history, system_message, max_tokens, temperature, top_p, parquet_data
215
+ )
216
  partial_response = ""
217
  for partial in response_gen:
218
  partial_response = partial
219
+ # λŒ€ν™” λ‚΄μ—­ μ—…λ°μ΄νŠΈ
220
+ display_history = history + [
221
+ {"role": "user", "content": message},
222
+ {"role": "assistant", "content": partial_response}
223
+ ]
224
+ yield display_history, ""
225
+ # λŒ€ν™” 내역에 μΆ”κ°€
226
+ history.append({"role": "user", "content": message})
227
+ history.append({"role": "assistant", "content": partial_response})
228
  except Exception as e:
229
  response = f"μΆ”λ‘  쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
230
+ history.append({"role": "user", "content": message})
231
  history.append({"role": "assistant", "content": response})
232
  yield history, ""
233
 
234
  send_data_upload.click(
235
  handle_message_data_upload,
236
+ inputs=[
237
+ msg_data_upload,
238
+ chatbot_data_upload,
239
+ system_message,
240
+ max_tokens,
241
+ temperature,
242
+ top_p,
243
+ parquet_data_state
244
+ ],
245
  outputs=[chatbot_data_upload, msg_data_upload],
246
  queue=True
247
  )
248
 
249
+ # 예제 μΆ”κ°€
250
+ with gr.Accordion("예제", open=False):
251
+ gr.Examples(
252
+ examples=[
253
+ ["μ—…λ‘œλ“œλœ λ°μ΄ν„°μ…‹μ˜ λ‚΄μš© 쀑 리슀트 5개 ν•­λͺ©μ„ 좜λ ₯ν•˜λΌ"],
254
+ ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ 데이���둜 ν™œμš©ν•˜μ—¬ μ „λ¬Έ λΈ”λ‘œκ·Έ 포슀트λ₯Ό 4000 토큰 이상 μƒμ„±ν•˜λΌ"],
255
+ ],
256
+ inputs=msg_data_upload,
257
+ label="예제 선택",
258
+ )
259
+
260
  # 두 번째 νƒ­: 데이터 λ³€ν™˜ (νƒ­ 이름 λ³€κ²½: "CSV to My 데이터셋")
261
  with gr.Tab("CSV to My 데이터셋"):
262
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
 
310
  outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
311
  )
312
 
313
+ gr.Markdown("### [email protected]", elem_id="initial-description")
 
314
 
315
  if __name__ == "__main__":
316
  demo.launch()
317
+