ginipick commited on
Commit
884361c
β€’
1 Parent(s): ea2c4cf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -78
app.py CHANGED
@@ -35,6 +35,9 @@ MixGEN_code = load_code('mgen.cod')
35
  # 초기 Parquet 파일 λ‘œλ“œ (κΈ°μ‘΄ test.parquet)
36
  test_parquet_content = load_parquet('test.parquet')
37
 
 
 
 
38
  def respond(
39
  message,
40
  history: List[Tuple[str, str]],
@@ -42,9 +45,8 @@ def respond(
42
  max_tokens=1024, # κΈ°λ³Έκ°’ μΆ”κ°€
43
  temperature=0.7, # κΈ°λ³Έκ°’ μΆ”κ°€
44
  top_p=0.9, # κΈ°λ³Έκ°’ μΆ”κ°€
45
- parquet_content="", # Parquet 파일 λ‚΄μš© μƒνƒœ
46
  ):
47
- global fashion_code, uhdimage_code, MixGEN_code, test_parquet_content
48
  system_message = system_message or ""
49
  system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ 닡변할것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ 4000토큰 이상 Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
50
 
@@ -59,10 +61,10 @@ def respond(
59
  system_message += f"\n\nMixGEN μ½”λ“œ λ‚΄μš©:\n```python\n{MixGEN_code}\n```"
60
  message = "MixGEN3 이미지 생성에 λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€κ³ , μ„€λͺ…ν•  μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€κ³  μ•Œλ¦¬κ³  μ„œλΉ„μŠ€ URL(https://openfree-mixgen3.hf.space)을 톡해 ν…ŒμŠ€νŠΈ 해보라고 좜λ ₯ν•˜λΌ."
61
  elif message.lower() == "test.parquet μ‹€ν–‰":
62
- system_message += f"\n\ntest.parquet 파일 λ‚΄μš©:\n```markdown\n{parquet_content}\n```"
63
  message = "test.parquet νŒŒμΌμ— λŒ€ν•œ λ‚΄μš©μ„ ν•™μŠ΅ν•˜μ˜€κ³ , κ΄€λ ¨ μ„€λͺ… 및 Q&Aλ₯Ό 진행할 μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€. κΆκΈˆν•œ 점이 있으면 물어보라."
64
  elif message.lower() == "csv μ—…λ‘œλ“œ":
65
- message = "CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ €λ©΄ μ•„λž˜μ˜ μ—…λ‘œλ“œ λ²„νŠΌμ„ μ‚¬μš©ν•˜μ„Έμš”."
66
 
67
  # μ‹œμŠ€ν…œ λ©”μ‹œμ§€μ™€ μ‚¬μš©μž λ©”μ‹œμ§€ κ²°ν•©
68
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
@@ -94,6 +96,14 @@ def upload_csv(file):
94
  # CSV 파일 읽기 (filepath νƒ€μž…μ΄λ―€λ‘œ file은 경둜 λ¬Έμžμ—΄)
95
  df = pd.read_csv(file)
96
 
 
 
 
 
 
 
 
 
97
  # 데이터 ν΄λ Œμ§•
98
  df.drop_duplicates(inplace=True)
99
  df.fillna('', inplace=True)
@@ -108,93 +118,70 @@ def upload_csv(file):
108
  # Parquet 파일 λ‘œλ“œ
109
  parquet_content = load_parquet(parquet_filename)
110
 
 
 
 
 
111
  return f"{parquet_filename} 파일이 μ„±κ³΅μ μœΌλ‘œ μ—…λ‘œλ“œλ˜κ³  λ³€ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", parquet_content
112
  except Exception as e:
113
  return f"CSV 파일 μ—…λ‘œλ“œ 및 λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}", ""
114
 
115
  # Gradio Blocks μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
116
- with gr.Blocks() as demo:
117
  gr.Markdown("# LLM μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€")
118
-
119
- with gr.Row():
120
- with gr.Column():
121
- # CSV 파일 μ—…λ‘œλ“œ μ„Ήμ…˜
122
- gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
123
- csv_file = gr.File(label="CSV 파일 μ—…λ‘œλ“œ", type="filepath")
124
- upload_button = gr.Button("μ—…λ‘œλ“œ 및 λ³€ν™˜")
125
- upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
126
- parquet_preview = gr.Markdown(label="Parquet 파일 미리보기")
127
-
128
- # μ—…λ‘œλ“œ λ²„νŠΌ 클릭 μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜
129
- upload_button.click(
130
- upload_csv,
131
- inputs=csv_file,
132
- outputs=[upload_status, parquet_preview]
133
- )
134
-
135
- gr.Markdown("### 기쑴 Parquet 파일")
136
- gr.Markdown(f"**test.parquet 파일 λ‚΄μš©:**\n```markdown\n{test_parquet_content}\n```")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
 
138
- with gr.Column():
139
- # Chat μΈν„°νŽ˜μ΄μŠ€ μ„Ήμ…˜
140
- gr.Markdown("### LLMκ³Ό λŒ€ν™”ν•˜κΈ°")
141
- chat_history = gr.State([]) # λŒ€ν™” νžˆμŠ€ν† λ¦¬ μ €μž₯
142
- parquet_content_state = gr.State(test_parquet_content) # 초기 Parquet λ‚΄μš© μƒνƒœ
143
-
144
- def chat_respond(
145
- message,
146
- history,
147
- system_message,
148
- max_tokens,
149
- temperature,
150
- top_p,
151
- parquet_content
152
- ):
153
- # ν˜„μž¬ Parquet λ‚΄μš© μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈ
154
- response = respond(message, history, system_message, max_tokens, temperature, top_p, parquet_content)
155
- return response
156
-
157
- chat = gr.Chatbot()
158
- system_message = gr.Textbox(label="System Message", value="")
159
- max_tokens = gr.Slider(minimum=1, maximum=8000, value=4000, label="Max Tokens")
160
- temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
161
- top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
162
-
163
- with gr.Row():
164
- user_message = gr.Textbox(label="λ©”μ‹œμ§€ μž…λ ₯")
165
- send_button = gr.Button("보내기")
166
-
167
- send_button.click(
168
- chat_respond,
169
- inputs=[user_message, chat_history, system_message, max_tokens, temperature, top_p, parquet_preview],
170
- outputs=[chat, chat_history]
171
- )
172
-
173
- gr.Markdown("## μ‚¬μš© 예제")
174
- gr.Examples(
175
- examples=[
176
- ["νŒ¨μ…˜ μ½”λ“œ μ‹€ν–‰"],
177
- ["UHD 이미지 μ½”λ“œ μ‹€ν–‰"],
178
- ["MixGEN μ½”λ“œ μ‹€ν–‰"],
179
- ["test.parquet μ‹€ν–‰"], # μƒˆλ‘œμš΄ 예제 μΆ”κ°€
180
- ["μƒμ„Έν•œ μ‚¬μš© 방법을 마치 화면을 λ³΄λ©΄μ„œ μ„€λͺ…ν•˜λ“―이 4000 토큰 이상 μžμ„Ένžˆ μ„€λͺ…ν•˜λΌ"],
181
- ["FAQ 20건을 μƒμ„Έν•˜κ²Œ μž‘μ„±ν•˜λΌ. 4000토큰 이상 μ‚¬μš©ν•˜λΌ."],
182
- ["μ‚¬μš© 방법과 차별점, νŠΉμ§•, 강점을 μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 유튜브 μ˜μƒ 슀크립트 ν˜•νƒœλ‘œ μž‘μ„±ν•˜λΌ"],
183
- ["λ³Έ μ„œλΉ„μŠ€λ₯Ό SEO μ΅œμ ν™”ν•˜μ—¬ λΈ”λ‘œκ·Έ 포슀트(λ°°κ²½ 및 ν•„μš”μ„±, κΈ°μ‘΄ μœ μ‚¬ μ„œλΉ„μŠ€μ™€ λΉ„κ΅ν•˜μ—¬ 특μž₯점, ν™œμš©μ²˜, κ°€μΉ˜, κΈ°λŒ€νš¨κ³Ό, 결둠을 포함)둜 4000 토큰 이상 μž‘μ„±ν•˜λΌ"],
184
- ["νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
185
- ["계속 μ΄μ–΄μ„œ λ‹΅λ³€ν•˜λΌ"],
186
- ],
187
- inputs=user_message,
188
- label="예제 선택",
189
- )
190
-
191
  gr.Markdown("## 주의 사항")
192
  gr.Markdown("""
193
  - **CSV μ—…λ‘œλ“œ**: CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ μžλ™μœΌλ‘œ Parquet 파일둜 λ³€ν™˜λ©λ‹ˆλ‹€.
194
  - **Parquet 미리보기**: μ—…λ‘œλ“œλœ Parquet 파일의 첫 10개 행이 미리보기둜 ν‘œμ‹œλ©λ‹ˆλ‹€.
195
  - **LLM과의 λŒ€ν™”**: λ³€ν™˜λœ Parquet 파일 λ‚΄μš©μ„ 기반으둜 LLM이 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
196
  """)
197
-
198
  gr.Markdown("### Gradio μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ LLM λͺ¨λΈκ³Ό μƒν˜Έμž‘μš©ν•˜μ„Έμš”!")
199
 
200
  if __name__ == "__main__":
 
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]],
 
45
  max_tokens=1024, # κΈ°λ³Έκ°’ μΆ”κ°€
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
 
 
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 μ—…λ‘œλ“œ":
67
+ message = "CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ €λ©΄ 두 번째 탭을 μ‚¬μš©ν•˜μ„Έμš”."
68
 
69
  # μ‹œμŠ€ν…œ λ©”μ‹œμ§€μ™€ μ‚¬μš©μž λ©”μ‹œμ§€ κ²°ν•©
70
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
 
96
  # CSV 파일 읽기 (filepath νƒ€μž…μ΄λ―€λ‘œ file은 경둜 λ¬Έμžμ—΄)
97
  df = pd.read_csv(file)
98
 
99
+ # CSV 파일의 컬럼 확인
100
+ required_columns = {'id', 'text', 'label', 'metadata'}
101
+ available_columns = set(df.columns)
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)
109
  df.fillna('', inplace=True)
 
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(theme="Nymbo/Nymbo_Theme",) as demo:
131
  gr.Markdown("# LLM μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€")
132
+
133
+ with gr.Tab("챗봇"):
134
+ gr.Markdown("### LLMκ³Ό λŒ€ν™”ν•˜κΈ°")
135
+ chat = gr.ChatInterface(
136
+ respond,
137
+ additional_inputs=[
138
+ gr.Textbox(label="System Message", value=""),
139
+ gr.Slider(minimum=1, maximum=8000, value=4000, label="Max Tokens"),
140
+ gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature"),
141
+ gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P"),
142
+ ],
143
+ examples=[
144
+ ["νŒ¨μ…˜ μ½”λ“œ μ‹€ν–‰"],
145
+ ["UHD 이미지 μ½”λ“œ μ‹€ν–‰"],
146
+ ["MixGEN μ½”λ“œ μ‹€ν–‰"],
147
+ ["test.parquet μ‹€ν–‰"], # μƒˆλ‘œμš΄ 예제 μΆ”κ°€
148
+ ["μƒμ„Έν•œ μ‚¬μš© 방법을 마치 화면을 λ³΄λ©΄μ„œ μ„€λͺ…ν•˜λ“―이 4000 토큰 이상 μžμ„Ένžˆ μ„€λͺ…ν•˜λΌ"],
149
+ ["FAQ 20건을 μƒμ„Έν•˜κ²Œ μž‘μ„±ν•˜λΌ. 4000토큰 이상 μ‚¬μš©ν•˜λΌ."],
150
+ ["μ‚¬μš© 방법과 차별점, νŠΉμ§•, 강점을 μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 유튜브 μ˜μƒ 슀크립트 ν˜•νƒœλ‘œ μž‘μ„±ν•˜λΌ"],
151
+ ["λ³Έ μ„œλΉ„μŠ€λ₯Ό SEO μ΅œμ ν™”ν•˜μ—¬ λΈ”λ‘œκ·Έ 포슀트(λ°°κ²½ 및 ν•„μš”μ„±, κΈ°μ‘΄ μœ μ‚¬ μ„œλΉ„μŠ€μ™€ λΉ„κ΅ν•˜μ—¬ 특μž₯점, ν™œμš©μ²˜, κ°€μΉ˜, κΈ°λŒ€νš¨κ³Ό, 결둠을 포함)둜 4000 토큰 이상 μž‘μ„±ν•˜λΌ"],
152
+ ["νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
153
+ ["계속 μ΄μ–΄μ„œ λ‹΅λ³€ν•˜λΌ"],
154
+ ],
155
+ theme="Nymbo/Nymbo_Theme",
156
+ cache_examples=False, # 캐싱 λΉ„ν™œμ„±ν™” μ„€μ •
157
+ )
158
+
159
+ with gr.Tab("데이터 λ³€ν™˜"):
160
+ gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
161
+ with gr.Row():
162
+ with gr.Column():
163
+ csv_file = gr.File(label="CSV 파일 μ—…λ‘œλ“œ", type="filepath")
164
+ upload_button = gr.Button("μ—…λ‘œλ“œ 및 λ³€ν™˜")
165
+ upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
166
+ parquet_preview = gr.Markdown(label="Parquet 파일 미리보기")
167
+
168
+ # μ—…λ‘œλ“œ λ²„νŠΌ 클릭 μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜
169
+ upload_button.click(
170
+ upload_csv,
171
+ inputs=csv_file,
172
+ outputs=[upload_status, parquet_preview]
173
+ )
174
 
175
+ gr.Markdown("### 기쑴 Parquet 파일")
176
+ gr.Markdown(f"**test.parquet 파일 λ‚΄μš©:**\n```markdown\n{test_parquet_content}\n```")
177
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  gr.Markdown("## 주의 사항")
179
  gr.Markdown("""
180
  - **CSV μ—…λ‘œλ“œ**: CSV νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λ©΄ μžλ™μœΌλ‘œ Parquet 파일둜 λ³€ν™˜λ©λ‹ˆλ‹€.
181
  - **Parquet 미리보기**: μ—…λ‘œλ“œλœ Parquet 파일의 첫 10개 행이 미리보기둜 ν‘œμ‹œλ©λ‹ˆλ‹€.
182
  - **LLM과의 λŒ€ν™”**: λ³€ν™˜λœ Parquet 파일 λ‚΄μš©μ„ 기반으둜 LLM이 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
183
  """)
184
+
185
  gr.Markdown("### Gradio μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ LLM λͺ¨λΈκ³Ό μƒν˜Έμž‘μš©ν•˜μ„Έμš”!")
186
 
187
  if __name__ == "__main__":