Back to blog
    n8n 和 Make.com 工作流程的微調工具呼叫
    n8nmake-comtool-callingfine-tuningautomationlocal-inference

    n8n 和 Make.com 工作流程的微調工具呼叫

    用微調的本地模型替換 n8n 或 Make.com 工作流程中的 OpenAI 節點。相同的工具路由、相同的結構化輸出、零 API 成本。以下是確切的模式——從工作流程日誌中擷取訓練資料到通過 Ollama 部署。

    EErtas Team·

    你有一個可以運作的 n8n 工作流程。客戶發送消息,OpenAI 節點決定要採取哪個操作,工作流程相應地分支。查詢訂單、檢查狀態、發起退款、升級給人工。每天運行 500 次。OpenAI 帳單是 $450/月,還在上漲。

    以下是完全消除這個成本的模式:從現有工作流程執行中擷取訓練資料,在你的特定工具 schema 上微調小型模型,使用 Ollama 在本地部署,並用指向 localhost 的 HTTP Request 節點替換 OpenAI 節點。

    相同的工作流程。相同的路由邏輯。相同的結構化輸出。零 API 成本。

    架構

    大多數 n8n AI 工作流程中的當前模式:

    Webhook → OpenAI 節點(工具選擇)→ Switch 節點 → 操作分支
    

    替換方案:

    Webhook → HTTP Request(本地 Ollama)→ Switch 節點 → 操作分支
    

    唯一變更的節點是 AI 決策點。下游的一切——Switch 節點、操作分支、資料庫寫入、郵件發送——保持完全不變。

    微調模型的工作是狹窄的:接收用戶消息,以 JSON 輸出工具名稱和參數。它不需要是通用助手。它不需要寫詩或摘要文件。它需要為你的特定工具分類意圖並擷取參數。

    範例:8 工具客戶支援工作流程

    我們將介紹一個有八個工具的真實工作流程:

    工具功能觸發範例
    lookup_order通過 ID 或郵件查找訂單"我的訂單 ORD-48291 在哪裡?"
    check_status獲取當前訂單狀態"我的訂單已發貨了嗎?"
    initiate_refund啟動退款流程"我想要退款"
    update_address更改收貨地址"我搬到 123 Oak St 了"
    send_notification發送郵件/SMS 給客戶"你能給我發一封收據郵件嗎?"
    check_inventory檢查產品可用性"你們有藍色小工具的庫存嗎?"
    apply_discount對訂單應用優惠碼"我有一個優惠碼 SAVE20"
    escalate_to_human轉接給人工客服"讓我和一個人說話"

    在 n8n 中,這個工作流程看起來像:Webhook 觸發器、帶工具定義的 OpenAI 節點、基於工具名稱的 Switch 節點,以及八個分支,各自執行適當的操作。

    OpenAI 節點每次執行費用 $0.02-0.04,取決於提示長度和模型。每天 500 次執行,僅路由決策每月就花費 $300-600。

    第一步:從工作流程日誌中擷取訓練資料

    n8n 儲存每次工作流程運行的執行資料。這是你的訓練資料來源——配對了實際有效的工具呼叫的真實用戶消息。

    在 n8n 中,進入工作流程的執行記錄並篩選成功的運行。每次執行包含輸入(用戶消息)和 OpenAI 節點的輸出(工具選擇 + 參數)。

    匯出這些資料。你可以使用 n8n API 或 Code 節點來擷取它:

    // n8n Code 節點——從執行歷史中擷取訓練對
    const executions = await this.helpers.httpRequest({
      method: 'GET',
      url: 'http://localhost:5678/api/v1/executions',
      headers: { 'X-N8N-API-KEY': 'your-api-key' },
      qs: { workflowId: 'your-workflow-id', status: 'success', limit: 1000 }
    });
    
    const trainingPairs = executions.data.map(exec => {
      const webhookData = exec.data.resultData.runData['Webhook'][0];
      const openaiData = exec.data.resultData.runData['OpenAI'][0];
    
      return {
        userMessage: webhookData.data.main[0][0].json.body.message,
        toolCall: openaiData.data.main[0][0].json.tool_calls[0]
      };
    });
    
    return trainingPairs;

    這給你真實的輸入-輸出對。如果你以每天 500 次執行運行了一個月的工作流程,那就是 15,000 個標記範例。已經足夠了。

    篩選品質: 刪除用戶消息為空的執行、工具呼叫之後在下游分支中出現錯誤的執行(表示錯誤的路由決策),或工作流程被手動更正的執行。

    第二步:格式化以進行微調

    將你擷取的對轉換為標準 JSONL 訓練格式:

    {"messages": [{"role": "system", "content": "You are a customer support router. Given a customer message, call the appropriate tool. Available tools: lookup_order, check_status, initiate_refund, update_address, send_notification, check_inventory, apply_discount, escalate_to_human."}, {"role": "user", "content": "Where's my order ORD-48291?"}, {"role": "assistant", "tool_calls": [{"function": {"name": "lookup_order", "arguments": "{\"order_id\": \"ORD-48291\"}"}}]}]}

    在系統消息中包含完整的工具 schema。在所有範例中保持相同——這是你在推理時將使用的相同系統提示。

    對於 8 工具工作流程,目標達到以下分佈:

    工具訓練範例比例
    lookup_order15014%
    check_status15014%
    initiate_refund1009%
    update_address807%
    send_notification807%
    check_inventory1009%
    apply_discount807%
    escalate_to_human606%
    無工具(負向)30027%
    總計1,100100%

    分佈應該大致與你的真實流量匹配。如果 lookup_order 佔你 30% 的請求,它應該有最多的範例。如果你沒有足夠的工具真實資料,使用合成擴展填補空缺

    第三步:微調模型

    對於工具呼叫路由,7B 或 8B 模型已經足夠了。Qwen 2.5 7B 和 Llama 3.3 8B 都效果很好。你在訓練帶有結構化輸出的分類器,而不是通用助手。

    使用 Ertas,微調流程是:

    1. 上傳你的 JSONL 資料集
    2. 選擇基礎模型(工具呼叫推薦 Qwen 2.5 7B)
    3. 配置 LoRA——rank 16,alpha 32,針對所有注意力層
    4. 以學習率 2e-4 訓練 3 個 epoch

    在單個 GPU 上訓練時間:1,100 個範例需要 30-45 分鐘。輸出是一個 LoRA 適配器——一個疊加在基礎模型上的 50-100MB 文件。

    如果你還沒有足夠的真實執行資料,先從你的工具 schema 構建一個合成資料集,訓練初始模型,部署它,幾週後用真實資料重新訓練。

    第四步:使用 Ollama 部署

    以 GGUF 格式匯出你的微調模型並建立 Ollama Modelfile:

    FROM ./qwen2.5-7b-customer-tools.gguf
    
    PARAMETER temperature 0.1
    PARAMETER num_ctx 2048
    
    SYSTEM """You are a customer support router. Given a customer message, call the appropriate tool. Available tools: lookup_order, check_status, initiate_refund, update_address, send_notification, check_inventory, apply_discount, escalate_to_human. Respond with a JSON tool call or a conversational message if no tool applies."""
    ollama create customer-router -f Modelfile
    ollama run customer-router

    測試它:

    curl http://localhost:11434/api/chat -d '{
      "model": "customer-router",
      "messages": [{"role": "user", "content": "I want a refund for ORD-55123, it was defective"}],
      "stream": false
    }'

    預期輸出:

    {
      "tool_calls": [{
        "function": {
          "name": "initiate_refund",
          "arguments": "{\"order_id\": \"ORD-55123\", \"reason\": \"defective\"}"
        }
      }]
    }

    在有 16GB RAM 的機器上的回應時間:200-400ms。足夠快可以用於即時工作流程執行。

    第五步:替換 n8n 中的 OpenAI 節點

    在你的 n8n 工作流程中,用 HTTP Request 節點替換 OpenAI 節點:

    HTTP Request 節點配置:

    • 方法:POST
    • URL:http://localhost:11434/api/chat
    • Body(JSON):
    {
      "model": "customer-router",
      "messages": [
        {
          "role": "user",
          "content": "={{ $json.body.message }}"
        }
      ],
      "stream": false,
      "format": "json"
    }

    來自 Ollama 的回應包含相同結構的工具呼叫。你的下游 Switch 節點解析工具名稱並路由到正確的分支——與以前完全一樣。

    更新 Switch 節點以從 Ollama 回應格式而不是 OpenAI 回應格式解析。工具名稱在相同位置;你可能需要稍微調整 JSON 路徑。

    成本比較

    以下是不同自動化量的真實計算:

    每日執行次數每月總計OpenAI 成本(GPT-4o-mini)OpenAI 成本(GPT-4o)微調本地每月節省
    1003,000$60/月$90/月$0/月$60-90/月
    50015,000$300/月$450/月$0/月$300-450/月
    2,00060,000$1,200/月$1,800/月$0/月$1,200-1,800/月
    5,000150,000$3,000/月$4,500/月$0/月$3,000-4,500/月

    「微調本地」列是 $0,因為在你自己的硬體上推理沒有邊際成本。你已經在為伺服器付費了。即使每天 5,000 次執行,推理的電力成本也可以忽略不計——每月不到 $5。

    一次性成本:微調計算(在雲 GPU 上 $5-20,或在 Ertas 上免費),加上建立資料集和測試的 4-8 小時時間。

    每天 100 次執行的損益平衡:不到一週。

    Make.com 等效方案

    相同的模式在 Make.com 中也有效。用調用本地 Ollama 端點的 HTTP 模組替換 OpenAI 模組。

    HTTP 模組配置:

    • URL:http://your-server-ip:11434/api/chat
    • 方法:POST
    • Body 類型:Raw(JSON)
    • 請求內容:
    {
      "model": "customer-router",
      "messages": [{"role": "user", "content": "{{1.body.message}}"}],
      "stream": false,
      "format": "json"
    }

    如果你的 Make.com 實例在雲中運行而你的 Ollama 實例在本地運行,你需要暴露 Ollama 端點。選項:Cloudflare Tunnel(免費)、ngrok 或 VPN。對於生產環境,使用帶訪問策略的 Cloudflare Tunnel 來限制誰可以訪問端點。

    Make.com 的定價模型實際上使節省更加顯著。你按操作付費,OpenAI 模組算作一個操作,加上你單獨向 OpenAI 付費。使用調用本地端點的 HTTP 模組,你仍然為 Make.com 操作付費,但完全消除了 OpenAI 成本。

    可靠性提升

    這是被低估的好處。成本節省引人注目,但可靠性往往是更大的收益。

    通用 GPT-4 模型偶爾會幻覺工具名稱。它可能輸出 search_order 而不是 lookup_order,或 refund_order 而不是 initiate_refund。對人類來說足夠接近,但對你的 Switch 節點來說足夠錯誤以使其崩潰。

    在你的八個工具名稱上專門訓練的微調模型永遠不會幻覺第九個。它在訓練資料中只見過這八個名稱。輸出空間被限制在你的實際 schema 中。

    在客戶支援工作流程的測試中,微調 7B 模型達到:

    • 工具選擇準確率: 94-97%(vs 帶提示工程的 GPT-4o-mini 89-93%)
    • 參數擷取準確率: 91-95%(vs GPT-4o-mini 87-92%)
    • Schema 合規性: 99.5%+(vs GPT-4o-mini 96-98%)
    • 幻覺工具名稱: 0%(vs 通用模型 1-3%)

    通用模型上的 1-3% 幻覺率聽起來不多,直到你每天運行 500 次執行。在 2% 時,那是每天 10 次失敗執行——10 個遇到錯誤的客戶,10 個支援票,10 次手動干預。

    處理邊緣案例

    不匹配任何工具的消息怎麼辦?模型需要進行對話式回應。

    在你的訓練資料中包含負向範例——像「你們的營業時間是什麼?」或「謝謝幫助!」這樣的消息,不應該觸發任何工具。訓練模型為這些消息輸出對話式回應。

    可能匹配多個工具的消息怎麼辦?「我想退貨並更改我的地址」——這需要兩個工具呼叫。如果你的工作流程支援順序執行,則訓練多工具範例;或者訓練模型選擇主要意圖並在後續輪次處理第二個。

    新工具怎麼辦?當你向工作流程添加第九個工具時,你需要重新訓練。將新工具的範例添加到你的資料集中,包含將其與類似現有工具區分開的負向範例,並運行快速微調。使用 LoRA,重新訓練需要 30-45 分鐘。你可以在午餐時間完成。


    Ship AI that runs on your users' devices.

    Ertas early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    遷移清單

    以下是遷移清單:

    1. 匯出執行歷史從你的 n8n/Make.com 工作流程(最少 500 次成功運行)
    2. 格式化為 JSONL,帶有正確的工具呼叫結構和 20% 負向範例
    3. 微調 7B 模型,使用 LoRA(30-45 分鐘)
    4. 部署到與工作流程引擎相同的機器或網路上的 Ollama
    5. 替換 OpenAI 節點為指向 localhost:11434 的 HTTP Request 節點
    6. 測試在切換生產流量之前使用 50 個真實消息
    7. 監控前 1,000 次執行,將工具選擇準確率與 OpenAI 基準進行比較
    8. 每月重新訓練使用新的執行資料以持續改善

    最難的部分是第 1 步——習慣在你自己硬體上運行的 7B 模型可以匹配 GPT-4 對你特定工具的路由準確率的想法。一旦你看到測試結果,其餘的就是直接的管道工作。

    你的工作流程繼續運行。你的自動化繼續工作。你的 API 帳單降至零。

    延伸閱讀

    Ship AI that runs on your users' devices.

    Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    Keep reading