Fine-tuning Llama 3: Dạy AI nói giọng "Gen Z" hoặc văn phong công sở chuyên nghiệp

AI Hunter

Member
Bạn hỏi AI: "Sếp đang giận, tôi phải làm sao?"
ChatGPT trả lời: "Bạn nên giữ bình tĩnh và tìm cơ hội nói chuyện riêng..." (Quá sách giáo khoa).

Bạn muốn AI trả lời kiểu Gen Z: "Xu cà na rồi fen ơi! Tém tém lại, đợi ổng hạ hỏa rồi hãy vào xin lỗi, đừng có ra dẻ lúc này!"

Để làm được điều này, Prompting là không đủ. Bạn cần Fine-tuning (Tinh chỉnh). Hôm nay, chúng ta sẽ dùng thư viện Unsloth để huấn luyện Llama 3 trở thành một "thánh chém gió" hoặc "chuyên gia công sở" ngay trên Google Colab (Free T4 GPU).

Fine-tuning Llama 3 Dạy AI nói giọng Gen Z hoặc văn phong công sở chuyên nghiệp.jpg

1. Fine-tuning vs. RAG: Khi nào dùng cái nào?​

  • RAG (Retrieval): Khi cần AI biết KIẾN THỨC mới (Dữ liệu lương thưởng, quy trình công ty).
  • Fine-tuning: Khi cần AI học PHONG CÁCH mới (Giọng điệu, cách hành văn, định dạng JSON/SQL đặc thù).

2. Chuẩn bị dữ liệu (Dataset)​

Dữ liệu Fine-tuning thường ở dạng JSONL. Cấu trúc đơn giản: Input (Câu hỏi) -> Output (Câu trả lời mong muốn).

Ví dụ file `genz_data.jsonl`:
JSON:
[
  {"instruction": "Chào buổi sáng", "output": "Hé lô các homie, ngày mới cháy phố nha!"},
  {"instruction": "Xin lỗi sếp", "output": "Sorry sếp iu, em lỡ tay xíu, để em fix ngay và luôn ạ!"},
  {"instruction": "Hết tiền rồi", "output": "Còn cái nịt fen ơi, cuối tháng ăn mì gói cầm hơi."}
]
Bạn cần khoảng 50 - 100 cặp câu mẫu như thế này để AI bắt chước được giọng điệu.

3. Quy trình Huấn luyện (Dùng Unsloth)​

Unsloth là thư viện giúp train Llama 3 nhanh hơn 2 lần và tốn ít hơn 60% bộ nhớ so với cách truyền thống.

Bước 1: Cài đặt​

Bash:
pip install unsloth "xformers<0.0.26" "trl<0.9.0" peft accelerate bitsandbytes

Bước 2: Load Model (4-bit Quantization)​

Python:
from unsloth import FastLanguageModel
import torch

# Load Llama 3 8B (Phiên bản nhẹ, chạy tốt trên Colab)
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = 2048,
    dtype = None,
    load_in_4bit = True,
)

# Thêm LoRA Adapters (Chỉ train 1 phần nhỏ trọng số -> Tiết kiệm VRAM)
model = FastLanguageModel.get_peft_model(
    model,
    r = 16, # Rank càng cao train càng kỹ nhưng tốn VRAM
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha = 16,
    lora_dropout = 0,
    use_gradient_checkpointing = True,
)

Bước 3: Chuẩn bị Dataset​

Python:
from datasets import load_dataset

# Hàm format dữ liệu theo chuẩn Alpaca
alpaca_prompt = """Below is an instruction that describes a task. Write a response that appropriately completes the request.

### Instruction:
{}

### Response:
{}"""

EOS_TOKEN = tokenizer.eos_token # Must add EOS_TOKEN
def formatting_prompts_func(examples):
    instructions = examples["instruction"]
    outputs      = examples["output"]
    texts = []
    for instruction, output in zip(instructions, outputs):
        text = alpaca_prompt.format(instruction, output) + EOS_TOKEN
        texts.append(text)
    return { "text" : texts, }

# Load file JSONL của bạn
dataset = load_dataset("json", data_files="genz_data.jsonl", split="train")
dataset = dataset.map(formatting_prompts_func, batched = True)

Bước 4: Train (Pha trà và đợi)​

Python:
from trl import SFTTrainer
from transformers import TrainingArguments

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = 2048,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 60, # Train nhanh demo (Tăng lên nếu dữ liệu nhiều)
        learning_rate = 2e-4,
        fp16 = not torch.cuda.is_bf16_supported(),
        bf16 = torch.cuda.is_bf16_supported(),
        logging_steps = 1,
        output_dir = "outputs",
        optim = "adamw_8bit",
    ),
)

trainer.train()

Bước 5: Test thử "nhân cách" mới​

Python:
# Chạy Inference
FastLanguageModel.for_inference(model)
inputs = tokenizer(
[
    alpaca_prompt.format(
        "Tối nay đi chơi không?", # Instruction
        "", # Output trống để AI điền
    )
], return_tensors = "pt").to("cuda")

outputs = model.generate(**inputs, max_new_tokens = 64)
print(tokenizer.batch_decode(outputs)[0])
Kết quả mong đợi: "Chốt đơn liền fen ơi, lên đồ đi quẩy nào!"

4. Xuất file GGUF để chạy trên Ollama​

Sau khi train xong, bạn có thể xuất model ra định dạng GGUF để chạy offline trên máy tính (như bài hướng dẫn Ollama số trước).

Python:
model.save_pretrained_gguf("model_genz", tokenizer, quantization_method = "q4_k_m")
Bạn lấy file này, nạp vào Ollama và thế là bạn có một trợ lý ảo "độc nhất vô nhị".

Kết luận​

Fine-tuning không còn là đặc quyền của các công ty Big Tech. Với Llama 3 và Unsloth, bất kỳ ai cũng có thể tạo ra một bản sao kỹ thuật số của chính mình hoặc tùy biến AI cho các tác vụ chuyên biệt cực hẹp.
 
Back
Top