Spaces:
Sleeping
Sleeping
|
Download ENTERPRISE_TRAINING.md from Justin-lee/sandbox-5ca717e4: direct link, hf CLI and curl.
- Browser
- Download file 8.22 kB
-
https://huggingface.co/spaces/Justin-lee/sandbox-5ca717e4/resolve/main/ENTERPRISE_TRAINING.md
- Command line
-
hf download hf://spaces/Justin-lee/sandbox-5ca717e4/ENTERPRISE_TRAINING.md
-
curl -L -o ENTERPRISE_TRAINING.md https://huggingface.co/spaces/Justin-lee/sandbox-5ca717e4/resolve/main/ENTERPRISE_TRAINING.md
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(推薦新手)
- 開啟 Enterprise_LLM_Training.ipynb
- 在 Colab 中選擇 GPU runtime (T4 免費 / A100 Pro)
- 依序執行每個 cell
- 訓練完模型自動推送到 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(檢查回答中是否包含預期的關鍵字)。
進階優化
增加自己的企業資料
最有效的改進方式是加入你自己公司的真實資料:
- 客服 FAQ:匯出客服系統的歷史 Q&A,格式化為 messages
- 文件 QA:用 GPT-4 從你的 SOP/手冊生成 QA pair
- 工單分類:匯出歷史工單及其分類標籤
- IE:標註一批包含日期/金額/地址的真實文檔
加入 500-1000 條企業特定資料,通常能帶來 10-20% 的準確率提升。
DPO 進一步對齊
訓練 SFT 之後,可以用 DPO 進一步提升品質:
- 讓模型對同一問題生成多個回答
- 人工挑選 chosen/rejected
- 用 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 |
本文件 |
參考文獻
- Qwen2.5 Technical Report
- Qwen2 SFT Recipe — Section 4.2: lr=7e-6, 2 epochs, cosine decay
- QLoRA Paper — all-linear LoRA critical for performance
- TRL SFTTrainer Docs