Kolekcje

Koncepcja kolekcji w bazie danych wektorowej Qdrant może być analogiczna do struktury tabeli w MYSQL, służącej do jednolitego przechowywania tych samych typów danych wektorowych. Każdy element danych przechowywany w kolekcji jest nazywany punktem w Qdrancie. Tutaj punkt jest podobny do koncepcji matematycznego przestrzeni geometrycznej, reprezentującą wektor w przestrzeni geometrycznej (po prostu rozważmy to jako część danych).

W tej samej kolekcji wektory każdego punktu muszą mieć takie same wymiary i być porównywane za pomocą jednej metryki. Nazwane wektory mogą być wykorzystane do uwzględnienia wielu wektorów w jednym punkcie, z każdym wektorem posiadającym własne wymiary i wymagania metryczne.

Metryki odległości służą do mierzenia podobieństwa między wektorami. Wybór metryki zależy od sposobu uzyskania wektorów, zwłaszcza metody stosowanej przy szkoleniu kodujących sieci neuronowych.

Qdrant obsługuje następujące popularne typy metryk:

  • Iloczyn skalarny: Dot
  • Podobieństwo cosinusowe: Cosine
  • Odległość euklidesowa: Euclid

Aby poprawić efektywność wyszukiwania, podobieństwo cosinusowe jest osiągane poprzez obliczenie iloczynu skalarnego znormalizowanych wektorów. Po przesłaniu, wektory są automatycznie normalizowane. Oprócz metryk i rozmiarów wektorów, każda kolekcja używa również swojego zestawu parametrów do kontroli optymalizacji kolekcji, budowy indeksu oraz czyszczenia. Te ustawienia można w każdej chwili zmienić za pomocą odpowiednich żądań.

Konfiguracja wielofirmowości

Ile kolekcji należy utworzyć? W większości przypadków wystarczy utworzyć pojedynczą kolekcję z partycjonowaniem opartym na ładunku. Ta metoda jest znana jako wielofirmowość. Dla większości użytkowników jest to efektywne, ale wymaga dodatkowej konfiguracji. Dowiedz się, jak skonfigurować wielofirmowość.

Kiedy należy utworzyć wiele kolekcji? Gdy masz ograniczoną liczbę użytkowników i wymagasz izolacji. Ta metoda jest bardziej elastyczna, ale może być droższa, ponieważ utworzenie dużej liczby kolekcji może prowadzić do nadmiernego zużycia zasobów. Dodatkowo, musisz zadbać, aby nie wpływały one w żaden sposób na siebie nawzajem, włącznie z wydajnością.

Tworzenie kolekcji

PUT /kolekcje/{nazwa_kolekcji}

{
    "wektory": {
      "rozmiar": 300,
      "odległość": "Cosine"
    }
}

Oprócz wymaganych opcji, można również określić niestandardowe wartości dla następujących opcji kolekcji:

  • hnsw_config - Szczegóły dotyczące indeksu znajdują się w sekcji indeksu.
  • wal_config - Konfiguracja związana z zapisywaniem dziennika operacji. Aby uzyskać bardziej szczegółowe informacje na temat WAL, proszę się do niego odnieść.
  • optimizers_config - Szczegóły dotyczące optymalizatorów znajdują się w sekcji optymalizatora.
  • shard_number - Określa, ile fragmentów kolekcja powinna mieć. Aby uzyskać więcej informacji, proszę się odnieść do sekcji rozproszonego wdrożenia.
  • on_disk_payload - Określa lokalizację przechowywania danych ładunku. Jeśli ustawione na true, będzie przechowywać ładunek tylko na dysku. Może to być bardzo przydatne do ograniczenia użycia pamięci RAM podczas pracy z dużymi ładunkami.
  • quantization_config - Dla szczegółowych informacji na temat kwantyzacji, proszę się odnieść do kwantyzacji.

Domyślne parametry opcjonalnych parametrów kolekcji są zdefiniowane w pliku konfiguracyjnym.

Dla dalszych informacji na temat parametrów kolekcji i wektorów, proszę zobaczyć definicję schematu i plik konfiguracyjny.

Dostępne od wersji v1.2.0

Wektory są przechowywane w pamięci RAM, aby osiągnąć bardzo szybki dostęp. Parametr on_disk może być ustawiony w konfiguracji wektorów. Jeśli ustawione na true, wszystkie wektory zostaną przechowywane na dysku. Umożliwi to korzystanie z odwzorowania pamięci, co jest odpowiednie do importowania dużych ilości danych.

Tworzenie kolekcji z innej kolekcji

Dostępne od wersji v1.0.0

Kolekcję można zainicjować z istniejącej kolekcji.

Może to być przydatne do szybkiego wypróbowania różnych konfiguracji tych samych danych.

Przy ustawianiu konfiguracji wektorów w nowej kolekcji, upewnij się, że wektory mają ten sam rozmiar i funkcję odległości co w pierwotnej kolekcji.

PUT /kolekcje/{nazwa_kolekcji}

{
    "wektory": {
      "rozmiar": 300,
      "odległość": "Cosine"
    },
    "init_from": {
       "kolekcja": {from_collection_name}
    }
}

Kolekcja wielowektorowa

Dostępna od wersji v0.10.0

Każdy rekord może zawierać wiele wektorów. Ta funkcja umożliwia przechowywanie wielu wektorów w kolekcji. Aby rozróżnić wektory w rekordzie, zdefiniuj ich unikalne nazwy podczas tworzenia kolekcji. Każdy nazwany wektor w tej strukturze ma własny dystans i rozmiar:

PUT /collections/{nazwa_kolekcji}

{
    "vectors": {
        "obraz": {
            "rozmiar": 4,
            "dystans": "Dot"
        },
        "tekst": {
            "rozmiar": 8,
            "dystans": "Cosine"
        }
    }
}

Dla kilku specjalnych przypadków można również utworzyć kolekcję bez przechowywania jakichkolwiek wektorów.

Dostępne od wersji v1.1.1

Dla każdego nazwanego wektora można opcjonalnie określić hnsw_config lub quantization_config, aby odbiegać od konfiguracji kolekcji. Może to zostać wykorzystane do optymalizacji wydajności wyszukiwania na poziomie wektora.

Dostępne od wersji v1.2.0

Wektory są przechowywane w pamięci dla szybkiego dostępu. Dla każdego wektora on_disk można ustawić na true, aby zawsze przechowywać wszystkie wektory na dysku. Umożliwi to odwzorowanie pamięci, odpowiednie do przetwarzania dużych ilości danych.

Usuwanie kolekcji

DELETE /collections/{nazwa_kolekcji}

Aktualizacja parametrów kolekcji

Dynamiczna aktualizacja parametrów może być pomocna, na przykład w bardziej wydajnym początkowym wczytywaniu wektorów. Można na przykład wyłączyć indeksowanie podczas przesyłania danych i włączyć je natychmiast po zakończeniu przesyłania. W ten sposób nie marnujesz dodatkowych zasobów obliczeniowych na przebudowę indeksu.

Poniższa komenda włącza indeksowanie dla segmentu zawierającego wektory większe niż 10000 kB:

PATCH /collections/{nazwa_kolekcji}

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

Można aktualizować następujące parametry:

  • optimizers_config - Zobacz szczegółowe opisy optymalizatorów.
  • hnsw_config - Zobacz szczegółowe opisy indeksu.
  • quantization_config - Zobacz szczegółowe opisy kwantyzacji.
  • vectors - Konfiguracja konkretnych wektorów, włącznie z ich odpowiednimi ustawieniami hnsw_config, quantization_config i on_disk.
  • params - Inne parametry kolekcji, włącznie z write_consistency_factor oraz on_disk_payload.

Pełna specyfikacja API znajduje się w definicjach schematu.

Dostępne od wersji v1.4.0

Wersja Qdrant 1.4 dodaje obsługę aktualizacji większej liczby parametrów kolekcji w czasie działania. Indeks HNSW, kwantyzacja oraz konfiguracja dysku mogą teraz być zmieniane bez konieczności ponownego tworzenia kolekcji. Segmenty (z danymi indeksu i kwantyzacji) zostaną automatycznie przebudowane w tle, aby dopasować się do zaktualizowanych parametrów.

W poniższym przykładzie zostają zaktualizowane cała kolekcja oraz parametry indeksu HNSW i kwantyzacji dla my_vector:

PATCH /collections/{nazwa_kolekcji}

{
    "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
        }
    }
}

Uwaga: Aby aktualizować parametry wektorów w kolekcji bez nazwanych wektorów, można użyć pustej ("") nazwy.

Wywołania tego punktu końcowego mogą blokować, ponieważ czekają na zakończenie istniejących optymalizatorów. Nie zalecamy używania tej funkcji w bazie danych produkcyjnej, ponieważ przebudowa indeksu może wprowadzić znaczący nadmiar.

Informacje o kolekcji

Qdrant umożliwia określenie parametrów konfiguracji istniejącej kolekcji w celu lepszego zrozumienia dystrybucji punktów i sytuacji indeksowania.

GET /collections/{collection_name}

{
    "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
}

Jeśli wektory zostaną wstawione do kolekcji, pole status może zmienić się na "yellow" podczas optymalizacji, a następnie wrócić do "green", gdy wszystkie punkty zostaną pomyślnie przetworzone.

Możliwe są następujące stany kolorów:

  • ? green: Kolekcja jest gotowa
  • ? yellow: Kolekcja przechodzi optymalizację
  • ? red: Silnik napotkał nieodwracalny błąd

Inne interesujące właściwości to:

  • points_count - Całkowita liczba obiektów (wektorów i ich ładunków) przechowywanych w kolekcji
  • vectors_count - Całkowita liczba wektorów w kolekcji. Jeśli każdy obiekt ma wiele wektorów, może się to nie równać points_count.
  • indexed_vectors_count - Całkowita liczba wektorów przechowywanych w indeksie HNSW. Qdrant nie przechowuje wszystkich wektorów w indeksie, tylko te, które mogą tworzyć segmenty indeksu na podstawie podanej konfiguracji.

Indeksowanie wektorów w HNSW

W niektórych przypadkach wartość indexed_vectors_count może być mniejsza niż vectors_count. Jest to intencjonalne zachowanie w zależności od konfiguracji optymalizatora. Nowy segment indeksu zostanie zbudowany, jeśli rozmiar niezaindeksowanych wektorów przekroczy indexing_threshold (w KB). Jeśli Twoja kolekcja jest bardzo mała lub wymiar wektora jest niski, segmenty HNSW mogą nie zostać utworzone, a indexed_vectors_count może równać się 0.

Możesz zmniejszyć wartość indexing_threshold w parametrach kolekcji, aby utworzyć nowy segment indeksu w istniejącej kolekcji.

Aliasy kolekcji

W środowisku produkcyjnym może zachodzić potrzeba płynnego przełączania się między różnymi wersjami wektorów, na przykład aktualizacji do nowej wersji sieci neuronowych.

W tych przypadkach może być niemożliwe zatrzymanie usługi i ponowne zbudowanie kolekcji z użyciem nowych wektorów. Alias to dodatkowa nazwa istniejącej kolekcji. Zapytania można wykonywać za pomocą aliasu zamiast nazwy kolekcji.

Dlatego w tle można zbudować drugą kolekcję, a następnie alias można przełączyć z starej kolekcji na nową kolekcję. Ponieważ zmiany aliasów są atomowe, żądania równoległe nie są dotknięte procesem przełączania.

Tworzenie aliasu

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

Usuwanie aliasu

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

Przełączanie kolekcji

Więcej operacji aliasów można wykonać atomowo. Na przykład można użyć poniższej komendy do przełączenia podstawowej kolekcji:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

Lista aliasów kolekcji

GET /collections/{nazwa_kolekcji}/aliasy

Wyświetl wszystkie aliasy

GET /aliasy

Wyświetl wszystkie kolekcje

GET /kolekcje