Fine-tuning Embedding Model: Dạy AI hiểu tiếng lóng và thuật ngữ chuyên ngành Việt Nam

AI Hunter

Member
Bạn xây dựng Chatbot tư vấn chứng khoán.
Khách hỏi: "Làm sao để tránh bị lùa gà?"
Hệ thống RAG tìm kiếm tài liệu về... cách chăn nuôi gia cầm. 🐔

Thảm họa này xảy ra vì Model Embedding (người phiên dịch từ chữ sang số) không hiểu nghĩa bóng của từ "lùa gà".
Trong không gian Vector hiện tại, từ "lùa gà" đang nằm gần cụm từ "nông nghiệp", thay vì nằm gần "lừa đảo tài chính".

Để sửa việc này, chúng ta cần **Fine-tune** model bằng thư viện `sentence-transformers`. Kỹ thuật này gọi là **Contrastive Learning** (Học tương phản): Kéo các cặp câu đồng nghĩa lại gần nhau và đẩy các câu khác nghĩa ra xa.

Fine-tuning Embedding Model Dạy AI hiểu tiếng lóng và thuật ngữ chuyên ngành Việt Nam.jpg

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

Dữ liệu Fine-tune Embedding đơn giản hơn LLM nhiều. Bạn chỉ cần chuẩn bị danh sách các cặp câu (Pairs) có ý nghĩa tương đương nhau trong ngữ cảnh của bạn.

Tạo file `crypto_slang.json`:
JSON:
[
    {"anchor": "Dấu hiệu nhận biết lùa gà", "positive": "Cách phát hiện các dự án lừa đảo, bơm thổi giá"},
    {"anchor": "Hôm nay thị trường sập mạnh quá", "positive": "Chỉ số VN-Index giảm điểm kỷ lục phiên hôm nay"},
    {"anchor": "Anh ấy mới đu đỉnh con coin rác", "positive": "Anh ấy mua tài sản mã hóa giá trị thấp ở mức giá cao nhất"},
    {"anchor": "Cá mập đang gom hàng", "positive": "Các nhà đầu tư lớn đang âm thầm mua vào số lượng lớn"}
]
* **Anchor:** Câu gốc (chứa tiếng lóng).
* **Positive:** Câu giải thích (nghĩa chuẩn).

2. Cài đặt môi trường​

Chúng ta sử dụng thư viện `sentence-transformers` (SBERT) nổi tiếng.

Bash:
pip install sentence-transformers

3. Code Fine-tuning (Python)​


Bước 1: Load Model cơ sở
Chúng ta sẽ chọn model `bkai-foundation-models/vietnamese-bi-encoder` (model tiếng Việt rất tốt của ĐH Bách Khoa) làm nền tảng.

Python:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader

# 1. Load model tiếng Việt có sẵn
model_name = "bkai-foundation-models/vietnamese-bi-encoder"
model = SentenceTransformer(model_name)

# Kiểm tra thử trước khi train
# "Lùa gà" và "Lừa đảo" ban đầu có thể chưa gần nhau lắm
print("Sim (Trước):", model.similarity(["Lùa gà"], ["Lừa đảo tài chính"]))

Bước 2: Nạp dữ liệu

Python:
# Dữ liệu mẫu (Thực tế bạn cần khoảng vài trăm cặp câu)
train_examples = [
    InputExample(texts=["Dấu hiệu nhận biết lùa gà", "Cách phát hiện các dự án lừa đảo"]),
    InputExample(texts=["Đu đỉnh", "Mua giá cao nhất"]),
    InputExample(texts=["Xa bờ", "Thua lỗ nặng chưa thể hoàn vốn"]),
    # ... Thêm nhiều dữ liệu vào đây
]

# Tạo DataLoader
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)

Bước 3: Định nghĩa hàm Loss
Đây là bí thuật. Chúng ta dùng `MultipleNegativesRankingLoss`.
Hàm này sẽ tự động coi các cặp câu trong cùng 1 batch là Positive, và chéo với các cặp khác là Negative. Bạn không cần chuẩn bị dữ liệu Negative thủ công!

Python:
train_loss = losses.MultipleNegativesRankingLoss(model)

Bước 4: Train
Quá trình này rất nhanh, chỉ mất vài phút trên Google Colab (GPU T4) với tập dữ liệu nhỏ.

Python:
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=10, # Chạy 10 vòng
    warmup_steps=100,
    show_progress_bar=True
)

# Lưu model đã khôn ra
model.save("my-finetuned-slang-model")

4. Kiểm tra kết quả (Evaluation)​

Hãy xem model mới hoạt động thế nào.

Python:
new_model = SentenceTransformer("my-finetuned-slang-model")

query = "Dấu hiệu lùa gà là gì?"
docs = ["Hướng dẫn chăn nuôi gia cầm", "Cảnh báo các mô hình lừa đảo tài chính"]

# Encode câu hỏi và tài liệu
q_emb = new_model.encode(query)
d_emb = new_model.encode(docs)

# Tính độ tương đồng
print(new_model.similarity([query], docs))

# KẾT QUẢ MONG ĐỢI:
# Với model cũ: "lùa gà" ~ "chăn nuôi" (Similarity cao)
# Với model mới: "lùa gà" ~ "lừa đảo tài chính" (Similarity cao nhất)

5. Khi nào cần Fine-tune?​

Đừng lạm dụng. Chỉ làm khi:
1. **Thuật ngữ hiếm:** Y khoa, Hóa học, Luật pháp đặc thù.
2. **Tiếng lóng/Teen code:** Mạng xã hội, Crypto, Gaming.
3. **Ngôn ngữ hỗn hợp:** Văn bản chèn tiếng Anh vào tiếng Việt (ví dụ: "Code này bị bug rồi, fix đi").

Kết luận​

Fine-tuning Embedding Model là cách rẻ nhất để tăng độ chính xác cho RAG. Thay vì cố gắng viết Prompt dài dòng giải thích cho ChatGPT "Lùa gà là gì", hãy dạy thẳng vào tiềm thức (Vector Space) của hệ thống. Đây là tài sản trí tuệ riêng mà đối thủ dùng API mặc định không thể có được.
 
Back
Top