ai-045Đọc toàn bộ đề miễn phí

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).

AINâng cao45 phút

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ủ đề

ragvector-databaseivfapproximate-nearest-neighborsclusteringfaiss

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 nprobe tâ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 nprobe cụ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]]:
        pass
  • dim: 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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.