Update app.py
Browse files
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 =
|
41 |
temperature: float = 0.7,
|
42 |
top_p: float = 0.9,
|
|
|
43 |
) -> str:
|
44 |
# 시스템 프롬프트 설정
|
45 |
-
system_prefix = """반드시 한글로 답변할 것. 너는 주어진 소스코드를 기반으로 "서비스 사용 설명 및 안내, Q&A를 하는 역할이다". 아주 친절하고 자세하게
|
46 |
|
47 |
# 특정 명령어 처리
|
48 |
if message.lower() == "패션 코드 실행":
|
49 |
system_prefix += f"\n\n패션 코드 내용:\n```python\n{fashion_code}\n```"
|
50 |
-
message = "패션 가상피팅에 대한 내용을 학습하였고, 설명할 준비가
|
51 |
elif message.lower() == "uhd 이미지 코드 실행":
|
52 |
system_prefix += f"\n\nUHD 이미지 코드 내용:\n```python\n{uhdimage_code}\n```"
|
53 |
-
message = "UHD 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가
|
54 |
elif message.lower() == "mixgen 코드 실행":
|
55 |
system_prefix += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
|
56 |
-
message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가
|
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,
|
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 |
-
|
|
|
|
|
|
|
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 |
-
|
185 |
-
|
186 |
-
|
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 |
-
|
201 |
for partial in response_gen:
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
|
|
|
|
|
|
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 |
-
|
211 |
|
212 |
-
|
213 |
-
|
214 |
-
inputs=[
|
215 |
-
outputs=[
|
|
|
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과의 대화**:
|
351 |
- **Parquet 다운로드**: 변환된 Parquet 파일을 다운로드하려면 변환된 파일 옆의 다운로드 링크를 클릭하세요.
|
352 |
-
- **챗봇 데이터 업로드**:
|
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 |
+
|