Chuẩn bị dữ liệu huấn luyện chất lượng cao
Chất lượng > số lượng, format dữ liệu instruction, lọc/dedup, sinh dữ liệu tổng hợp có kiểm soát, tránh rò rỉ dữ liệu.
Đây là công đoạn quyết định kết quả fine-tuning nhiều nhất — nghiên cứu và kinh nghiệm thực tế đều cho thấy vài trăm mẫu dữ liệu chất lượng cao, được chọn lọc kỹ, cho kết quả tốt hơn hàng chục nghìn mẫu chất lượng thấp/nhiễu. Đây cũng chính là phần "tốn 60-70% thời gian dự án" đã nói ở Module 1.
🎯 Mục tiêu học tập
- Áp dụng nguyên tắc chất lượng > số lượng khi xây dựng tập dữ liệu huấn luyện
- Định dạng dữ liệu đúng chuẩn instruction-following (chat template)
- Lọc, khử trùng lặp, và đánh giá chất lượng dữ liệu trước khi đưa vào huấn luyện
- Sinh dữ liệu tổng hợp (synthetic data) có kiểm soát bằng LLM mạnh khi dữ liệu thật khan hiếm
- Tránh rò rỉ dữ liệu (data leakage) giữa tập train và tập đánh giá
Chất lượng > Số lượng — bằng chứng và trực giác
Nghiên cứu LIMA (Less Is More for Alignment) chứng minh: 1.000 mẫu dữ liệu instruction được chọn lọc cẩn thận bởi con người có thể cho kết quả alignment gần bằng các bộ dữ liệu lớn hơn hàng trăm lần. Trực giác: base model (sau pre-training) đã có sẵn hầu hết "năng lực" cần thiết; fine-tuning dữ liệu ít nhưng chất lượng cao chủ yếu dạy model định dạng và phong cách phản hồi mong muốn, không phải dạy kiến thức mới từ đầu — vài trăm ví dụ tốt đã đủ truyền đạt điều đó rõ ràng.
Thu thập càng nhiều dữ liệu càng tốt mà không kiểm soát chất lượng — dữ liệu nhiễu/mâu thuẫn khiến model học các pattern không nhất quán, kết quả tệ hơn cả khi dùng ít dữ liệu nhưng sạch.
Format dữ liệu Instruction (Chat Template)
Dữ liệu huấn luyện SFT (Module 6) thường ở định dạng hội thoại có vai trò (giống cấu trúc messages đã quen thuộc từ khoá AI Engineer), rồi được chuyển qua chat template riêng của từng họ model (Llama, Qwen, ChatML...) thành 1 chuỗi text duy nhất trước khi tokenize:
{
"messages": [
{"role": "system", "content": "Bạn là trợ lý hỗ trợ khách hàng của cửa hàng ABC."},
{"role": "user", "content": "Đơn hàng DH123 của tôi khi nào giao?"},
{"role": "assistant", "content": "Đơn hàng DH123 dự kiến giao trong 2-3 ngày làm việc..."}
]
}
# Áp dụng chat template của chính model sẽ fine-tune — bắt buộc dùng đúng template
# tương ứng, không tự bịa định dạng riêng
text = tokenizer.apply_chat_template(example["messages"], tokenize=False)
Dùng sai chat template (ví dụ áp template của Llama cho model Qwen) khiến model học các token đặc biệt sai vị trí — kết quả thường vẫn "chạy được" nhưng chất lượng suy giảm khó nhận ra ngay, chỉ lộ rõ khi test kỹ.
Lọc, Dedup, Đánh giá chất lượng
- Khử trùng lặp: dùng hash chính xác cho bản sao y hệt, và embedding similarity (giống kỹ thuật đã học ở Module 3 khoá AI Engineer) cho bản sao gần giống — dữ liệu trùng lặp khiến model "học vẹt" một số pattern quá mức.
- Lọc theo độ dài: loại mẫu quá ngắn (thiếu thông tin để học) hoặc quá dài bất thường (có thể là lỗi thu thập dữ liệu).
- Lọc chất lượng bằng LLM-as-judge: dùng một model mạnh chấm điểm từng mẫu theo rubric (câu trả lời có hữu ích, chính xác, đúng định dạng mong muốn không) — kỹ thuật giống hệt LLM-as-judge đã học ở Module 11 khoá AI Engineer, áp dụng ngược lại cho việc lọc dữ liệu đầu vào thay vì đánh giá đầu ra.
- Đa dạng hoá: đảm bảo tập dữ liệu bao phủ đủ các biến thể của tác vụ thực tế (độ dài câu hỏi khác nhau, cách diễn đạt khác nhau, cả trường hợp khó/edge case) — tránh model chỉ giỏi với đúng kiểu câu hỏi xuất hiện trong dữ liệu huấn luyện.
Sinh dữ liệu tổng hợp (Synthetic Data) có kiểm soát
Khi dữ liệu thật khan hiếm, dùng một LLM mạnh (Claude/GPT-5) để sinh thêm dữ liệu huấn luyện theo khuôn mẫu (kỹ thuật phổ biến gọi là distillation khi mục tiêu là "dạy" một model nhỏ bắt chước hành vi của model lớn hơn):
SYNTH_PROMPT = (
"Đóng vai một khách hàng đang hỏi về đơn hàng thương mại điện tử. "
"Sinh ra 1 câu hỏi tự nhiên, đa dạng cách diễn đạt, thuộc chủ đề: {topic}. "
"Chỉ trả về câu hỏi, không giải thích thêm."
)
# Sinh câu hỏi đa dạng, sau đó dùng model mạnh sinh câu trả lời mẫu chất lượng cao
# cho từng câu hỏi — tạo thành cặp (instruction, response) để huấn luyện model nhỏ hơn
Dữ liệu tổng hợp thuần tuý dễ bị "model đồng dạng hoá" (mode collapse) — thiếu đa dạng tự nhiên, đôi khi thừa hưởng cả lỗi/thiên kiến của model sinh dữ liệu. Luôn trộn với một phần dữ liệu thật (dù ít), và luôn cho con người review một mẫu ngẫu nhiên trước khi dùng để huấn luyện.
Tránh rò rỉ dữ liệu (Data Leakage)
Tách rõ ràng tập train và tập eval/test (Module 12) trước khi làm bất kỳ bước xử lý nào khác — nếu khử trùng lặp/tăng cường dữ liệu được làm sau khi tách, dễ vô tình để lọt các biến thể gần giống của cùng 1 mẫu vào cả 2 tập, khiến kết quả đánh giá "tốt giả" (model chỉ đang nhớ lại mẫu gần giống đã thấy lúc train, không phải tổng quát hoá thật).
🏋️ Bài tập thực hành
Chọn 1 tác vụ cụ thể (ví dụ: trả lời câu hỏi hỗ trợ khách hàng theo đúng phong cách thương hiệu). Thu thập/sinh tối thiểu 200 mẫu dữ liệu instruction, áp dụng quy trình: khử trùng lặp, lọc chất lượng bằng LLM-as-judge (loại các mẫu dưới ngưỡng điểm), tách 85/15 thành train/eval trước khi xử lý tiếp. Viết báo cáo ngắn mô tả quy trình và số liệu (bao nhiêu mẫu bị loại, vì sao).
📚 Tài nguyên học tập
-
Zhou et al. — LIMA: Less Is More for AlignmentNghiên cứu chứng minh chất lượng dữ liệu quan trọng hơn số lượngPaper
-
Hugging Face — Chat templates guideHướng dẫn chi tiết về chat templateDocs
-
Argilla — Data curation for LLMsCông cụ mã nguồn mở hỗ trợ gán nhãn/lọc dữ liệu huấn luyệnDocs
✅ Tự đánh giá hoàn thành
- Giải thích được vì sao chất lượng dữ liệu quan trọng hơn số lượng, có dẫn chứng
- Format đúng dữ liệu theo chat template của model dự định fine-tune
- Xây dựng được quy trình lọc/dedup có thể lặp lại, không làm thủ công một lần rồi bỏ
- Tách train/eval đúng cách trước khi xử lý tiếp, tránh data leakage