iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
生成式 AI

打造基於 MCP 協議與 n8n 工作流的會議處理 Agent系列 第 6

Day 6 使用 LM Studio 本地部署中文摘要模型並整合 n8n 工作流

  • 分享至 

  • xImage
  •  

今天的目標與挑戰

昨天成功建立了 MCPAgent 與 n8n 的基礎連通後,今天嘗試不使用付費 API,實現高品質的中文摘要功能,我決定使用 LM Studio 這款圖形化的本地大型語言模型管理工具,來協助我完成這個任務。

  • 安裝並熟悉 LM Studio 操作介面
  • 下載並配置適合的繁體中文摘要模型
  • 啟動 LM Studio 本地 OpenAI 兼容 API 服務
  • 整合 LM Studio API 到 n8n 工作流中
  • 完成從轉錄文字到摘要與任務提取的端到端測試

為什麼選擇 LM Studio?

在考慮本地部署中文摘要模型的方案時,我面臨了兩個選擇,要自己用 Python + transformers 寫 Flask API,或是使用現成的工具,而 LM Studio 的存在完美解決了我的問題

  1. 圖形化介面設計:提供直觀友善的桌面應用程式,無需複雜的命令行操作,大幅降低了本地大型語言模型的使用門檻。
  2. 一鍵模型管理:內建 Hugging Face 模型瀏覽器,可以直接搜尋、下載、管理各種開源模型,支援 GGUF 格式,模型載入和切換都非常便利。
  3. 完全離線運作:模型下載後可完全離線運行,確保資料隱私安全,不會有任何資訊上傳到雲端服務。
  4. OpenAI API 相容性:內建標準的 OpenAI 相容 REST API 伺服器,可以無縫整合到現有的應用程式和工作流中。
  5. 智慧資源調配:支援 GPU 卸載技術,能根據硬體資源自動調整模型載入策略,即使在有限的 VRAM 環境下也能高效運行大型模型。
  6. 跨平台支援:原生支援 Windows、macOS 和 Linux 系統,並針對不同硬體架構(包括 Apple Silicon)進行最佳化。

這些特點讓 LM Studio 成為部署本地中文摘要服務的理想選擇,且採用這個作法,能讓我把時間和精力聚焦在 Agent 的核心邏輯開發上。


Step 1:安裝 LM Studio 並選擇模型

1-1 下載與安裝

  1. 前往官網下載
    開啟瀏覽器,前往 LM Studio 官網,點擊「Download」按鈕,下載並安裝 LM Studio
  2. 選擇適合版本
    根據作業系統選擇對應版本並執行安裝。
  3. 啟動LM Studio
    打開桌面上的 LM Studio。

執行結果

安裝成功啟動LM Studio後,LM Studio 是可以選擇中文介面,但除了英文以外,其他語言全為測試版,我的建議還是用英文。


Step 2:搜尋與下載繁體中文模型

2-1 首次下載

  1. 下載 TAIDE 模型
    點選左側選單的 「Discover」 ,並在搜尋框輸入 TAIDE-LX-7B-Chat-4bit,下載由「台灣 AI 卓越中心」開發的模型。
  2. 下載遇到問題
    出現錯誤訊息
    File can no longer be found. It has likely been moved or deleted

2-2 使用替代模型

  1. 選擇模型
    改為使用 Qwen2.5-Taiwan-7B-Instruct-i1
  2. 選擇量化版本
    在右邊中間的選項中選擇 Q5_K_M 版本(約 5.44GB)。
  3. 開始下載
    點擊「Download」,下載時間依據個人的網路速度來決定。

選擇 Qwen2.5-Taiwan-7B-Instruct-i1 作為替代模型的原因

在 TAIDE 模型下載失敗後,我選擇 Qwen2.5-Taiwan-7B-Instruct-i1 的主要原因有

技術優勢

  • 更高的摘要準確度和更低的幻覺風險:經過我的測試,Qwen2.5 在摘要任務上表現比較穩定,不太會出現無中生有的內容
  • 良好的繁體中文表達:專為臺灣語境最佳化,能產生更符合臺灣用語習慣的自然繁體中文
  • 良好的資源利用率:適合中階硬體環境運作,記憶體需求也不會太高

社群維護優勢

  • 由活躍的開源社群持續維護和更新
  • 提供多種量化版本選擇,適應不同硬體配置
  • 下載穩定性高,避免官方模型可能遇到的授權或連結問題

因此,我選定這個 Qwen2.5-Taiwan-7B-Instruct-i1 作為我要使用的模型。

執行結果

成功下載 Qwen2.5-Taiwan-7B-Instruct-i1 模型,在「My Models」裡可以看到已下載的模型。


Step 3:模型參數配置與記憶體優化

3-1 遇到記憶體分配問題

首次嘗試載入 Q5_K_M 版本時,遇到了以下的錯誤

RuntimeError: [enforce fail at alloc_cpu.cpp:121] data. DefaultCPUAllocator: not enough memory: you tried to allocate 4194304 bytes.

3-2 切換到 Q4_K_S 版本

我的解決方法是

  1. 下載稍小的版本
    改為下載 Q4_K_S 版本(約 4.46GB),記憶體需求更低。
    Qwen2.5-Taiwan-7B-Instruct-i1-GGUF Q4_K_S

  2. 最佳化模型參數
    點選左側選單的「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
    

    Model Settings

執行結果

參數最佳化後,Q4_K_S 版本成功載入,記憶體的使用穩定在 4~5GB 的範圍內。


Step 4:啟動本地 API 服務

4-1 載入模型並啟動服務

  1. 切換到 Developer 頁面
    點選左側選單的「Developer」。
  2. 選擇模型並啟動
    Select a model to load 下拉選單中選擇 Qwen2.5 Taiwan 7B Instruct i1,在上角將 「Status」 從 Stopped 切換為 Running
  3. 確認服務狀態
    成功啟動後會顯示
[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.

Server Running

4-2 測試 API 連接

建立測試程式 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 能準確的理解內容,並且生成正確的繁體中文摘要,而且沒有捏造不存在的內容。


Step 5:整合 LM Studio API 到 n8n 工作流

5-1 「AI 摘要」節點參數設定

在「Webhook」與「Respond to Webhook」之間,點擊中間的 + 號 (Add),新增「HTTP Request」後將名稱修改為「AI摘要」較為容易辨認,並設定以下參數

基本設定

  • MethodPOST
  • URLhttp://host.docker.internal:1234/v1/chat/completions
  • AuthenticationNone(本地 API 不需要認證)

Body 設定

  • Send Body:開啟
  • Body Content TypeJSON
  • Specify BodyUsing 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 }}


5-2 「任務提取」節點參數設定

新增第二個 HTTP Request 節點「任務提取」,在節點「AI摘要」之後點擊中間的 + 號 (Add),新增「HTTP Request」後將名稱修改為「任務提取」較為容易辨認,並設定以下參數

基本設定

  • MethodPOST
  • URLhttp://host.docker.internal:1234/v1/chat/completions
  • AuthenticationNone (本地 API 不需要認證)

Body 設定

  • Send Body:開啟
  • Body Content TypeJSON
  • Specify BodyUsing 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 回應

5-3 修改「Respond to Webhook」節點

將原本的 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"]
}

修改 URL

因為我們的n8n是架設在 Docker 上,所以將 http://localhost:1234/v1/chat/completions 改為 http://host.docker.internal:1234/v1/chat/completions

執行結果

n8n 工作流成功整合,所有節點正常運作,資料在節點間正確傳遞。
Working Good
Transcribed successfully


今天的成果總結

完成項目

  • 成功安裝並設定 LM Studio 圖形化介面
  • 下載並載入 Qwen2.5-Taiwan-7B-Instruct-i1-GGUF 中文摘要模型
  • 啟動本地 OpenAI 兼容 API 服務
  • n8n 工作流成功整合 LM Studio API
  • 完成「AI摘要」與「任務提取」的完整自動化流程
  • 通過端到端測試,整個系統正常運作

📝 關鍵發現

  • LM Studio 的優勢:圖形化介面大幅降低了本地模型部署的技術門檻,無需撰寫任何 Python 代碼
  • LM Studio 支援斷點續傳:在下載的過程中即使中途中斷也能繼續下載。
  • 中文模型表現優異:Qwen2.5-Taiwan-7B 對中文的理解和摘要能力遠超預期,產生的摘要準確且自然
  • OpenAI 兼容性:標準的 OpenAI API 格式讓 n8n 整合變得輕鬆,未來也易於替換其他 API 服務

意外收穫

在測試過程中,我發現 LM Studio 的 Chat 頁面可以直接與模型對話,這為後續的 prompt 調優提供了便利的測試環境。另外,模型載入後會常駐記憶體,重複呼叫 API 時無需重新載入。

Chat With Model

心得

今天最大的收穫是建立了一個完全本地化、零成本的 AI 摘要服務。透過 LM Studio 的圖形化介面,我省略了複雜的 Python 環境配置和模型管理問題,讓我可以專注在 Agent 的核心邏輯開發。

整個過程中遇到了多重挑戰,從最初嘗試 Hugging Face 免費 API 時遇到 404 錯誤,到 TAIDE 模型下載失敗,再到記憶體分配問題和 n8n 表達式語法調整。

這段期間我感到非常的挫折,幸好在這個過程中,我找到了 LM Studio 這個好用的工具,而且最後每個問題的解決都讓我對本地 AI 部署有了更深入的了解。

🎯 明天計劃

解決 n8n 工作流中的 JSON 特殊字符處理問題,使用 Code 節點重構「AI摘要」與「任務提取」功能,建立完整的錯誤處理機制,確保系統穩定性。


上一篇
Day 5 整合 WhisperService 與 n8n Webhook
下一篇
Day 7 n8n 工作流 JSON 處理與穩定性完善
系列文
打造基於 MCP 協議與 n8n 工作流的會議處理 Agent7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言