想先看 LLM / 平台 / 工具 / Agent / 微調 怎麼拼成一張圖 → 從一顆腦到公司 Agent:LLM 全景地圖
- 先別急著調參數。要它「知道公司文件」→ 用 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 當範例,把「調參數」從頭講清楚:該不該調、你的電腦能不能調、資料怎麼準備、實際怎麼跑、怎麼驗收——並先幫你擋掉最貴的那個坑。
先問對問題:你要教它「知識」還是「行為」?
這一步決定你根本該不該 fine-tune。搞錯方向,後面全白做:
| 你的目標 | 該用 | 為什麼 |
|---|---|---|
| 要它知道公司文件/規章/資料(問答) | RAG,不是 fine-tune | fine-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 | 只訓一小塊 adapter | 44GB 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% 顯存。
你的電腦能不能訓練?(誠實版)
以一台常見的輕薄筆電(32GB RAM、AMD Ryzen + 內顯、無獨立 NVIDIA 顯卡)為例:
訓練需要 NVIDIA CUDA GPU。AMD 內顯連推理都可能算錯吐亂碼(實例),更別說訓練;純 CPU 訓 20B = 幾週~不可能。本機只適合:準備資料 + 最後跑推理(Q4、CPU、慢但可用)。
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」(你獨佔、跑完就清)比用公有雲的託管微調服務安全。
你的本地資料怎麼變成訓練集(最花工的一步)
這步決定成敗,也最花時間。原始文件不能直接餵——要轉成「指令 → 理想輸出」的對話範例,存成 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 學風格/行為,幾百~幾千筆高品質就有效,不用海量。垃圾進垃圾出。
- 格式一致、無矛盾、去識別敏感資料。同一種任務用同一種輸出格式;矛盾的範例會讓它學亂;個資/機密先遮蔽。
實戰七步:用 gpt-oss-20b 跑一次 QLoRA
- 準備
train.jsonl(幾百筆,見上) - 開一台 GPU(免費 Colab / 租私有裸機)
pip install unsloth,載 gpt-oss-20b 4-bit + 掛 LoRA- 用 SFTTrainer 訓 1–3 個 epoch(太多會過擬合)
- 產出 LoRA adapter(很小,幾十~幾百 MB)
- 合併 / 匯出 GGUF → 用 Ollama / vLLM 部署推理(這步可回你本機 CPU 跑)
- 驗證(下一節)——別跳過
核心程式碼長這樣(示意,實際照 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_rate 從 2e-4 降到 1e-5(降 20 倍)就變正常數字 |
| 答案被切斷、只看到英文思考 | 輸出停在 analysis(英文碎念)沒吐最終答案 | reasoning 模型會先「想」吃掉 token;reasoning_effort="low" + max_new_tokens 加到 512 |
| 亂呼叫工具 | 回答跑進 commentary 通道、生出假的 functions.run tool call | gpt-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。
讀懂 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 掛 LoRA | 13 | 凍結原權重,只外掛 0.44% 可訓練小塊 = 你要存的 adapter |
| 3(可跳) | 15–19 | reasoning effort 示範,與訓練無關 |
| 4 資料 | 22, 23, 25, 27 | 載你的 jsonl → 套聊天模板 → 檢查第一筆(cell 23 是換資料那行) |
| 5 設火候 | 30 | 設訓練超參數(learning_rate / max_steps…) |
| 6(可跳/驗證) | 32, 34, 37 | train_on_responses_only(純文字資料跳過)、檢查遮罩、記憶體 |
| 7 訓練 | 39 | trainer.train() 按下訓練,loss 下降=學得動 |
| 8 測驗收 | 42 | 換「沒訓練過」的新問題生成,看有沒有學會格式 |
| 9 存檔 | 45 | save_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 / 4 | OOM 就維持 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 推理落地。
決策流程 + 建議路徑
① 先問 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 變成公司真正握在手裡的能力,而不是每月帳單。
一頁速查 + 名詞表
| 名詞 | 白話 |
|---|---|
| fine-tune / 調參數 | 用你的範例再訓練,微調模型權重(改行為) |
| LoRA | 只訓練外掛的一小塊 adapter,不動原模型 |
| QLoRA | LoRA + 把底模壓 4-bit,最省顯存(20B 只要 14GB) |
| RAG | 不訓練,查資料庫把答案塞進 prompt(改知識) |
| epoch | 把整份資料練過一輪;1–3 輪,太多會過擬合 |
| catastrophic forgetting | 學了新東西忘了舊能力(=變笨) |
| GGUF | 量化後的模型檔格式,給 Ollama / llama.cpp 跑 |
| 蒸餾 | 用大模型從文件生 Q&A 訓練資料,再人工校對 |
發佈留言