immunobiotech commited on
Commit
399b55b
ยท
verified ยท
1 Parent(s): ee06ac4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +113 -11
app.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  import gradio as gr
3
  from gradio import ChatMessage
4
  from typing import Iterator
@@ -54,6 +55,29 @@ for split in korean_food_dataset.keys():
54
  sub_len = min(MAX_SAMPLES, len(ds_split))
55
  korean_subset[split] = ds_split.select(range(sub_len))
56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
  def format_chat_history(messages: list) -> list:
59
  """
@@ -152,7 +176,6 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
152
  most_similar_data = find_most_similar_data(user_message)
153
 
154
  # ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ์„ค์ •
155
- # ์•„๋ž˜ system_prefix์—์„œ '์Œ์‹ + ๊ฑด๊ฐ• + ๋ฌธํ™” + ์—ญ์‚ฌ + ์•Œ๋ ˆ๋ฅด๊ธฐ + ์˜์–‘์†Œ + ์นผ๋กœ๋ฆฌ + ์•ฝ๋ฌผ ๋ณต์šฉ' ๋“ฑ ์ข…ํ•ฉ ์•ˆ๋‚ด๋ฅผ ๊ฐ•์กฐ
156
  system_message = (
157
  "์ €๋Š” ์ƒˆ๋กœ์šด ๋ง›๊ณผ ๊ฑด๊ฐ•์„ ์œ„ํ•œ ํ˜์‹ ์  ์กฐ๋ฆฌ๋ฒ•์„ ์ œ์‹œํ•˜๊ณ , "
158
  "ํ•œ๊ตญ ์Œ์‹์„ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋ ˆ์‹œํ”ผ ๋ฐ์ดํ„ฐ์™€ ๊ฑด๊ฐ• ์ง€์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ "
@@ -183,9 +206,18 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
183
  """
184
 
185
  if most_similar_data:
 
 
 
 
 
 
 
 
186
  prefixed_message = (
187
  f"{system_prefix} {system_message}\n\n"
188
- f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n\n"
 
189
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
190
  )
191
  else:
@@ -271,7 +303,6 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
271
  )
272
  yield messages
273
 
274
-
275
  def stream_gemini_response_special(user_message: str, messages: list) -> Iterator[list]:
276
  """
277
  ํŠน์ˆ˜ ์งˆ๋ฌธ(์˜ˆ: ๊ฑด๊ฐ• ์‹๋‹จ ์„ค๊ณ„, ๋งž์ถคํ˜• ์š”๋ฆฌ ๊ฐœ๋ฐœ ๋“ฑ)์— ๋Œ€ํ•œ Gemini์˜ ์ƒ๊ฐ๊ณผ ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ
@@ -309,9 +340,18 @@ def stream_gemini_response_special(user_message: str, messages: list) -> Iterato
309
  """
310
 
311
  if most_similar_data:
 
 
 
 
 
 
 
 
312
  prefixed_message = (
313
  f"{system_prefix} {system_message}\n\n"
314
- f"[๊ด€๋ จ ์ •๋ณด]\n{most_similar_data}\n\n"
 
315
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
316
  )
317
  else:
@@ -435,9 +475,18 @@ def stream_gemini_response_personalized(user_message: str, messages: list) -> It
435
  """
436
 
437
  if most_similar_data:
 
 
 
 
 
 
 
 
438
  prefixed_message = (
439
  f"{system_prefix} {system_message}\n\n"
440
- f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n\n"
 
441
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
442
  )
443
  else:
@@ -525,7 +574,6 @@ def user_message(msg: str, history: list) -> tuple[str, list]:
525
  ########################
526
  # Gradio ์ธํ„ฐ๏ฟฝ๏ฟฝ์ด์Šค ๊ตฌ์„ฑ
527
  ########################
528
-
529
  with gr.Blocks(
530
  theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral"),
531
  css="""
@@ -653,7 +701,7 @@ with gr.Blocks(
653
  queue=False
654
  )
655
 
656
- # 3) ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ (Personalized Cuisine Recommender) ํƒญ
657
  with gr.TabItem("์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ", id="personalized_cuisine_tab"):
658
  personalized_chatbot = gr.Chatbot(
659
  type="messages",
@@ -673,7 +721,6 @@ with gr.Blocks(
673
  )
674
  personalized_clear_button = gr.Button("๋Œ€ํ™” ์ดˆ๊ธฐํ™”", scale=1)
675
 
676
- # ์˜ˆ์‹œ
677
  personalized_example_prompts = [
678
  ["์•Œ๋ ˆ๋ฅด๊ธฐ๊ฐ€ (๊ฒฌ๊ณผ๋ฅ˜, ํ•ด์‚ฐ๋ฌผ)์ด๊ณ , ํ˜ˆ์•• ์•ฝ์„ ๋ณต์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ €์นผ๋กœ๋ฆฌ ์ €์—ผ์‹ ์ถ”์ฒœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค."],
679
  ["์œ ๋‹น๋ถˆ๋‚ด์ฆ์ด ์žˆ์–ด์„œ ์œ ์ œํ’ˆ์„ ํ”ผํ•˜๊ณ  ์‹ถ๊ณ , ๋‹จ๋ฐฑ์งˆ ์„ญ์ทจ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹๋‹จ ์กฐํ•ฉ ์ข€ ์•Œ๋ ค์ฃผ์„ธ์š”."],
@@ -710,6 +757,59 @@ with gr.Blocks(
710
  queue=False
711
  )
712
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
713
  # ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ํƒญ
714
  with gr.TabItem("์ด์šฉ ๋ฐฉ๋ฒ•", id="instructions_tab"):
715
  gr.Markdown(
@@ -726,13 +826,15 @@ with gr.Blocks(
726
  - **ํ•œ๊ตญ ์Œ์‹ ํŠนํ™”**: ์ „ํ†ต ํ•œ์‹ ๋ ˆ์‹œํ”ผ ๋ฐ ํ•œ๊ตญ ์Œ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ํ’๋ถ€ํ•œ ์ œ์•ˆ ๊ฐ€๋Šฅ.
727
  - **์‹ค์‹œ๊ฐ„ ์ถ”๋ก (Thinking) ํ‘œ์‹œ**: ๋‹ต๋ณ€ ๊ณผ์ •์—์„œ ๋ชจ๋ธ์ด ์ƒ๊ฐ์„ ์ „๊ฐœํ•˜๋Š” ํ๋ฆ„(์‹คํ—˜์  ๊ธฐ๋Šฅ)์„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ™•์ธ.
728
  - **๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰**: ๋‚ด๋ถ€์ ์œผ๋กœ ์ ํ•ฉํ•œ ์ •๋ณด๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ํ’๋ถ€ํ•˜๊ฒŒ ์ œ๊ณต.
 
729
 
730
  ### ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
731
  1. **'์ฐฝ์˜์  ๋ ˆ์‹œํ”ผ ๋ฐ ๊ฐ€์ด๋“œ' ํƒญ**: ์ผ๋ฐ˜์ ์ธ ์š”๋ฆฌ ์•„์ด๋””์–ด๋‚˜ ์˜์–‘ ์ •๋ณด๋ฅผ ๋ฌธ์˜.
732
  2. **'๋งž์ถคํ˜• ์‹๋‹จ/๊ฑด๊ฐ•' ํƒญ**: ํŠน์ • ์งˆํ™˜, ์ƒํ™ฉ๋ณ„(์Šคํฌ์ธ , ๋‹ค์ด์–ดํŠธ ๋“ฑ) ์‹๋‹จ/๋ ˆ์‹œํ”ผ ์ƒ๋‹ด.
733
  3. **'์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ' ํƒญ**: ์•Œ๋ ˆ๋ฅด๊ธฐ, ์•ฝ๋ฌผ, ๊ฐœ์ธ ์นผ๋กœ๋ฆฌ ๋ชฉํ‘œ ๋“ฑ ์„ธ๋ถ€ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•œ ์ตœ์  ์‹๋‹จ ์ถ”์ฒœ.
734
- 4. **์˜ˆ์‹œ ์งˆ๋ฌธ**์„ ํด๋ฆญํ•˜๋ฉด ์ฆ‰์‹œ ์งˆ๋ฌธ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
735
- 5. ํ•„์š” ์‹œ **๋Œ€ํ™” ์ดˆ๊ธฐํ™”** ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒˆ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”.
 
736
 
737
  ### ์ฐธ๊ณ  ์‚ฌํ•ญ
738
  - **Thinking(์ถ”๋ก ) ๊ธฐ๋Šฅ**์€ ๋ชจ๋ธ ๋‚ด๋ถ€ ๊ณผ์ •์„ ์ผ๋ถ€ ๊ณต๊ฐœํ•˜์ง€๋งŒ, ์ด๋Š” ์‹คํ—˜์ ์ด๋ฉฐ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„๊ณต๊ฐœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@@ -743,4 +845,4 @@ with gr.Blocks(
743
 
744
  # Gradio ์›น ์„œ๋น„์Šค ์‹คํ–‰
745
  if __name__ == "__main__":
746
- demo.launch(debug=True)
 
1
  import os
2
+ import csv
3
  import gradio as gr
4
  from gradio import ChatMessage
5
  from typing import Iterator
 
55
  sub_len = min(MAX_SAMPLES, len(ds_split))
56
  korean_subset[split] = ds_split.select(range(sub_len))
57
 
58
+ def find_related_restaurants(query: str, limit: int = 3) -> list:
59
+ """
60
+ Query์— ๊ด€๋ จ๋œ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘์„ find.csv์—์„œ ์ฐพ์•„ ๋ฐ˜ํ™˜
61
+ """
62
+ try:
63
+ with open('find.csv', 'r', encoding='utf-8') as f:
64
+ reader = csv.DictReader(f)
65
+ restaurants = list(reader)
66
+
67
+ # ๊ฐ„๋‹จํ•œ ํ‚ค์›Œ๋“œ ๋งค์นญ
68
+ related = []
69
+ query = query.lower()
70
+ for restaurant in restaurants:
71
+ if (query in restaurant.get('Cuisine', '').lower() or
72
+ query in restaurant.get('Description', '').lower()):
73
+ related.append(restaurant)
74
+ if len(related) >= limit:
75
+ break
76
+
77
+ return related
78
+ except Exception as e:
79
+ print(f"Error finding restaurants: {e}")
80
+ return []
81
 
82
  def format_chat_history(messages: list) -> list:
83
  """
 
176
  most_similar_data = find_most_similar_data(user_message)
177
 
178
  # ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ์„ค์ •
 
179
  system_message = (
180
  "์ €๋Š” ์ƒˆ๋กœ์šด ๋ง›๊ณผ ๊ฑด๊ฐ•์„ ์œ„ํ•œ ํ˜์‹ ์  ์กฐ๋ฆฌ๋ฒ•์„ ์ œ์‹œํ•˜๊ณ , "
181
  "ํ•œ๊ตญ ์Œ์‹์„ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋ ˆ์‹œํ”ผ ๋ฐ์ดํ„ฐ์™€ ๊ฑด๊ฐ• ์ง€์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ "
 
206
  """
207
 
208
  if most_similar_data:
209
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
210
+ related_restaurants = find_related_restaurants(user_message)
211
+ restaurant_text = ""
212
+ if related_restaurants:
213
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
214
+ for rest in related_restaurants:
215
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
216
+
217
  prefixed_message = (
218
  f"{system_prefix} {system_message}\n\n"
219
+ f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n"
220
+ f"{restaurant_text}\n"
221
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
222
  )
223
  else:
 
303
  )
304
  yield messages
305
 
 
306
  def stream_gemini_response_special(user_message: str, messages: list) -> Iterator[list]:
307
  """
308
  ํŠน์ˆ˜ ์งˆ๋ฌธ(์˜ˆ: ๊ฑด๊ฐ• ์‹๋‹จ ์„ค๊ณ„, ๋งž์ถคํ˜• ์š”๋ฆฌ ๊ฐœ๋ฐœ ๋“ฑ)์— ๋Œ€ํ•œ Gemini์˜ ์ƒ๊ฐ๊ณผ ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ
 
340
  """
341
 
342
  if most_similar_data:
343
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
344
+ related_restaurants = find_related_restaurants(user_message)
345
+ restaurant_text = ""
346
+ if related_restaurants:
347
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
348
+ for rest in related_restaurants:
349
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
350
+
351
  prefixed_message = (
352
  f"{system_prefix} {system_message}\n\n"
353
+ f"[๊ด€๋ จ ์ •๋ณด]\n{most_similar_data}\n"
354
+ f"{restaurant_text}\n"
355
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
356
  )
357
  else:
 
475
  """
476
 
477
  if most_similar_data:
478
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
479
+ related_restaurants = find_related_restaurants(user_message)
480
+ restaurant_text = ""
481
+ if related_restaurants:
482
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
483
+ for rest in related_restaurants:
484
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
485
+
486
  prefixed_message = (
487
  f"{system_prefix} {system_message}\n\n"
488
+ f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n"
489
+ f"{restaurant_text}\n"
490
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
491
  )
492
  else:
 
574
  ########################
575
  # Gradio ์ธํ„ฐ๏ฟฝ๏ฟฝ์ด์Šค ๊ตฌ์„ฑ
576
  ########################
 
577
  with gr.Blocks(
578
  theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral"),
579
  css="""
 
701
  queue=False
702
  )
703
 
704
+ # 3) ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ ํƒญ
705
  with gr.TabItem("์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ", id="personalized_cuisine_tab"):
706
  personalized_chatbot = gr.Chatbot(
707
  type="messages",
 
721
  )
722
  personalized_clear_button = gr.Button("๋Œ€ํ™” ์ดˆ๊ธฐํ™”", scale=1)
723
 
 
724
  personalized_example_prompts = [
725
  ["์•Œ๋ ˆ๋ฅด๊ธฐ๊ฐ€ (๊ฒฌ๊ณผ๋ฅ˜, ํ•ด์‚ฐ๋ฌผ)์ด๊ณ , ํ˜ˆ์•• ์•ฝ์„ ๋ณต์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ €์นผ๋กœ๋ฆฌ ์ €์—ผ์‹ ์ถ”์ฒœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค."],
726
  ["์œ ๋‹น๋ถˆ๋‚ด์ฆ์ด ์žˆ์–ด์„œ ์œ ์ œํ’ˆ์„ ํ”ผํ•˜๊ณ  ์‹ถ๊ณ , ๋‹จ๋ฐฑ์งˆ ์„ญ์ทจ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹๋‹จ ์กฐํ•ฉ ์ข€ ์•Œ๋ ค์ฃผ์„ธ์š”."],
 
757
  queue=False
758
  )
759
 
760
+ # 4) ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ํƒญ
761
+ with gr.TabItem("MICHELIN Restaurant", id="restaurant_tab"):
762
+ with gr.Row():
763
+ search_box = gr.Textbox(
764
+ label="๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰",
765
+ placeholder="๋ ˆ์Šคํ† ๋ž‘ ์ด๋ฆ„, ์ฃผ์†Œ, ์š”๋ฆฌ ์ข…๋ฅ˜ ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰...",
766
+ scale=3
767
+ )
768
+ cuisine_dropdown = gr.Dropdown(
769
+ label="์š”๋ฆฌ ์ข…๋ฅ˜",
770
+ choices=["์ „์ฒด"] + sorted(set(r['Cuisine'] for r in find_related_restaurants("", 1000))),
771
+ value="์ „์ฒด",
772
+ scale=1
773
+ )
774
+ award_dropdown = gr.Dropdown(
775
+ label="๋ฏธ์‰๋ฆฐ ๋“ฑ๊ธ‰",
776
+ choices=["์ „์ฒด"] + sorted(set(r['Award'] for r in find_related_restaurants("", 1000))),
777
+ value="์ „์ฒด",
778
+ scale=1
779
+ )
780
+ search_button = gr.Button("๊ฒ€์ƒ‰", scale=1)
781
+
782
+ result_table = gr.Dataframe(
783
+ headers=["Name", "Address", "Location", "Price", "Cuisine", "Award", "Description"],
784
+ row_count=10,
785
+ col_count=(7, "fixed"),
786
+ overflow_row_behaviour="paginate"
787
+ )
788
+
789
+ def search_restaurants(search_term, cuisine, award):
790
+ restaurants = find_related_restaurants("", 1000) # ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
791
+
792
+ filtered = []
793
+ for r in restaurants:
794
+ if search_term.lower() in r['Name'].lower() or \
795
+ search_term.lower() in r['Address'].lower() or \
796
+ search_term.lower() in r['Description'].lower():
797
+ if (cuisine == "์ „์ฒด" or r['Cuisine'] == cuisine) and \
798
+ (award == "์ „์ฒด" or r['Award'] == award):
799
+ filtered.append([
800
+ r['Name'], r['Address'], r['Location'],
801
+ r['Price'], r['Cuisine'], r['Award'],
802
+ r['Description']
803
+ ])
804
+
805
+ return filtered
806
+
807
+ search_button.click(
808
+ search_restaurants,
809
+ inputs=[search_box, cuisine_dropdown, award_dropdown],
810
+ outputs=result_table
811
+ )
812
+
813
  # ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ํƒญ
814
  with gr.TabItem("์ด์šฉ ๋ฐฉ๋ฒ•", id="instructions_tab"):
815
  gr.Markdown(
 
826
  - **ํ•œ๊ตญ ์Œ์‹ ํŠนํ™”**: ์ „ํ†ต ํ•œ์‹ ๋ ˆ์‹œํ”ผ ๋ฐ ํ•œ๊ตญ ์Œ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ํ’๋ถ€ํ•œ ์ œ์•ˆ ๊ฐ€๋Šฅ.
827
  - **์‹ค์‹œ๊ฐ„ ์ถ”๋ก (Thinking) ํ‘œ์‹œ**: ๋‹ต๋ณ€ ๊ณผ์ •์—์„œ ๋ชจ๋ธ์ด ์ƒ๊ฐ์„ ์ „๊ฐœํ•˜๋Š” ํ๋ฆ„(์‹คํ—˜์  ๊ธฐ๋Šฅ)์„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ™•์ธ.
828
  - **๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰**: ๋‚ด๋ถ€์ ์œผ๋กœ ์ ํ•ฉํ•œ ์ •๋ณด๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ํ’๋ถ€ํ•˜๊ฒŒ ์ œ๊ณต.
829
+ - **๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰**: ์ „ ์„ธ๊ณ„ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰ ๋ฐ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ์ œ๊ณต.
830
 
831
  ### ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
832
  1. **'์ฐฝ์˜์  ๋ ˆ์‹œํ”ผ ๋ฐ ๊ฐ€์ด๋“œ' ํƒญ**: ์ผ๋ฐ˜์ ์ธ ์š”๋ฆฌ ์•„์ด๋””์–ด๋‚˜ ์˜์–‘ ์ •๋ณด๋ฅผ ๋ฌธ์˜.
833
  2. **'๋งž์ถคํ˜• ์‹๋‹จ/๊ฑด๊ฐ•' ํƒญ**: ํŠน์ • ์งˆํ™˜, ์ƒํ™ฉ๋ณ„(์Šคํฌ์ธ , ๋‹ค์ด์–ดํŠธ ๋“ฑ) ์‹๋‹จ/๋ ˆ์‹œํ”ผ ์ƒ๋‹ด.
834
  3. **'์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ' ํƒญ**: ์•Œ๋ ˆ๋ฅด๊ธฐ, ์•ฝ๋ฌผ, ๊ฐœ์ธ ์นผ๋กœ๋ฆฌ ๋ชฉํ‘œ ๋“ฑ ์„ธ๋ถ€ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•œ ์ตœ์  ์‹๋‹จ ์ถ”์ฒœ.
835
+ 4. **'MICHELIN Restaurant' ํƒญ**: ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ.
836
+ 5. **์˜ˆ์‹œ ์งˆ๋ฌธ**์„ ํด๋ฆญํ•˜๋ฉด ์ฆ‰์‹œ ์งˆ๋ฌธ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
837
+ 6. ํ•„์š” ์‹œ **๋Œ€ํ™” ์ดˆ๊ธฐํ™”** ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒˆ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”.
838
 
839
  ### ์ฐธ๊ณ  ์‚ฌํ•ญ
840
  - **Thinking(์ถ”๋ก ) ๊ธฐ๋Šฅ**์€ ๋ชจ๋ธ ๋‚ด๋ถ€ ๊ณผ์ •์„ ์ผ๋ถ€ ๊ณต๊ฐœํ•˜์ง€๋งŒ, ์ด๋Š” ์‹คํ—˜์ ์ด๋ฉฐ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„๊ณต๊ฐœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
845
 
846
  # Gradio ์›น ์„œ๋น„์Šค ์‹คํ–‰
847
  if __name__ == "__main__":
848
+ demo.launch(debug=True)