從每月 $500 的 OpenAI 帳單到 $0:將 n8n 工作流程遷移到本地模型
為每月花費數百美元於 OpenAI API 呼叫的 n8n 用戶提供的實用遷移指南。在不破壞任何東西的情況下將工作流程遷移到本地微調模型。
你從一個使用 OpenAI 的 n8n 工作流程開始。一個簡單的——也許它分類傳入的電子郵件或從表單提交中提取資料。API 呼叫每次執行的費用不到一分錢。幾乎不引人注意。所以你又構建了五個工作流程。然後十個。然後你為需要更好推理的工作流程添加了 GPT-4。然後你的同事看到了你構建的東西,又要求了三個。
現在你面對的是每月 $500 的 OpenAI 帳單。而且還在增長。
問題是:大多數這些工作流程不需要 GPT-4。它們甚至不需要 GPT-3.5。它們需要一個在一個特定任務上非常出色的模型——分類、提取、重新格式化、摘要——而這正是微調的 7B 模型所做的。從 OpenAI API 呼叫遷移到本地微調模型並不像聽起來那麼可怕,節省的成本是巨大的:從每月數百美元到按每個 token 計費字面上為零。
本指南逐步介紹整個遷移過程。我們將稽核你的工作流程、優先考慮遷移內容、為每種工作流程類型微調模型、使用 Ollama 部署它們,並在不破壞任何東西的情況下在 n8n 中交換端點。
遷移稽核
在遷移任何東西之前,你需要了解你在處理什麼。稽核的目標是清點每個使用 AI 節點的 n8n 工作流程,按複雜性和容量對每個進行分類,並確定快速獲勝的機會。
第一步:列出所有帶有 AI 節點的工作流程。 在 n8n 中,進入你的工作流程列表並搜索包含 OpenAI 節點(或任何 AI/LLM 節點)的工作流程。對於每個工作流程,記錄:
- 工作流程名稱和目的
- 使用的模型(GPT-4、GPT-4o、GPT-3.5-turbo)
- 每天的大約執行次數
- 每次執行的平均輸入 token 數
- 每次執行的平均輸出 token 數
- 是否使用結構化輸出(JSON 模式、函數呼叫)
第二步:按任務類型分類。 大多數 AI 驅動的 n8n 工作流程屬於以下類別:
| 任務類型 | 範例 | 複雜性 | 遷移難度 |
|---|---|---|---|
| 分類 | 電子郵件路由、票券分類、情感分析 | 低 | 簡單 |
| 提取 | 從文字中提取名稱/日期/金額、解析發票 | 低-中 | 簡單 |
| 重新格式化 | 將散文轉換為要點、標準化格式 | 低 | 簡單 |
| 摘要 | 摘要電子郵件、會議記錄、文件 | 中 | 中等 |
| 生成 | 撰寫電子郵件回覆、創建描述、起草內容 | 中-高 | 中等 |
| 推理 | 多步驟分析、決策制定、複雜問答 | 高 | 困難 |
| 代碼生成 | 撰寫 SQL 查詢、生成腳本 | 高 | 困難 |
第三步:計算每個工作流程的費用。 將每個工作流程的每日執 行次數乘以其 token 使用量和模型的每個 token 費率。以下是快速參考:
| 模型 | 輸入費用(每 100 萬 token) | 輸出費用(每 100 萬 token) |
|---|---|---|
| GPT-4o | $2.50 | $10.00 |
| GPT-4 | $30.00 | $60.00 |
| GPT-3.5-turbo | $0.50 | $1.50 |
每天運行 500 次、800 個輸入 token 和 200 個輸出 token 的 GPT-4o 工作流程:
- 輸入:500 x 800 = 40 萬 token/天 = 1,200 萬 token/月 = $30/月
- 輸出:500 x 200 = 10 萬 token/天 = 300 萬 token/月 = $30/月
- 總計:單個工作流程每月 $60
乘以 10-15 個工作流程,你就能明 白為什麼每月 $500 很快就發生了。
優先遷移哪些工作流程
並非所有工作流程都是同等的遷移候選者。理想的首要目標是:
高容量、低複雜性。 每天將 2,000 封電子郵件分類為 5 個類別的工作流程是完美的。它有清晰的輸入輸出模式、高容量(因此高節省)和低複雜性(微調的 3B 模型可以輕鬆處理)。
結構化輸出。 期望 JSON 輸出的工作流程——例如從發票中提取字段或解析表單資料——是絕佳候選者。輸出格式受到約束且可預測,這使得微調直接且評估簡單。JSON 要麼正確要麼不正確。
重複模式。 如果工作流程對數千次輸入執行本質上相同的轉換,只有輸入資料不同,微調效果很好。模型只需要學習一次模式。
首先不要遷移的工作流程:
- 任何需要最新世界知識的工作(微調模型知道它被訓練時的知識,僅此而已)
- 多步驟推理鏈,其中早期輸出饋入後期提示
- 質量主觀且難以評估的創意生成
- 任何具有安全關鍵後果的東西(醫療、法律、財務建議)
以下是優先排序框架:
| 優先級 | 標準 | 預期節省 |
|---|---|---|
| P0 — 立即遷移 | 分類、提取、重新格式化;每天超過 100 次執行 | 90-100% 費用減少 |
| P1 — 接下來遷移 | 摘要、簡單生成;每天超過 50 次執行 | 85-95% 費用減少 |
| P2 — 仔細評估 | 複雜生成、多步驟推理;任何容量 | 70-90% 費用減少 |
| P3 — 保留在 API 上 | 安全關鍵、需要世界知識、高度可變的任務 | 0%(保留在 API 上) |
遷移框架
遷移分四個階段進行。不要跳過階段。不要急於求成。
第一階段:導出執行資料
對於你要遷移的每個工作流程,你需要實際執行的輸入輸出對。這是你的訓練資料。
從 n8n 執行日誌: n8n 為每次工作流程執行存儲執行資料。你可以通過 n8n API 訪問這些,或者如果你是自托管,直接從資料庫訪問。對於 AI 節點的每次執行,提取:
- 發送到 OpenAI 的提示/輸入
- 收到的回應/輸出
- 工作流程是否成功完成(過濾掉失敗)
導出腳本方法:
// 從 n8n 執行中提取訓練對的偽代碼
const executions = await n8nApi.getExecutions({
workflowId: "your-workflow-id",
status: "success",
limit: 5000,
});
const trainingData = executions.map((exec) => {
const aiNode = exec.data.resultData.runData["OpenAI Node"][0];
return {
input: aiNode.parameters.prompt,
output: aiNode.data.main[0][0].json.text,
};
});
// 寫成 JSONL
const jsonl = trainingData
.map((d) => JSON.stringify(d))
.join("\n");
fs.writeFileSync("training-data.jsonl", jsonl);每種工作流程類型需要多少資料?
| 工作流程複雜性 | 最低範例數 | 推薦 | 收益遞減後 |
|---|---|---|---|
| 分類(5-10 個類別) | 200 | 500 | 2,000 |
| 資料提取 | 300 | 800 | 3,000 |
| 重新格式化 | 200 | 500 | 1,500 |
| 摘要 | 500 | 1,500 | 5,000 |
| 內容生成 | 800 | 2,000 | 5,000 以上 |
對於大多數 n8n 工作流程,兩到四週的執行日誌提供了超過足夠的訓練資料。
第二階段:每個工作流程進行微調
現在的問題是:你是為所有工作流程訓練一個模型還是每種工作流程類型一個模型?
每種工作流程類型一個模型 幾乎總是正確的選擇。原因如下:
- 每個模型可以很小很快(3B-7B 參數),因為它只需要處理一個任務
- 質量更高,因為模型不會被競爭的任務模式混淆
- 你可以在要求改變時獨立更新每個模型
- 如果一個模型表現不佳,你只需重新訓練那個——不是全部
使用 Ertas 進行微調過程:
- 將 JSONL 訓練文件上傳到 Ertas
- 選擇基礎模型:
- Qwen 2.5 3B 用於簡單分類和提取(在 4GB RAM 上運行)
- Qwen 2.5 7B 用於摘要和生成(在 8GB RAM 上運行)
- 配置 LoRA 訓練(對 大多數工作流程,默認值就很好)
- 訓練——500 個範例在 3B 模型上大約需要 15 分鐘,7B 大約需要 30 分鐘
- 對保留的測試範例進行評估
- 導出為 GGUF
第三階段:部署和測試
在單個 Ollama 實例上部署所有你的微調模型。Ollama 高效地處理多個模型——它將活躍模型加載到記憶體中,並可以在幾秒鐘內在模型之間切換。
部署設置:
# 在 VPS 上安裝 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 創建每個模型
ollama create email-classifier -f Modelfile.email-classifier
ollama create invoice-extractor -f Modelfile.invoice-extractor
ollama create ticket-summarizer -f Modelfile.ticket-summarizer多個模型的 VPS 規格:
| 模型數量 | 同時活躍 | 推薦 VPS |
|---|