昨天成功建立了 MCPAgent 與 n8n 的基礎連通後,今天嘗試不使用付費 API,實現高品質的中文摘要功能,我決定使用 LM Studio 這款圖形化的本地大型語言模型管理工具,來協助我完成這個任務。
在考慮本地部署中文摘要模型的方案時,我面臨了兩個選擇,要自己用 Python + transformers 寫 Flask API,或是使用現成的工具,而 LM Studio 的存在完美解決了我的問題
這些特點讓 LM Studio 成為部署本地中文摘要服務的理想選擇,且採用這個作法,能讓我把時間和精力聚焦在 Agent 的核心邏輯開發上。
安裝成功啟動LM Studio後,LM Studio 是可以選擇中文介面,但除了英文以外,其他語言全為測試版,我的建議還是用英文。
TAIDE-LX-7B-Chat-4bit
,下載由「台灣 AI 卓越中心」開發的模型。File can no longer be found. It has likely been moved or deleted
Qwen2.5-Taiwan-7B-Instruct-i1
。Q5_K_M
版本(約 5.44GB)。在 TAIDE 模型下載失敗後,我選擇 Qwen2.5-Taiwan-7B-Instruct-i1
的主要原因有
技術優勢
社群維護優勢
因此,我選定這個 Qwen2.5-Taiwan-7B-Instruct-i1
作為我要使用的模型。
成功下載 Qwen2.5-Taiwan-7B-Instruct-i1
模型,在「My Models」裡可以看到已下載的模型。
首次嘗試載入 Q5_K_M
版本時,遇到了以下的錯誤
RuntimeError: [enforce fail at alloc_cpu.cpp:121] data. DefaultCPUAllocator: not enough memory: you tried to allocate 4194304 bytes.
我的解決方法是
下載稍小的版本
改為下載 Q4_K_S
版本(約 4.46GB),記憶體需求更低。
最佳化模型參數
點選左側選單的「My Models」,點擊在 Actions 欄位下的齒輪圖示,進入 Edit model default config,根據我電腦的配置,我調整了以下參數
Context Length: 2048
GPU Offload: 0
CPU Thread Pool Size: 4
Evaluation Batch Size: 256
Offload KV Cache to GPU Memory: OFF
Keep Model in Memory: ON
參數最佳化後,Q4_K_S 版本成功載入,記憶體的使用穩定在 4~5GB 的範圍內。
Qwen2.5 Taiwan 7B Instruct i1
,在上角將 「Status」 從 Stopped 切換為 Running。[INFO] [LM STUDIO SERVER] Success! HTTP server listening on port 1234
[INFO] [LM STUDIO SERVER] Supported endpoints:
[INFO] [LM STUDIO SERVER] -> GET http://localhost:1234/v1/models
[INFO] [LM STUDIO SERVER] -> POST http://localhost:1234/v1/chat/completions
[INFO] [LM STUDIO SERVER] -> POST http://localhost:1234/v1/completions
[INFO] [LM STUDIO SERVER] -> POST http://localhost:1234/v1/embeddings
[INFO] [LM STUDIO SERVER] Logs are saved into C:\Users\<username>\.lmstudio\server-logs
[INFO] Server started.
[INFO] Just-in-time model loading active.
建立測試程式 test_lmstudio_api.py
import requests
import json
def test_lmstudio_api():
url = "http://localhost:1234/v1/chat/completions"
payload = {
"model": "qwen2.5-taiwan-7b-instruct-i1",
"messages": [
{
"role": "user",
"content": "請摘要以下內容:大家好,我是斯珀西我家裡面有養一隻小牛牛牠的名字叫阿牛然後牠小時候的時候棉花就沒了所以我有幫牠開刀然後在牠的手臂下面開了一個刀然後幫牠補棉花所以牠現在就是肚子都胖胖的那大家,阿牛謝謝大家",
}
],
"temperature": 0.7,
"max_tokens": 200,
}
try:
response = requests.post(url, json=payload)
if response.status_code == 200:
result = response.json()
print("✅模型 Qwen2.5-Taiwan-7B-Instruct-i1-GGUF 測試成功!")
print(f"摘要結果:{result['choices'][0]['message']['content']}")
else:
print(f"❌ API 測試失敗:{response.status_code}")
print(response.text)
except Exception as e:
print(f"❌ 連接失敗:{e}")
print("請確認 LM Studio 伺服器正在運作")
if __name__ == "__main__":
test_lmstudio_api()
✅模型 Qwen2.5-Taiwan-7B-Instruct-i1-GGUF 測試成功!
摘要結果:你好!這段話的主要內容是,作者介紹了一只名叫「阿牛」的小牛,並提到阿牛小時候因為棉花消失而需要進行手術。為了幫助阿牛恢復健康,他們在其手臂下方進行了開刀並補上了棉花。現在,阿牛的肚子比較圓胖,顯得更健康。最後,作者對大家表示感謝。
成功了!版本為 Q4_K_S
的模型 Qwen2.5-Taiwan-7B-Instruct-i1
能準確的理解內容,並且生成正確的繁體中文摘要,而且沒有捏造不存在的內容。
在「Webhook」與「Respond to Webhook」之間,點擊中間的 + 號 (Add),新增「HTTP Request」後將名稱修改為「AI摘要」較為容易辨認,並設定以下參數
基本設定
POST
http://host.docker.internal:1234/v1/chat/completions
None
(本地 API 不需要認證)Body 設定
JSON
Using JSON
JSON Body
{
"model": "qwen2.5-taiwan-7b-instruct-i1",
"messages": [
{
"role": "user",
"content": "請摘要以下內容,重點說明主要討論事項:{{ $json.body.text }}"
}
],
"temperature": 0.5,
"max_tokens": 300
}
JSON參數說明
temperature: 0.5
:控制回應的創造性,較低值使輸出更穩定max_tokens: 300
:限制摘要長度,避免過長的回應{{ $json.body.text }}
:n8n 表達式,引用 Webhook 節點傳來的文字資料初次測試時發現 AI 摘要沒有正確讀取 Webhook 資料,輸出時顯示
摘要結果:請提供需要總結的內容,我會幫你進行摘要。
經過檢查 Webhook 輸出結構,發現資料位於 body.text
路徑下:
{
"body": {
"text": "大家好,我是斯珀西...",
"instruction": "請幫我整理出重點"
}
}
於是我將表達式從 {{ $json.text }}
修正為 {{ $json.body.text }}
。
新增第二個 HTTP Request 節點「任務提取」,在節點「AI摘要」之後點擊中間的 + 號 (Add),新增「HTTP Request」後將名稱修改為「任務提取」較為容易辨認,並設定以下參數
基本設定
POST
http://host.docker.internal:1234/v1/chat/completions
None
(本地 API 不需要認證)Body 設定
JSON
Using JSON
JSON Body
{
"model": "qwen2.5-taiwan-7b-instruct-i1",
"messages": [
{
"role": "user",
"content": "請從以下摘要中提取所有行動項目和待辦事項,以條列式呈現,若無則說沒有指派任何行動:{{ $json.choices[0].message.content }}"
}
],
"temperature": 0.5,
"max_tokens": 300
}
JSON參數說明
temperature: 0.5
:控制回應的創造性,較低值使輸出更穩定max_tokens: 300
:限制摘要長度,避免過長的回應{{ $json.choices.message.content }}
:是 LM Studio API 的格式,引用了上一個節點的 LM Studio API 回應將原本的 JSON 替換為以下的內容
{
"summary": "{{$node["AI 摘要"].json.choices[0].message.content}}",
"tasks": "{{$node["任務提取"].json.choices[0].message.content}}"
}
表達式說明
$node["AI 摘要"]
:明確指定引用「AI 摘要」節點的輸出.json.choices.message.content
:LM Studio API 標準回應格式的路徑第一次設定 n8n HTTP Request 節點時遇到了問題
{
"errorMessage": "The service refused the connection - perhaps it is offline",
"rawErrorMessage": ["connect ECONNREFUSED ::1:1234"]
}
因為我們的n8n是架設在 Docker 上,所以將 http://localhost:1234/v1/chat/completions
改為 http://host.docker.internal:1234/v1/chat/completions
n8n 工作流成功整合,所有節點正常運作,資料在節點間正確傳遞。
✅ 完成項目
Qwen2.5-Taiwan-7B-Instruct-i1-GGUF
中文摘要模型📝 關鍵發現
在測試過程中,我發現 LM Studio 的 Chat 頁面可以直接與模型對話,這為後續的 prompt 調優提供了便利的測試環境。另外,模型載入後會常駐記憶體,重複呼叫 API 時無需重新載入。
今天最大的收穫是建立了一個完全本地化、零成本的 AI 摘要服務。透過 LM Studio 的圖形化介面,我省略了複雜的 Python 環境配置和模型管理問題,讓我可以專注在 Agent 的核心邏輯開發。
整個過程中遇到了多重挑戰,從最初嘗試 Hugging Face 免費 API 時遇到 404 錯誤,到 TAIDE 模型下載失敗,再到記憶體分配問題和 n8n 表達式語法調整。
這段期間我感到非常的挫折,幸好在這個過程中,我找到了 LM Studio 這個好用的工具,而且最後每個問題的解決都讓我對本地 AI 部署有了更深入的了解。
🎯 明天計劃
解決 n8n 工作流中的 JSON 特殊字符處理問題,使用 Code 節點重構「AI摘要」與「任務提取」功能,建立完整的錯誤處理機制,確保系統穩定性。