CPT 讓模型的語域偏移到資安領域,但它還不知道你要它做什麼。SFT 就是教它做事的階段。
今天的重點不在訓練技巧(SFT 的訓練參數比 CPT 單純很多),而在資料怎麼來。
一筆 SFT 資料的最小結構是:
system: 你是一位資安分析師,負責產出給客戶閱讀的事件報告。
user: 【輸入資料 / 指令】
assistant: 【期望的輸出】
看起來簡單,但有幾個容易做錯的地方:
system prompt 要固定還是要變化? 我的做法是每個任務用固定的 system prompt,但在訓練資料裡保留少量變體。全部固定會讓模型過度依賴那一句話;全部隨機則學不到穩定行為。
要不要把 RAG 檢索到的內容放進 user 訊息? 要。而且訓練時的格式必須跟推論時完全一致。這是我認為最容易被忽略的一點——如果你訓練時給的是純問題,推論時卻塞了一大段檢索內容進去,模型會不知道那段東西是什麼。
輸出的長度要控制嗎? 要。如果你的訓練資料裡回答長度分佈很散,模型的輸出長度也會很不穩定。我刻意讓同一種任務的回答長度落在相近的區間。
Day 5 說過,這份資料好,但是通用資安的,不是我的場景的。
我的用法是把它當基底能力層:它負責讓模型在面對資安問題時能正常、專業、不拒答地回應。這一層的價值是解決 Day 1 講的第三種落差(過度謹慎)。
比例上它佔我 SFT 資料的多數,但它不決定輸出格式。
這是我自己補的部分,也是最花工的部分。
我要的是:格式跟真實文件一模一樣,但內容完全是假的。
做法分三步:
第一步:抽取結構。 從真實文件(事件報告、月報、Q&A 回覆)中抽出「骨架」——段落順序、欄位名稱、標題層級、慣用句式、長度分佈。只抽結構,不帶任何內容。
第二步:合成內容。 用合成的資料填進骨架:假的 IP、假的主機名、假的公司名、假的時間、假的事件經過。CVE 編號我用真實存在的公開漏洞(因為那是公開資訊),但關聯的受影響資產全部是虛構的。
第三步:驗證。 產出來的樣本要有人讀過,確認兩件事:一,格式真的對;二,沒有任何真實資訊殘留。第二點我用了自動掃描 + 人工抽查雙保險。
三個理由,任何一個單獨都足夠:
這個決定的代價:合成資料的多樣性不如真實資料,我需要更費力地確保它涵蓋足夠的情境變化。但這個代價我付得心甘情願。
SFT 不需要很多資料,但需要每一種你希望的行為都有足夠的樣本。
我的估算方式是倒過來的:先列出模型需要會的行為(四個任務 × 各任務的幾種變化),每種行為配一個最低樣本數,加起來就是需求量。
不要用「總筆數」當目標,那會導致你在容易產的行為上堆量,難產的行為只有零星幾筆。模型會學會前者,學不會後者。
SFT 的參數比 CPT 好調:
跟 CPT 不同,SFT 的效果應該要肉眼可見。
跑完之後我做的第一件事不是看 benchmark,是拿五個真實情境的輸入,讓 CPT-only 和 SFT 後的模型各產一次,並排比較。
該看的是:
如果這些沒有明顯改善,那 SFT 資料有問題,不要急著往下走。
明天做推理蒸餾,三階段的最後一步。
🛡️ IG: @aid3fend — 歡迎追蹤交流。