Compartir a través de


Cuantificación de productos para búsqueda vectorial en Azure Cosmos DB para MongoDB vCore

La cuantificación de productos (PQ) es una técnica eficaz en Azure Cosmos DB para núcleo virtual de MongoDB que comprime significativamente las incrustaciones de vectores de alta dimensión que se usan en la búsqueda vectorial. Esta compresión reduce el uso de memoria y acelera las búsquedas de vecinos más cercanos, lo que mejora la eficacia de los conjuntos de datos vectoriales de gran tamaño. Aunque PQ ofrece ventajas para la velocidad y la escala, puede ser a expensas de la precisión.

Ventajas

  • Almacenamiento reducido: PQ reduce considerablemente el almacenamiento necesario para los índices vectoriales en comparación con los vectores de precisión completa (float32), lo que da lugar a un ahorro considerable de costos para grandes conjuntos de datos.
  • Búsqueda más rápida: Trabajar con vectores comprimidos permite al sistema calcular distancias y encontrar posibles vecinos más cercanos mucho más rápido que con vectores de precisión completa.
  • Escalabilidad mejorada: La menor sobrecarga de memoria permite que la búsqueda de vectores escalable gestione incrustaciones más grandes y de mayor dimensionalidad dentro de su clúster.

Cómo funciona

La cuantificación del producto divide el espacio vectorial de alta dimensión en varios subespacios dimensionales inferiores. Cada subespacio se cuantifica de forma independiente mediante un algoritmo de agrupación en clústeres (normalmente k-means). El centro de cada clúster representa todos los vectores que contiene. A continuación, cada vector original se representa mediante un código corto de los identificadores de clúster a los que pertenece en cada subespacio.

Uso de la cuantificación de productos

Para crear un índice vectorial con cuantización del producto, utilice el comando createIndexes con cosmosSearchOptions especificando "compression": "pq" y "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
            }
        }
    ]
}
Campo Tipo Descripción
compression cuerda / cadena Establézcalo en "pq" para habilitar la cuantificación de productos.
pqCompressedDims entero Dimensiones después de la compresión PQ (debe ser menor que las dimensiones originales). Se calcula automáticamente si se omite. Intervalo: 1-8000.
pqSampleSize entero Número de vectores de muestra para el entrenamiento del centroide PQ. Un valor mayor significa una mejor calidad, pero mayor tiempo de compilación. Valor predeterminado: 1000. Rango: 1000-100000.

Nota:

La cuantificación de productos solo se admite actualmente con el tipo de vector-diskann índice.

Nota:

Para obtener los mejores resultados, cree un índice PQ después de que la recopilación tenga datos. Si la colección está vacía, el sistema usa vectores aleatorios para los centroide iniciales. Si el número de documentos es menor que pqSampleSize, los datos de entrenamiento se rellenan con datos aleatorios dentro del intervalo de los datos vectoriales existentes.

Cómo se establecen las dimensiones comprimidas

Si no especifica pqCompressedDims, determina automáticamente en función del vector dimensionsoriginal :

Intervalo de dimensiones original pqCompressedDims
[0 - 32) dimensiones/2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
por encima de 1536 128

Creación de un índice 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
            }
        }
    ]
} )

Mejora de la búsqueda con sobremuestreo

La compresión PQ puede provocar una pérdida de precisión en los cálculos de distancia. Para reducir esto, Azure Cosmos DB para MongoDB (núcleo virtual) ofrece el parámetro oversampling en el operador $search.

El oversampling factor (un valor flotante con un mínimo de 1) especifica cuántos más vectores candidatos se recuperarán del índice comprimido que k (el número de resultados deseados). Estos candidatos adicionales se usan para refinar la búsqueda mediante los vectores originales de precisión completa, lo que mejora la precisión final del k superior. Por ejemplo, para obtener los 10 principales vectores (k=10) más similares, un procedimiento recomendado podría ser establecer oversampling en un valor como 1,5 o 2,0. Con "oversampling": 1.5, el sistema obtendría primero 15 candidatos del índice y, a continuación, refinaría los 10 primeros con los datos de precisión completa.

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

Este fragmento de código muestra una búsqueda vectorial mediante el $search operador con la cuantificación de productos. Toma un queryVector como entrada y busca en el campo v. La consulta solicita los 10 documentos más similares (k: 10), utilizando un oversampling factor de 2.0, que recupera 20 candidatos que mejoran la precisión de la búsqueda en el índice comprimido.

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 vs. cuantización de producto

Tanto la precisión media como la cuantificación de productos (PQ) comprimen los índices de vectores en Azure Cosmos DB para MongoDB (núcleo virtual), pero difieren en cómo logran la compresión y afectan a la búsqueda:

Característica Precisión media Cuantificación de productos (PQ)
Método de Compresión Reduce cada dimensión vectorial a 16 bits. Divide el espacio vectorial en subespacios y cuantifica cada uno.
Dimensiones máximas Hasta 4000 Hasta 16 000
Cambio de precisión Pérdida leve debido a una profundidad de bits inferior. Pérdida potencialmente mayor, configurable mediante pqCompressedDims.
Velocidad de búsqueda Aumento de velocidad moderada debido a un índice más pequeño. Aumento significativo de la velocidad debido a vectores altamente comprimidos.
Tiempo de compilación del índice Relativamente rápido. Puede ser más largo debido al entrenamiento del centroide (pqSampleSize).
Compatibilidad con índices HNSW, IVF. DiskANN.
Configuración Sencillo, habilite compression: "half". Más parámetros: pqCompressedDims, pqSampleSize.
Uso de sobremuestreo Ayuda con una pérdida de precisión menor. Esencial para recuperar la precisión de una compresión mayor.
Casos de uso ideales Reducción moderada de la memoria, aumento de las dimensiones, equilibrio de precisión aceptable. Grandes conjuntos de datos, dimensiones altas, búsqueda rápida priorizada, precisión administrada con sobremuestreo.

Consideraciones para la cuantificación de productos

  • Precisión frente a compresión: Una mayor compresión PQ conduce a índices más pequeños y una búsqueda más rápida, pero una mayor pérdida de precisión. Experimente con pqCompressedDims y oversampling para encontrar el equilibrio correcto.
  • Tiempo de compilación del índice: La creación de índices PQ puede tardar más tiempo debido al proceso de entrenamiento centroide, influenciado por pqSampleSize.
  • Distribución de datos: PQ funciona mejor cuando los datos vectoriales tienen una estructura de clúster clara.

Pasos siguientes