Bỏ qua đến nội dung

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.

Hoang Yell
Hoang Yell
11 phút đọc
English
Fine-tuning vs RAG: Mô hình tư duy 'Dạy học vs. Học thuộc lòng'

“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.


Tóm tắt (TL;DR)

Hộp Trả Lời Nhanh (Quick Answer Box cho Google Search):

  • Khi nào nên chọn RAG? Khi dữ liệu của bạn thay đổi liên tục (bảng giá, tài liệu công ty, tin tức), cần trích dẫn nguồn chính xác 100% và muốn chi phí triển khai thấp nhất.
  • Khi nào nên chọn Fine-Tuning? Khi bạn cần dạy mô hình định hình phong cách hành vi (Form), tuân thủ định dạng JSON/schema nghiêm ngặt, hoặc sử dụng ngôn ngữ đặc thù mà prompt thông thường không ép được.
  • Quy tắc vàng: RAG cung cấp tri thức (Facts) - Fine-Tuning định hình phong cách (Form). Tuyệt đối không fine-tune chỉ để nạp dữ liệu biến động.
  • Mô hình kiến trúc tối ưu nhất: Kết hợp một model nhỏ đã fine-tune LoRA để hiểu cấu trúc câu lệnh kết nối với cơ sở dữ liệu vector pgvector để truy xuất dữ liệu động.

Sự lựa chọn giữa Fine-Tuning và RAG (Retrieval-Augmented Generation) không phải là cuộc tranh cãi xem cái nào xịn hơn: đó là sự phân chia rạch ròi giữa phong cáchtri thức.

  • Fine-Tuning dạy phong cách (Form): Huấn luyện model văn phong riêng, thuật ngữ chuyên ngành, định dạng JSON nghiêm ngặt hoặc cú pháp đặc thù.
  • RAG cung cấp dữ liệu thực tế (Facts): Kết nối model với cơ sở dữ liệu động, bảng giá thay đổi liên tục và tài liệu mới nhất với trích dẫn nguồn chuẩn xác.
  • Quy tắc vàng: Đừng bao giờ fine-tune chỉ để nhồi nhét dữ liệu thường xuyên biến động: hãy dùng RAG để tra cứu và fine-tuning để định hình hành vi.
  • Mô hình kết hợp tối ưu: Dùng model nhỏ được gắn adapter LoRA chạy cục bộ kết hợp với pgvector để lấy dữ liệu thời gian thực.

Bản đồ Tư duy (Beginner Map)

Lối Tắt 3 Phút: Cây Quyết Định RAG vs Fine-Tuning (The Fast Path)

Để đưa ra quyết định kỹ thuật chính xác trong 30 giây mà không lãng phí hàng nghìn USD:

  1. Câu hỏi 1: Dữ liệu có biến động theo thời gian không?
    • Nếu dữ liệu thay đổi theo ngày/tuần: Chọn RAG 100%.
  2. Câu hỏi 2: Bạn cần mô hình nhớ thêm sự thật hay cần mô hình đổi giọng văn/cú pháp?
    • Cần thêm sự thật mới: Chọn RAG.
    • Cần ép chuẩn output JSON hoặc học phong cách lập trình đặc thù: Chọn Fine-Tuning (LoRA).
  3. Chiến lược an toàn nhất: Bắt đầu bằng RAG + Prompt Engineering trước; chỉ nghĩ đến Fine-Tuning khi RAG không thể đáp ứng được yêu cầu về định dạng hoặc độ trễ.

Khi quyết định nâng cấp năng lực cho LLM trong dự án thực tế, hãy đi qua 4 chặng phân tích:

  1. Nền tảng: Phép loại suy trường y (học 7 năm để có tư duy bác sĩ vs mở sổ tay tra cứu liều thuốc mới nhất).
  2. Khảo sát: Những trường hợp thực tế Fine-tuning hoàn toàn vượt trội RAG (ép chuẩn định dạng, giảm độ trễ, tiết kiệm token).
  3. Chẩn đoán: Phương pháp nén LoRA/QLoRA trên GPU cá nhân và các cạm bẫy cắt chunk dữ liệu trong vector database.
  4. Giải pháp: Ma trận quyết định thực chiến kèm code mẫu chạy thử LoRA cục bộ và API đám mây.

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.
                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ố).

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)

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)

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)

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": "..."}]
)

Thử thách thực hành (Student First Assignment)

  1. Xác định một bài toán cụ thể trong dự án của bạn (ví dụ: trả lời chính sách công ty vs sinh mã JSON chuẩn schema).
  2. Áp dụng bảng ma trận quyết định: phân tích xem dữ liệu có thay đổi hàng ngày (cần RAG) hay cấu trúc đầu ra cần độ chính xác 100% (cần Fine-Tuning).
  3. Dùng thử một thư viện cắt chunk ngữ nghĩa trên tài liệu PDF 5 trang và kiểm tra độ chính xác khi truy vấn vector.
  4. Soạn thảo thử 10 cặp dữ liệu huấn luyện mẫu định dạng JSONL để nắm bản chất dữ liệu đầu vào của LoRA.


Fine-tuning có thể cập nhật thông tin sản phẩm mới thay cho RAG không?

Không nên làm như vậy. Đây là sai lầm phổ biến nhất của các kỹ sư mới vào nghề. Khi cố nhồi nhét sự thật mới qua fine-tuning, mô hình rất dễ gặp hiện tượng quên thảm họa (catastrophic forgetting) - làm suy giảm năng lực suy luận tổng quát - và vẫn sinh ra ảo tưởng (hallucination) với các số liệu chi tiết. RAG luôn là giải pháp chuẩn xác cho việc cập nhật kiến thức động.

Chi phí fine-tuning bằng LoRA/QLoRA trên GPU cá nhân là bao nhiêu?

Nhờ kỹ thuật QLoRA (Quantized Low-Rank Adaptation), bạn có thể fine-tune một model 7B hoặc 8B (như Llama 3.1 8B hay Qwen 2.5 7B) trực tiếp trên một chiếc card đồ họa thông thường như RTX 3060 12GB hoặc RTX 4070. Quá trình huấn luyện một tập dữ liệu vài nghìn mẫu chỉ mất từ 2 đến 4 giờ với chi phí tiền điện thực tế dưới 10.000 VNĐ.

Khi nào nên kết hợp cả RAG và Fine-Tuning trong cùng một hệ thống?

Trong các hệ thống enterprise cao cấp:

  • Tầng Fine-Tuning: Tinh chỉnh một model 7B hoặc 8B chuyên sâu để chuyển đổi câu hỏi của người dùng thành câu truy vấn SQL/Vector chính xác và trích xuất thực thể.
  • Tầng RAG: Truy vấn dữ liệu thực tế từ cơ sở dữ liệu và chuyển tài liệu trả về cho model tổng hợp câu trả lời cuối cùng.

Điểm yếu lớn nhất của hệ thống RAG là gì?

Điểm yếu chí mạng của RAG nằm ở bước bóc tách văn bản (chunking) và độ chính xác của tìm kiếm vector (retrieval accuracy). Nếu thuật toán tìm kiếm mang về những đoạn văn bản không liên quan hoặc cắt đứt ngữ nghĩa của bảng biểu, LLM sẽ tổng hợp câu trả lời sai lệch (hiện tượng “garbage in, garbage out”).

Lời khuyên cuối (Final Take)

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.

Bài viết liên quan