cwadayi commited on
Commit
1c90e24
·
verified ·
1 Parent(s): 94a0171

Update ai_service.py

Browse files
Files changed (1) hide show
  1. ai_service.py +24 -33
ai_service.py CHANGED
@@ -1,10 +1,12 @@
1
  # ai_service.py
 
 
2
  from config import (
3
- HUGGING_FACE_TOKEN, LLM_MODEL, LLM_MAX_NEW_TOKENS,
4
  LLM_TOP_K, LLM_TEMPERATURE
5
  )
6
 
7
- # 用於延遲載入語言模型的字典,現在只儲存 pipeline 物件
8
  _LLM = {"loaded": False, "ok": False, "err": None, "model": None}
9
 
10
  def _ensure_llm():
@@ -13,52 +15,38 @@ def _ensure_llm():
13
  return _LLM["ok"], _LLM["err"]
14
  _LLM["loaded"] = True
15
 
16
- # 檢查 HF Token 是否存在
17
- if not HUGGING_FACE_TOKEN:
18
- _LLM["err"] = "HUGGING_FACE_TOKEN secret not set in deployment environment."
19
- _LLM["ok"] = False
20
- return False, _LLM["err"]
21
-
22
  try:
23
- import torch
24
- from transformers import pipeline
25
- from huggingface_hub import login
26
 
27
- # 使用 Token 登入
28
- login(token=HUGGING_FACE_TOKEN)
 
29
 
30
- # 建立 text-generation pipeline
31
- # device_map="auto" 會自動使用 GPU (如果可用)
32
  pipe = pipeline(
33
  "text-generation",
34
- model=LLM_MODEL,
35
- torch_dtype=torch.bfloat16,
36
- device_map="auto",
37
  )
 
38
  _LLM.update({"ok": True, "model": pipe})
39
  return True, None
40
  except Exception as e:
41
- # 如果 Token 無效或未同意模型條款,會在此處拋出錯誤
42
  _LLM["err"] = f"{e}"
43
  _LLM["ok"] = False
44
  return False, _LLM["err"]
45
 
46
  def generate_ai_text(user_prompt: str) -> str:
47
- """使用已載入的 Gemma 模型生成文字回應。"""
48
  ok, err = _ensure_llm()
49
  if not ok:
50
- return (
51
- "🤖 AI 模型無法使用。\n"
52
- "可能原因:\n"
53
- "1. 未在 Hugging Face Spaces 設定名為 HUGGING_FACE_TOKEN 的 Secret。\n"
54
- "2. 尚未在 Hugging Face 網站上同意 gemma-2b-it 模型的使用條款。\n"
55
- f"\n詳細錯誤:{err}"
56
- )
57
 
58
  pipe = _LLM["model"]
59
-
60
- # 建立符合 Gemma 指令微調模型的 Prompt 格式
61
- prompt = f"<start_of_turn>user\n你是一個多功能的台灣在地LINE助理,請用繁體中文簡潔有力地回答問題。{user_prompt}<end_of_turn>\n<start_of_turn>model\n"
62
 
63
  try:
64
  outputs = pipe(
@@ -67,11 +55,14 @@ def generate_ai_text(user_prompt: str) -> str:
67
  do_sample=True,
68
  temperature=LLM_TEMPERATURE,
69
  top_k=LLM_TOP_K,
70
- top_p=0.95,
71
  )
72
  # 從 pipeline 的輸出中解析出模型生成的部分
73
- full_text = outputs[0]["generated_text"]
74
- response = full_text.split("<start_of_turn>model\n")[-1]
 
 
 
 
75
  return response.strip() or "(AI 沒有產生任何內容)"
76
  except Exception as e:
77
  return f"AI 產生內容時發生錯誤:{e}"
 
1
  # ai_service.py
2
+ import torch
3
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
4
  from config import (
5
+ LLM_MODEL, LLM_MAX_NEW_TOKENS,
6
  LLM_TOP_K, LLM_TEMPERATURE
7
  )
8
 
9
+ # 用於延遲載入語言模型的字典
10
  _LLM = {"loaded": False, "ok": False, "err": None, "model": None}
11
 
12
  def _ensure_llm():
 
15
  return _LLM["ok"], _LLM["err"]
16
  _LLM["loaded"] = True
17
 
 
 
 
 
 
 
18
  try:
19
+ # [修改] 採用更穩健的載入方式
20
+ # 1. 決定裝置 (GPU or CPU)
21
+ device = "cuda" if torch.cuda.is_available() else "cpu"
22
 
23
+ # 2. 分別載入 tokenizer 和 model
24
+ tokenizer = AutoTokenizer.from_pretrained(LLM_MODEL)
25
+ model = AutoModelForCausalLM.from_pretrained(LLM_MODEL).to(device)
26
 
27
+ # 3. 將載入好的 tokenizer 和 model 傳入 pipeline
 
28
  pipe = pipeline(
29
  "text-generation",
30
+ model=model,
31
+ tokenizer=tokenizer,
32
+ device=device
33
  )
34
+
35
  _LLM.update({"ok": True, "model": pipe})
36
  return True, None
37
  except Exception as e:
 
38
  _LLM["err"] = f"{e}"
39
  _LLM["ok"] = False
40
  return False, _LLM["err"]
41
 
42
  def generate_ai_text(user_prompt: str) -> str:
43
+ """使用已載入的 AI 模型生成文字回應。"""
44
  ok, err = _ensure_llm()
45
  if not ok:
46
+ return f"🤖 AI 模型無法使用。\n詳細錯誤:{err}"
 
 
 
 
 
 
47
 
48
  pipe = _LLM["model"]
49
+ prompt = user_prompt
 
 
50
 
51
  try:
52
  outputs = pipe(
 
55
  do_sample=True,
56
  temperature=LLM_TEMPERATURE,
57
  top_k=LLM_TOP_K,
 
58
  )
59
  # 從 pipeline 的輸出中解析出模型生成的部分
60
+ response = outputs[0]["generated_text"]
61
+
62
+ # 移除原始 prompt 以獲得乾淨的回應
63
+ if prompt in response:
64
+ response = response.split(prompt, 1)[-1]
65
+
66
  return response.strip() or "(AI 沒有產生任何內容)"
67
  except Exception as e:
68
  return f"AI 產生內容時發生錯誤:{e}"