cwadayi commited on
Commit
5a66e84
·
verified ·
1 Parent(s): 0ee2d51

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -25
app.py CHANGED
@@ -1,9 +1,9 @@
1
  import gradio as gr
2
  from transformers import AutoTokenizer, AutoModelForCausalLM
3
  import torch
4
- import webbrowser # 用於開啟網頁地圖連結
5
 
6
  # --- 模型配置 (CPU TinyLlama) ---
 
7
  MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
8
  print("Loading TinyLlama model and tokenizer...")
9
  model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
@@ -11,6 +11,7 @@ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
11
  print("TinyLlama model and tokenizer loaded.")
12
 
13
  # --- 文字生成函數 ---
 
14
  def generate_text(prompt, max_new_tokens, temperature, top_p):
15
  print(f"Generating TinyLlama response for prompt: '{prompt}'")
16
  chat = [{"role": "user", "content": prompt}]
@@ -25,30 +26,39 @@ def generate_text(prompt, max_new_tokens, temperature, top_p):
25
  top_p=float(top_p),
26
  eos_token_id=tokenizer.eos_token_id
27
  )
28
- decoded_output = tokenizer.decode(outputs[:, inputs["input_ids"].shape[-1]:][0], skip_special_tokens=True)
29
- print(f"Generated response: {decoded_output}")
30
- return decoded_output.strip()
 
31
 
32
- # --- 地圖生成函數 (開啟 Google 地圖網頁) ---
 
33
  def show_map(location_query):
34
- """開啟包含指定地點的 Google 地圖網頁。"""
 
 
35
  base_url = "https://www.google.com/maps/search/?api=1&query="
36
- map_url = base_url + location_query.replace(" ", "+")
37
- webbrowser.open_new_tab(map_url)
38
- return f"已在您的預設瀏覽器中開啟 {location_query} 的地圖。"
 
 
39
 
40
- # --- Gradio 介面 ---
 
41
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
42
- gr.Markdown("# 多功能應用:文字生成與地圖顯示")
43
  gr.Markdown("這個應用程式可以生成文字,也可以根據您輸入的地點顯示地圖。")
44
 
45
- with gr.TabbedInterface(["文字生成", "顯示地圖"]) as tabbed:
 
 
46
  with gr.TabItem("文字生成"):
47
  gr.Markdown("## 使用 TinyLlama 生成文字")
48
  with gr.Column():
49
  prompt_input = gr.Textbox(
50
  label="您的提示詞",
51
- placeholder="請輸入您想讓模型接續的文字..."
52
  )
53
  with gr.Accordion("生成參數", open=False):
54
  max_new_tokens_slider = gr.Slider(minimum=50, maximum=512, value=256, step=1, label="最大生成 Token 數")
@@ -56,25 +66,29 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
56
  top_p_slider = gr.Slider(minimum=0.1, maximum=1.0, value=0.9, step=0.05, label="Top-P (Nucleus Sampling)")
57
  generate_button = gr.Button("生成文字 ✨", variant="primary")
58
  output_text = gr.Textbox(label="模型的回應", lines=10, interactive=False)
59
- generate_button.click(
60
- fn=generate_text,
61
- inputs=[prompt_input, max_new_tokens_slider, temperature_slider, top_p_slider],
62
- outputs=output_text
63
- )
64
 
 
65
  with gr.TabItem("顯示地圖"):
66
  gr.Markdown("## 顯示指定地點的地圖")
67
  location_input = gr.Textbox(
68
  label="輸入地點名稱",
69
  placeholder="例如:台北 101, New York Central Park, 東京鐵塔"
70
  )
71
- show_map_button = gr.Button("顯示地圖 🗺️", variant="primary")
72
- map_output = gr.Textbox(label="地圖顯示訊息", interactive=False)
73
- show_map_button.click(
74
- fn=show_map,
75
- inputs=location_input,
76
- outputs=map_output
77
- )
 
 
 
 
 
 
 
 
78
 
79
  # --- 啟動 Gradio 應用 ---
80
  demo.launch()
 
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)
 
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}]
 
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 數")
 
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 應用 ---
94
  demo.launch()