Udostępnij przez


Kwantyzacja produktu na potrzeby wyszukiwania wektorów w usłudze Azure DocumentDB

Kwantyzacja produktu (PQ) to zaawansowana technika w usłudze Azure DocumentDB, która znacząco kompresuje osadzanie wektorów o wysokim wymiarach używane w wyszukiwaniu wektorowym. Ta kompresja zmniejsza użycie pamięci i przyspiesza wyszukiwanie najbliższych sąsiadów, zwiększając wydajność dużych zestawów danych wektorów. Chociaż PQ oferuje korzyści z szybkości i skali, może to być kosztem dokładności.

Korzyści

  • Zmniejszona ilość miejsca do magazynowania: PQ znacznie obniża magazyn potrzebny do indeksów wektorów w porównaniu z wektorami o pełnej precyzji (float32), co prowadzi do znacznych oszczędności kosztów dla dużych zestawów danych.
  • Szybsze wyszukiwanie: Praca ze skompresowanymi wektorami umożliwia systemowi obliczanie odległości i znajdowanie potencjalnych najbliższych sąsiadów znacznie szybciej niż w przypadku wektorów o pełnej precyzji.
  • Ulepszona skalowalność: Mniejsze obciążenie pamięci umożliwia skalowanie wyszukiwania wektorów w celu obsługi większych i bardziej wymiarowych osadzania w klastrze.

Jak to działa

Kwantyzacja produktu dzieli przestrzeń wektorów o dużej wymiarach na kilka przestrzeni podrzędnych o małych wymiarach. Każda podprzestrzeń jest następnie kwantyzowana niezależnie przy użyciu algorytmu klastrowania (zazwyczaj k-średnich). Środek każdego klastra reprezentuje wszystkie wektory w nim. Każdy oryginalny wektor jest następnie reprezentowany przez krótki kod identyfikatorów klastra, do których należy w każdej podprzestrzeni.

Używanie kwantyzacji produktu

Aby utworzyć indeks wektora z kwantyzacją produktu, użyj createIndexes polecenia z cosmosSearchOptions określeniem "compression": "pq" i "kind" : "vector-diskann":

{
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "<string_value>", // "COS", "L2"
                "dimensions": <integer_value>, // Max 16,000
                "compression": "pq",
                "pqCompressedDims": <integer_value>, // Dimensions after compression (< original)
                "pqSampleSize": <integer_value>    // Samples for centroid generation
            }
        }
    ]
}
(No changes needed) Typ Description
compression ciąg Ustaw "pq", aby włączyć kwantyzację produktów.
pqCompressedDims liczba całkowita Wymiary po kompresji PQ (muszą być mniejsze niż oryginalne wymiary). Automatycznie obliczane w przypadku pominięcia. Zakres: 1–8000.
pqSampleSize liczba całkowita Liczba przykładowych wektorów do trenowania centroidów PQ. Wyższa wartość oznacza lepszą jakość, ale dłuższy czas kompilacji. Wartość domyślna: 1000. Zakres: 1000-100000.

Uwaga / Notatka

Kwantyzacja produktu jest obecnie obsługiwana tylko w przypadku typu indeksu vector-diskann .

Uwaga / Notatka

Aby uzyskać najlepsze wyniki, utwórz indeks PQ po zebraniu danych w kolekcji. Jeśli kolekcja jest pusta, system używa losowych wektorów dla początkowych centroidów. Jeśli liczba dokumentów jest mniejsza niż pqSampleSize, dane szkoleniowe są dopełniane losowymi danymi w zakresie istniejących danych wektorowych.

Jak ustawiane są skompresowane wymiary

Jeśli nie określisz pqCompressedDimsparametru , zostanie on automatycznie określony na podstawie oryginalnego wektora dimensions:

Oryginalny zakres wymiarów pqCompressedDims
[0 - 32) wymiary/2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
powyżej 1536 128

Tworzenie indeksu PQ

db.runCommand(
{
    "createIndexes": "your_vector_collection",
    "indexes": [
        {
            "key": { "v": "cosmosSearch" },
            "name": "diskann_pq_index",
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "COS",
                "dimensions": 1536,
                "compression": "pq",
                "pqCompressedDims": 96,
                "pqSampleSize": 2000
            }
        }
    ]
} )

Ulepszanie wyszukiwania za pomocą nadpróbkowania

Kompresja PQ może prowadzić do utraty dokładności w obliczeniach odległości. Aby to zmniejszyć, usługa Azure DocumentDB oferuje parametr oversampling w operatorze $search.

Współczynnik oversampling (liczba zmiennoprzecinkowa z co najmniej wartością 1) określa, o ile więcej wektorów kandydatów należy pobrać ze skompresowanego indeksu niż wynosi liczba pożądanych wyników k. Te dodatkowe kandydaty są używane do uściślenia wyszukiwania przy użyciu oryginalnych, wektorów pełnej precyzji, co poprawia ostateczną najwyższą k dokładność. Na przykład aby uzyskać 10 pierwszych (k=10) najbardziej podobnych wektorów, dobrym najlepszym rozwiązaniem może być ustawienie oversampling wartości takiej jak 1.5 lub 2.0. W systemie "oversampling": 1.5 najpierw uzyskano 15 kandydatów z indeksu, a następnie uściślono 10 pierwszych przy użyciu danych o pełnej precyzji.

{
    "$search": {
        "cosmosSearch": {
            "vector": <vector_to_search>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "oversampling": <float_value> 
        },
    }
}

Ten fragment kodu przedstawia wyszukiwanie wektorów przy użyciu $search operatora z kwantyzacją Produktu. queryVector Przyjmuje ono jako dane wejściowe i wyszukuje v pole. Zapytanie żąda 10 najbardziej podobnych dokumentów (k: 10), używając współczynnika oversampling o wartości 2.0, co pobiera 20 kandydatów, zwiększając dokładność wyszukiwania przez skompresowany indeks.

db.your_vector_collection.aggregate([
    {
        $search: {
            "cosmosSearch": {
                "vector": [0.1, 0.5, 0.9, ...],
                "path": "v",
                "k": 10,
                "oversampling": 2.0 // Retrieve 2 * 10 = 20 candidates for reranking
            },
            "returnStoredSource": true
        }
    }
])

Half-Precision a kwantyzacja produktu

Zarówno połowa precyzji, jak i kwantyzacja produktu (PQ) kompresują indeksy wektorów w usłudze Azure DocumentDB, ale różnią się one sposobem osiągnięcia kompresji i wpływem na wyszukiwanie.

Funkcja Półprecyzja Kwantyzacja produktu (PQ)
Metoda kompresji Zmniejsza każdy wymiar wektora do 16 bitów. Dzieli przestrzeń wektorową na przestrzenie podrzędne i kwantyzuje każde z nich.
Maksymalna liczba wymiarów Do 4 000 Do 16 000
Zmiana precyzji Niewielka utrata ze względu na niższą głębokość bitów. Potencjalnie większa utrata, którą można skonfigurować za pomocą polecenia pqCompressedDims.
Szybkość wyszukiwania Umiarkowany wzrost szybkości z powodu mniejszego indeksu. Znaczna szybkość zwiększa się z powodu wysoce skompresowanych wektorów.
Czas kompilacji indeksu Stosunkowo szybko. Może trwać dłużej z powodu treningu centrycznego (pqSampleSize).
Obsługa indeksów HNSW, IVF. DiskANN.
Configuration Prosto, włącz compression: "half". Więcej parametrów: pqCompressedDims, pqSampleSize.
Użycie oversamplingu Pomaga przy niewielkiej utracie precyzji. Niezbędne do odzyskania dokładności z większej kompresji.
Idealne przypadki użycia Umiarkowana redukcja pamięci, zwiększone wymiary, akceptowalny kompromis precyzji. Duże zestawy danych, wysoka wymiarowość, priorytet dla szybkiego wyszukiwania, precyzja zarządzana za pomocą nadpróbkowania.

Zagadnienia dotyczące kwantyzacji produktu

  • Precyzja a kompresja: Wyższa kompresja PQ prowadzi do mniejszych indeksów i szybszego wyszukiwania, ale większej utraty precyzji. Poeksperymentuj z elementem pqCompressedDims i oversampling , aby znaleźć właściwą równowagę.
  • Czas kompilacji indeksu: Tworzenie indeksu PQ może trwać dłużej ze względu na proces trenowania centroidów, na który wpływ ma pqSampleSize.
  • Dystrybucja danych: PQ działa najlepiej, gdy dane wektorowe mają czystą strukturę klastra.

Dalsze kroki