“AI của chúng tôi cứ trả lời bằng tiếng Anh thay vì tiếng Việt. Có nên fine-tune không?”
“AI không biết về sản phẩm mới ra tuần trước. Có nên fine-tune không?”
Câu trả lời cho cả hai gần như không bao giờ giống nhau. Vậy mà kỹ sư liên tục nhầm lẫn giữa hai cách — và một lựa chọn sai tốn cả tuần lẫn hàng nghìn đô la.
Phần 1: Nền tảng (Mô hình tư duy)
Ví dụ Trường Y
RAG = Đưa bác sĩ một cuốn sách tham khảo trước mỗi lần khám bệnh.
- “Đây là thông tin liên quan cho bệnh nhân này. Hãy chẩn đoán.”
- Kiến thức y tế nền của bác sĩ không thay đổi.
- Lý tưởng cho: thông tin hiện tại, dữ liệu riêng của công ty.
Fine-tuning = Gửi bác sĩ đi học Trường Y thực sự.
- Não bộ của bác sĩ được đào tạo lại. Họ nội hóa kiến thức và hành vi mới.
- Lý tưởng cho: thay đổi cách model hành xử, nói chuyện và lý luận.
1
2
3
4
5
| RAG Fine-tuning
Dùng khi: "Model thiếu kiến thức" "Model thiếu kỹ năng/phong cách"
Chi phí: Thấp (chỉ indexing) Cao ($$ giờ GPU)
Cập nhật: Tức thì (re-index là xong) Khó (phải train lại)
Ví dụ: "Biết FAQ của chúng tôi" "Luôn trả lời theo văn phong thương hiệu"
|
Phần 2: Điều tra (Khi nào Fine-tuning thắng?)
Fine-tuning thay đổi trọng số (weight) của model — hành vi cơ bản của nó. Dùng khi bạn cần:
- Format/style nhất quán: “Luôn trả lời dạng gạch đầu dòng markdown.”
- Ngôn ngữ chuyên ngành: Thuật ngữ y tế, ngôn ngữ pháp lý, code theo phong cách cụ thể.
- Chuyên môn hóa task: Model chỉ tạo SQL, nhanh và đáng tin cậy.
- Ngôn ngữ/phương ngữ: Dạy model viết tiếng Việt tự nhiên (không nghe như dịch máy).
Khi RAG là đủ (luôn thử cái này trước):
- Model chỉ cần sự kiện mới mà nó chưa biết.
- Bạn cần trích dẫn nguồn trong câu trả lời.
- Dữ liệu thay đổi thường xuyên (danh mục sản phẩm, giá cả).
Phần 3: Chẩn đoán (LoRA — Fine-tune không cần siêu máy tính)
Fine-tune đầy đủ cập nhật TẤT CẢ hàng tỷ tham số. Cực kỳ tốn kém.
LoRA (Low-Rank Adaptation) là bước đột phá giúp fine-tuning trở nên tiếp cận được. Thay vì cập nhật tất cả trọng số, nó thêm các ma trận adapter nhỏ vào các lớp chính. Chỉ adapter được train (~1% tham số).
1
2
| Full Fine-Tuning: Cập nhật 7 tỷ tham số → cần GPU 80GB × 4 ngày
LoRA Fine-Tuning: Cập nhật ~70 triệu tham số adapter → cần GPU 16GB × 2 tiếng
|
Fine-tuning với Unsloth + LoRA (Python)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| from unsloth import FastLanguageModel
from trl import SFTTrainer
from datasets import Dataset
# Tải model nền với lượng tử hóa 4-bit (vừa vào GPU consumer đơn)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/llama-3-8b",
max_seq_length=2048,
load_in_4bit=True, # Model 8B chỉ cần ~6GB VRAM
)
# Áp dụng adapter LoRA
model = FastLanguageModel.get_peft_model(
model,
r=16, # Rank LoRA: cao hơn = nhiều năng lực hơn nhưng nhiều tham số hơn
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
)
# Dữ liệu training (cặp instruction → response)
data = Dataset.from_list([
{"text": f"### Instruction:\n{ex['input']}\n\n### Response:\n{ex['output']}"}
for ex in du_lieu_training
])
trainer = SFTTrainer(model=model, train_dataset=data, dataset_text_field="text")
trainer.train()
# Lưu chỉ adapter (nhỏ: ~50MB so với 16GB cho toàn bộ model)
model.save_pretrained("my-lora-adapter")
|
Phần 4: Giải pháp (Framework Ra quyết định)
1
2
3
4
5
6
7
8
9
10
11
| Vấn đề: "AI không biết X"
│
├── X thay đổi thường xuyên? → RAG (re-index là xong)
│
├── X là tài liệu nội bộ/riêng tư? → RAG
│
└── X là kỹ năng/hành vi/phong cách? → Fine-tune
│
├── Ngân sách < $100? → LoRA trên model mở (Llama 3, Mistral)
│
└── Ngân sách linh hoạt? → OpenAI fine-tuning API
|
OpenAI Fine-Tuning API (Managed, không cần GPU)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| from openai import OpenAI
import json
client = OpenAI()
# 1. Upload dữ liệu training (JSONL, tối thiểu 10 ví dụ)
with open("training.jsonl", "w") as f:
for ex in training_data:
f.write(json.dumps({
"messages": [
{"role": "system", "content": "Bạn là trợ lý hữu ích."},
{"role": "user", "content": ex["cau_hoi"]},
{"role": "assistant", "content": ex["cau_tra_loi"]}
]
}) + "\n")
file = client.files.create(file=open("training.jsonl", "rb"), purpose="fine-tune")
# 2. Bắt đầu fine-tuning job
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini" # Fine-tune model nhỏ hơn (rẻ hơn)
)
# 3. Dùng model đã fine-tune
response = client.chat.completions.create(
model=job.fine_tuned_model,
messages=[{"role": "user", "content": "..."}]
)
|
Mô hình tư duy chốt hạ
1
2
3
4
5
6
7
| RAG → Đưa bác sĩ sách tham khảo. Tức thì. Có nguồn. Cập nhật được.
Fine-tuning → Gửi bác sĩ học Trường Y. Vĩnh viễn. Đắt. Mạnh mẽ.
LoRA → Thêm lớp adapter phẫu thuật. Train 1% tham số. 90% hiệu quả.
Full FT → Đào tạo lại toàn bộ bộ não. Đắt gấp 100x. Hiếm khi cần.
Bắt đầu với RAG. Fine-tune chỉ khi RAG không giải quyết được.
|
Quy tắc 2026: 90% vấn đề sản phẩm AI giải quyết được bằng prompt tốt hơn + RAG. Fine-tune khi đã thử hết cả hai. Dùng LoRA khi fine-tune.