- Remove session-ses_2f27.md (161KB raw session log) - Remove 49 ROOT_* duplicate files across REFERENCE/ - Remove 14 duplicate files between REFERENCE/ root and history/ - Remove asr_legacy.rs (dead code, replaced by asr.rs) - Remove src/core/worker/ (duplicate JobWorker) - Remove src/core/layers/ (empty directory) - Remove 4 .bak files in src/ - Remove 7 dead private methods in worker/processor.rs - Remove backup directory from git tracking
99 lines
3.0 KiB
Python
99 lines
3.0 KiB
Python
#!/opt/homebrew/bin/python3.11
|
|
"""
|
|
Ollama Local LLM Feasibility Test
|
|
職責:測試使用本地 Ollama (Qwen3) 執行語義分析的速度與品質。
|
|
"""
|
|
|
|
import json
|
|
import subprocess
|
|
import time
|
|
|
|
UUID = "384b0ff44aaaa1f1"
|
|
ASR_PATH = f"output/{UUID}/{UUID}.asr.json"
|
|
|
|
# 選用的模型 (根據用戶要求使用 Gemma 4)
|
|
# Gemma 4 (4B/12B depending on version, here using latest tag from list)
|
|
MODEL_NAME = "gemma4:latest"
|
|
|
|
|
|
def load_sample_text(n_segments=20):
|
|
"""從 ASR JSON 中載入一段文字作為測試素材"""
|
|
try:
|
|
with open(ASR_PATH, "r") as f:
|
|
data = json.load(f)
|
|
|
|
# 隨機取一段連續的對話
|
|
segments = data.get("segments", [])
|
|
start_idx = 50 # 取第 50 段附近
|
|
sample_segments = segments[start_idx : start_idx + n_segments]
|
|
|
|
text = " ".join([s.get("text", "") for s in sample_segments])
|
|
return text
|
|
except Exception as e:
|
|
print(f"Error loading ASR: {e}")
|
|
return "Sample text for testing."
|
|
|
|
|
|
def run_ollama_task(prompt, text):
|
|
"""呼叫 Ollama CLI 並測量時間"""
|
|
# 組合完整輸入
|
|
full_input = f"{prompt}\n\nContext:\n{text}"
|
|
|
|
start_time = time.time()
|
|
|
|
# 執行指令
|
|
result = subprocess.run(
|
|
["ollama", "run", MODEL_NAME, full_input],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=60, # 60 秒超時
|
|
)
|
|
|
|
end_time = time.time()
|
|
duration = end_time - start_time
|
|
|
|
return result.stdout.strip(), duration
|
|
|
|
|
|
def main():
|
|
print(f"🧪 Starting Ollama Feasibility Test with model: {MODEL_NAME}")
|
|
|
|
# 1. 載入素材
|
|
print("📂 Loading sample text...")
|
|
text = load_sample_text()
|
|
print(f" Loaded {len(text)} characters.")
|
|
|
|
# 2. 任務 A: 劇情摘要 (Summarization)
|
|
print("\n📝 Task A: Plot Summarization")
|
|
prompt_summary = "請用一句話總結以下電影對白內容,只輸出摘要,不要解釋。"
|
|
|
|
res_a, time_a = run_ollama_task(prompt_summary, text)
|
|
print(f" ⏱️ Time: {time_a:.2f}s")
|
|
print(f" 📄 Result: {res_a[:100]}...")
|
|
|
|
# 3. 任務 B: 情緒與意圖分析 (Sentiment & Intent)
|
|
print("\n🧠 Task B: Sentiment & Intent Analysis (JSON Output)")
|
|
prompt_sentiment = """
|
|
請分析以下電影對白的「情緒」與「意圖」,並以 JSON 格式輸出。
|
|
格式範例:{"mood": ["suspicious", "romantic"], "intent": "interrogation"}
|
|
不要輸出任何其他文字。
|
|
"""
|
|
|
|
res_b, time_b = run_ollama_task(prompt_sentiment, text)
|
|
print(f" ⏱️ Time: {time_b:.2f}s")
|
|
print(f" 📄 Result: {res_b}")
|
|
|
|
# 4. 總結評估
|
|
print("\n📊 Feasibility Assessment:")
|
|
total_time = time_a + time_b
|
|
print(f" Total Time for 2 tasks: {total_time:.2f}s")
|
|
|
|
if total_time < 30:
|
|
print(" ✅ PASS: 速度可接受,適合批次處理 (Batch Processing)。")
|
|
else:
|
|
print(" ⚠️ WARN: 速度較慢,建議使用更小的模型 (如 qwen2.5:3b) 或非同步處理。")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|