Chỉ Mục Phân Cụm Đảo (Inverted File Index - IVF) Cho Vector Search
1. Giai đoạn Huấn luyện (Train): Chạy K-Means để chia không gian vector thành C tế bào Voronoi (Voronoi cells), mỗi tế bào có một tâm cụm (centroid).
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: kmeans-clustering-lloyd, dense-embedding-cosine-index.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu tại sao Flat Index O(N) không thể scale khi kho dữ liệu lên tới 100 triệu vector.
- Kiến trúc Inverted File (IVF):
- Giai đoạn Huấn luyện (Train): Chạy K-Means để chia không gian vector thành C tế bào Voronoi (Voronoi cells), mỗi tế bào có một tâm cụm (centroid).
- Giai đoạn Nạp dữ liệu (Add): Mỗi vector được gán vào tâm cụm gần nhất và lưu trong danh sách liên kết đảo (inverted list) của cụm đó.
- Giai đoạn Truy vấn (Search):
- So khớp vector truy vấn với C tâm cụm, tìm ra
nprobetâm cụm gần nhất (1 ≤ nprobe ≤ C). - Chỉ duyệt tìm kiếm chi tiết các vector nằm trong
nprobecụm được chọn. - Giảm số lượng vector cần so khớp từ N xuống ≈ nprobeC N (tăng tốc độ gấp 20x - 100x).
Yêu cầu
Xây dựng lớp IVFFlatIndex:
class IVFFlatIndex:
def __init__(self, dim: int, nlist: int = 4):
pass
def train(self, vectors: np.ndarray, seed: int = 42) -> None:
pass
def add(self, vectors: np.ndarray, doc_ids: list[str]) -> None:
pass
def search(self, query: np.ndarray, top_k: int = 3, nprobe: int = 1) -> list[tuple[str, float]]:
passdim: Số chiều vector.nlist: Số lượng tâm cụm (centroids).nprobe: Số lượng cụm lân cận cần quét khi tìm kiếm.
Input
- Lớp
IVFFlatIndex(dim,nlist): Khởi tạo đối tượng với các tham số, trọng số hoặc cấu hình tương ứng.
Output
- Các phương thức của
IVFFlatIndex: Trả về kết quả tính toán hoặc cập nhật trạng thái nội bộ của đối tượng.
Ràng buộc
- Thời gian chạy tối đa: 3000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
dim = 4
index = IVFFlatIndex(dim=dim, nlist=2)
train_data = np.array([[1.0, 0.0, 0.0, 0.0], [0.9, 0.1, 0.0, 0.0], [0.95, 0.05, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.9, 0.1], [0.0, 0.0, 0.95, 0.05]])
index.train(train_data)
index.add(train_data, [f'doc_{i}' for i in range(6)])
query = np.array([1.0, 0.0, 0.0, 0.0])
index.search(query, top_k=3, nprobe=1)Output
[('doc_0', 1.0), ('doc_2', 0.9986178293325098), ('doc_1', 0.9938837346736189)]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
index = IVFFlatIndex(dim=2, nlist=2)
train_data = np.array([[1.0, 0.0], [0.0, 1.0]])
index.train(train_data)
index.add(train_data, ['doc_x', 'doc_y'])
res = index.search(np.array([1.0, 1.0]), top_k=2, nprobe=2)Output
[('doc_x', 0.7071067811865475), ('doc_y', 0.7071067811865475)]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
