ginipick commited on
Commit
1071ed2
β€’
1 Parent(s): 707bf52

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -37
app.py CHANGED
@@ -42,7 +42,7 @@ def respond(
42
  parquet_data: Dict = None
43
  ) -> str:
44
  # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
45
- system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ λ‹΅λ³€ν•  것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μ½”λ“œλ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. μ½”λ“œ 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , ν‚€ κ°’ 및 μ—”λ“œν¬μΈνŠΈμ™€ ꡬ체적인 λͺ¨λΈμ€ κ³΅κ°œν•˜μ§€ 마라."""
46
 
47
  # Parquet 데이터 포함
48
  if parquet_data:
@@ -54,7 +54,7 @@ def respond(
54
  messages = [{"role": "system", "content": system_prefix}]
55
  for chat in history:
56
  messages.append({"role": chat['role'], "content": chat['content']})
57
- messages.append({"role": "user", "content": message})
58
 
59
  try:
60
  # λͺ¨λΈμ— λ©”μ‹œμ§€ 전솑 및 응닡 λ°›κΈ°
@@ -155,38 +155,13 @@ textarea, input[type="text"] {
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 파일 미리보기")
175
- parquet_data_state = gr.State()
176
-
177
- def handle_parquet_upload(file_path: str):
178
- message, parquet_content, parquet_json = upload_parquet(file_path)
179
- if parquet_json:
180
- return message, parquet_content, parquet_json
181
- else:
182
- return message, "", ""
183
-
184
- parquet_upload_button.click(
185
- handle_parquet_upload,
186
- inputs=parquet_upload,
187
- outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
188
- )
189
-
190
  gr.Markdown("### LLMκ³Ό λŒ€ν™”ν•˜κΈ°")
191
  chatbot_data_upload = gr.Chatbot(label="챗봇", type="messages", elem_id="chatbot-data-upload")
192
  msg_data_upload = gr.Textbox(label="λ©”μ‹œμ§€ μž…λ ₯", placeholder="여기에 λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜μ„Έμš”...")
@@ -209,6 +184,8 @@ with gr.Blocks(css=css) as demo:
209
  ):
210
  history = history or []
211
  try:
 
 
212
  # 응닡 생성
213
  response_gen = respond(
214
  message, history, system_message, max_tokens, temperature, top_p, parquet_data
@@ -218,16 +195,13 @@ with gr.Blocks(css=css) as demo:
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
 
@@ -240,7 +214,7 @@ with gr.Blocks(css=css) as demo:
240
  max_tokens,
241
  temperature,
242
  top_p,
243
- parquet_data_state
244
  ],
245
  outputs=[chatbot_data_upload, msg_data_upload],
246
  queue=True
@@ -251,16 +225,41 @@ with gr.Blocks(css=css) as demo:
251
  gr.Examples(
252
  examples=[
253
  ["μ—…λ‘œλ“œλœ 데이터셋에 λŒ€ν•΄ μš”μ•½ μ„€λͺ…ν•˜λΌ."],
254
- ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, λ³Έ μ„œλΉ„μŠ€λ₯Ό SEO μ΅œμ ν™”ν•˜μ—¬ λΈ”λ‘œκ·Έ 포슀트(κ°œμš”, λ°°κ²½ 및 ν•„μš”μ„±, κΈ°μ‘΄ μœ μ‚¬ μ œν””/μ„œλΉ„μŠ€μ™€ λΉ„κ΅ν•˜μ—¬ 특μž₯점, ν™œμš©μ²˜, κ°€μΉ˜, κΈ°λŒ€νš¨κ³Ό, 결둠을 포함)둜 4000 토큰 이상 μž‘μ„±ν•˜λΌ"],
255
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, μ‚¬μš© 방법과 차별점, νŠΉμ§•, 강점을 μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 유튜브 μ˜μƒ 슀크립트 ν˜•νƒœλ‘œ μž‘μ„±ν•˜λΌ"],
256
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, μ œν’ˆ 상세 νŽ˜μ΄μ§€ ν˜•μ‹μ˜ λ‚΄μš©μ„ 4000 토큰 이상 μžμ„Ένžˆ μ„€λͺ…ν•˜λΌ"],
257
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, FAQ 20건을 μƒμ„Έν•˜κ²Œ μž‘μ„±ν•˜λΌ. 4000토큰 이상 μ‚¬μš©ν•˜λΌ."],
258
- ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
259
  ],
260
  inputs=msg_data_upload,
261
  label="예제 선택",
262
  )
263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  # 두 번째 νƒ­: 데이터 λ³€ν™˜ (νƒ­ 이름 λ³€κ²½: "CSV to My 데이터셋")
265
  with gr.Tab("CSV to My 데이터셋"):
266
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
@@ -318,4 +317,3 @@ with gr.Blocks(css=css) as demo:
318
 
319
  if __name__ == "__main__":
320
  demo.launch()
321
-
 
42
  parquet_data: Dict = None
43
  ) -> str:
44
  # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
45
+ system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ λ‹΅λ³€ν•  것. λ„ˆλŠ” 주어진 데이터λ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” 데이터λ₯Ό 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄μš©μžκ°€ κΆκΈˆν•΄ν•  λ§Œν•œ λ‚΄μš©μ— μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όλ„λ‘ ν•˜λΌ. 데이터 전체 λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•˜κ³ , λ―Όκ°ν•œ μ •λ³΄λŠ” κ³΅κ°œν•˜μ§€ 마라."""
46
 
47
  # Parquet 데이터 포함
48
  if parquet_data:
 
54
  messages = [{"role": "system", "content": system_prefix}]
55
  for chat in history:
56
  messages.append({"role": chat['role'], "content": chat['content']})
57
+ # λ§ˆμ§€λ§‰ λ©”μ‹œμ§€λŠ” 이미 history에 μžˆμœΌλ―€λ‘œ μΆ”κ°€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
58
 
59
  try:
60
  # λͺ¨λΈμ— λ©”μ‹œμ§€ 전솑 및 응닡 λ°›κΈ°
 
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 포맷 데이터셋 μžλ™ λ³€ν™˜ 2) Parquet 포맷 데이터셋을 μ—…λ‘œλ“œν•˜λ©΄, LLM이 맞좀 ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬ 응닡\n"
159
+ "### Tip) '예제'λ₯Ό 톡해 λ‹€μ–‘ν•œ ν™œμš© 방법을 μ²΄ν—˜ν•˜κ³  μ‘μš©ν•΄ λ³΄μ„Έμš”, 데이터셋 μ—…λ‘œλ“œμ‹œ λ―Έλ¦¬λ³΄κΈ°λŠ” 10건만 좜λ ₯",
 
160
  elem_id="initial-description"
161
  )
162
 
163
  # 첫 번째 νƒ­: 챗봇 데이터 μ—…λ‘œλ“œ (νƒ­ 이름 λ³€κ²½: "My 데이터셋+LLM")
164
  with gr.Tab("My 데이터셋+LLM"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  gr.Markdown("### LLMκ³Ό λŒ€ν™”ν•˜κΈ°")
166
  chatbot_data_upload = gr.Chatbot(label="챗봇", type="messages", elem_id="chatbot-data-upload")
167
  msg_data_upload = gr.Textbox(label="λ©”μ‹œμ§€ μž…λ ₯", placeholder="여기에 λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜μ„Έμš”...")
 
184
  ):
185
  history = history or []
186
  try:
187
+ # μ‚¬μš©μžμ˜ λ©”μ‹œμ§€λ₯Ό νžˆμŠ€ν† λ¦¬μ— μΆ”κ°€
188
+ history.append({"role": "user", "content": message})
189
  # 응닡 생성
190
  response_gen = respond(
191
  message, history, system_message, max_tokens, temperature, top_p, parquet_data
 
195
  partial_response = partial
196
  # λŒ€ν™” λ‚΄μ—­ μ—…λ°μ΄νŠΈ
197
  display_history = history + [
 
198
  {"role": "assistant", "content": partial_response}
199
  ]
200
  yield display_history, ""
201
+ # μ–΄μ‹œμŠ€ν„΄νŠΈμ˜ 응닡을 νžˆμŠ€ν† λ¦¬μ— μΆ”κ°€
 
202
  history.append({"role": "assistant", "content": partial_response})
203
  except Exception as e:
204
  response = f"μΆ”λ‘  쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
 
205
  history.append({"role": "assistant", "content": response})
206
  yield history, ""
207
 
 
214
  max_tokens,
215
  temperature,
216
  top_p,
217
+ gr.State(), # parquet_data_stateλŠ” μ•„λž˜μ—μ„œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.
218
  ],
219
  outputs=[chatbot_data_upload, msg_data_upload],
220
  queue=True
 
225
  gr.Examples(
226
  examples=[
227
  ["μ—…λ‘œλ“œλœ 데이터셋에 λŒ€ν•΄ μš”μ•½ μ„€λͺ…ν•˜λΌ."],
228
+ ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, λ³Έ μ„œλΉ„μŠ€λ₯Ό SEO μ΅œμ ν™”ν•˜μ—¬ λΈ”λ‘œκ·Έ 포슀트(κ°œμš”, λ°°κ²½ 및 ν•„μš”μ„±, κΈ°μ‘΄ μœ μ‚¬ μ œν’ˆ/μ„œλΉ„μŠ€μ™€ λΉ„κ΅ν•˜μ—¬ 특μž₯점, ν™œμš©μ²˜, κ°€μΉ˜, κΈ°λŒ€νš¨κ³Ό, 결둠을 포함)둜 4000 토큰 이상 μž‘μ„±ν•˜λΌ"],
229
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, μ‚¬μš© 방법과 차별점, νŠΉμ§•, 강점을 μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 유튜브 μ˜μƒ 슀크립트 ν˜•νƒœλ‘œ μž‘μ„±ν•˜λΌ"],
230
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, μ œν’ˆ 상세 νŽ˜μ΄μ§€ ν˜•μ‹μ˜ λ‚΄μš©μ„ 4000 토큰 이상 μžμ„Ένžˆ μ„€λͺ…ν•˜λΌ"],
231
  ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, FAQ 20건을 μƒμ„Έν•˜κ²Œ μž‘μ„±ν•˜λΌ. 4000토큰 이상 μ‚¬μš©ν•˜λΌ."],
232
+ ["μ—…λ‘œλ“œλœ 데이터셋 νŒŒμΌμ„ ν•™μŠ΅ λ°μ΄ν„°λ‘œ ν™œμš©ν•˜μ—¬, νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€ λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 ν˜μ‹ μ μΈ 창의 발λͺ… λ‚΄μš©μ„ μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 μž‘μ„±ν•˜λΌ."],
233
  ],
234
  inputs=msg_data_upload,
235
  label="예제 선택",
236
  )
237
 
238
+ # Parquet 파일 μ—…λ‘œλ“œλ₯Ό ν™”λ©΄ ν•˜λ‹¨μœΌλ‘œ 이동
239
+ gr.Markdown("### Parquet 파일 μ—…λ‘œλ“œ")
240
+ with gr.Row():
241
+ with gr.Column():
242
+ parquet_upload = gr.File(
243
+ label="Parquet 파일 μ—…λ‘œλ“œ", type="filepath", elem_id="parquet-upload-area"
244
+ )
245
+ parquet_upload_button = gr.Button("μ—…λ‘œλ“œ")
246
+ parquet_upload_status = gr.Textbox(label="μ—…λ‘œλ“œ μƒνƒœ", interactive=False)
247
+ parquet_preview_chat = gr.Markdown(label="Parquet 파일 미리보기")
248
+ parquet_data_state = gr.State()
249
+
250
+ def handle_parquet_upload(file_path: str):
251
+ message, parquet_content, parquet_json = upload_parquet(file_path)
252
+ if parquet_json:
253
+ return message, parquet_content, parquet_json
254
+ else:
255
+ return message, "", ""
256
+
257
+ parquet_upload_button.click(
258
+ handle_parquet_upload,
259
+ inputs=parquet_upload,
260
+ outputs=[parquet_upload_status, parquet_preview_chat, parquet_data_state]
261
+ )
262
+
263
  # 두 번째 νƒ­: 데이터 λ³€ν™˜ (νƒ­ 이름 λ³€κ²½: "CSV to My 데이터셋")
264
  with gr.Tab("CSV to My 데이터셋"):
265
  gr.Markdown("### CSV 파일 μ—…λ‘œλ“œ 및 Parquet λ³€ν™˜")
 
317
 
318
  if __name__ == "__main__":
319
  demo.launch()