AI-LECTURER 速報課|2026-09-05|約 26 分鐘

100 步 GRPO 微調,讓 3.5 億參數的小模型學會『真的守規矩』

📍 真實場景
阿凱,一間小型網路電商的後端工程師,負責維護自動訂單客服機器人

他打算把 LLM 接進客服系統,讓 AI 直接把顧客傳來的訊息轉成訂單系統看得懂的 JSON 資料,省掉人工輸入的步驟

😖 卡住的地方:系統三不五時就在解析 AI 回傳的資料時噴錯——有時候欄位型別不對(數字寫成文字、文字寫成數字),有時候 AI 多嘴加了一句「很樂意為您服務」,把整包 JSON 包在客套話裡,程式一解析就整條當機
💡 這課會告訴他:與其一直加防呆程式碼硬接,不如搞懂『結構化輸出的守門邏輯』是什麼,以及怎麼用小模型微調,把『守規矩』直接練進模型的行為習慣裡

🧭 這到底是什麼(白話版)

你有沒有想過,為什麼客服機器人平常答得好好的,一接進真正的訂單系統就整組壞掉?問題常常不是「內容對不對」,而是「格式對不對」。這篇文章講的就是 結構化輸出(structured output)要求 AI 不要自由發揮講一段話,而是照著指定的格式,比如固定欄位的 JSON,把答案吐出來,方便程式直接讀取 這件事——而且特別去衡量,AI 輸出的東西有沒有符合 schema格式的規格書,規定資料長什麼樣子,例如「一定要有 order_id 這個欄位,而且必須是文字」。合不合規往往就是能不能把 AI 接進真正系統的分水嶺。

文章示範的做法,是拿一顆只有 參數量(350M)模型裡面『旋鈕』的數量,350M 代表 3.5 億個旋鈕,數字越大通常能力越強,但也越貴、跑起來越慢 的小模型,做一次 微調(fine-tuning)拿一個已經訓練好的通用模型,用少量特定任務的資料再訓練一小段,讓它更擅長做那件特定的事。訓練方法用的是 GRPO一種強化學習訓練法(Group Relative Policy Optimization),讓模型針對同一題產生多個候選答案,互相比較評分,再把分數較高的答案的思路留下來,而且只練了 100 步——目標不是要打敗排行榜,而是要證明:一顆小模型針對特定任務練過之後,有機會追上體積大得多的模型的表現。

為了驗證這件事,作者先在自己的筆電上,用 llama.cpp一套能在一般電腦(甚至筆電)上跑 AI 模型的軟體,還能開一個網路服務讓其他程式呼叫模型 把模型服務起來——用的是壓縮打包成 GGUF一種把 AI 模型壓縮打包的檔案格式,方便在一般電腦上載入運行 格式、精度是 BF16一種數字精度格式,精度越低通常檔案越小、跑得越快,但可能犧牲一點準確度 的版本,接上開源評測工具 IFStruct,量出微調前的基準分數,再決定值不值得投入時間去微調。

🎯 為什麼值得你花時間

小模型也能扛住真實系統的要求不用非得吃大模型的帳單和延遲,經過針對性微調的小模型也有機會穩定產出合規格式,對預算和速度敏感的系統特別重要。
格式錯一個字,系統就斷線結構化輸出不是『看起來差不多就好』,型別錯、多欄位、包了客套話,通通會讓下游程式解析失敗,這是能不能真正上線的關鍵。
先量基準,再談進步文章示範了工程上很重要的紀律——先重現、確認基準分數可信,才有資格說『微調真的有效』,而不是憑感覺說有變好。

⚙️ 它是怎麼運作的

1
先掛號量體溫:重現 base model 的基準分數在自己的 MacBook 上用 llama.cpp 把還沒微調的 LFM2.5-350M 服務起來,對著 IFStruct 的 2000 道題目跑一次,看看沒練過的模型本來就有幾成能守住格式規矩。
2
把訓練搬去免費雲端 GPUGRPO 訓練需要反覆計算梯度,很吃顯示卡,所以在免費的 Colab 或 Kaggle GPU 上進行,不用自己買昂貴的顯卡。
3
用 GRPO 跑 100 步微調讓模型針對結構化輸出任務,反覆產生候選答案、互相比較評分,只用 100 步的訓練量,把『守格式』這件事練進模型的行為習慣裡。
4
把微調完的模型再壓縮成 GGUF訓練完的模型要能在一般筆電跑,需要透過 llama.cpp 相關工具轉成 GGUF 這種輕量檔案格式。
5
拿同一份 IFStruct 題庫,重新評測一次用一模一樣的評測流程跑微調後的模型,才能公平比較『練過』跟『沒練過』的差距在哪裡。
6
回頭決定值不值得換成小模型把訓練前後的表現放在一起看,判斷這顆微調過的 350M 小模型,是不是已經夠格接進真正需要結構化輸出的下游系統。
為什麼訓練跟評測要分開在兩個地方跑?
階段在哪裡跑為什麼
GRPO 微調訓練免費 Colab / Kaggle GPU(雲端)訓練要反覆計算梯度、很吃顯示卡,自己筆電通常扛不住
IFStruct 評測本機 MacBook(Apple M5 Max,36GB 統一記憶體)透過 llama.cpp 開本地伺服器評測只是讓模型回答固定題目,壓縮成 GGUF 的模型用一台筆電就跑得動,不必占用雲端 GPU 額度

🔍 程式碼漫遊(點有 ● 的行看白話講解)

這段指令在做什麼:把還沒微調的 LFM2.5-350M 模型用 llama.cpp 服務起來,開一個網址讓評測程式送題目過來。

llama-server \
💬 啟動 llama.cpp 內建的本機模型伺服器
-hf LiquidAI/LFM2.5-350M-GGUF:BF16 \
💬 直接從 Hugging Face 抓這顆用 BF16 精度包好的 GGUF 模型檔來服務,不用自己下載轉檔
-c 32768 \
💬 設定一次能塞給模型看的文字上限(prompt context 大小)
-np 4 \
💬 同時處理 4 個評測請求,加速跑完整份 2000 題的題庫
-ngl 99 \
💬 盡量把模型的每一層都丟給 GPU 算,沒有 GPU 時會自動退回用 CPU(速度會慢很多)
--alias LiquidAI/LFM2.5-350M \
💬 評測工具是靠這個名字認出要打哪個模型,要跟評測端設定的名稱一致
--host 127.0.0.1 --port 8080
💬 開出一個本機網址,讓評測程式當成一般 OpenAI API 端點來呼叫

🛠️ 動手做:你來當『格式糾察隊』:先猜再驗,還要親手改到過關

  1. 下面有 6 組「候選輸出」,情境是:你的客服系統要求 LLM 產生 JSON 格式的訂單資訊,規則是「只能有 order_id(文字)、item(文字)、quantity(正整數)這三個欄位,而且外面不能包任何客套話」。
  2. 先自己讀一遍每組候選輸出,點『我猜:PASS』或『我猜:FAIL』做出判斷。
  3. 按下猜測後,系統會顯示真正的判定結果與原因,對照你猜對了沒。
  4. 遇到 FAIL 的候選,直接在下面的文字框裡動手修改內容(比如把數字改成文字、把多餘的話刪掉),然後按『重新檢查』,直到你把它改到 PASS 為止。
👇 下面是活的,直接操作

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 為什麼不乾脆用提示詞硬性要求 AI 只輸出 JSON,而要花力氣做微調?
材料裡的評測動作本身就是答案——沒微調過的 LFM2.5-350M 就算收到「請輸出結構化 JSON」的提示,實測也只有 22.6% 真的守規矩。可見光靠提示詞對小模型是不夠的,提示詞只能『講規則』,微調才能把規則刻進模型的行為習慣裡,這對要接進真實系統、不能有例外的場景特別關鍵。
🔭 為什麼作者要先花力氣重現 base model 的分數,而不是直接開始微調?
這是資深工程師常見的『先量基準再動手』紀律——沒有基準分數,永遠不知道微調到底有沒有進步、進步多少。材料特別強調這份筆記本『不是想重現 IFStruct 排行榜分數,而是要證明小模型微調後能追上大模型』,代表評測的目的是給自己一把量尺,而不是為了排名。
🔭 為什麼訓練跟評測要刻意拆成雲端 GPU 跟本機筆電兩個地方跑?
這是成本與資源的權衡——訓練需要反覆試錯、算梯度,非常吃顯示卡,所以借免費的 Colab/Kaggle GPU 額度;但評測只是讓模型回答固定題目,用 llama.cpp 把模型壓縮成 GGUF 格式後,一台筆電的算力就夠用,不需要浪費雲端 GPU 的珍貴時數在評測這種相對輕量的工作上。
🔭 llama-server 指令裡特地設定 -ngl 99,把所有層丟給 GPU,這跟輸出正確性有關係嗎?
這其實是『速度』而非『正確性』的權衡——就算不把層數都丟給 GPU,模型一样能算出一模一樣的輸出結果,只是評測 2000 筆題目會變得非常慢。工程上先確保結果可信(基準分數可重現),再用硬體設定去換取更快的迭代速度,是評測階段常見的取捨順序。

📝 隨堂考(點選答案,立即回饋)

Q1. IFStruct 這個評測基準,主要在測 LLM 的什麼能力?
✅ 材料開頭就說明,結構化輸出常被合併進更廣的推理或抽取分數裡,但 IFStruct 是特別把『輸出是否有效、可解析、符合指定格式』單獨拿出來測。
Q2. 文章裡,為什麼要特地跑一次『重現 base model 分數』的步驟?
✅ 有了可信的基準分數,才能判斷之後微調到底有沒有效、進步了多少。
Q3. 評測時為什麼是在本機 MacBook 上用 llama.cpp 跑,而不是繼續用雲端 GPU?
✅ 材料提到評測可以在 MacBook 上透過 llama.cpp 起一個 OpenAI 相容伺服器來跑,是刻意把訓練跟評測的算力需求分開處理。
Q4. llama-server 指令裡的 -ngl 99 大致在做什麼?
✅ -ngl 控制卸載到 GPU 的層數,99 代表盡可能把所有層都丟給 GPU 加速。
Q5. 如果一個 LLM 輸出的 JSON 在 order_id 欄位填了數字 1029 而不是文字 "1029",在嚴格的 schema 驗證下會發生什麼事?
✅ 結構化輸出比對的是型別是不是符合規格,型別不對(數字 vs 文字)在嚴格 schema 驗證下就是不合格,這正是本課互動示範要練習抓出來的錯誤型態。

🃏 翻牌記憶卡(先想答案,再點開對答)

Schema compliance(格式合規)點我翻面
LLM 的輸出是不是完全符合規定的格式規格,可不可以直接被下游程式讀取解析。
GRPO點我翻面
一種強化學習訓練法,讓模型針對同一題產生多個候選答案,互相比較評分後,把表現較好的傾向留下來。
為什麼要先跑 base model 評測點我翻面
建立微調前的基準分數,之後才能量化微調到底有沒有進步。
llama.cpp 的用途點我翻面
讓一般電腦(甚至筆電)也能跑 AI 模型,還能開一個相容 OpenAI 格式的網路服務給其他程式呼叫。
-ngl 99 的意思點我翻面
盡量把模型的每一層都丟給 GPU 計算,加速推論。
為什麼訓練跟評測分開跑點我翻面
訓練很耗顯示卡資源,用免費雲端 GPU;評測相對輕量,壓縮後的模型用一台筆電就夠。

✅ 離開前自測(全勾=這課真的學會了)

0%