Compartir vía


Comprimir vectores mediante cuantificación escalar o binaria

Azure AI Search admite la cuantificación escalar y binaria para reducir el tamaño de los vectores en un índice de búsqueda. Se recomienda la cuantificación para reducir el tamaño del vector porque reduce tanto el consumo de memoria como el almacenamiento en disco para las inserciones float16 y float32. Para desplazar los efectos de la compresión de pérdida, puede agregar sobremuestreo y recorción sobre vectores sin comprimir.

Para usar la cuantificación integrada, siga estos pasos:

  • Comience con campos vectoriales y unavectorSearchconfiguración a un índice
  • Agregue vectorSearch.compressions.
  • Agregue una scalarQuantization configuración o binaryQuantization y asígnele un nombre.
  • Establezca propiedades opcionales para mitigar los efectos de la indexación perdida.
  • Crear un nuevo perfil de vector que use la configuración con nombre
  • Creación de un nuevo campo de vector con el nuevo perfil de vector
  • Cargar el índice con datos float32 o float16 que se cuantifican durante la indexación con la configuración definida
  • Opcionalmente, consulte los datos cuantificados mediante el parámetro de sobremuestreo si desea invalidar el valor predeterminado.

Requisitos previos

  • Campos vectores de un índice de búsqueda con una configuración de vectorSearch, usando los algoritmos jerárquicos de pequeños mundos navegables (HNSW) o los algoritmos K-vecinos más cercanos (eKNN) y un nuevo perfil de vector.

Técnicas de cuantificación admitidas

La cuantificación se aplica a los campos vectoriales que reciben vectores de tipo float. En los ejemplos de este artículo, el tipo de datos del campo es Collection(Edm.Single) para incrustaciones entrantes float32, pero también se admite float16. Cuando los vectores se reciben en un campo con compresión configurada, el motor realiza automáticamente la cuantificación para reducir la superficie de los datos vectoriales en la memoria y en el disco.

Se admiten dos tipos de cuantificación:

  • La cuantificación escalar comprime los valores float en tipos de datos más estrechos. Ai Search admite actualmente int8, que es de 8 bits, lo que reduce el tamaño del índice vectorial cuatro veces.

  • La cuantificación binaria convierte los floats en bits binarios, que ocupa 1 bit. Esto da como resultado un tamaño de índice vectorial reducido hasta 28 veces menor.

Agregar "compresión" a un índice de búsqueda

En el ejemplo siguiente se muestra una definición de índice parcial con una colección de campos que incluye un campo vectorial y una sección vectorSearch.compressions.

Incluye tanto scalarQuantization o binaryQuantization. Puede especificar tantas configuraciones de compresión como necesite y, a continuación, asignar las que desee a un perfil de vector.

La sintaxis de vectorSearch.Compressions varía entre las API de REST estables y en versión preliminar, con la versión preliminar agregando nuevas opciones para la optimización del almacenamiento, además de cambios en la sintaxis existente. La compatibilidad con versiones anteriores se conserva a través de asignaciones de API internas, pero debe adoptar la nueva sintaxis en el código que tiene como destino 2024-11-01-preview y versiones futuras.

Use la API de REST Crear índice o Crear o actualizar índice para configurar las opciones de compresión.

POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01

{
  "name": "my-index",
  "fields": [
    { "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
    { "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
    { "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
  ],
  "vectorSearch": {
        "profiles": [ ],
        "algorithms": [ ],
        "compressions": [
          {
            "name": "use-scalar",
            "kind": "scalarQuantization",
            "scalarQuantizationParameters": {
              "quantizedDataType": "int8"
            },
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          },
          {
            "name": "use-binary",
            "kind": "binaryQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          }
        ]
    }
}

Puntos clave:

  • kind debe establecerse en scalarQuantization o binaryQuantization.

  • rerankWithOriginalVectors usa los vectores sin comprimir originales para recalcular la similitud y volver a generar los resultados principales devueltos por la consulta de búsqueda inicial. Los vectores sin comprimir existen en el índice de búsqueda aunque stored sea false. Esta propiedad es opcional. El valor predeterminado es true.

  • defaultOversampling considera un conjunto más amplio de resultados potenciales para compensar la reducción de la información de la cuantificación. La fórmula para los posibles resultados consta de la k en la consulta, con un multiplicador de sobremuestreo. Por ejemplo, si la consulta especifica una k de 5 y el sobremuestreo es 20, la consulta solicita eficazmente 100 documentos para su uso en la reedición, y utiliza el vector sin comprimir original para ese propósito. Solo se devuelven los mejores k resultados reclasificados. Esta propiedad es opcional. El valor predeterminado es 4.

  • quantizedDataType es opcional y solo se aplica a la cuantificación escalar. Si lo agrega, debe establecerse en int8. Este es el único tipo de datos primitivo admitido para la cuantificación escalar en este momento. El valor predeterminado es int8.

Adición del algoritmo de búsqueda vectorial

Puede usar el algoritmo HNSW o KNN exhaustivo en la API de REST 2024-11-01-preview. Para la versión estable, use solo HNSW.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Creación y asignación de un nuevo perfil de vector

Para usar una nueva configuración de cuantificación, debe crear un nuevo perfil de vector. La creación de un nuevo perfil de vector es necesaria para crear índices comprimidos en memoria. El nuevo perfil usa HNSW.

  1. En la misma definición de índice, cree un nuevo perfil de vector y agregue una propiedad de compresión y un algoritmo. Estos son dos perfiles, uno para cada enfoque de cuantificación.

    "vectorSearch": {
        "profiles": [
           {
              "name": "vector-profile-hnsw-scalar",
              "compression": "use-scalar", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           },
           {
              "name": "vector-profile-hnsw-binary",
              "compression": "use-binary", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           }
         ],
         "algorithms": [  <see previous section> ],
         "compressions": [ <see previous section> ] 
    }
    
  2. Asigne un perfil de vector a un nuevo campo vectorial. El tipo de datos del campo es float32 o float16.

    En Azure AI Search, los equivalentes en el Modelo de Datos de Entidades (EDM) de los tipos float32 y float16 son Collection(Edm.Single) y Collection(Edm.Half), respectivamente.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Cargue el índice mediante indexadores para la indexación de modelos de extracción o API para la indexación de modelos de inserción.

La cuantificación escalar reduce la resolución de cada número dentro de cada inserción de vectores. En lugar de describir cada número como un número de coma flotante de 16 o 32 bits, utiliza un número entero de 8 bits. Identifica un rango de números (normalmente percentil 99 mínimo y máximo) y los divide en un número finito de niveles o rangos, asignando a cada contenedor un identificador. En la cuantificación escalar de 8 bits, hay 2^8 o 256 rangos posibles.

Cada componente del vector se asigna al valor representativo más cercano dentro de este conjunto de niveles de cuantificación en un proceso similar a redondear un número real al entero más cercano. En el vector cuantificado de 8 bits, el número de identificador se sitúa en lugar del valor original. Después de la cuantificación, cada vector se representa mediante una matriz de identificadores para los contenedores a los que pertenecen sus componentes. Estos vectores cuantificados requieren muchos menos bits para almacenarse en comparación con el vector original, lo que reduce los requisitos de almacenamiento y la huella de memoria.

La cuantificación binaria comprime vectores de alta dimensión mediante la representación de cada componente como un solo bit, ya sea 0 o 1. Este método reduce drásticamente la superficie de memoria y acelera las operaciones de comparación de vectores, que son cruciales para las tareas de búsqueda y recuperación. Las pruebas comparativas muestran una reducción del 96 % en el tamaño del índice vectorial.

Es especialmente eficaz para las incrustaciones con dimensiones mayores que 1024. Para dimensiones más pequeñas, se recomienda probar la calidad de la cuantificación binaria o probar escalar en su lugar. Además, hemos encontrado que BQ funciona muy bien cuando las incrustaciones se centran alrededor de cero. Los modelos de inserción más populares, como OpenAI, Cohere y Mistral, se centran alrededor de cero.

Consulta de un campo vectorial cuantificado mediante el sobremuestreo

La sintaxis de consulta para un campo vectorial comprimido o cuantificado es la misma que para los campos vectoriales no comprimidos, a menos que desee invalidar los parámetros asociados con el sobremuestreo o la corrección con vectores originales.

Recuerde que la definición de compresión de vector en el índice tiene configuración para rerankWithOriginalVectors y defaultOversampling para mitigar los efectos de la compresión perdida. Puede invalidar los valores predeterminados para variar el comportamiento en el momento de la consulta. Por ejemplo, si defaultOversampling es 10,0, puede cambiarlo a otra cosa en la solicitud de consulta.

Puede establecer el parámetro de sobremuestreo aunque el índice no tenga explícitamente una definición rerankWithOriginalVectors o defaultOversampling. Proporcionar oversampling en tiempo de consulta invalida la configuración de índice para esa consulta y ejecuta la consulta con un valor efectivo rerankWithOriginalVectors como true.

POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01

{    
    "vectorQueries": [
        {    
            "kind": "vector",    
            "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
            "fields": "myvector",
            "oversampling": 12.0,
            "k": 5   
        }
  ]    
}

Puntos clave:

  • Se aplica a campos vectoriales que se someten a compresión vectorial, según la asignación del perfil vectorial.

  • Invalida el valor defaultOversampling o introduce el sobremuestreo en el momento de la consulta, incluso aunque en la configuración de compresión del índice no se especificaran opciones de sobremuestreo o reclasificación.