Featured image of post Fine-tuning vs RAG: Mô hình tư duy 'Dạy học vs. Học thuộc lòng'

Fine-tuning vs RAG: Mô hình tư duy 'Dạy học vs. Học thuộc lòng'

Khi nào nên fine-tune thay vì dùng RAG? Hướng dẫn chuyên sâu về LoRA, PEFT và framework quyết định giúp bạn tránh lãng phí $10,000 giờ GPU.

“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ệnlý 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.

Được tạo với sự lười biếng tình yêu 🦥

Subscribe to My Newsletter