Bộ sưu tập

Khái niệm bộ sưu tập trong cơ sở dữ liệu vector Qdrant có thể tương tự như cấu trúc bảng trong MYSQL, được sử dụng để lưu trữ một cách đồng nhất dữ liệu vector cùng loại. Mỗi mảnh dữ liệu được lưu trữ trong một bộ sưu tập được gọi là một điểm trong Qdrant. Ở đây, một điểm tương tự như khái niệm không gian hình học toán học, đại diện cho việc biểu diễn của một vector trong không gian hình học (chỉ cần coi nó như một mảnh dữ liệu).

Trong cùng một bộ sưu tập, vector của mỗi điểm phải có cùng số chiều và được so sánh bằng một phép đo duy nhất. Vector được đặt tên có thể được sử dụng để bao gồm nhiều vector trong một điểm duy nhất, với mỗi vector có số chiều và yêu cầu phép đo riêng.

Khoảng cách giữa các vector được sử dụng để đo đạc độ tương đồng giữa chúng. Sự lựa chọn của phép đo tùy thuộc vào cách mà các vector được thu thập, đặc biệt là phương pháp sử dụng cho việc huấn luyện bộ biểu diễn mạng nơ-ron.

Qdrant hỗ trợ các loại phương pháp đo phổ biến sau:

  • Tích vô hướng: Dot
  • Độ tương đồng cosin: Cosine
  • Khoảng cách Euclidean: Euclid

Để cải thiện hiệu suất tìm kiếm, sự tương đồng cosin được đạt được bằng cách lấy tích vô hướng của các vector chuẩn hóa. Khi tải lên, các vector sẽ được tự động chuẩn hóa. Ngoài các phép đo và kích thước vector, mỗi bộ sưu tập cũng sử dụng một tập hợp các tham số riêng để kiểm soát việc tối ưu hóa bộ sưu tập, xây dựng chỉ mục và làm sạch. Những cài đặt này có thể được thay đổi bất kỳ lúc nào thông qua các yêu cầu tương ứng.

Thiết lập Đa-đơn vị

Cần tạo bao nhiêu bộ sưu tập? Trong hầu hết các trường hợp, bạn chỉ cần sử dụng một bộ sưu tập duy nhất với phân vùng dựa trên dữ liệu payload. Cách tiếp cận này được gọi là đa-đơn vị. Đối với hầu hết người dùng, đây là cách tiếp cận hiệu quả nhưng yêu cầu cấu hình bổ sung. Học cách thiết lập đa-đơn vị.

Khi nào nên tạo nhiều bộ sưu tập? Khi bạn có một số lượng người dùng hạn chế và cần cách ly. Cách tiếp cận này linh hoạt hơn nhưng có thể tốn kém hơn, vì tạo ra một số lượng lớn bộ sưu tập có thể dẫn đến overhead tài nguyên. Ngoài ra, bạn cần đảm bảo rằng chúng không gây nhiễu loạn lẫn nhau bằng bất kỳ cách nào, bao gồm cả về hiệu suất.

Tạo một bộ sưu tập

PUT /collections/{tên_bộ_sưu_tập}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

Ngoài các tùy chọn bắt buộc, các giá trị tùy chỉnh cũng có thể được chỉ định cho các tùy chọn bộ sưu tập sau:

  • hnsw_config - Đối với chi tiết chỉ mục, hãy tham khảo phần chỉ mục.
  • wal_config - Cấu hình liên quan đến ghi nhật ký trước khi ghi. Để biết thông tin chi tiết hơn về WAL, vui lòng tham khảo.
  • optimizers_config - Đối với chi tiết trình tối ưu hóa, hãy tham khảo phần trình tối ưu hóa.
  • shard_number - Xác định số lượng shard mà bộ sưu tập phải có. Để biết thêm thông tin, vui lòng tham khảo phần triển khai phân phối.
  • on_disk_payload - Xác định vị trí để lưu trữ dữ liệu payload. Nếu được đặt thành true, nó sẽ chỉ lưu trữ dữ liệu payload trên đĩa. Điều này có thể rất hữu ích trong việc hạn chế việc sử dụng RAM khi xử lý các dữ liệu payload lớn.
  • quantization_config - Đối với thông tin chi tiết về lượng tử hóa, hãy tham khảo phần lượng tử hóa.

Các tham số mặc định cho các tham số tùy chọn của bộ sưu tập được xác định trong tệp cấu hình.

Để biết thêm thông tin về các tham số bộ sưu tập và vector, vui lòng xem định nghĩa schematệp cấu hình.

Có sẵn từ phiên bản v1.2.0

Vector được lưu trữ trong RAM để đạt được việc truy cập rất nhanh chóng. Tham số on_disk có thể được thiết lập trong cấu hình vector. Nếu được đặt thành true, tất cả các vector sẽ được lưu trữ trên ổ đĩa. Điều này sẽ cho phép việc sử dụng ánh xạ bộ nhớ, phù hợp cho việc nhập khẩu một lượng lớn dữ liệu.

Tạo một bộ sưu tập từ một bộ sưu tập khác

Có sẵn từ phiên bản v1.0.0

Một bộ sưu tập có thể được khởi tạo từ một bộ sưu tập đã tồn tại.

Việc này có thể hữu ích để nhanh chóng thử nghiệm các cấu hình khác nhau của cùng một tập dữ liệu.

Khi thiết lập cấu hình vector trong bộ sưu tập mới, hãy đảm bảo rằng các vector có kích thước và chức năng khoảng cách giống như trong bộ sưu tập gốc.

PUT /collections/{tên_bộ_sưu_tập}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

Bộ sưu tập đa-vector

Có sẵn từ v0.10.0

Mỗi bản ghi có thể chứa nhiều vector. Tính năng này cho phép lưu trữ nhiều vector trong một bộ sưu tập. Để phân biệt các vector trong một bản ghi, hãy xác định tên duy nhất của chúng khi tạo bộ sưu tập. Mỗi vector được đặt tên trong cấu trúc này có khoảng cách và kích thước riêng:

PUT /collections/{tên_bộ_sưu_tập}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

Đối với một số trường hợp đặc biệt, có thể tạo một bộ sưu tập mà không lưu trữ bất kỳ vector nào.

Có sẵn từ v1.1.1

Đối với mỗi vector được đặt tên, bạn có thể tùy chọn chỉ định hnsw_config hoặc quantization_config để khác với cấu hình của bộ sưu tập. Điều này có thể được sử dụng để tối ưu hóa hiệu suất tìm kiếm ở mức vector.

Có sẵn từ v1.2.0

Các vector được lưu trữ trong bộ nhớ để truy cập nhanh. Đối với mỗi vector, on_disk có thể được thiết lập thành true để luôn lưu trữ tất cả các vector trên đĩa. Điều này sẽ kích hoạt ánh xạ bộ nhớ, phù hợp để tiếp nhận một lượng lớn dữ liệu.

Xóa một bộ sưu tập

DELETE /collections/{tên_bộ_sưu_tập}

Cập nhật tham số của bộ sưu tập

Cập nhật tham số động có thể hữu ích, chẳng hạn như tải vector ban đầu hiệu quả hơn. Ví dụ, bạn có thể vô hiệu hóa việc đánh chỉ mục trong quá trình tải lên và kích hoạt nó ngay sau khi hoàn tất việc tải lên. Điều này sẽ giúp bạn không lãng phí tài nguyên tính toán để xây dựng lại chỉ mục.

Lệnh sau đây kích hoạt chỉ mục cho một đoạn có chứa vector lớn hơn 10000 kB:

PATCH /collections/{tên_bộ_sưu_tập}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

Các tham số sau đây có thể được cập nhật:

  • optimizers_config - Xem mô tả chi tiết của các trình tối ưu hóa.
  • hnsw_config - Xem mô tả chi tiết của chỉ mục.
  • quantization_config - Xem mô tả chi tiết của lượng tử hóa.
  • vectors - Cấu hình cho các vector cụ thể, bao gồm các thiết lập hnsw_config, quantization_configon_disk tương ứng.
  • params - Các tham số bộ sưu tập khác, bao gồm write_consistency_factoron_disk_payload.

Đặc tả API hoàn chỉnh được đặt ở xác định cấu trúc.

Có sẵn từ v1.4.0

Qdrant 1.4 thêm hỗ trợ cập nhật thêm các tham số của bộ sưu tập trong thời gian chạy. Chỉ mục HNSW, lượng tử hóa và cấu hình đĩa có thể được thay đổi mà không cần tạo lại bộ sưu tập. Các đoạn (với dữ liệu chỉ mục và lượng tử hóa) sẽ tự động xây dựng lại ở nền để phù hợp với các tham số cập nhật.

Trong ví dụ sau, toàn bộ bộ sưu tập và các thông số chỉ mục và lượng tử hóa cho my_vector được cập nhật:

PATCH /collections/{tên_bộ_sưu_tập}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

Lưu ý: Để cập nhật tham số của vector trong một bộ sưu tập không có vector được đặt tên, có thể sử dụng tên rỗng ("").

Các cuộc gọi đến điểm cuối này có thể bị chặn khi chờ đợi tối ưu hóa hiện có hoàn thành. Chúng tôi không khuyến nghị sử dụng tính năng này trong một cơ sở dữ liệu sản xuất vì việc xây dựng lại chỉ mục có thể mang lại overhead đáng kể.

Thông tin Bộ sưu tập

Qdrant cho phép xác định các tham số cấu hình cho một bộ sưu tập hiện có để hiểu rõ hơn về phân phối các điểm và tình hình khám phá chỉ mục.

GET /collections/{tên_bộ_sưu_tập}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

Nếu vectơ được chèn vào bộ sưu tập, trường status có thể thay đổi thành "yellow" trong quá trình tối ưu hóa và sẽ chuyển sang "green" sau khi tất cả các điểm đã được xử lý thành công.

Các trạng thái màu sau có thể gặp phải:

  • ? green: Bộ sưu tập sẵn sàng
  • ? yellow: Bộ sưu tập đang trải qua quá trình tối ưu hóa
  • ? red: Hệ thống đã gặp phải lỗi không thể phục hồi được

Một số thuộc tính khác có tính hữu ích bao gồm:

  • points_count - Tổng số đối tượng (vectơ và dữ liệu gửi kèm của chúng) được lưu trữ trong bộ sưu tập
  • vectors_count - Tổng số vectơ trong bộ sưu tập. Nếu mỗi đối tượng có nhiều vectơ, điều này có thể không bằng points_count.
  • indexed_vectors_count - Tổng số vectơ được lưu trữ trong chỉ mục HNSW. Qdrant không lưu trữ tất cả vectơ trong chỉ mục, chỉ những vectơ có thể tạo các đoạn chỉ mục dựa trên cấu hình được cung cấp.

Chỉ mục các vectơ trong HNSW

Trong một số trường hợp, bạn có thể thấy rằng giá trị của indexed_vectors_count nhỏ hơn vectors_count. Điều này là hành vi có chủ ý tùy thuộc vào cấu hình của trình tối ưu hóa. Một đoạn chỉ mục mới sẽ được xây dựng nếu kích thước của các vectơ chưa được chỉ mục vượt quá indexing_threshold (tính bằng KB). Nếu bộ sưu tập của bạn rất nhỏ hoặc chiều chi của vectơ thấp, các đoạn chỉ mục HNSW có thể không được tạo ra, và indexed_vectors_count có thể bằng 0.

Bạn có thể giảm giá trị của indexing_threshold trong các tham số bộ sưu tập để tạo ra một đoạn chỉ mục mới trong bộ sưu tập hiện tại.

Bí danh Bộ sưu tập

Trong môi trường sản xuất, có thể có nhu cầu chuyển đổi một cách mượt mà giữa các phiên bản vectơ khác nhau, như việc nâng cấp lên một phiên bản mới của các mạng neural.

Trong những trường hợp như vậy, việc dừng dịch vụ và xây dựng lại bộ sưu tập bằng các vectơ mới có thể là không khả thi. Một bí danh là tên bổ sung cho một bộ sưu tập hiện có. Truy vấn có thể được thực hiện hoàn toàn bằng cách sử dụng bí danh thay vì tên bộ sưu tập.

Do đó, một bộ sưu tập thứ hai có thể được xây dựng trong nền, và sau đó bí danh có thể được chuyển từ bộ sưu tập cũ sang bộ sưu tập mới. Do thay đổi bí danh là nguyên tử, các yêu cầu đồng thời không bị ảnh hưởng trong quá trình chuyển đổi.

Tạo Bí danh

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "bộ_sưu_tập_sản_xuất",
                "collection_name": "bộ_sưu_tập_mẫu"
            }
        }
    ]
}

Xóa Bí danh

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "bộ_sưu_tập_sản_xuất"
            }
        }
    ]
}

Chuyển Bộ sưu tập

Nhiều thao tác bí danh có thể được thực hiện một cách nguyên tử. Ví dụ, bạn có thể sử dụng lệnh sau để chuyển bộ sưu tập cơ bản:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "bộ_sưu_tập_sản_xuất"
            }
        },
        {
            "create_alias": {
                "alias_name": "bộ_sưu_tập_sản_xuất",
                "collection_name": "bộ_sưu_tập_mới"
            }
        }
    ]
}

Danh Sách Bí Danh Của Bộ Sưu Tập

GET /collections/{tên_bộ_sưu_tập}/bí_danh

Liệt Kê Tất Cả Bí Danh

GET /bí_danh

Liệt Kê Tất Cả Bộ Sưu Tập

GET /bộ_sưu_tập