Indexer les vecteurs binaires pour la recherche vectorielle

Recherche Azure AI prend en charge un type binaire compressé de Collection(Edm.Byte) pour réduire davantage l’empreinte mémoire et le stockage des données vectorielles. Vous pouvez utiliser ce type de données pour la sortie des modèles tels que les modèles d’incorporation binaires Embed v3 de Cohere.

La configuration d’un index pour les données vecteurs se fait au moyen de trois étapes :

  • Ajouter un algorithme de recherche vectorielle qui spécifie la distance de Hamming pour la comparaison de vecteurs binaires
  • Ajouter un profil vectoriel qui pointe vers l’algorithme
  • Ajouter le profil vectoriel à la définition de votre champ binaire

Cet article part du principe que vous savez comment créer un index dans Recherche Azure AI. Les API REST servent à illustrer chaque étape, mais vous pouvez également ajouter un champ binaire à un index dans le Portail Azure.

Les types de données binaires sont généralement disponibles à partir de la version d’API 2024-07-01 et sont affectés aux champs à l’aide des APIs Créer un index ou Créer ou mettre à jour l’index.

Conseil

Si vous examinez la prise en charge des vecteurs binaires pour sa plus petite empreinte, vous pouvez également prendre en compte les fonctionnalités de quantisation de vecteur et de réduction du stockage dans Recherche Azure AI. Les entrées sont des incorporations float32 ou float16. La sortie est stockée dans un format beaucoup plus petit. Pour plus d’informations, consultez Réduire la taille de vecteurs via la quantification, les types de données étroits et les options de stockage.

Prérequis

  • Vecteurs binaires, avec 1 bit par dimension, emballés dans les valeurs uint8 avec 8 bits par valeur. Ils peuvent être obtenus en utilisant des modèles qui génèrent directement des vecteurs « binaires emballés », ou en quantifiant les vecteurs en vecteurs binaires côté client lors de l'indexation et de la recherche.

Limites

  • Pas de prise en charge du Portail Azure dans l’Assistant Importer et vectoriser des données.
  • Aucune prise en charge des champs binaires dans la compétence AML utilisée pour la vectorisation intégrée des modèles dans le catalogue des modèles Azure AI Studio.

Ajouter un algorithme de recherche vectorielle et un profil vectoriel

Les algorithmes de recherche vectorielle sont utilisés pour créer les structures de navigation des requêtes pendant l’indexation. Pour les champs de vecteurs binaires, les comparaisons de vecteurs sont effectuées à l’aide de la métrique de distance de Hamming.

  1. Pour ajouter un champ binaire à un index, configurez une requête Create or Update Index à l’aide de l’API REST ou du Portail Azure.

  2. Dans le schéma d’index, ajoutez une section vectorSearch qui spécifie des profils et des algorithmes.

  3. Ajoutez un ou plusieurs algorithmes de recherche vectorielle qui ont une métrique de similarité de hamming. Il est courant d’utiliser les petits mondes navigables hiérarchiques (HNSW), mais vous pouvez également utiliser la distance de Hamming avec les K plus proche voisins exhaustifs.

  4. Ajoutez un ou plusieurs profils vectoriels qui spécifient l’algorithme.

L’exemple suivant illustre une configuration vectorSearch de base :

  "vectorSearch": { 
    "profiles": [ 
      { 
        "name": "myHnswProfile", 
        "algorithm": "myHnsw", 
        "compression": null, 
        "vectorizer": null 
      } 
    ], 
    "algorithms": [ 
      { 
        "name": "myHnsw", 
        "kind": "hnsw", 
        "hnswParameters": { 
          "metric": "hamming" 
        } 
      }, 
      { 
        "name": "myExhaustiveKnn", 
        "kind": "exhaustiveKnn", 
        "exhaustiveKnnParameters": { 
          "metric": "hamming" 
        } 
      } 
    ] 
  }

Ajouter un champ binaire à un index

La collection de champs d’un index doit inclure un champ pour la clé de document, les champs vectoriels et tous les autres champs dont vous avez besoin pour les scénarios de recherche hybride.

Les champs binaires sont de type Collection(Edm.Byte) et contiennent des incorporations compressées. Par exemple, si la dimension d’incorporation d’origine est de 1024, la longueur du vecteur binaire compressé est de ceiling(1024 / 8) = 128. Vous obtenez la forme compressée en définissant la propriété vectorEncoding sur le champ.

  • Ajoutez un champ à la collection de champs et donnez-lui un nom.
  • Définissez le type de données sur Collection(Edm.Byte).
  • Définissez vectorEncoding sur packedBit pour l’encodage binaire.
  • Affectez la valeur dimensions à 1024. Spécifiez la dimension de vecteur d’origine (décompressé).
  • Définissez vectorSearchProfile sur un profil que vous avez défini à l’étape précédente.
  • Rendre le champ pouvant faire l’objet d’une recherche.

La définition de champ suivante est un exemple des propriétés que vous devez définir :

  "fields": [ 
    . . . 
    { 
      "name": "my-binary-vector-field", 
      "type": "Collection(Edm.Byte)", 
      "vectorEncoding": "packedBit", 
      "dimensions": 1024, 
      "vectorSearchProfile": "myHnswProfile",
      "searchable": true
    },
   . . . 
  ]

Voir aussi

Les exemples de code du référentiel azure-search-vector-samples illustrent des workflows de bout en bout qui incluent la définition de schéma, la vectorisation, l’indexation et les requêtes.

Le code de démonstration est disponible en Python, C# et JavaScript.