AI Hunter
Member
Bạn có 1 triệu cuốn sách trong thư viện.
Cách 2 chính là bí mật của các ông lớn như Google hay Facebook. Hai kỹ thuật cốt lõi của nó là HNSW và Quantization.
Hãy tưởng tượng dữ liệu của bạn được sắp xếp thành nhiều tầng (Layers):
Quy trình tìm kiếm:
1. Bắt đầu từ Tầng trên cùng -> Nhảy nhanh về phía mục tiêu.
2. Khi không thể đến gần hơn -> Tụt xuống tầng dưới.
3. Lặp lại cho đến Tầng đáy -> Tìm ra điểm gần nhất chính xác.
Tham số cần tinh chỉnh (Tuning):
Model text-embedding-3-small có 1536 chiều -> 1 Vector nặng ~6KB.
=> 1 triệu Vector tốn 6GB RAM.
Nếu bạn có 100 triệu Vector? Bạn cần 600GB RAM -> Tiền Server chịu không nổi.
Giải pháp là Quantization (Lượng tử hóa): Biến số thực (Float) thành số nguyên (Int) hoặc thậm chí là nhị phân (Binary).
Mẹo tối ưu Python (Batch Processing):
Đừng bao giờ add từng vector một. Hãy add theo lô (batch).
Với HNSW và Quantization, bạn có thể scale hệ thống lên hàng triệu người dùng mà chi phí phần cứng gần như không đổi. Đây là kỹ năng tối ưu hóa Backend bắt buộc phải có của một Senior AI Engineer.
- Cách 1 (Flat Search): Bạn chạy bộ qua từng kệ sách, so sánh từng cuốn một xem cuốn nào giống cuốn bạn cần tìm nhất. (Độ phức tạp O(N) -> Chậm, chính xác 100%).
- Cách 2 (ANN - Approximate Nearest Neighbor): Bạn dùng bản đồ chỉ dẫn để nhảy cóc đến đúng khu vực cần tìm, bỏ qua 99% số sách không liên quan. (Độ phức tạp O(log N) -> Siêu nhanh, chính xác 99%).
Cách 2 chính là bí mật của các ông lớn như Google hay Facebook. Hai kỹ thuật cốt lõi của nó là HNSW và Quantization.
1. HNSW: Hệ thống giao thông cao tốc cho Dữ liệu
HNSW (Hierarchical Navigable Small World) là thuật toán Vector Search phổ biến nhất hiện nay (được dùng trong ChromaDB, Pinecone, Qdrant).Hãy tưởng tượng dữ liệu của bạn được sắp xếp thành nhiều tầng (Layers):
- Tầng trên cùng (Cao tốc): Chỉ chứa vài điểm dữ liệu quan trọng, nối với nhau rất thưa. Giúp bạn di chuyển những bước đại nhảy vọt qua không gian dữ liệu.
- Tầng giữa (Quốc lộ): Mật độ điểm dày hơn, giúp thu hẹp phạm vi.
- Tầng đáy (Đường làng): Chứa tất cả dữ liệu, kết nối chi tiết.
Quy trình tìm kiếm:
1. Bắt đầu từ Tầng trên cùng -> Nhảy nhanh về phía mục tiêu.
2. Khi không thể đến gần hơn -> Tụt xuống tầng dưới.
3. Lặp lại cho đến Tầng đáy -> Tìm ra điểm gần nhất chính xác.
Tham số cần tinh chỉnh (Tuning):
- M (Số kết nối): Mỗi điểm kết nối với bao nhiêu điểm khác? M càng cao thì tìm càng chính xác nhưng tốn RAM và Index lâu. (Khuyến nghị: 16 - 64).
- ef_construction & ef_search: Độ rộng của việc tìm kiếm. Số càng to càng chính xác nhưng càng chậm.
2. Quantization: Nén dữ liệu để "nhét" vừa RAM
Một Vector thông thường (Float32) tốn 4 bytes cho mỗi chiều.Model text-embedding-3-small có 1536 chiều -> 1 Vector nặng ~6KB.
=> 1 triệu Vector tốn 6GB RAM.
Nếu bạn có 100 triệu Vector? Bạn cần 600GB RAM -> Tiền Server chịu không nổi.
Giải pháp là Quantization (Lượng tử hóa): Biến số thực (Float) thành số nguyên (Int) hoặc thậm chí là nhị phân (Binary).
- Scalar Quantization (SQ8): Chuyển Float32 -> Int8. Giảm dung lượng 4 lần. Độ chính xác giảm không đáng kể (mất dưới 1%).
- Binary Quantization: Chuyển về 0 và 1. Giảm dung lượng 32 lần. Tốc độ nhanh gấp 30 lần. (Phù hợp với model embedding chiều cao như OpenAI).
3. Thực hành: Tinh chỉnh ChromaDB
ChromaDB mặc định dùng HNSW. Tuy nhiên, để tối ưu cho tập dữ liệu lớn, bạn cần cấu hình lại khi tạo Collection.
Python:
import chromadb
client = chromadb.PersistentClient(path="./my_big_data")
# Cấu hình HNSW thủ công (thông qua metadata hnsw:*)
# Lưu ý: ChromaDB giấu khá kỹ phần này, đây là cách can thiệp sâu
collection = client.get_or_create_collection(
name="million_vectors",
metadata={
"hnsw:space": "cosine", # Hàm khoảng cách
"hnsw:construction_ef": 100, # Tăng lên 200 nếu muốn build kỹ hơn
"hnsw:M": 32, # Mặc định là 16. Tăng lên 32 để tìm chính xác hơn
"hnsw:search_ef": 50 # Số lượng ứng viên khi tìm kiếm
}
)
print("🚀 Đã tạo Collection với cấu hình High Performance!")
Mẹo tối ưu Python (Batch Processing):
Đừng bao giờ add từng vector một. Hãy add theo lô (batch).
Python:
# KHÔNG LÀM THẾ NÀY (Sẽ mất cả ngày để add 1 triệu dòng)
# for doc in docs: collection.add(...)
# HÃY LÀM THẾ NÀY (Batch Size = 5000)
batch_size = 5000
for i in range(0, len(docs), batch_size):
batch_docs = docs[i : i + batch_size]
batch_ids = ids[i : i + batch_size]
collection.add(documents=batch_docs, ids=batch_ids)
print(f"Đã nạp {i + batch_size} documents...")
4. Kết quả Benchmark (Giả định)
| Phương pháp | Thời gian tìm (1M Docs) | RAM tiêu thụ | Độ chính xác (Recall) |
|---|---|---|---|
| Flat Search (Brute Force) | 1500 ms | 6 GB | 100% |
| HNSW (Default) | 15 ms | 7 GB (Tốn thêm RAM cho Graph) | 98% |
| HNSW + Quantization (Int8) | 8 ms | 2 GB | 97% |
Kết luận
Trong thế giới Big Data AI: "Nhanh và gần đúng" luôn chiến thắng "Chậm và chính xác tuyệt đối".Với HNSW và Quantization, bạn có thể scale hệ thống lên hàng triệu người dùng mà chi phí phần cứng gần như không đổi. Đây là kỹ năng tối ưu hóa Backend bắt buộc phải có của một Senior AI Engineer.
Bài viết liên quan