Đọc phần "Phán quyết" trước khi dùng. Adapter này trượt cổng hồi quy của lab:
nó thắng rõ trên tác vụ đích nhưng làm tụt năng lực phổ thông của model nền.
Tác vụ
Đầu vào: một ticket CSKH tiếng Việt. Đầu ra: đúng một JSON, đúng 4 khóa, không markdown.
text-linear — toàn bộ 12 lớp linear của text decoder, không gắn vision tower
r / alpha
16 / 32
Tham số huấn luyện
32,464,896
Learning rate
1e-4 (≈ 10× thang full fine-tune)
Batch hiệu dụng
16 (1 × grad_accum 16)
Epochs / steps
2 / 30 optimizer steps
max_length
1024 (p95 đo được của corpus: 98 token)
Loss mask
assistant-only — supervised_fraction = 0.4149, câu hỏi không vào loss
Precision
fp16 + GradScaler (T4 · sm_75 · không có bf16)
Dữ liệu
225 train / 25 val, tách seed 42 từ 250 ticket tổng hợp
Phần cứng
Colab Free T4 · peak VRAM 12.01 GB · 991 s
Trọng số adapter được lưu ở fp32 (hệ quả của bước recast cho GradScaler trên fp16),
nên file nặng ~124 MB thay vì ~62 MB.
Kết quả
Chấm trên 50 ticket giữ riêng (target), 15 câu kiến thức phổ thông (regression), greedy decoding.
Run
target
regression
format
latency (ms)
(a) base + prompt ngây thơ
0.000
0.758
0.000
3303.3
(b) base + prompt tối ưu
0.765
0.758
1.000
1060.6
(c) adapter này
0.970
0.656
1.000
1493.4
Adapter được chấm với prompt một câu ("Phân loại ticket sau."), còn (b) dùng prompt
schema đầy đủ — hành vi đã nằm trong trọng số, không phải trong prompt.
Phán quyết: FAILED
target Δ = +0.205 so với baseline prompt tối ưu đã đóng băng trước khi train ✅
regression Δ = -0.102 — gấp 5.1 lần ngưỡng dung sai 0.020 ❌
valid_trace_rate = 0.00 — khả năng sinh khối <think> biến mất hoàn toàn
Đây là quên thảm hoạ (catastrophic forgetting): 225 mẫu, 2 epoch, 100% token được supervise
đều là JSON 4 trường. Đừng deploy adapter này như trợ lý tổng quát. Dùng được nếu mount
có điều kiện — chỉ bật cho route triage, mọi request khác đi thẳng vào base model.
6 lỗi còn lại có cấu trúc
Điểm 0.970 = sai 6/200 trường. Cả 6 đều là cùng một trường (urgency), cùng một
chiều (thap → trung_binh), và cùng một cụm từ trong ticket: "Khi nào tiện."
Hai cue thap khác thì đúng 100% ("Không vội" 7/7, "Hỏi cho biết thôi" 5/5), dù cụm
"Khi nào tiện" xuất hiện tới 35 lần trong tập train và luôn gắn nhãn thap. Giả thuyết:
base model đọc cụm đó như câu hỏi về thời điểm, và 30 step chưa đủ để lật một tiên nghiệm
ngược chiều.
Đối chứng (cùng 30 step, mỗi run đổi đúng một biến)
Run
Biến đổi
r
trainable
target
VRAM GB
correct (adapter này)
—
16
32,464,896
0.970
12.01
attn_only
chỉ gắn q,v (rank khớp ngân sách)
283
32,456,704
0.970
12.02
wrong_lr
LR 1e-5 (thang full-FT)
16
32,464,896
0.000
12.01
qlora
4-bit
16
32,464,896
0.940
7.09
attn_onlyhoà, không thua — trên corpus này phép so vị trí-vs-rank đã bão hoà. Đáng
chú ý: xếp theo train loss thì attn_only (0.536) "thắng" correct (0.626), tức thứ tự
theo loss khác thứ tự theo năng lực thật.
Cách dùng
python
1from transformers import AutoModelForCausalLM, AutoTokenizer
2from peft import PeftModel
34BASE ="unsloth/Qwen3.5-4B"5tok = AutoTokenizer.from_pretrained(BASE)6model = AutoModelForCausalLM.from_pretrained(BASE, dtype="auto", device_map="auto")7model = PeftModel.from_pretrained(model,"hungarmen/lab21-2A202601523-qwen35-triage-vi")89msgs =[10{"role":"system","content":"Phân loại ticket sau."},11{"role":"user","content":"Alo shop, mình đặt balo laptop mã đơn VN411453. Cho tôi trả lại. Đã 3 ngày rồi."},12]13ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device)14out = model.generate(ids, max_new_tokens=96, do_sample=False)15print(tok.decode(out[0][ids.shape[-1]:], skip_special_tokens=True))
Giới hạn
Huấn luyện trên 250 ticket tổng hợp, không phải log CSKH thật — phân bố hẹp, câu chữ
đều đặn hơn dữ liệu thực tế nhiều.
Năng lực phổ thông đã tụt 0.102; không dùng cho hội thoại mở.
product được chấm bằng so khớp sau khi bỏ dấu, nên tên sản phẩm lạ có thể lệch.
Chỉ kiểm trên tiếng Việt.
Artefact kèm theo
results/ — toàn bộ file chấm điểm: mask_proof.json, baselines_frozen.json,
runs.csv, verdict.json, autopsy.json, qualitative.json, token_stats.json,
template_check.json