Partager via


Quantisation du produit pour la recherche vectorielle dans Azure DocumentDB

La quantisation de produit (PQ) est une technique puissante dans Azure DocumentDB qui compresse considérablement les incorporations de vecteurs à haute dimension utilisées dans la recherche vectorielle. Cette compression réduit l’utilisation de la mémoire et accélère les recherches voisines les plus proches, ce qui améliore l’efficacité des jeux de données vectoriels volumineux. Bien que le PQ offre des avantages pour la vitesse et l’échelle, cela peut être au détriment de la précision.

Avantages

  • Stockage réduit : Le PQ réduit considérablement le stockage nécessaire pour les index vectoriels par rapport aux vecteurs de précision totale (float32), ce qui entraîne des économies substantielles pour les jeux de données volumineux.
  • Recherche plus rapide : L’utilisation de vecteurs compressés permet au système de calculer les distances et de trouver des voisins les plus proches potentiels beaucoup plus rapidement que avec des vecteurs de précision totale.
  • Scalabilité améliorée : Une surcharge de mémoire plus faible permet l'extension de la recherche vectorielle pour gérer des embeddings plus grands et de dimensions plus élevées au sein de votre cluster.

Fonctionnement

La quantisation de produit divise l’espace vectoriel à haute dimension en plusieurs sous-espaces de dimension inférieure. Chaque sous-espace est ensuite quantifié indépendamment à l’aide d’un algorithme de clustering (généralement k-moyennes). Le centre de chaque cluster représente tous les vecteurs qu’il contient. Chaque vecteur d’origine est ensuite représenté par un code court des ID de cluster auquel il appartient dans chaque sous-espace.

Utilisation de la quantisation du produit

Pour créer un index vectoriel avec la quantisation de produit, utilisez la createIndexes commande en spécifiant cosmosSearchOptions et "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
            }
        }
    ]
}
Champ Type Descriptif
compression ficelle Réglez sur "pq" pour activer la quantification de produit.
pqCompressedDims entier Dimensions après la compression PQ (doivent être inférieures aux dimensions d’origine). Calculé automatiquement s’il est omis. Plage : 1 à 8000.
pqSampleSize entier Nombre d’exemples de vecteurs pour l’apprentissage du centroïde PQ. Une valeur plus élevée signifie une meilleure qualité mais un temps de génération plus long. Valeur par défaut : 1000. Plage : 1 000 – 100 000.

Note

La quantisation du produit est actuellement prise en charge uniquement avec le type d’index vector-diskann .

Note

Pour obtenir de meilleurs résultats, créez un index PQ une fois que votre collection a des données. Si la collection est vide, le système utilise des vecteurs aléatoires pour les centroïdes initiaux. Si le nombre de documents est inférieur à pqSampleSize, les données d’apprentissage sont complétées avec des données aléatoires dans la plage de vos données vectorielles existantes.

Définition des dimensions compressées

Si vous ne spécifiez pqCompressedDimspas, il détermine automatiquement en fonction du vecteur dimensionsd’origine :

Plage de dimensions d’origine pqCompressedDims
[0 - 32) dimensions / 2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
au-dessus de 1536 128

Créer un index 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
            }
        }
    ]
} )

Amélioration de la recherche par suréchantillonnage

La compression PQ peut entraîner une perte de précision dans les calculs de distance. Pour réduire ce problème, Azure DocumentDB propose le oversampling paramètre dans l’opérateur $search .

Le facteur oversampling (un nombre à virgule flottante avec un minimum de 1) spécifie combien de vecteurs candidats récupérer depuis l'index compressé, par rapport à k (le nombre de résultats souhaités). Ces candidats supplémentaires sont utilisés pour affiner la recherche à l’aide des vecteurs originaux et de précision complète, améliorant ainsi la précision maximale k finale. Par exemple, pour obtenir les 10 premiers (k=10) les vecteurs les plus similaires, une bonne pratique peut être de définir oversampling une valeur telle que 1,5 ou 2.0. Avec "oversampling": 1.5, le système obtiendrait d’abord 15 candidats à partir de l’index, puis affinerait les 10 premiers à l’aide des données de précision complète.

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

Cet extrait de code illustre une recherche vectorielle à l’aide de l’opérateur $search avec la quantification par produit. Il prend une queryVector entrée et recherche le v champ. La requête demande les 10 documents les plus similaires (k: 10), à l’aide d’un oversampling facteur de 2,0, qui récupère 20 candidats améliorant la précision de la recherche sur l’index compressé.

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

Demi-précision et Quantification du produit

La quantification en demi-précision et la quantification produit (PQ) compressent toutes deux les index vectoriels dans Azure DocumentDB, mais elles diffèrent dans la manière dont elles réalisent la compression et affectent la recherche :

Caractéristique Demi-précision Quantisation du produit (PQ)
Méthode de compression Réduit chaque dimension de vecteur à 16 bits. Divise l’espace vectoriel en sous-espaces et quantifie chacun d’eux.
Dimensions maximales Jusqu’à 4 000 Jusqu’à 16 000
Changement de précision Légère perte due à une faible profondeur de bits. Perte potentiellement plus grande, configurable via pqCompressedDims.
Vitesse de recherche Augmentation modérée de la vitesse due à un index plus petit. Augmentation significative de la vitesse due à des vecteurs fortement compressés.
Heure de génération de l’index Relativement rapide. Peut être plus long en raison de la formation du centroïde (pqSampleSize).
Prise en charge des index HNSW, IVF. DiskANN.
Configuration Simple, activez compression: "half". Autres paramètres : pqCompressedDims, pqSampleSize.
Utilisation du suréchantillonnage Aide avec une perte de précision mineure. Essentiel pour récupérer la précision à partir d’une compression plus grande.
Cas d’usage idéaux Réduction modérée de la mémoire, dimensions accrues, compromis de précision acceptable. Jeux de données volumineux, dimensions élevées, recherche rapide hiérarchisée, précision gérée avec surachantillonnage.

Considérations relatives à la quantisation du produit

  • Précision et compression : Une compression PQ plus élevée entraîne des index plus petits et une recherche plus rapide, mais une perte de précision accrue. Expérimentez avec pqCompressedDims et oversampling pour trouver le bon équilibre.
  • Heure de génération de l’index : La création d’index PQ peut prendre plus de temps en raison du processus de formation centroïde, influencé par pqSampleSize.
  • Distribution des données : Le PQ fonctionne mieux lorsque les données vectorielles ont une structure de cluster claire.

Étapes suivantes