跳到內容

微調與後訓練

資料在這裡整理,訓練在別的機器上跑,成果再收回這裡。這台機器不做訓練。


DuDuClaw 值班機是一台只有內顯的迷你主機(Intel N305 或 AMD 8845HS)。它訓練不了語言模型,再怎麼等也一樣:LLaMA-Factory、Unsloth、Axolotl 全部假設有 CUDA 或 ROCm,llama.cpp 自己的 finetune 路徑也已經多年沒人維護。任何寫著「在你的值班機上微調」的產品,不是在賣別的東西,就是在唬人。

所以這個功能是照著這台機器真正擅長的事設計的。它的本機儲存裡躺著你好幾個月的對話、任務結果與審批決定,世界上沒有第二個地方有這批資料。把它變成訓練語料,才是有價值的那一半;GPU 用租的、用借的,或者本來就在你桌子底下。

三個步驟,三個分頁:

這台機器 你自備的 GPU 這台機器
+------------------+ +----------------------+ +------------------+
| 1. 整理 | | 2. 訓練 | | 3. 部署 |
| | ---> | | ---> | |
| 對話紀錄 | | 你自己的 GPU 主機 | | GGUF / LoRA 放進 |
| 任務結果 | | (SSH+LLaMA- | | 本地模型目錄 |
| 審批決定 | | Factory) | | |
| | | | 或雲端服務 | | |
| v | | | | |
| SFT + DPO JSONL | | 或乾跑:完全不訓練 | | |
+------------------+ +----------------------+ +------------------+

打開管理 → 微調與後訓練 → 資料集,取個名字、選格式、按建構。四種來源餵進去,全部是 gateway 本來就在存的資料:

來源 產出 為什麼是好的訓練樣本
AI 員工的對話 多輪 SFT 樣本 你的員工實際怎麼回答、用你們的詞彙
完成的任務結果 單輪 SFT 樣本 交辦內容與完成品成對
覆核裁決 DPO 偏好對 同一件任務:被退回的那一輪,與被接受的那一輪
審批決定 DPO 偏好對 同一種動作,你放行的對上你擋下的

兩種輸出格式,都照 LLaMA-Factory 讀得懂的樣子寫,並附上登記檔案的 dataset_info.json,遠端訓練不需要再轉一次格式:

  • ShareGPT:多輪對話訓練。
  • Alpaca:單輪指令訓練。

會變成垃圾的資料列直接丟掉,不會湊數。沒有回答的對話、沒有結果的任務、還沒決定的審批,一律不產生樣本;你看到的數字就是真的寫進檔案的量。一台全新的機器就誠實地建出零筆的資料集。

建構可以限定特定 AI 員工與起始日期,送出前可以先預覽前幾筆 JSON,也可以匯出檔案位置。


管理 → 微調與後訓練 → 訓練工作。挑資料集,挑 GPU 在哪。

驗證每一項設定,產生真正要用的那份 train.yaml 與寫明完整指令的 plan.json,然後停下來。什麼都不上傳、什麼都不訓練,工作狀態永遠停在「已規劃(未訓練)」,不會偷偷變成「完成」。這是在花 GPU 錢之前檢查參數的誠實作法。

透過 SSH 連到你自己的機器,用 rsync 把資料集送過去,在那裡跑 llamafactory-cli train train.yaml。LoRA、SFT 或 DPO,rank/輪數/學習率都由你決定。訓練完成後把 adapter 取回;如果那台機器上還有 llama.cpp 的 convert_lora_to_gguf.py,會順便轉出 GGUF 一起帶回來。

主機的準備大約十分鐘,見準備一台遠端 GPU 主機

把資料集上傳到 Together AI 的微調服務,用工作 id 追蹤狀態。上傳前會先轉成 Together 自己的 JSONL 格式(他們的 SFT 與 DPO 格式跟 LLaMA-Factory 不一樣),轉好的檔案留在工作目錄裡,事後還答得出「到底拿什麼訓練的」。需要在 gateway 的環境變數裡設好 TOGETHER_API_KEY

這一頁沒有進度條,是刻意的。工作只顯示狀態,加上真正那份訓練日誌的原文結尾:

  • 自有 GPU 主機:狀態來自遠端行程還在不在、adapter 檔案出現了沒有。主機一時連不上時,畫面會說連不上並保留原狀態。斷線不等於訓練失敗。
  • Together:直接用他們的狀態欄位一對一對應。他們有給剩餘秒數估計時原樣轉述。
  • 乾跑:永遠停在已規劃。

管理 → 微調與後訓練 → 匯入。指向一個 .gguf.safetensors.bin,本機路徑(完成的工作卡片上一鍵就能帶入產物)或 https:// 網址皆可。檔案會落在本地模型市集掃的同一個模型目錄,所以你的微調成果會跟其他模型並排出現在本地模型清單裡。沒有第二套登記表:檔案本身就是登記表。


步驟一全部在這台機器上完成。步驟二與三就不是了,所以兩個會把整理好的資料往外送的動作(匯出資料集,以及在 dry_run 以外任何後端建立訓練工作)都會擋下來,直到你勾選**「我了解這些資料會離開這台機器」**。

閘門失敗時關閉:沒勾就是拒絕,不是預設同意;不認識的後端一律當作遠端。拒絕是一個結構化回應,畫面把它變成一個確認步驟而不是錯誤訊息,所以那個勾選框是你在看著警語時、為這次動作做的一個決定。


  • 完全不做本機訓練。 不是慢慢訓練,也不是縮水訓練。值班機只負責整理與保管。
  • 資料的判斷仍然是你的。 資料集建構不做去識別化。對話裡有客戶的細節,那個細節就在 JSONL 裡。匯出閘門存在的理由就是這個。
  • 從審批來的偏好對訊號比覆核裁決弱:那是同一種動作被判了不同結果,不是同一個問題的兩個答案。每一列都記著自己的來源,你可以篩。
  • 對話模板很重要。 template 填錯會訓練出流暢的胡說八道,所以這個欄位是明填的,不用猜的。

私有微調真正稀缺的東西從來就不是 GPU 時數。稀缺的是一份反映你的生意怎麼回答問題的語料,而那份語料已經在這台機器上了。這個功能把它變成訓練資料、送到真的能訓練的硬體、再把成果帶回來,並且在每一步都明講:運算發生在哪裡、你的資料去了哪裡。