ginipick commited on
Commit
ca69132
β€’
1 Parent(s): 71edfae

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -17
app.py CHANGED
@@ -35,9 +35,6 @@ MixGEN_code = load_code('mgen.cod')
35
  # 초기 Parquet 파일 λ‘œλ“œ (κΈ°μ‘΄ test.parquet)
36
  test_parquet_content = load_parquet('test.parquet')
37
 
38
- # κΈ€λ‘œλ²Œ λ³€μˆ˜λ‘œ Parquet λ‚΄μš© μ €μž₯
39
- current_parquet_content = test_parquet_content
40
-
41
  def respond(
42
  message,
43
  history: List[Tuple[str, str]],
@@ -46,10 +43,9 @@ def respond(
46
  temperature=0.7, # κΈ°λ³Έκ°’ μœ μ§€
47
  top_p=0.9, # κΈ°λ³Έκ°’ μœ μ§€
48
  ):
49
- global fashion_code, uhdimage_code, MixGEN_code, current_parquet_content
50
- system_message = system_message or ""
51
  system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ 닡변할것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ 4000토큰 이상 Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
52
-
53
  # λͺ…λ Ήμ–΄ 처리
54
  if message.lower() == "νŒ¨μ…˜ μ½”λ“œ μ‹€ν–‰":
55
  system_message += f"\n\nνŒ¨μ…˜ μ½”λ“œ λ‚΄μš©:\n```python\n{fashion_code}\n```"
@@ -61,6 +57,8 @@ def respond(
61
  system_message += f"\n\nMixGEN μ½”λ“œ λ‚΄μš©:\n```python\n{MixGEN_code}\n```"
62
  message = "MixGEN3 이미지 생성에 λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€κ³ , μ„€λͺ…ν•  μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€κ³  μ•Œλ¦¬κ³  μ„œλΉ„μŠ€ URL(https://openfree-mixgen3.hf.space)을 톡해 ν…ŒμŠ€νŠΈ 해보라고 좜λ ₯ν•˜λΌ."
63
  elif message.lower() == "test.parquet μ‹€ν–‰":
 
 
64
  system_message += f"\n\ntest.parquet 파일 λ‚΄μš©:\n```markdown\n{current_parquet_content}\n```"
65
  message = "test.parquet νŒŒμΌμ— λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€κ³ , κ΄€λ ¨ μ„€λͺ… 및 Q&Aλ₯Ό 진행할 μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€. κΆκΈˆν•œ 점이 있으면 물어보라."
66
  elif message.lower() == "csv μ—…λ‘œλ“œ":
@@ -102,7 +100,7 @@ def upload_csv(file):
102
  missing_columns = required_columns - available_columns
103
 
104
  if missing_columns:
105
- return f"CSV νŒŒμΌμ— λ‹€μŒ ν•„μˆ˜ 컬럼이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€: {', '.join(missing_columns)}", ""
106
 
107
  # 데이터 ν΄λ Œμ§•
108
  df.drop_duplicates(inplace=True)
@@ -118,13 +116,21 @@ def upload_csv(file):
118
  # Parquet 파일 λ‘œλ“œ
119
  parquet_content = load_parquet(parquet_filename)
120
 
121
- # κΈ€λ‘œλ²Œ λ³€μˆ˜ μ—…λ°μ΄νŠΈ
122
- global current_parquet_content
123
- current_parquet_content = parquet_content
 
 
 
 
 
 
 
 
124
 
125
- return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜κ³  λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content
126
  except Exception as e:
127
- return f"CSV 파일 μ—…λ‘œλ“œ 및 λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", ""
128
 
129
  # Gradio Blocks μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
130
  with gr.Blocks() as demo:
@@ -146,7 +152,7 @@ with gr.Blocks() as demo:
146
  ["νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
147
  ["계속 μ΄μ–΄μ„œ λ‹΅λ³€ν•˜λΌ"],
148
  ],
149
- theme="default", # ν…Œλ§ˆ λ³€κ²½ κ°€λŠ₯
150
  )
151
 
152
  with gr.Accordion("μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ 및 μ˜΅μ…˜ μ„€μ •", open=False):
@@ -159,26 +165,81 @@ with gr.Blocks() as demo:
159
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
160
  with gr.Row():
161
  with gr.Column():
162
- csv_file = gr.File(label="CSV 파일 μ—…λ‘œλ“œ", type="filepath")
163
  upload_button = gr.Button("μ—…λ‘œλ“œ 및 λ³€ν™˜")
164
  upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
165
  parquet_preview = gr.Markdown(label="Parquet 파일 ���리보기")
166
-
 
167
  # μ—…λ‘œλ“œ λ²„νŠΌ 클릭 μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜
 
 
 
 
 
 
 
 
 
 
168
  upload_button.click(
169
- upload_csv,
170
  inputs=csv_file,
171
- outputs=[upload_status, parquet_preview]
172
  )
173
 
174
  gr.Markdown("### κΈ°μ‘΄ Parquet 파일")
175
  gr.Markdown(f"**test.parquet 파일 λ‚΄μš©:**\n```markdown\n{test_parquet_content}\n```")
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  gr.Markdown("## 주의 사항")
178
  gr.Markdown("""
179
  - **CSV μ—…λ‘œλ“œ**: CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ μžλ™μœΌλ‘œ Parquet 파일둜 λ³€ν™˜λ©λ‹ˆλ‹€. CSV νŒŒμΌμ€ λ°˜λ“œμ‹œ **콀마(`,`)**둜 κ΅¬λΆ„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
180
  - **Parquet 미리보기**: μ—…λ‘œλ“œλœ Parquet 파일의 첫 10개 행이 미리보기둜 ν‘œμ‹œλ©λ‹ˆλ‹€.
181
  - **LLM과의 λŒ€ν™”**: λ³€ν™˜λœ Parquet 파일 λ‚΄μš©μ„ 기반으둜 LLM이 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
 
 
182
  """)
183
 
184
  gr.Markdown("### Gradio μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ LLM λͺ¨λΈκ³Ό μƒν˜Έμž‘μš©ν•˜μ„Έμš”!")
 
35
  # 초기 Parquet 파일 λ‘œλ“œ (κΈ°μ‘΄ test.parquet)
36
  test_parquet_content = load_parquet('test.parquet')
37
 
 
 
 
38
  def respond(
39
  message,
40
  history: List[Tuple[str, str]],
 
43
  temperature=0.7, # κΈ°λ³Έκ°’ μœ μ§€
44
  top_p=0.9, # κΈ°λ³Έκ°’ μœ μ§€
45
  ):
46
+ # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
 
47
  system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ 닡변할것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ 4000토큰 이상 Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
48
+
49
  # λͺ…λ Ήμ–΄ 처리
50
  if message.lower() == "νŒ¨μ…˜ μ½”λ“œ μ‹€ν–‰":
51
  system_message += f"\n\nνŒ¨μ…˜ μ½”λ“œ λ‚΄μš©:\n```python\n{fashion_code}\n```"
 
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
+ current_parquet_content = history.get('parquet_content', "")
62
  system_message += f"\n\ntest.parquet 파일 λ‚΄μš©:\n```markdown\n{current_parquet_content}\n```"
63
  message = "test.parquet νŒŒμΌμ— λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€κ³ , κ΄€λ ¨ μ„€λͺ… 및 Q&Aλ₯Ό 진행할 μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€. κΆκΈˆν•œ 점이 있으면 물어보라."
64
  elif message.lower() == "csv μ—…λ‘œλ“œ":
 
100
  missing_columns = required_columns - available_columns
101
 
102
  if missing_columns:
103
+ return f"CSV νŒŒμΌμ— λ‹€μŒ ν•„μˆ˜ 컬럼이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€: {', '.join(missing_columns)}", None
104
 
105
  # 데이터 ν΄λ Œμ§•
106
  df.drop_duplicates(inplace=True)
 
116
  # Parquet 파일 λ‘œλ“œ
117
  parquet_content = load_parquet(parquet_filename)
118
 
119
+ return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜κ³  λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_filename
120
+ except Exception as e:
121
+ return f"CSV 파일 μ—…λ‘œλ“œ 및 λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", None
122
+
123
+ def upload_parquet(file):
124
+ try:
125
+ # Parquet 파일 읽기
126
+ df = pd.read_parquet(file, engine='pyarrow')
127
+
128
+ # λ°μ΄ν„°ν”„λ ˆμž„μ„ Markdown으둜 λ³€ν™˜
129
+ parquet_content = df.to_markdown(index=False)
130
 
131
+ return "Parquet 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content, df.to_json() # JSON으둜 데이터 μ €μž₯
132
  except Exception as e:
133
+ return f"Parquet 파일 μ—…λ‘œλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", None, None
134
 
135
  # Gradio Blocks μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
136
  with gr.Blocks() as demo:
 
152
  ["νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
153
  ["계속 μ΄μ–΄μ„œ λ‹΅λ³€ν•˜λΌ"],
154
  ],
155
+ theme="default", # μ›ν•˜λŠ” ν…Œλ§ˆλ‘œ λ³€κ²½ κ°€λŠ₯
156
  )
157
 
158
  with gr.Accordion("μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ 및 μ˜΅μ…˜ μ„€μ •", open=False):
 
165
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
166
  with gr.Row():
167
  with gr.Column():
168
+ csv_file = gr.File(label="CSV 파일 μ—…λ‘œλ“œ", type="file")
169
  upload_button = gr.Button("μ—…λ‘œλ“œ 및 λ³€ν™˜")
170
  upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
171
  parquet_preview = gr.Markdown(label="Parquet 파일 ���리보기")
172
+ download_button = gr.File(label="Parquet 파일 λ‹€μš΄λ‘œλ“œ", file=None, interactive=False)
173
+
174
  # μ—…λ‘œλ“œ λ²„νŠΌ 클릭 μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜
175
+ def handle_csv_upload(file):
176
+ message, parquet_filename = upload_csv(file.name)
177
+ if parquet_filename:
178
+ # νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ„λ‘ 경둜 μ„€μ •
179
+ with open(parquet_filename, "rb") as f:
180
+ data = f.read()
181
+ return message, parquet_preview.update(value=load_parquet(parquet_filename)), gr.File.update(value=(parquet_filename, data))
182
+ else:
183
+ return message, "", None
184
+
185
  upload_button.click(
186
+ handle_csv_upload,
187
  inputs=csv_file,
188
+ outputs=[upload_status, parquet_preview, download_button]
189
  )
190
 
191
  gr.Markdown("### κΈ°μ‘΄ Parquet 파일")
192
  gr.Markdown(f"**test.parquet 파일 λ‚΄μš©:**\n```markdown\n{test_parquet_content}\n```")
193
 
194
+ with gr.Tab("챗봇"):
195
+ gr.Markdown("### Parquet 파일 μ—…λ‘œλ“œ 및 μ§ˆλ¬Έν•˜κΈ°")
196
+ with gr.Row():
197
+ with gr.Column():
198
+ parquet_upload = gr.File(label="Parquet 파일 μ—…λ‘œλ“œ", type="file")
199
+ parquet_upload_button = gr.Button("μ—…λ‘œλ“œ")
200
+ parquet_upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
201
+ parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
202
+ # μƒνƒœλ₯Ό μ €μž₯ν•  Hidden State
203
+ parquet_data_state = gr.State()
204
+
205
+ def handle_parquet_upload(file):
206
+ message, parquet_content, parquet_json = upload_parquet(file.name)
207
+ if parquet_json:
208
+ return message, parquet_preview_chat.update(value=parquet_content), parquet_data_state.update(value=parquet_json)
209
+ else:
210
+ return message, gr.Markdown.update(value=""), parquet_data_state.update(value=None)
211
+
212
+ parquet_upload_button.click(
213
+ handle_parquet_upload,
214
+ inputs=parquet_upload,
215
+ outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
216
+ )
217
+
218
+ gr.Markdown("### LLMκ³Ό λŒ€ν™”ν•˜κΈ°")
219
+ chat_interface = gr.ChatInterface(
220
+ fn=respond,
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
+ theme="default", # μ›ν•˜λŠ” ν…Œλ§ˆλ‘œ λ³€κ²½ κ°€λŠ₯
234
+ )
235
+
236
  gr.Markdown("## 주의 사항")
237
  gr.Markdown("""
238
  - **CSV μ—…λ‘œλ“œ**: CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ μžλ™μœΌλ‘œ Parquet 파일둜 λ³€ν™˜λ©λ‹ˆλ‹€. CSV νŒŒμΌμ€ λ°˜λ“œμ‹œ **콀마(`,`)**둜 κ΅¬λΆ„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
239
  - **Parquet 미리보기**: μ—…λ‘œλ“œλœ Parquet 파일의 첫 10개 행이 미리보기둜 ν‘œμ‹œλ©λ‹ˆλ‹€.
240
  - **LLM과의 λŒ€ν™”**: λ³€ν™˜λœ Parquet 파일 λ‚΄μš©μ„ 기반으둜 LLM이 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
241
+ - **Parquet λ‹€μš΄λ‘œλ“œ**: λ³€ν™˜λœ Parquet νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λ €λ©΄ λ³€ν™˜λœ 파일 μ˜†μ˜ λ‹€μš΄λ‘œλ“œ 링크λ₯Ό ν΄λ¦­ν•˜μ„Έμš”.
242
+ - **챗봇 Parquet μ—…λ‘œλ“œ**: 챗봇 νƒ­μ—μ„œ Parquet νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ ν•΄λ‹Ή 데이터λ₯Ό 기반으둜 질문과 닡변을 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.
243
  """)
244
 
245
  gr.Markdown("### Gradio μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ LLM λͺ¨λΈκ³Ό μƒν˜Έμž‘μš©ν•˜μ„Έμš”!")