immunobiotech commited on
Commit
b32ab88
ยท
verified ยท
1 Parent(s): 81bcbbd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +148 -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,32 @@ 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 +179,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 +209,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 +306,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 +343,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 +478,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 +577,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 +704,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 +724,6 @@ with gr.Blocks(
673
  )
674
  personalized_clear_button = gr.Button("๋Œ€ํ™” ์ดˆ๊ธฐํ™”", scale=1)
675
 
676
- # ์˜ˆ์‹œ
677
  personalized_example_prompts = [
678
  ["์•Œ๋ ˆ๋ฅด๊ธฐ๊ฐ€ (๊ฒฌ๊ณผ๋ฅ˜, ํ•ด์‚ฐ๋ฌผ)์ด๊ณ , ํ˜ˆ์•• ์•ฝ์„ ๋ณต์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ €์นผ๋กœ๋ฆฌ ์ €์—ผ์‹ ์ถ”์ฒœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค."],
679
  ["์œ ๋‹น๋ถˆ๋‚ด์ฆ์ด ์žˆ์–ด์„œ ์œ ์ œํ’ˆ์„ ํ”ผํ•˜๊ณ  ์‹ถ๊ณ , ๋‹จ๋ฐฑ์งˆ ์„ญ์ทจ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹๋‹จ ์กฐํ•ฉ ์ข€ ์•Œ๋ ค์ฃผ์„ธ์š”."],
@@ -710,6 +760,91 @@ with gr.Blocks(
710
  queue=False
711
  )
712
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
713
  # ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ํƒญ
714
  with gr.TabItem("์ด์šฉ ๋ฐฉ๋ฒ•", id="instructions_tab"):
715
  gr.Markdown(
@@ -726,13 +861,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 +880,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์— ๊ด€๋ จ๋œ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘์„ michelin_my_maps.csv์—์„œ ์ฐพ์•„ ๋ฐ˜ํ™˜
61
+ """
62
+ try:
63
+ with open('michelin_my_maps.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 FileNotFoundError:
79
+ print("Warning: michelin_my_maps.csv file not found")
80
+ return []
81
+ except Exception as e:
82
+ print(f"Error finding restaurants: {e}")
83
+ return []
84
 
85
  def format_chat_history(messages: list) -> list:
86
  """
 
179
  most_similar_data = find_most_similar_data(user_message)
180
 
181
  # ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์™€ ํ”„๋กฌํ”„ํŠธ ์„ค์ •
 
182
  system_message = (
183
  "์ €๋Š” ์ƒˆ๋กœ์šด ๋ง›๊ณผ ๊ฑด๊ฐ•์„ ์œ„ํ•œ ํ˜์‹ ์  ์กฐ๋ฆฌ๋ฒ•์„ ์ œ์‹œํ•˜๊ณ , "
184
  "ํ•œ๊ตญ ์Œ์‹์„ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋ ˆ์‹œํ”ผ ๋ฐ์ดํ„ฐ์™€ ๊ฑด๊ฐ• ์ง€์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ "
 
209
  """
210
 
211
  if most_similar_data:
212
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
213
+ related_restaurants = find_related_restaurants(user_message)
214
+ restaurant_text = ""
215
+ if related_restaurants:
216
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
217
+ for rest in related_restaurants:
218
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
219
+
220
  prefixed_message = (
221
  f"{system_prefix} {system_message}\n\n"
222
+ f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n"
223
+ f"{restaurant_text}\n"
224
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
225
  )
226
  else:
 
306
  )
307
  yield messages
308
 
 
309
  def stream_gemini_response_special(user_message: str, messages: list) -> Iterator[list]:
310
  """
311
  ํŠน์ˆ˜ ์งˆ๋ฌธ(์˜ˆ: ๊ฑด๊ฐ• ์‹๋‹จ ์„ค๊ณ„, ๋งž์ถคํ˜• ์š”๋ฆฌ ๊ฐœ๋ฐœ ๋“ฑ)์— ๋Œ€ํ•œ Gemini์˜ ์ƒ๊ฐ๊ณผ ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ
 
343
  """
344
 
345
  if most_similar_data:
346
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
347
+ related_restaurants = find_related_restaurants(user_message)
348
+ restaurant_text = ""
349
+ if related_restaurants:
350
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
351
+ for rest in related_restaurants:
352
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
353
+
354
  prefixed_message = (
355
  f"{system_prefix} {system_message}\n\n"
356
+ f"[๊ด€๋ จ ์ •๋ณด]\n{most_similar_data}\n"
357
+ f"{restaurant_text}\n"
358
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
359
  )
360
  else:
 
478
  """
479
 
480
  if most_similar_data:
481
+ # ๊ด€๋ จ ๋ ˆ์Šคํ† ๋ž‘ ์ฐพ๊ธฐ
482
+ related_restaurants = find_related_restaurants(user_message)
483
+ restaurant_text = ""
484
+ if related_restaurants:
485
+ restaurant_text = "\n\n[๊ด€๋ จ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ์ถ”์ฒœ]\n"
486
+ for rest in related_restaurants:
487
+ restaurant_text += f"- {rest['Name']} ({rest['Location']}): {rest['Cuisine']}, {rest['Award']}\n"
488
+
489
  prefixed_message = (
490
  f"{system_prefix} {system_message}\n\n"
491
+ f"[๊ด€๋ จ ๋ฐ์ดํ„ฐ]\n{most_similar_data}\n"
492
+ f"{restaurant_text}\n"
493
  f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_message}"
494
  )
495
  else:
 
577
  ########################
578
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
579
  ########################
 
580
  with gr.Blocks(
581
  theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral"),
582
  css="""
 
704
  queue=False
705
  )
706
 
707
+ # 3) ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ ํƒญ
708
  with gr.TabItem("์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ", id="personalized_cuisine_tab"):
709
  personalized_chatbot = gr.Chatbot(
710
  type="messages",
 
724
  )
725
  personalized_clear_button = gr.Button("๋Œ€ํ™” ์ดˆ๊ธฐํ™”", scale=1)
726
 
 
727
  personalized_example_prompts = [
728
  ["์•Œ๋ ˆ๋ฅด๊ธฐ๊ฐ€ (๊ฒฌ๊ณผ๋ฅ˜, ํ•ด์‚ฐ๋ฌผ)์ด๊ณ , ํ˜ˆ์•• ์•ฝ์„ ๋ณต์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ €์นผ๋กœ๋ฆฌ ์ €์—ผ์‹ ์ถ”์ฒœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค."],
729
  ["์œ ๋‹น๋ถˆ๋‚ด์ฆ์ด ์žˆ์–ด์„œ ์œ ์ œํ’ˆ์„ ํ”ผํ•˜๊ณ  ์‹ถ๊ณ , ๋‹จ๋ฐฑ์งˆ ์„ญ์ทจ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹๋‹จ ์กฐํ•ฉ ์ข€ ์•Œ๋ ค์ฃผ์„ธ์š”."],
 
760
  queue=False
761
  )
762
 
763
+ # 4) ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ํƒญ
764
+ with gr.TabItem("MICHELIN Restaurant", id="restaurant_tab"):
765
+ with gr.Row():
766
+ search_box = gr.Textbox(
767
+ label="๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰",
768
+ placeholder="๋ ˆ์Šคํ† ๋ž‘ ์ด๋ฆ„, ์ฃผ์†Œ, ์š”๋ฆฌ ์ข…๋ฅ˜ ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰...",
769
+ scale=3
770
+ )
771
+ cuisine_dropdown = gr.Dropdown(
772
+ label="์š”๋ฆฌ ์ข…๋ฅ˜",
773
+ choices=[("์ „์ฒด", "์ „์ฒด")], # ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
774
+ value="์ „์ฒด",
775
+ scale=1
776
+ )
777
+ award_dropdown = gr.Dropdown(
778
+ label="๋ฏธ์‰๋ฆฐ ๋“ฑ๊ธ‰",
779
+ choices=[("์ „์ฒด", "์ „์ฒด")], # ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
780
+ value="์ „์ฒด",
781
+ scale=1
782
+ )
783
+ search_button = gr.Button("๊ฒ€์ƒ‰", scale=1)
784
+
785
+ result_table = gr.Dataframe(
786
+ headers=["Name", "Address", "Location", "Price", "Cuisine", "Award", "Description"],
787
+ row_count=100,
788
+ col_count=7,
789
+ interactive=False,
790
+ )
791
+
792
+ def init_dropdowns():
793
+ try:
794
+ with open('michelin_my_maps.csv', 'r', encoding='utf-8') as f:
795
+ reader = csv.DictReader(f)
796
+ restaurants = list(reader)
797
+ cuisines = [("์ „์ฒด", "์ „์ฒด")] + [(cuisine, cuisine) for cuisine in
798
+ sorted(set(r['Cuisine'] for r in restaurants if r['Cuisine']))]
799
+ awards = [("์ „์ฒด", "์ „์ฒด")] + [(award, award) for award in
800
+ sorted(set(r['Award'] for r in restaurants if r['Award']))]
801
+ return cuisines, awards
802
+ except FileNotFoundError:
803
+ print("Warning: michelin_my_maps.csv file not found")
804
+ return [("์ „์ฒด", "์ „์ฒด")], [("์ „์ฒด", "์ „์ฒด")]
805
+
806
+ def search_restaurants(search_term, cuisine, award):
807
+ try:
808
+ with open('michelin_my_maps.csv', 'r', encoding='utf-8') as f:
809
+ reader = csv.DictReader(f)
810
+ restaurants = list(reader)
811
+
812
+ filtered = []
813
+ search_term = search_term.lower() if search_term else ""
814
+
815
+ for r in restaurants:
816
+ if search_term == "" or \
817
+ search_term in r['Name'].lower() or \
818
+ search_term in r['Address'].lower() or \
819
+ search_term in r['Description'].lower():
820
+ if (cuisine == "์ „์ฒด" or r['Cuisine'] == cuisine) and \
821
+ (award == "์ „์ฒด" or r['Award'] == award):
822
+ filtered.append([
823
+ r['Name'], r['Address'], r['Location'],
824
+ r['Price'], r['Cuisine'], r['Award'],
825
+ r['Description']
826
+ ])
827
+ if len(filtered) >= 100: # ์ตœ๋Œ€ 10๊ฐœ ๊ฒฐ๊ณผ๋กœ ์ œํ•œ
828
+ break
829
+
830
+ return filtered
831
+ except FileNotFoundError:
832
+ return [["ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค", "", "", "", "", "", "michelin_my_maps.csv ํŒŒ์ผ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”"]]
833
+
834
+ # ๋“œ๋กญ๋‹ค์šด ์ดˆ๊ธฐํ™”
835
+ cuisines, awards = init_dropdowns()
836
+ cuisine_dropdown.choices = cuisines
837
+ award_dropdown.choices = awards
838
+
839
+ search_button.click(
840
+ search_restaurants,
841
+ inputs=[search_box, cuisine_dropdown, award_dropdown],
842
+ outputs=result_table
843
+ )
844
+
845
+
846
+
847
+
848
  # ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ํƒญ
849
  with gr.TabItem("์ด์šฉ ๋ฐฉ๋ฒ•", id="instructions_tab"):
850
  gr.Markdown(
 
861
  - **ํ•œ๊ตญ ์Œ์‹ ํŠนํ™”**: ์ „ํ†ต ํ•œ์‹ ๋ ˆ์‹œํ”ผ ๋ฐ ํ•œ๊ตญ ์Œ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ํ’๋ถ€ํ•œ ์ œ์•ˆ ๊ฐ€๋Šฅ.
862
  - **์‹ค์‹œ๊ฐ„ ์ถ”๋ก (Thinking) ํ‘œ์‹œ**: ๋‹ต๋ณ€ ๊ณผ์ •์—์„œ ๋ชจ๋ธ์ด ์ƒ๊ฐ์„ ์ „๊ฐœํ•˜๋Š” ํ๋ฆ„(์‹คํ—˜์  ๊ธฐ๋Šฅ)์„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ™•์ธ.
863
  - **๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰**: ๋‚ด๋ถ€์ ์œผ๋กœ ์ ํ•ฉํ•œ ์ •๋ณด๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ํ’๋ถ€ํ•˜๊ฒŒ ์ œ๊ณต.
864
+ - **๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰**: ์ „ ์„ธ๊ณ„ ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰ ๋ฐ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ์ œ๊ณต.
865
 
866
  ### ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
867
  1. **'์ฐฝ์˜์  ๋ ˆ์‹œํ”ผ ๋ฐ ๊ฐ€์ด๋“œ' ํƒญ**: ์ผ๋ฐ˜์ ์ธ ์š”๋ฆฌ ์•„์ด๋””์–ด๋‚˜ ์˜์–‘ ์ •๋ณด๋ฅผ ๋ฌธ์˜.
868
  2. **'๋งž์ถคํ˜• ์‹๋‹จ/๊ฑด๊ฐ•' ํƒญ**: ํŠน์ • ์งˆํ™˜, ์ƒํ™ฉ๋ณ„(์Šคํฌ์ธ , ๋‹ค์ด์–ดํŠธ ๋“ฑ) ์‹๋‹จ/๋ ˆ์‹œํ”ผ ์ƒ๋‹ด.
869
  3. **'์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์Œ์‹ ์ถ”์ฒœ' ํƒญ**: ์•Œ๋ ˆ๋ฅด๊ธฐ, ์•ฝ๋ฌผ, ๊ฐœ์ธ ์นผ๋กœ๋ฆฌ ๋ชฉํ‘œ ๋“ฑ ์„ธ๋ถ€ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•œ ์ตœ์  ์‹๋‹จ ์ถ”์ฒœ.
870
+ 4. **'MICHELIN Restaurant' ํƒญ**: ๋ฏธ์‰๋ฆฐ ๋ ˆ์Šคํ† ๋ž‘ ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ.
871
+ 5. **์˜ˆ์‹œ ์งˆ๋ฌธ**์„ ํด๋ฆญํ•˜๋ฉด ์ฆ‰์‹œ ์งˆ๋ฌธ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
872
+ 6. ํ•„์š” ์‹œ **๋Œ€ํ™” ์ดˆ๊ธฐํ™”** ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒˆ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”.
873
 
874
  ### ์ฐธ๊ณ  ์‚ฌํ•ญ
875
  - **Thinking(์ถ”๋ก ) ๊ธฐ๋Šฅ**์€ ๋ชจ๋ธ ๋‚ด๋ถ€ ๊ณผ์ •์„ ์ผ๋ถ€ ๊ณต๊ฐœํ•˜์ง€๋งŒ, ์ด๋Š” ์‹คํ—˜์ ์ด๋ฉฐ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„๊ณต๊ฐœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
880
 
881
  # Gradio ์›น ์„œ๋น„์Šค ์‹คํ–‰
882
  if __name__ == "__main__":
883
+ demo.launch(debug=True)