gpt-oss-20b 微調實戰:把開源腦養成公司資產

🧭 這是系列的一塊 — 先看全景地圖
想先看 LLM / 平台 / 工具 / Agent / 微調 怎麼拼成一張圖 → 從一顆腦到公司 Agent:LLM 全景地圖
重點摘要(TL;DR)
  • 先別急著調參數。要它「知道公司文件」→ 用 RAG(70% 公司用例);要它「用某種語氣/格式/SOP 回答」→ 才 fine-tune
  • 個人唯一可行的微調法是 QLoRA:gpt-oss-20b 只要 14GB VRAM(BF16 LoRA 要 44GB,full 要數百 GB)。
  • 你的筆電(AMD iGPU、無 CUDA)不能訓練——但 14GB 低到免費 Google Colab(T4)就能跑;敏感公司資料則租私有 GPU。
  • 最花工的是資料:原始文件不能直接餵,要轉成「指令→理想輸出」的 JSONL,幾百筆高品質即可,品質 >> 數量。
  • 微調完一定要測會不會「變笨」(catastrophic forgetting)。

很多人一想到「客製公司模型」就衝去 fine-tune,結果花大錢調出一個會過時、會幻覺的模型。這篇用開源的 gpt-oss-20b 當範例,把「調參數」從頭講清楚:該不該調、你的電腦能不能調、資料怎麼準備、實際怎麼跑、怎麼驗收——並先幫你擋掉最貴的那個坑。

🧭 本文導覽(五部分)
Part 一 — 該不該調?
Part 二 — 硬體現實
Part 三 — 資料準備(最花工)
Part 四 — 實戰 + 驗證
Part 五 — 讀懂 notebook + 怎麼調
Part 六 — 決策 + 為什麼值得(資產化)
Part 七 — 速查
Part 一 — 該不該調?

先問對問題:你要教它「知識」還是「行為」?

這一步決定你根本該不該 fine-tune。搞錯方向,後面全白做:

你的目標該用為什麼
要它知道公司文件/規章/資料(問答)RAG,不是 fine-tunefine-tune 灌知識會過時、幻覺、每次資料更新要重訓;RAG 知識隨資料庫即時更新、答得準
要它固定用某語氣/格式/SOP/分類回答fine-tune(LoRA)這是「行為」,RAG 做不到
兩個都要混合:fine-tune 定行為 + RAG 定知識多數 production 最後都走這條
一句話心法
RAG 教知識,fine-tune 教行為。「公司內部問答」幾乎都是 RAG 的活——硬用 fine-tune 灌知識,是最常見的貴錯誤。只有當你要它「學會某種公司特有的回答方式/任務」才 fine-tune。下面假設你確實需要調行為。

「調參數」到底是什麼:三個等級

fine-tune = 拿預訓練好的模型,用你的範例資料再訓練一次,微調它的權重(就是那些「參數」)。依動到多少參數分三級:

方式改什麼gpt-oss-20b 顯存適合誰
Full fine-tune全部參數數百 GB個人別碰
BF16 LoRA只訓一小塊 adapter44GB VRAM有大顯卡
QLoRA(4-bit)⭐4-bit 底模 + 小 adapter只要 14GB VRAM你唯一可行路

QLoRA 的訣竅:把底模壓成 4-bit(省記憶體),凍結它,只訓練外掛的一小塊 LoRA adapter(幾十~幾百 MB)。gpt-oss-20b 是 MoE(32 選 4 專家、MXFP4 權重),目前只有 Unsloth 這套工具搞得定它的 QLoRA,省 80% 顯存。

Part 二 — 硬體現實

你的電腦能不能訓練?(誠實版)

以一台常見的輕薄筆電(32GB RAM、AMD Ryzen + 內顯、無獨立 NVIDIA 顯卡)為例:

本機不能訓練 20B
訓練需要 NVIDIA CUDA GPU。AMD 內顯連推理都可能算錯吐亂碼(實例),更別說訓練;純 CPU 訓 20B = 幾週~不可能。本機只適合:準備資料 + 最後跑推理(Q4、CPU、慢但可用)。
好消息:14GB 低到免費 Colab 就能跑
gpt-oss-20b QLoRA 只吃 14GB VRAM,一張免費 Google Colab 的 T4(16GB)就能訓——Unsloth 有現成的一鍵 notebook,不用自己配環境。學流程從這裡開始最省事。

依「隱私」選 GPU:Colab / 租裸機 / 公司機

情境用什麼隱私
學流程 / 練手免費 Colab T4(16GB)資料會上 Google,別放真公司資料
公司敏感資料租私有 GPU 裸機(RunPod / Lambda,A10 / 4090 / A100,幾美元/hr,QLoRA 20B 幾小時)或公司自有 GPU / 未來 DGX資料只在你控制的機器,不落第三方
本機的角色只做資料準備 + 推理部署全私密
隱私紅線
公司內部資料別上會拿去訓練的平台、用你能控制的 GPU、資料不外流。要訓真公司版,租「裸機 GPU」(你獨佔、跑完就清)比用公有雲的託管微調服務安全。
Part 三 — 資料準備(最花工)

你的本地資料怎麼變成訓練集(最花工的一步)

這步決定成敗,也最花時間。原始文件不能直接餵——要轉成「指令 → 理想輸出」的對話範例,存成 JSONL(每行一筆):

// train.jsonl —— 每一行是一個對話範例(chat 格式)
{"messages":[
  {"role":"system","content":"你是公司的智能助理,回答精簡、附依據。"},
  {"role":"user","content":"客戶問退貨流程,我該怎麼回?"},
  {"role":"assistant","content":"依公司 SOP:1) 先確認訂單編號… 2) …(這就是你要它學的『理想回答方式』)"}
]}
{"messages":[
  {"role":"system","content":"你是公司的智能助理,回答精簡、附依據。"},
  {"role":"user","content":"幫我把這段會議記錄整理成三點行動項"},
  {"role":"assistant","content":"1) …\n2) …\n3) …(你要的固定輸出格式)"}
]}

三個守則

  • 轉成「問→理想答」對,不是丟文件。學行為就蒐集你要它模仿的範例(標準回覆、報告格式、SOP 對話)。可先用大模型從文件自動生 Q&A 草稿,再人工校對(蒸餾)。
  • 品質 >> 數量。QLoRA 學風格/行為,幾百~幾千筆高品質就有效,不用海量。垃圾進垃圾出。
  • 格式一致、無矛盾、去識別敏感資料。同一種任務用同一種輸出格式;矛盾的範例會讓它學亂;個資/機密先遮蔽。
Part 四 — 實戰 + 驗證

實戰七步:用 gpt-oss-20b 跑一次 QLoRA

  1. 準備 train.jsonl(幾百筆,見上)
  2. 開一台 GPU(免費 Colab / 租私有裸機)
  3. pip install unsloth,載 gpt-oss-20b 4-bit + 掛 LoRA
  4. 用 SFTTrainer 訓 1–3 個 epoch(太多會過擬合)
  5. 產出 LoRA adapter(很小,幾十~幾百 MB)
  6. 合併 / 匯出 GGUF → 用 Ollama / vLLM 部署推理(這步可回你本機 CPU 跑)
  7. 驗證(下一節)——別跳過

核心程式碼長這樣(示意,實際照 Unsloth 官方 notebook,參數會更新):

from unsloth import FastLanguageModel
from trl import SFTTrainer

model, tok = FastLanguageModel.from_pretrained(
    "unsloth/gpt-oss-20b", load_in_4bit=True, max_seq_length=2048)

model = FastLanguageModel.get_peft_model(   # 掛 LoRA:只訓這一小塊
    model, r=16, lora_alpha=16,
    target_modules=["q_proj","k_proj","v_proj","o_proj"])

trainer = SFTTrainer(model=model, tokenizer=tok,
    train_dataset=my_jsonl,                 # 你的 train.jsonl
    args=dict(num_train_epochs=2, learning_rate=2e-4,
              per_device_train_batch_size=2))
trainer.train()
model.save_pretrained("hsinchu-20b-lora")   # 產出 adapter

驗證:有沒有變好、有沒有「變笨」

微調最危險的副作用是 catastrophic forgetting:學了你的新格式,卻忘了通用能力。綠燈≠成功,一定要兩邊都測:

測什麼怎麼測不通過代表
① 有沒有學會拿沒訓過的同類問題,看它有沒有用你要的格式/行為回答資料太少或太雜,加量/清乾淨
② 有沒有變笨用通用任務(前幾篇的五張成績單 / 真實 agent 任務)測——寫程式、工具呼叫還在不在overfitting;降 epoch、降 learning rate、混一點通用資料
驗收心法
fine-tune 是用一點通用能力換一點你要的專精。目標是「學會你的行為 + 通用能力沒明顯退步」。QLoRA(只動一小塊)比 full FT 安全,但仍要測——用選型框架那套真實任務驗最準。

新手實戰筆記:免費 Colab 走一遍會撞的四個坑

我真的用免費 Colab T4 從頭把 gpt-oss-20b QLoRA 跑了一遍(15 筆廠務資料、教它固定用「【結論】【依據】【下一步】」回答)。官方 notebook 順跑會撞四個坑——這裡先幫你擋,這些教科書不會寫:

現象解法
train_on_responses_only 報錯ValueError: masked every label to -100 ... response marker not found那格是選用優化,只對「有 analysis/final 通道的推理型資料」有效;純文字三段答案資料直接跳過該格
loss = nan訓練每一步 loss 都是 nan(等於沒在學)gpt-oss 在免費 T4 數值敏感;learning_rate2e-4 降到 1e-5(降 20 倍)就變正常數字
答案被切斷、只看到英文思考輸出停在 analysis(英文碎念)沒吐最終答案reasoning 模型會先「想」吃掉 token;reasoning_effort="low" + max_new_tokens 加到 512
亂呼叫工具回答跑進 commentary 通道、生出假的 functions.run tool callgpt-oss 是工具原生模型會手癢;reasoning_effort 調低,或 system prompt 明講「不要呼叫任何工具,直接三段回答」
成功長怎樣
對一個沒訓練過的新問題(例:「隔壁廠想借我們的堆高機兩天,該借嗎?」),模型自動用【結論】【依據】【下一步】三段格式回答,而且內容有料(合法性/設備安全/成本/公司政策)—— 這代表它學到的是行為(格式+口吻),不是背答案 = 真正的泛化。實測:loss 5.9→4.6、15 筆、免費 T4 約 11 分鐘。
為什麼你會撞這些
這四個坑在免費 T4 + gpt-oss 特別容易遇到(T4 老、無 bf16、gpt-oss 又是 MoE+工具原生)。真做公司版時換成 A100 / 租的 GPU,大多不會有 nan,還能用更大的 learning_rate、更多 epoch、更乾淨地學。所以:免費 Colab 拿來「學流程」很讚,正式訓練上私有 GPU。
Part 五 — 讀懂 notebook + 怎麼調

讀懂 notebook:每一格在幹嘛(九階段)

拿官方 Unsloth 的 gpt-oss-20b notebook 對照,拆成九個階段。你反覆會動的只有三格:換底模(cell 11)、換資料(cell 23)、調火候(cell 30),其他大多照跑。

階段cell在幹嘛
0 準備4–6上傳 train.jsonl、確認檔案在 /content
1 拿底模8, 11裝 unsloth、載 gpt-oss-20b(4-bit)當基底
2 掛 LoRA13凍結原權重,只外掛 0.44% 可訓練小塊 = 你要存的 adapter
3(可跳)15–19reasoning effort 示範,與訓練無關
4 資料22, 23, 25, 27載你的 jsonl → 套聊天模板 → 檢查第一筆(cell 23 是換資料那行)
5 設火候30設訓練超參數(learning_rate / max_steps…)
6(可跳/驗證)32, 34, 37train_on_responses_only(純文字資料跳過)、檢查遮罩、記憶體
7 訓練39trainer.train() 按下訓練,loss 下降=學得動
8 測驗收42換「沒訓練過」的新問題生成,看有沒有學會格式
9 存檔45save_pretrained() → LoRA adapter(資產本體,幾百 MB)

調整指南:想改什麼就動哪一格

只動三處
換底模 → cell 11 的 model_name;換/擴充資料 → cell 23 的 load_dataset(...) + 你的 jsonl;調訓練火候 → cell 30 的 learning_rate/max_steps

① 資料格式(你要準備的)

// train.jsonl,每行一筆:
{"messages":[
  {"role":"system","content":"(人設/固定規則)"},
  {"role":"user","content":"(問題或指令)"},
  {"role":"assistant","content":"(你要它學的理想答案)"}
]}

你只要準備 user(問)+ assistant(理想答);幾百~幾千筆、品質 >> 數量、格式一致、無矛盾、去識別敏感資料

② 訓練火候(cell 30,最常調)

參數意思預設何時調 / 建議值
learning_rate學多快2e-4太高會 nan(gpt-oss+T4)→ 降 1e-5;A100/bf16 用 5e-5 較穩有力
max_steps練幾步30資料多要加大:15 筆→30、300 筆→100–300
num_train_epochs練幾輪(與 max_steps 二選一)(註解掉)想用輪:max_steps=None + 設 3
per_device_train_batch_size / gradient_accumulation_steps一次吃幾筆1 / 4OOM 就維持 batch=1;想等效更大 batch 就加大 accum
r(cell 13)LoRA 旋鈕大小8簡單格式 8/16;較難/資料多用 32

③ 測試輸出(cell 42)

reasoning_effort="low"(固定格式任務少想快答)+ max_new_tokens=512(太小會切斷)+ 把 messages 換成沒訓練過的新問題驗收。

快速決策:我該設什麼
學流程(免費 T4):gpt-oss-20b + 15–30 筆 + lr=1e-5, max_steps=30(現狀)。
真做公司版(A100/DGX/租):gpt-oss-20b + 300–1000 筆去識別真資料 + lr=5e-5, num_train_epochs=3, r=16。訓練用 NVIDIA;Mac Mini 不能訓練但很適合之後跑 Ollama 推理落地。
Part 六 — 決策 + 為什麼值得(資產化)

決策流程 + 建議路徑

照這個順序走,別跳步
先問 RAG 夠不夠(公司問答多半夠,先別 fine-tune)→
② 想熟流程:免費 Colab 跑一次 gpt-oss-20b QLoRA(用公開範例資料,不碰真公司資料)→
③ 真做公司版:租私有 GPU + 你的資料 + Unsloth,幾百筆 QLoRA →
④ 本機只負責:資料準備 + 推理部署

為什麼值得做:一個腦,落地到每個廠區(真正的資產)

這才是微調的戰略價值——你調出來的東西是你擁有的資產,不是租來的服務。租雲端 API 是費用(用多少付多少、資料出門、廠商漲價你認);養一個微調模型是資產(一次養成、到處部署、資料不出廠)。

這個「腦」由兩塊組成是什麼誰擁有
開源底模gpt-oss-20b(Apache 2.0,可商用部署)公開,誰都能用
你的 LoRA adapter幾百 MB,結晶了公司特有的 know-how / 回答方式你獨有 —— 這就是資產本體

落地到每個廠區:各廠區只要一台能跑推理的伺服器(20B Q4 約 16GB 記憶體,一台像樣的工作站就行,不用訓練級 GPU)→ 掛上這顆腦 → 離線、私密、零雲端 per-token 成本,就地做事。

最強落地架構:一顆共用腦 + 各廠自己的知識庫
中央維護一顆「公司腦」(fine-tune 定行為)+ 每個廠區掛自己的 RAG(在地文件/資料)。腦是集中管理、統一更新的資產;各廠區的知識各自在地、不互相外洩。一次養成、N 個廠區複製,每個廠都像有一位受過公司訓練的在地助理。
但要配套治理(這是委員會該建的)
資產要能維護才叫資產:① adapter 版本控管(v1/v2,可回溯)② 中央更新、推送到各站(MLOps 流程)③ 每次更新都跑前面的驗證關(別讓新版變笨)④ 資料治理(哪些資料能進訓練、去識別)。這正是「air-gapped 公司分身」願景的落地版——腦在自家伺服器、資料不出廠。
一句話
租 API 是費用,養模型是資產。一次養、到處放、資料不出廠——這才是把 AI 變成公司真正握在手裡的能力,而不是每月帳單。
Part 七 — 速查

一頁速查 + 名詞表

名詞白話
fine-tune / 調參數用你的範例再訓練,微調模型權重(改行為)
LoRA只訓練外掛的一小塊 adapter,不動原模型
QLoRALoRA + 把底模壓 4-bit,最省顯存(20B 只要 14GB)
RAG不訓練,查資料庫把答案塞進 prompt(改知識)
epoch把整份資料練過一輪;1–3 輪,太多會過擬合
catastrophic forgetting學了新東西忘了舊能力(=變笨)
GGUF量化後的模型檔格式,給 Ollama / llama.cpp 跑
蒸餾用大模型從文件生 Q&A 訓練資料,再人工校對

延伸:LLM Request/Response 與 Tool Use 拆解 · 副手選型框架 + 89 模型全掃

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *