Freigeben über


Produktquantisierung für die Vektorsuche in Azure DocumentDB

Die Produktquantisierung (Product Quantization, PQ) ist eine leistungsstarke Technik in Azure DocumentDB, die hochdimensionale Vektoreinbettungen erheblich komprimiert, die in der Vektorsuche verwendet werden. Diese Komprimierung reduziert die Speichernutzung und beschleunigt die Suchen nach dem nächsten Nachbarn, wodurch die Effizienz für große Vektordatensätze verbessert wird. Während PQ Vorteile für Geschwindigkeit und Skalierung bietet, kann es auf Kosten der Genauigkeit kommen.

Vorteile

  • Reduzierter Speicher: PQ verringert den für Vektorindizes benötigten Speicher erheblich im Vergleich zu Float32-Vektoren mit voller Genauigkeit, was zu erheblichen Kosteneinsparungen für große Datasets führt.
  • Schnellere Suche: Die Arbeit mit komprimierten Vektoren ermöglicht es dem System, Entfernungen zu berechnen und potenzielle nächste Nachbarn viel schneller zu finden als bei Vollpräzisionsvektoren.
  • Verbesserte Skalierbarkeit: Geringerer Arbeitsspeicheraufwand ermöglicht die Skalierungsvektorsuche, um größere und mehrdimensionale Einbettungen in Ihrem Cluster zu verarbeiten.

Funktionsweise

Die Produktquantisierung teilt den hochdimensionalen Vektorraum in mehrere unterdimensionale Unterräume auf. Jeder Unterraum wird dann unabhängig mit einem Clustering-Algorithmus (in der Regel k-means) quantisiert. Die Mitte jedes Clusters stellt alle Vektoren darin dar. Jeder ursprüngliche Vektor wird dann durch einen kurzen Code der Cluster-IDs dargestellt, zu denen er in jedem Unterbereich gehört.

Verwenden der Produktquantisierung

Verwenden Sie zum Erstellen eines Vektorindex mit Produktquantisierung den createIndexes Befehl mit der Angabe "compression": "pq" und "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
            }
        }
    ]
}
Feld Typ Description
compression Schnur Setzen Sie auf "pq", um die Produktquantisierung zu aktivieren.
pqCompressedDims integer Dimensionen nach der PQ-Komprimierung (müssen kleiner als originale Abmessungen sein). Wird automatisch berechnet, wenn sie weggelassen wird. Bereich: 1-8000.
pqSampleSize integer Anzahl der Beispielvektoren für die PQ-Zentroidbestimmung. Höherer Wert bedeutet eine bessere Qualität, aber längere Buildzeit. Standard: 1000. Bereich: 1000-100000.

Hinweis

Die Produktquantisierung wird derzeit nur mit dem vector-diskann Indextyp unterstützt.

Hinweis

Um optimale Ergebnisse zu erzielen, erstellen Sie einen PQ-Index, nachdem Ihre Sammlung Daten enthält. Wenn die Sammlung leer ist, verwendet das System Zufallsvektoren für anfängliche Schwerpunkte. Wenn die Anzahl der Dokumente kleiner als pqSampleSizeist, werden die Schulungsdaten mit zufälligen Daten innerhalb des Bereichs Ihrer vorhandenen Vektordaten aufgefüllt.

Wie komprimierte Abmessungen festgelegt werden

Wenn Sie pqCompressedDims nicht spezifizieren, wird es automatisch basierend auf dem ursprünglichen Vektor dimensions bestimmt.

Originaler Dimensionsbereich pqCompressedDims
[0 - 32) Abmessungen / 2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
über 1536 128

Erstellen eines PQ-Indexes

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
            }
        }
    ]
} )

Verbessern der Suche mit Oversampling

Die PQ-Komprimierung kann zu Genauigkeitsverlusten bei Entfernungsberechnungen führen. Um dies zu verringern, bietet Azure DocumentDB den oversampling Parameter im $search Operator an.

Der oversampling Faktor (ein Gleitkomma mit mindestens 1) gibt an, wie viele weitere Kandidatenvektoren aus dem komprimierten Index abgerufen werden sollen als k (die Anzahl der gewünschten Ergebnisse). Diese zusätzlichen Kandidaten werden verwendet, um die Suche mithilfe der ursprünglichen Vektoren mit vollständiger Genauigkeit zu verfeinern und die endgültige Spitzengenauigkeit k zu verbessern. Um beispielsweise die top 10 (k=10) ähnlichsten Vektoren abzurufen, empfiehlt es sich, einen Wert wie oversampling oder 2,0 festzulegen. Mit "oversampling": 1.5 würde das System zuerst 15 Kandidaten aus dem Index abfragen und dann die besten 10 mit vollpräzisen Daten optimieren.

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

Dieser Codeausschnitt veranschaulicht eine Vektorsuche mithilfe des $search Operators mit Produktquantisierung. Es benötigt eine queryVector Eingabe und durchsucht das v Feld. Die Abfrage fordert die 10 am häufigsten ähnlichen Dokumente (k: 10) mit einem oversampling Faktor von 2,0 an, der 20 Kandidaten abruft, die die Genauigkeit der Suche über den komprimierten Index verbessern.

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 im Vergleich zur Produkt quantisierung

Sowohl Halbgenauigkeit als auch die PQ-Komprimierung (Product Quantization) komprimieren Vektorindizes in Azure DocumentDB, unterscheiden sich jedoch darin, wie sie die Komprimierung erreichen und sich auf die Suche auswirken:

Merkmal Halbpräzision Produktquantisierung (PQ)
Compression-Methode Reduziert jede Vektordimension auf 16 Bit. Dividiert den Vektorraum in Unterspaces und quantisiert die einzelnen Vektorräume.
Max. Abmessungen Bis zu 4.000 Bis zu 16.000
Genauigkeitsänderung Leichter Verlust aufgrund niedrigerer Bittiefe. Potenziell größerer Verlust, konfigurierbar über pqCompressedDims.
Suchgeschwindigkeit Moderate Geschwindigkeitssteigerung aufgrund kleinerer Index. Erhebliche Geschwindigkeitssteigerung durch hochkomprimierte Vektoren.
Indexerstellungszeit Relativ schnell. Kann aufgrund des Zentroid-Trainings (pqSampleSize) länger sein.
Indexunterstützung HNSW, IVF. DiskANN.
Configuration Einfach, aktivieren Sie compression: "half". Weitere Parameter: pqCompressedDims, pqSampleSize.
Oversampling-Verwendung Hilft bei geringfügigen Genauigkeitsverlusten. Wichtig für die Wiederherstellung der Genauigkeit bei starker Komprimierung.
Ideale Anwendungsfälle Moderate Speicherreduzierung, erhöhte Dimensionen, akzeptable Genauigkeitsabnahme. Große Datensätze, hochdimensionale Daten, schnelle Suche priorisiert, Präzision durch Übersampling gesteuert.

Überlegungen zur Produktquantisierung

  • Genauigkeit im Vergleich zur Komprimierung: Eine höhere PQ-Komprimierung führt zu kleineren Indizes und schnelleren Suchvorgängen, aber zu einem höheren Genauigkeitsverlust. Experimentieren Sie mit pqCompressedDims und oversampling, und finden Sie das richtige Gleichgewicht.
  • Index-Erstellungszeit: Die Erstellung von PQ-Indexen kann länger dauern aufgrund des Zentroidentrainings, beeinflusst von pqSampleSize.
  • Datenverteilung: PQ funktioniert am besten, wenn Vektordaten eine klare Clusterstruktur aufweisen.

Nächste Schritte