sandbox-5ca717e4 / ENTERPRISE_TRAINING.md
Justin-lee's picture
Upload ENTERPRISE_TRAINING.md with huggingface_hub
d7cf470 verified
|
Raw History Blame Contribute Delete
8.22 kB

🏢 企業多任務 LLM 訓練指南

概覽

訓練一個能處理四大企業任務的中文 LLM:

任務 說明 System Prompt
🤖 客服 FAQ 回答產品、訂單、退款、流程問題 你是一個專業的企業客服助手...
📄 文件問答 SOP、手冊、合約、內部知識庫 QA 你是一個文件分析助手...
🏷️ 工單分類 自動判斷工單類別並分流 你是一個工單分類與分流助手...
🔍 資訊抽取 從文字中抓日期、金額、地址、姓名 你是一個資訊抽取助手...

技術方案

模型選擇

Qwen2.5-7B-Instruct ✅ Qwen2.5-3B-Instruct (備選)
中文能力 C-Eval 83%, CMMLU 86% ~10分較低
4-bit VRAM ~4.0 GB ~1.8 GB
訓練 VRAM ~7 GB (QLoRA) ~3.6 GB
RTX 3070 8GB ✅ batch=1 ✅ batch=2
Colab T4 16GB ✅ batch=2 ✅ batch=4

為什麼選 Qwen2.5-7B-Instruct?

  • 2025 年 3-7B 級別中文 SOTA(18T tokens 預訓練,包含大量中文語料)
  • GQA 架構(4 KV heads)記憶體效率極高
  • Instruct 版本已有指令跟隨對齊,fine-tune 穩定

訓練方法

QLoRA SFT (Supervised Fine-Tuning)

  • 4-bit NF4 量化 + double quantization
  • LoRA rank=64, alpha=128, all-linear layers
  • 參考:QLoRA Paper — "LoRA on all linear layers is critical to match full fine-tune"

超參數

learning_rate: 2e-4 (QLoRA 推薦,比 full fine-tune 高 10x)
lr_scheduler: cosine
warmup_ratio: 0.03
epochs: 3
effective_batch_size: 16 (batch × grad_accum)
max_length: 2048
optimizer: paged_adamw_8bit
gradient_checkpointing: True

訓練資料

資料組成 (~45K+ 條)

來源 數量 任務覆蓋 格式
Firefly-1.1M 15K NER + QA + FAQ kind/input/target
CMRC2018 10K 文件問答 context/question/answers
TNEWS 10K 15類分類 sentence/label
BELLE-1M 10K 通用指令 instruction/input/output
合成 IE 8 日期/金額/地址/姓名抽取 手工高品質
合成 FAQ 8 企業客服場景 手工高品質
合成工單 12 8類工單分類 手工高品質

資料轉換

所有資料統一轉為 ChatML messages 格式:

{
  "messages": [
    {"role": "system", "content": "你是一個..."},
    {"role": "user", "content": "問題..."},
    {"role": "assistant", "content": "回答..."}
  ]
}

SFTTrainer 會自動套用 Qwen2.5 的 chat template 進行 tokenization。


使用方式

方式一:Google Colab(推薦新手)

  1. 開啟 Enterprise_LLM_Training.ipynb
  2. 在 Colab 中選擇 GPU runtime (T4 免費 / A100 Pro)
  3. 依序執行每個 cell
  4. 訓練完模型自動推送到 HF Hub

方式二:本地 RTX 3070(推薦進階用戶)

# 1. 安裝依賴
pip install transformers trl peft bitsandbytes datasets accelerate

# 2. 登入 HF
huggingface-cli login

# 3. 修改 enterprise_llm_train.py 中的參數
#    - per_device_train_batch_size=1  (8GB VRAM)
#    - gradient_accumulation_steps=16
#    - max_length=1536               (如果還是 OOM)
#    - HUB_MODEL_ID 改成你自己的

# 4. 開始訓練
python enterprise_llm_train.py

RTX 3070 預計訓練時間:

  • batch=1, grad_accum=16, 45K samples, 3 epochs
  • ~2,800 steps × ~3 sec/step ≈ 2.5 小時

方式三:HF Jobs(需預付額度)

# 在 HF Jobs 上用 A10G 跑
# 約 1.5 小時,費用 ~$3

訓練後使用

載入模型

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel
import torch

# 4-bit 載入基座模型
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)

base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct",
    quantization_config=bnb_config,
    device_map="auto",
)

# 載入 LoRA adapter
model = PeftModel.from_pretrained(base_model, "Justin-lee/Qwen2.5-7B-Enterprise-ZH")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")

四種任務範例

客服 FAQ

messages = [
    {"role": "system", "content": "你是一個專業的企業客服助手。請根據用戶的問題,提供準確、簡潔、有禮貌的回答。"},
    {"role": "user", "content": "我的訂單什麼時候能到?"}
]

文件問答

messages = [
    {"role": "system", "content": "你是一個文件分析助手。請仔細閱讀提供的文件內容,僅根據文件中的資訊回答問題。"},
    {"role": "user", "content": f"請根據以下文件回答問題。\n\n【文件】\n{your_document}\n\n【問題】\n{your_question}"}
]

工單分類

categories = "售後服務、物流配送、帳號問題、付款財務、產品諮詢、投訴建議、技術支援、合作洽談"
messages = [
    {"role": "system", "content": "你是一個工單分類與分流助手。請根據用戶描述的問題,將其分類到最合適的處理類別。"},
    {"role": "user", "content": f"請分類到以下類別之一:{categories}\n\n客戶訊息:{ticket_text}"}
]

資訊抽取

messages = [
    {"role": "system", "content": "你是一個資訊抽取助手。請從文本中準確抽取指定類型的實體資訊,以結構化格式輸出。"},
    {"role": "user", "content": f"請從以下文本中抽取所有關鍵資訊(人名、日期、金額、地址):\n\n{text}"}
]

生成回答

text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=512,
        temperature=0.3,
        top_p=0.9,
        do_sample=True,
    )

response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response)

評估

用 eval_enterprise.py 測試四種任務:

# 測試 fine-tuned 模型
python eval_enterprise.py

# 對比 base 模型
python eval_enterprise.py --base

評估方式:keyword coverage(檢查回答中是否包含預期的關鍵字)。


進階優化

增加自己的企業資料

最有效的改進方式是加入你自己公司的真實資料:

  1. 客服 FAQ:匯出客服系統的歷史 Q&A,格式化為 messages
  2. 文件 QA:用 GPT-4 從你的 SOP/手冊生成 QA pair
  3. 工單分類:匯出歷史工單及其分類標籤
  4. IE:標註一批包含日期/金額/地址的真實文檔

加入 500-1000 條企業特定資料,通常能帶來 10-20% 的準確率提升。

DPO 進一步對齊

訓練 SFT 之後,可以用 DPO 進一步提升品質:

  1. 讓模型對同一問題生成多個回答
  2. 人工挑選 chosen/rejected
  3. 用 TRL DPOTrainer 訓練

合併 LoRA 減少推理延遲

from peft import PeftModel
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged_model")

檔案清單

檔案 說明
enterprise_llm_train.py 完整訓練腳本 (512 行)
eval_enterprise.py 四任務評估腳本 (183 行)
Enterprise_LLM_Training.ipynb Colab 一鍵訓練 notebook
ENTERPRISE_TRAINING.md 本文件

參考文獻