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.
{"intent": "doi_tra", "urgency": "trung_binh", "product": "balo laptop", "sentiment": "trung_tinh"}
Table with columns: Trường, Tập giá trị| Trường | Tập giá trị |
|---|
intent | doi_tra · van_chuyen · hoan_tien · san_pham_loi · hoi_thong_tin |
urgency | cao · trung_binh · thap |
sentiment | tieu_cuc · trung_tinh · tich_cuc |
product | tên sản phẩm xuất hiện trong ticket |
Cấu hình huấn luyện
Table | |
|---|
| Base model | unsloth/Qwen3.5-4B |
| Phương pháp | LoRA (PEFT), base đóng băng |
| Vị trí gắn | 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) |
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.
Table with columns: Run, target, regression, format, latency (ms)| 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)
Table with columns: Run, Biến đổi, r, trainable, target, VRAM GB| 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 |
attn_only hoà, 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
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
BASE = "unsloth/Qwen3.5-4B"
tok = AutoTokenizer.from_pretrained(BASE)
model = AutoModelForCausalLM.from_pretrained(BASE, dtype="auto", device_map="auto")
model = PeftModel.from_pretrained(model, "hungarmen/lab21-2A202601523-qwen35-triage-vi")
msgs = [
{"role": "system", "content": "Phân loại ticket sau."},
{"role": "user", "content": "Alo shop, mình đặt balo laptop mã đơn VN411453. Cho tôi trả lại. Đã 3 ngày rồi."},
]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=96, do_sample=False)
print(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
submission/REPORT.md — báo cáo đầy đủ 7 mục