Justin-lee commited on
Commit
d7cf470
·
verified ·
1 Parent(s): b6f186b

Upload ENTERPRISE_TRAINING.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. ENTERPRISE_TRAINING.md +264 -0
ENTERPRISE_TRAINING.md ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🏢 企業多任務 LLM 訓練指南
2
+
3
+ ## 概覽
4
+
5
+ 訓練一個能處理四大企業任務的中文 LLM:
6
+
7
+ | 任務 | 說明 | System Prompt |
8
+ |------|------|--------------|
9
+ | 🤖 客服 FAQ | 回答產品、訂單、退款、流程問題 | `你是一個專業的企業客服助手...` |
10
+ | 📄 文件問答 | SOP、手冊、合約、內部知識庫 QA | `你是一個文件分析助手...` |
11
+ | 🏷️ 工單分類 | 自動判斷工單類別並分流 | `你是一個工單分類與分流助手...` |
12
+ | 🔍 資訊抽取 | 從文字中抓日期、金額、地址、姓名 | `你是一個資訊抽取助手...` |
13
+
14
+ ---
15
+
16
+ ## 技術方案
17
+
18
+ ### 模型選擇
19
+ | | Qwen2.5-7B-Instruct ✅ | Qwen2.5-3B-Instruct (備選) |
20
+ |---|---|---|
21
+ | 中文能力 | C-Eval 83%, CMMLU 86% | ~10分較低 |
22
+ | 4-bit VRAM | ~4.0 GB | ~1.8 GB |
23
+ | 訓練 VRAM | ~7 GB (QLoRA) | ~3.6 GB |
24
+ | RTX 3070 8GB | ✅ batch=1 | ✅ batch=2 |
25
+ | Colab T4 16GB | ✅ batch=2 | ✅ batch=4 |
26
+
27
+ **為什麼選 Qwen2.5-7B-Instruct?**
28
+ - 2025 年 3-7B 級別中文 SOTA(18T tokens 預訓練,包含大量中文語料)
29
+ - GQA 架構(4 KV heads)記憶體效率極高
30
+ - Instruct 版本已有指令跟隨對齊,fine-tune 穩定
31
+
32
+ ### 訓練方法
33
+ **QLoRA SFT (Supervised Fine-Tuning)**
34
+ - 4-bit NF4 量化 + double quantization
35
+ - LoRA rank=64, alpha=128, all-linear layers
36
+ - 參考:[QLoRA Paper](https://arxiv.org/abs/2305.14314) — "LoRA on all linear layers is critical to match full fine-tune"
37
+
38
+ ### 超參數
39
+ ```
40
+ learning_rate: 2e-4 (QLoRA 推薦,比 full fine-tune 高 10x)
41
+ lr_scheduler: cosine
42
+ warmup_ratio: 0.03
43
+ epochs: 3
44
+ effective_batch_size: 16 (batch × grad_accum)
45
+ max_length: 2048
46
+ optimizer: paged_adamw_8bit
47
+ gradient_checkpointing: True
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 訓練資料
53
+
54
+ ### 資料組成 (~45K+ 條)
55
+
56
+ | 來源 | 數量 | 任務覆蓋 | 格式 |
57
+ |------|------|---------|------|
58
+ | [Firefly-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M) | 15K | NER + QA + FAQ | kind/input/target |
59
+ | [CMRC2018](https://huggingface.co/datasets/hfl/cmrc2018) | 10K | 文件問答 | context/question/answers |
60
+ | [TNEWS](https://huggingface.co/datasets/clue/clue) | 10K | 15類分類 | sentence/label |
61
+ | [BELLE-1M](https://huggingface.co/datasets/BelleGroup/train_1M_CN) | 10K | 通用指令 | instruction/input/output |
62
+ | 合成 IE | 8 | 日期/金額/地址/姓名抽取 | 手工高品質 |
63
+ | 合成 FAQ | 8 | 企業客服場景 | 手工高品質 |
64
+ | 合成工單 | 12 | 8類工單分類 | 手工高品質 |
65
+
66
+ ### 資料轉換
67
+ 所有資料統一轉為 ChatML `messages` 格式:
68
+ ```json
69
+ {
70
+ "messages": [
71
+ {"role": "system", "content": "你是一個..."},
72
+ {"role": "user", "content": "問題..."},
73
+ {"role": "assistant", "content": "回答..."}
74
+ ]
75
+ }
76
+ ```
77
+
78
+ SFTTrainer 會自動套用 Qwen2.5 的 chat template 進行 tokenization。
79
+
80
+ ---
81
+
82
+ ## 使用方式
83
+
84
+ ### 方式一:Google Colab(推薦新手)
85
+
86
+ 1. 開啟 [Enterprise_LLM_Training.ipynb](https://huggingface.co/spaces/Justin-lee/sandbox-5ca717e4/blob/main/Enterprise_LLM_Training.ipynb)
87
+ 2. 在 Colab 中選擇 GPU runtime (T4 免費 / A100 Pro)
88
+ 3. 依序執行每個 cell
89
+ 4. 訓練完模型自動推送到 HF Hub
90
+
91
+ ### 方式二:本地 RTX 3070(推薦進階用戶)
92
+
93
+ ```bash
94
+ # 1. 安裝依賴
95
+ pip install transformers trl peft bitsandbytes datasets accelerate
96
+
97
+ # 2. 登入 HF
98
+ huggingface-cli login
99
+
100
+ # 3. 修改 enterprise_llm_train.py 中的參數
101
+ # - per_device_train_batch_size=1 (8GB VRAM)
102
+ # - gradient_accumulation_steps=16
103
+ # - max_length=1536 (如果還是 OOM)
104
+ # - HUB_MODEL_ID 改成你自己的
105
+
106
+ # 4. 開始訓練
107
+ python enterprise_llm_train.py
108
+ ```
109
+
110
+ **RTX 3070 預計訓練時間**:
111
+ - batch=1, grad_accum=16, 45K samples, 3 epochs
112
+ - ~2,800 steps × ~3 sec/step ≈ **2.5 小時**
113
+
114
+ ### 方式三:HF Jobs(需預付額度)
115
+
116
+ ```bash
117
+ # 在 HF Jobs 上用 A10G 跑
118
+ # 約 1.5 小時,費用 ~$3
119
+ ```
120
+
121
+ ---
122
+
123
+ ## 訓練後使用
124
+
125
+ ### 載入模型
126
+ ```python
127
+ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
128
+ from peft import PeftModel
129
+ import torch
130
+
131
+ # 4-bit 載入基座模型
132
+ bnb_config = BitsAndBytesConfig(
133
+ load_in_4bit=True,
134
+ bnb_4bit_quant_type="nf4",
135
+ bnb_4bit_use_double_quant=True,
136
+ bnb_4bit_compute_dtype=torch.bfloat16,
137
+ )
138
+
139
+ base_model = AutoModelForCausalLM.from_pretrained(
140
+ "Qwen/Qwen2.5-7B-Instruct",
141
+ quantization_config=bnb_config,
142
+ device_map="auto",
143
+ )
144
+
145
+ # 載入 LoRA adapter
146
+ model = PeftModel.from_pretrained(base_model, "Justin-lee/Qwen2.5-7B-Enterprise-ZH")
147
+ tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
148
+ ```
149
+
150
+ ### 四種任務範例
151
+
152
+ #### 客服 FAQ
153
+ ```python
154
+ messages = [
155
+ {"role": "system", "content": "你是一個專業的企業客服助手。請根據用戶的問題,提供準確、簡潔、有禮貌的回答。"},
156
+ {"role": "user", "content": "我的訂單什麼時候能到?"}
157
+ ]
158
+ ```
159
+
160
+ #### 文件問答
161
+ ```python
162
+ messages = [
163
+ {"role": "system", "content": "你是一個文件分析助手。請仔細閱讀提供的文件內容,僅根據文件中的資訊回答問題。"},
164
+ {"role": "user", "content": f"請根據以下文件回答問題。\n\n【文件】\n{your_document}\n\n【問題】\n{your_question}"}
165
+ ]
166
+ ```
167
+
168
+ #### 工單分類
169
+ ```python
170
+ categories = "售後服務、物流配送、帳號問題、付款財務、產品諮詢、投訴建議、技術支援、合作洽談"
171
+ messages = [
172
+ {"role": "system", "content": "你是一個工單分類與分流助手。請根據用戶描述的問題,將其分類到最合適的處理類別。"},
173
+ {"role": "user", "content": f"請分類到以下類別之一:{categories}\n\n客戶訊息:{ticket_text}"}
174
+ ]
175
+ ```
176
+
177
+ #### 資訊抽取
178
+ ```python
179
+ messages = [
180
+ {"role": "system", "content": "你是一個資訊抽取助手。請從文本中準確抽取指定類型的實體資訊,以結構化格式輸出。"},
181
+ {"role": "user", "content": f"請從以下文本中抽取所有關鍵資訊(人名、日期、金額、地址):\n\n{text}"}
182
+ ]
183
+ ```
184
+
185
+ #### 生成回答
186
+ ```python
187
+ text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
188
+ inputs = tokenizer(text, return_tensors="pt").to(model.device)
189
+
190
+ with torch.no_grad():
191
+ outputs = model.generate(
192
+ **inputs,
193
+ max_new_tokens=512,
194
+ temperature=0.3,
195
+ top_p=0.9,
196
+ do_sample=True,
197
+ )
198
+
199
+ response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
200
+ print(response)
201
+ ```
202
+
203
+ ---
204
+
205
+ ## 評估
206
+
207
+ 用 `eval_enterprise.py` 測試四種任務:
208
+
209
+ ```bash
210
+ # 測試 fine-tuned 模型
211
+ python eval_enterprise.py
212
+
213
+ # 對比 base 模型
214
+ python eval_enterprise.py --base
215
+ ```
216
+
217
+ 評估方式:keyword coverage(檢查回答中是否包含預期的關鍵字)。
218
+
219
+ ---
220
+
221
+ ## 進階優化
222
+
223
+ ### 增加自己的企業資料
224
+ 最有效的改進方式是加入**你自己公司的真實資料**:
225
+
226
+ 1. **客服 FAQ**:匯出客服系統的歷史 Q&A,格式化為 messages
227
+ 2. **文件 QA**:用 GPT-4 從你的 SOP/手冊生成 QA pair
228
+ 3. **工單分類**:匯出歷史工單及其分類標籤
229
+ 4. **IE**:標註一批包含日期/金額/地址的真實文檔
230
+
231
+ 加入 500-1000 條企業特定資料,通常能帶來 10-20% 的準確率提升。
232
+
233
+ ### DPO 進一步對齊
234
+ 訓練 SFT 之後,可以用 DPO 進一步提升品質:
235
+ 1. 讓模型對同一問題生成多個回答
236
+ 2. 人工挑選 chosen/rejected
237
+ 3. 用 TRL DPOTrainer 訓練
238
+
239
+ ### 合併 LoRA 減少推理延遲
240
+ ```python
241
+ from peft import PeftModel
242
+ merged_model = model.merge_and_unload()
243
+ merged_model.save_pretrained("./merged_model")
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 檔案清單
249
+
250
+ | 檔案 | 說明 |
251
+ |------|------|
252
+ | `enterprise_llm_train.py` | 完整訓練腳本 (512 行) |
253
+ | `eval_enterprise.py` | 四任務評估腳本 (183 行) |
254
+ | `Enterprise_LLM_Training.ipynb` | Colab 一鍵訓練 notebook |
255
+ | `ENTERPRISE_TRAINING.md` | 本文件 |
256
+
257
+ ---
258
+
259
+ ## 參考文獻
260
+
261
+ - [Qwen2.5 Technical Report](https://arxiv.org/abs/2412.15115)
262
+ - [Qwen2 SFT Recipe](https://arxiv.org/abs/2407.10671) — Section 4.2: lr=7e-6, 2 epochs, cosine decay
263
+ - [QLoRA Paper](https://arxiv.org/abs/2305.14314) — all-linear LoRA critical for performance
264
+ - [TRL SFTTrainer Docs](https://huggingface.co/docs/trl/sft_trainer)