微調資料集怎麼準備:格式、數量與品質的實際標準
微調成敗八成取決於資料。這篇是可以直接照做的準備流程。
微調最常見的失敗不是超參數設錯,而是資料本身就有問題——標註不一致、格式混雜、混進了模型本來就會的簡單樣本。
資料格式
// train.jsonl,每行一筆對話
{"messages": [
{"role": "system", "content": "你是客服工單分類助手。"},
{"role": "user", "content": "我上週訂的東西還沒到"},
{"role": "assistant", "content": "{\"type\":\"logistics\",\"urgency\":\"mid\"}"}
]}system 訊息務必與上線時完全一致。訓練時寫一種、推論時寫另一種,等於白訓練。
數量的實際感覺
- 固定格式輸出:300–500 筆常常就夠。
- 分類任務:每個類別至少 50 筆,罕見類別要刻意補。
- 語氣與寫作風格:1000 筆以上才會穩定。
- 複雜推理:微調不是好工具,先考慮換模型或改流程。
品質檢查清單
- 同一種輸入的標註是否一致——抽 50 筆讓第二個人重標,看一致率。
- 有沒有重複樣本,去重後數量掉多少。
- 標籤分布是否嚴重偏斜。
- 輸出是否都符合目標格式(用程式驗證,不要人工看)。
- 有沒有混進個資或機密內容。
import json, collections, hashlib
seen, dup, bad = set(), 0, 0
dist = collections.Counter()
for line in open('train.jsonl', encoding='utf-8'):
row = json.loads(line)
out = row['messages'][-1]['content']
key = hashlib.md5(json.dumps(row, sort_keys=True).encode()).hexdigest()
if key in seen: dup += 1
seen.add(key)
try: dist[json.loads(out)['type']] += 1
except Exception: bad += 1
print(f'重複 {dup} 筆、格式錯誤 {bad} 筆、分布 {dist}')切驗證集要在去重之後,而且要確保驗證集裡沒有與訓練集近似重複的樣本,否則分數會虛高。