cwadayi commited on
Commit
04b3116
·
verified ·
1 Parent(s): 5a66e84

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -58
app.py CHANGED
@@ -1,19 +1,19 @@
1
  import gradio as gr
2
  from transformers import AutoTokenizer, AutoModelForCausalLM
3
  import torch
 
4
 
5
  # --- 模型配置 (CPU TinyLlama) ---
6
- # 這部分保持不變
7
  MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
8
- print("Loading TinyLlama model and tokenizer...")
9
  model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
10
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
11
- print("TinyLlama model and tokenizer loaded.")
12
 
13
- # --- 文字生成函數 ---
14
- # 這部分保持不變
15
- def generate_text(prompt, max_new_tokens, temperature, top_p):
16
- print(f"Generating TinyLlama response for prompt: '{prompt}'")
17
  chat = [{"role": "user", "content": prompt}]
18
  formatted_prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
19
  inputs = tokenizer(formatted_prompt, return_tensors="pt")
@@ -26,68 +26,85 @@ def generate_text(prompt, max_new_tokens, temperature, top_p):
26
  top_p=float(top_p),
27
  eos_token_id=tokenizer.eos_token_id
28
  )
29
- # 修正解碼方式以只回傳模型生成的部分
30
  response = tokenizer.decode(outputs[0, inputs["input_ids"].shape[-1]:], skip_special_tokens=True)
31
- print(f"Generated response: {response}")
32
  return response.strip()
33
 
34
- # --- 地圖生成函數 (回傳 Google 地圖網址) ---
35
- # 我們將修改此函數,使其回傳一個可點擊的連結,而不是試圖開啟新分頁
36
- def show_map(location_query):
37
- """根據地點名稱生成一個 Google 地圖的 URL"""
38
  if not location_query:
39
- return "請輸入一個地點!"
40
  base_url = "https://www.google.com/maps/search/?api=1&query="
41
- # 將地點名稱進行 URL 編碼,避免特殊字元問題
42
- from urllib.parse import quote
43
  map_url = base_url + quote(location_query)
44
- # 使用 Markdown 格式回傳一個可點擊的連結
45
  return f"點擊這裡查看 **{location_query}** 的地圖:\n[在 Google 地圖中開啟]({map_url})"
46
 
47
- # --- Gradio 介面 (修正版) ---
48
- # 使用 gr.Blocks 和 gr.Tabs 來建立介面
49
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
50
- gr.Markdown("# ✨ 多功能應用:文字生成與地圖顯示")
51
- gr.Markdown("這個應用程式可以生成文字,也可以根據您輸入的地點顯示地圖。")
52
-
53
- # 使用 gr.Tabs 建立分頁容器
54
- with gr.Tabs():
55
- # 第一個分頁:文字生成
56
- with gr.TabItem("文字生成"):
57
- gr.Markdown("## 使用 TinyLlama 生成文字")
58
- with gr.Column():
59
- prompt_input = gr.Textbox(
60
- label="您的提示詞",
61
- placeholder="例如:請用繁體中文解釋什麼是光合作用?"
62
- )
63
- with gr.Accordion("生成參數", open=False):
64
- max_new_tokens_slider = gr.Slider(minimum=50, maximum=512, value=256, step=1, label="最大生成 Token 數")
65
- temperature_slider = gr.Slider(minimum=0.1, maximum=1.0, value=0.7, step=0.05, label="溫度 (Temperature)")
66
- top_p_slider = gr.Slider(minimum=0.1, maximum=1.0, value=0.9, step=0.05, label="Top-P (Nucleus Sampling)")
67
- generate_button = gr.Button("生成文字 ✨", variant="primary")
68
- output_text = gr.Textbox(label="模型的回應", lines=10, interactive=False)
69
-
70
- # 第二個分頁:顯示地圖
71
- with gr.TabItem("顯示地圖"):
72
- gr.Markdown("## 顯示指定地點的地圖")
73
- location_input = gr.Textbox(
74
- label="輸入地點名稱",
75
- placeholder="例如:台北 101, New York Central Park, 東京鐵塔"
76
- )
77
- show_map_button = gr.Button("取得地圖連結 🗺️", variant="primary")
78
- # 輸出元件改為 gr.Markdown 以便顯示可點擊的連結
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  map_output = gr.Markdown(label="地圖連結")
80
 
81
- # 將元件的事件監聽器放在 gr.Tabs 之外
82
- generate_button.click(
83
- fn=generate_text,
84
- inputs=[prompt_input, max_new_tokens_slider, temperature_slider, top_p_slider],
85
- outputs=output_text
86
  )
87
- show_map_button.click(
88
- fn=show_map,
89
- inputs=location_input,
90
- outputs=map_output
 
 
 
 
 
 
91
  )
92
 
93
  # --- 啟動 Gradio 應用 ---
 
1
  import gradio as gr
2
  from transformers import AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
+ from urllib.parse import quote
5
 
6
  # --- 模型配置 (CPU TinyLlama) ---
 
7
  MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
8
+ print("正在載入 TinyLlama 模型與分詞器,請稍候...")
9
  model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
10
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
11
+ print("模型與分詞器載入完成。")
12
 
13
+ # --- 核心功能函數 ---
14
+
15
+ def llm_generate(prompt, max_new_tokens=256, temperature=0.7, top_p=0.9):
16
+ """基礎的語言模型文字生成函數"""
17
  chat = [{"role": "user", "content": prompt}]
18
  formatted_prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
19
  inputs = tokenizer(formatted_prompt, return_tensors="pt")
 
26
  top_p=float(top_p),
27
  eos_token_id=tokenizer.eos_token_id
28
  )
 
29
  response = tokenizer.decode(outputs[0, inputs["input_ids"].shape[-1]:], skip_special_tokens=True)
 
30
  return response.strip()
31
 
32
+ def get_map_link(location_query):
33
+ """根據地點名稱生成 Google 地圖的 URL"""
 
 
34
  if not location_query:
35
+ return ""
36
  base_url = "https://www.google.com/maps/search/?api=1&query="
 
 
37
  map_url = base_url + quote(location_query)
 
38
  return f"點擊這裡查看 **{location_query}** 的地圖:\n[在 Google 地圖中開啟]({map_url})"
39
 
40
+ def unified_processor(query):
41
+ """
42
+ 統一處理函數:接收使用者輸入,同時生成地點描述和地圖連結。
43
+ """
44
+ if not query:
45
+ return "請輸入一個地點或一段描述。", ""
46
+
47
+ print(f"正在處理查詢:'{query}'")
48
+
49
+ # 步驟 1: 讓模型生成關於這個地點的描述
50
+ description_prompt = f"請用繁體中文,生動地介紹一下「{query}」這個地方的特色、歷史或是有趣的景點。"
51
+ generated_description = llm_generate(description_prompt)
52
+
53
+ # 步驟 2: 產生該地點的地圖連結
54
+ map_link_markdown = get_map_link(query)
55
+
56
+ # 步驟 3: 讓模型推薦附近的景點
57
+ recommendation_prompt = f"我在「{query}」這個地方,請用條列的方式,推薦3個附近的必去景點或必吃美食。"
58
+ generated_recommendations = llm_generate(recommendation_prompt)
59
+
60
+ # 組合最終的文字輸出
61
+ final_text_output = (
62
+ f"### 關於「{query}」\n"
63
+ f"{generated_description}\n\n"
64
+ f"### 附近推薦\n"
65
+ f"{generated_recommendations}"
66
+ )
67
+
68
+ return final_text_output, map_link_markdown
69
+
70
+ # --- Gradio 介面 (整合版) ---
71
+ with gr.Blocks(theme=gr.themes.Default()) as demo:
72
+ gr.Markdown(
73
+ """
74
+ # 🗺️ AI 智慧導遊 ✨
75
+ 輸入一個地點,AI 將為您生成生動的介紹、推薦附近景點,並附上地圖!
76
+ """
77
+ )
78
+
79
+ with gr.Row():
80
+ query_input = gr.Textbox(
81
+ label="請輸入地點名稱或描述",
82
+ placeholder="例如:九份老街、有著巨大玻璃金字塔的博物館..."
83
+ )
84
+
85
+ process_button = gr.Button("開始導覽 ✨", variant="primary")
86
+
87
+ with gr.Row():
88
+ with gr.Column(scale=2):
89
+ text_output = gr.Markdown(label="AI 導覽介紹")
90
+ with gr.Column(scale=1):
91
  map_output = gr.Markdown(label="地圖連結")
92
 
93
+ process_button.click(
94
+ fn=unified_processor,
95
+ inputs=query_input,
96
+ outputs=[text_output, map_output]
 
97
  )
98
+
99
+ gr.Examples(
100
+ examples=[
101
+ "東京迪士尼樂園",
102
+ "羅浮宮",
103
+ "台灣的阿里山",
104
+ "一個可以看到極光的玻璃屋飯店"
105
+ ],
106
+ inputs=query_input,
107
+ label="試試看這些例子"
108
  )
109
 
110
  # --- 啟動 Gradio 應用 ---