Chào mừng các bạn đến với bài viết hướng dẫn chi tiết cách finetune (tinh chỉnh) một mô hình ngôn ngữ lớn (LLM) một cách đơn giản và hoàn toàn miễn phí sử dụng thư viện Unsloth. Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một chatbot có khả năng tự động tạo workflow n8n dựa trên yêu cầu.
Bài toán
Mục tiêu của chúng ta là tạo ra một chatbot có thể hiểu yêu cầu của người dùng và trả về một workflow n8n tương ứng dưới dạng JSON một cách chính xác. Để đạt được điều này, chúng ta cần tinh chỉnh một mô hình LLM đã tồn tại trên bộ dữ liệu đặc thù về các template n8n.
Các bước thực hiện
Quá trình finetune sẽ bao gồm các bước chính sau:
- Chuẩn bị dữ liệu.
- Đưa dữ liệu lên Hugging Face.
- Tạo notebook và tiến hành finetune model.
1. Chuẩn bị dữ liệu
Bước đầu tiên và quan trọng nhất là chuẩn bị bộ dữ liệu chất lượng. Dữ liệu của chúng ta sẽ bao gồm các cặp input
và output
:
input
: Tên hoặc mô tả ngắn gọn về template n8n.output
: Workflow n8n tương ứng dưới dạng chuỗi JSON.
Để xây dựng bộ dữ liệu này, bạn có thể tiến hành crawl dữ liệu từ các nguồn cung cấp template n8n.
2. Đưa dữ liệu lên Hugging Face
Để tiện lợi cho việc truy cập và sử dụng trong quá trình finetune, chúng ta sẽ lưu trữ bộ dữ liệu đã chuẩn bị lên nền tảng Hugging Face.
Bạn chỉ cần thực hiện các bước sau:
- Truy cập trang web Hugging Face.
- Tạo một dataset mới trên tài khoản của bạn.
- Tải tệp JSON chứa bộ dữ liệu của bạn lên dataset vừa tạo.
Việc này giúp chúng ta có thể dễ dàng tải dữ liệu xuống trực tiếp trong môi trường Google Colab hoặc bất kỳ môi trường huấn luyện nào khác.
3. Tạo notebook và tiến hành finetune model
Bây giờ, chúng ta sẽ sử dụng Google Colab và thư viện Unsloth để tiến hành finetune mô hình. Unsloth là một thư viện giúp tăng tốc đáng kể quá trình finetune các mô hình LLM, cho phép chúng ta thực hiện công việc này ngay cả trên các tài nguyên miễn phí như Google Colab.
Bạn có thể bắt đầu bằng việc sao chép notebook mẫu được tạo sẵn bởi Unsloth. Notebook này cung cấp cấu trúc cơ bản và các đoạn mã cần thiết.
Sau khi sao chép notebook về Google Colab của mình, chúng ta cần sửa đổi một số đoạn mã để phù hợp với cấu trúc dữ liệu và bài toán cụ thể của mình.
Sửa đổi mã nguồn xử lý dữ liệu
Đoạn mã dưới đây là phần xử lý dữ liệu, chuyển đổi cặp input
/output
trong dataset của bạn thành định dạng prompt mà mô hình có thể hiểu được (theo định dạng Alpaca prompt).
alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction:
Create n8n workflow {} ### Response:
{}""" EOS_TOKEN = tokenizer.eos_token # Must add EOS_TOKEN
def formatting_prompts_func(examples): instructions = examples["input"] outputs = examples["output"] texts = [] # print(instructions,outputs) for instruction, output in zip(instructions, outputs): # Must add EOS_TOKEN, otherwise your generation will go on forever! text = alpaca_prompt.format(instruction, output) + EOS_TOKEN texts.append(text) return { "text" : texts, }
pass from datasets import load_dataset
# Thay "npv2k1/n8n-workflow" bằng tên dataset của bạn trên Hugging Face
dataset = load_dataset("npv2k1/n8n-workflow", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
Trong đoạn mã này:
alpaca_prompt
: Định nghĩa cấu trúc của prompt đầu vào cho mô hình. Chúng ta chèninput
(tên template) vào phần### Instruction
vàoutput
(workflow JSON) vào phần### Response
.formatting_prompts_func
: Hàm này nhận các ví dụ từ dataset và áp dụng định dạng prompt đã định nghĩa.load_dataset("npv2k1/n8n-workflow", split = "train")
: Tải dataset của bạn từ Hugging Face. Hãy nhớ thay thế"npv2k1/n8n-workflow"
bằng tên dataset thực tế của bạn trên Hugging Face.dataset.map(...)
: Áp dụng hàm định dạng prompt lên toàn bộ dataset.
Cấu hình và chạy huấn luyện
Sau khi dữ liệu đã được chuẩn bị và định dạng đúng, chúng ta sẽ cấu hình các tham số cho quá trình huấn luyện và bắt đầu finetune.
from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = max_seq_length, dataset_num_proc = 2, packing = False, # Can make training 5x faster for short sequences. args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, num_train_epochs = 1, # Set this for 1 full training run. # max_steps = 60, # Hoặc sử dụng max_steps để train nhanh hơn learning_rate = 2e-4, fp16 = not is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logging_steps = 1, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", seed = 3407, output_dir = "outputs", report_to = "none", # Use this for WandB etc ),
) # Bắt đầu quá trình huấn luyện
trainer.train()
Trong đoạn mã này:
- Chúng ta sử dụng
SFTTrainer
từ thư việntrl
(Transformer Reinforcement Learning) để huấn luyện mô hình trên dữ liệu đã định dạng. TrainingArguments
: Định nghĩa các tham số huấn luyện như kích thước batch, số epoch, tốc độ học, v.v.num_train_epochs = 1
: Đặt số epoch là 1 để mô hình học qua toàn bộ dataset một lần.max_steps = 60
: Bạn có thể bỏ comment dòng này và sử dụngmax_steps
thay chonum_train_epochs
nếu muốn huấn luyện nhanh hơn với một số bước cố định.
trainer.train()
: Bắt đầu quá trình huấn luyện mô hình.
Chạy thử mô hình:
Lưu model lên Hugging Face
Sau khi quá trình huấn luyện hoàn tất, bạn có thể lưu mô hình đã finetune của mình lên Hugging Face để dễ dàng chia sẻ và sử dụng sau này.
if True: # Đảm bảo điều kiện này là True để lưu model model.push_to_hub_gguf( "npv2k1/Qwen2.5-7B-n8n", # Thay "npv2k1/Qwen2.5-7B-n8n" bằng tên repository bạn muốn tạo trên Hugging Face tokenizer, quantization_method = ["q4_k_m"], # Chọn phương pháp lượng tử hóa phù hợp token = "", # Nhập Hugging Face token của bạn ở đây hoặc cấu hình môi trường )
model.push_to_hub_gguf(...)
: Hàm này từ Unsloth giúp đẩy mô hình lên Hugging Face ở định dạng GGUF (thường dùng cho các framework inference như llama.cpp).- Thay thế
"npv2k1/Qwen2.5-7B-n8n"
bằng tên repository mà bạn muốn tạo trên Hugging Face (ví dụ:your_username/your_model_name
). - Nhập Hugging Face token của bạn vào tham số
token
. Bạn có thể lấy token này từ trang cài đặt tài khoản Hugging Face của mình (https://huggingface.co/settings/tokens
). Hoặc cấu hình token trong môi trường Colab.
Download mô hình và chạy thử với lmstudio:
Kết luận
Như vậy, chỉ với vài bước đơn giản và sử dụng thư viện Unsloth, chúng ta đã có thể finetune một mô hình LLM để giải quyết bài toán cụ thể của mình. Mô hình đã được tinh chỉnh giờ đây có khả năng hiểu các yêu cầu về workflow n8n và tạo ra output dưới dạng JSON tương ứng.
Bạn có thể tiếp tục thử nghiệm với các tham số huấn luyện khác nhau, kích thước dataset lớn hơn hoặc các mô hình nền (base model) khác để đạt được kết quả tốt nhất cho bài toán của mình.
Chúc bạn thành công!