Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
|
@@ -10,6 +10,7 @@ import os
|
|
| 10 |
import io
|
| 11 |
import re
|
| 12 |
import json
|
|
|
|
| 13 |
from typing import List, Dict, Tuple, Optional
|
| 14 |
|
| 15 |
import gradio as gr
|
|
@@ -189,6 +190,7 @@ def call_llm(messages: List[dict], model: str, logs: List[str]) -> dict:
|
|
| 189 |
保留原名稱 call_llm,但改為本地 LLaMA。
|
| 190 |
嚴格要求僅輸出 JSON;若混入其他文本,會正則擷取第一個 {...}。
|
| 191 |
"""
|
|
|
|
| 192 |
try:
|
| 193 |
_ensure_local_model(logs)
|
| 194 |
# 準備 chat prompt(加上 JSON 輸出約束)
|
|
@@ -220,31 +222,23 @@ def call_llm(messages: List[dict], model: str, logs: List[str]) -> dict:
|
|
| 220 |
full_text = _hf_tok.decode(out_ids[0], skip_special_tokens=True)
|
| 221 |
gen_text = full_text[len(prompt):] if full_text.startswith(prompt) else full_text
|
| 222 |
logs.append(f"[LOCAL LLM] raw_len={len(gen_text)}")
|
| 223 |
-
logs.append(f"[LOCAL LLM] raw_head={gen_text
|
| 224 |
|
| 225 |
# ★ 強韌解析:剝掉前置描述,只取第一個 {...}
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
return data
|
| 230 |
-
except Exception as jerr:
|
| 231 |
-
logs.append(f"[LOCAL LLM] JSON 解析失敗:{jerr}")
|
| 232 |
-
# 回傳結構化錯誤,避免整個流程中斷
|
| 233 |
-
return {
|
| 234 |
-
"符合情況": "部分符合",
|
| 235 |
-
"原因": [f"模型輸出非合法 JSON:{str(jerr)}"],
|
| 236 |
-
"改進建議": ["請調整提示詞,要求嚴格輸出 JSON(雙引號、無註解、無多餘文字)。"],
|
| 237 |
-
"規則逐點檢核": []
|
| 238 |
-
}
|
| 239 |
except Exception as e:
|
| 240 |
-
logs.append(f"[LOCAL LLM]
|
| 241 |
return {
|
| 242 |
"符合情況": "部分符合",
|
| 243 |
"原因": [f"本地模型錯誤:{e}"],
|
| 244 |
"改進建議": ["請檢查 Hugging Face 權杖與模型權限、或改用較小模型。"],
|
| 245 |
"規則逐點檢核": []
|
| 246 |
}
|
| 247 |
-
|
|
|
|
|
|
|
| 248 |
# -----------------------------
|
| 249 |
# 檔案讀取:TXT / PDF(含 OCR fallback)
|
| 250 |
# -----------------------------
|
|
|
|
| 10 |
import io
|
| 11 |
import re
|
| 12 |
import json
|
| 13 |
+
import time
|
| 14 |
from typing import List, Dict, Tuple, Optional
|
| 15 |
|
| 16 |
import gradio as gr
|
|
|
|
| 190 |
保留原名稱 call_llm,但改為本地 LLaMA。
|
| 191 |
嚴格要求僅輸出 JSON;若混入其他文本,會正則擷取第一個 {...}。
|
| 192 |
"""
|
| 193 |
+
start_time = time.time() # 計時開始
|
| 194 |
try:
|
| 195 |
_ensure_local_model(logs)
|
| 196 |
# 準備 chat prompt(加上 JSON 輸出約束)
|
|
|
|
| 222 |
full_text = _hf_tok.decode(out_ids[0], skip_special_tokens=True)
|
| 223 |
gen_text = full_text[len(prompt):] if full_text.startswith(prompt) else full_text
|
| 224 |
logs.append(f"[LOCAL LLM] raw_len={len(gen_text)}")
|
| 225 |
+
logs.append(f"[LOCAL LLM] raw_head={gen_text}")
|
| 226 |
|
| 227 |
# ★ 強韌解析:剝掉前置描述,只取第一個 {...}
|
| 228 |
+
data = safe_parse_json(gen_text)
|
| 229 |
+
logs.append("[LOCAL LLM] JSON 解析成功")
|
| 230 |
+
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
except Exception as e:
|
| 232 |
+
logs.append(f"[LOCAL LLM] JSON 解析失敗:{e}")
|
| 233 |
return {
|
| 234 |
"符合情況": "部分符合",
|
| 235 |
"原因": [f"本地模型錯誤:{e}"],
|
| 236 |
"改進建議": ["請檢查 Hugging Face 權杖與模型權限、或改用較小模型。"],
|
| 237 |
"規則逐點檢核": []
|
| 238 |
}
|
| 239 |
+
finally:
|
| 240 |
+
elapsed = time.time() - start_time
|
| 241 |
+
logs.append(f"[LOCAL LLM] 本次執行耗時:{elapsed:.2f} 秒")
|
| 242 |
# -----------------------------
|
| 243 |
# 檔案讀取:TXT / PDF(含 OCR fallback)
|
| 244 |
# -----------------------------
|