Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La recherche Azure AI prend en charge la quantification scalaire et binaire pour réduire la taille des vecteurs dans un index de recherche. La quantisation est recommandée, car elle réduit à la fois la mémoire et le stockage de disque pour les incorporations float16 et float32. Pour compenser les effets de la compression avec perte, vous pouvez ajouter un suréchantillonnage et un rescoring.
Pour utiliser la quantification intégrée, suivez ces étapes :
- Commencer par des champs vectoriels et une
vectorSearchconfiguration à un index - Ajouter
vectorSearch.compressions - Ajouter une configuration
scalarQuantizationoubinaryQuantizationet lui donner un nom - Définir des propriétés facultatives pour atténuer les effets de l’indexation avec perte
- Créer un profil vectoriel qui utilise la configuration nommée
- Créer un nouveau champ vectoriel avec le nouveau profil vectoriel.
- Charger l’index avec des données float32 ou float16 quantifiées pendant l’indexation par la configuration définie
- Si vous le souhaitez, interrogez des données quantifiées à l’aide du paramètre de surachantillonnage. Si le champ de vecteur ne spécifie pas de suréchantillonnage dans sa définition, vous pouvez l’ajouter au moment de la requête.
Conseil / Astuce
Recherche Azure AI : Réduire les coûts vectoriels jusqu’à 92,5% avec de nouvelles techniques de compression compare les stratégies de compression et explique les économies dans le stockage et les coûts. Il inclut également des métriques pour mesurer la pertinence en fonction du gain cumulatif normalisé réduit (NDCG), démontrant que vous pouvez compresser vos données sans sacrifier la qualité de la recherche.
Prérequis
-
Champs vectoriels dans un index de recherche, avec une
vectorSearchconfiguration spécifiant l’algorithme HNSW (Hierarchical Navigable Small Worlds) ou l’algorithme K-Nearest Neighbor (KNN) exhaustif et un nouveau profil vectoriel.
Techniques de quantification prises en charge
La quantification s’applique aux champs vectoriels recevant des vecteurs de type float. Dans les exemples de cet article, le type de données du champ est Collection(Edm.Single) pour les incorporations float32 entrantes, mais float16 est également pris en charge. Lorsque les vecteurs sont reçus sur un champ avec compression configurée, le moteur effectue la quantisation pour réduire l’empreinte des données vectorielles en mémoire et sur le disque.
Deux types de quantification sont pris en charge :
La quantification scalaire compresse les valeurs flottantes en types de données plus étroits. Recherche IA prend actuellement en charge int8, qui est 8 bits, réduisant ainsi la taille de l'index vectoriel de quatre fois.
La quantification binaire convertit des floats en bits binaires qui prennent jusqu’à 1 bit. Ce qui se traduit par une taille d’index vectoriel réduite jusqu’à 28 fois.
Remarque
Bien que les services gratuits prennent en charge la quantisation, ils ne montrent pas les économies de stockage complètes en raison du quota de stockage limité.
Fonctionnement de la quantification scalaire dans Azure AI Search
La quantification scalaire réduit la résolution de chaque nombre dans chaque intégration vectorielle. Au lieu de décrire chaque nombre comme un nombre à virgule flottante de 16 bits ou 32 bits, il utilise un entier de 8 bits. Il identifie une plage de nombres (généralement le minimum et le maximum du 99e percentile) et les divise en un nombre fini de niveaux ou de catégories, en attribuant à chaque catégorie un identifiant. Dans la quantification scalaire 8 bits, il existe 2 ^ 8, soit 256, bacs possibles.
Chaque composante du vecteur est mappée à la valeur représentative la plus proche au sein de cet ensemble de niveaux de quantification dans un processus semblable à l'arrondi d'un nombre réel à l'entier le plus proche. Dans le vecteur quantifié de 8 bits, le numéro d'identification remplace la valeur d'origine. Après quantification, chaque vecteur est représenté par un tableau d'identifiants pour les bacs auxquels appartiennent ses composants. Ces vecteurs quantifiés nécessitent beaucoup moins de bits à stocker par rapport au vecteur d'origine, réduisant ainsi les besoins de stockage et l'empreinte mémoire.
Fonctionnement de la quantification binaire dans Azure AI Search
La quantification binaire compresse des vecteurs hautement dimensionnels en représentant chaque composant en tant que bit unique, 0 ou 1. Cette méthode réduit considérablement l’empreinte mémoire et accélère les opérations de comparaison vectorielle qui sont essentielles pour les tâches de recherche et d’extraction. Les tests de point de référence montrent jusqu’à 96 % de réduction en taille d’index vectoriel.
C’est particulièrement efficace pour les incorporations ayant des dimensions supérieures à 1024. Pour les dimensions plus petites, nous vous recommandons de tester la qualité de la quantification binaire ou d’essayer le type scalaire à la place. En outre, nous avons trouvé que la quantisation binaire fonctionne très bien lorsque les incorporations sont centrées autour de zéro. Les modèles d’incorporation les plus populaires proposés par OpenAI, Cohere et Mistral sont centrés autour de zéro.
Techniques de rescoring prises en charge
Le rescoring est une technique facultative utilisée pour compenser la perte d’informations en raison de la quantisation vectorielle. Pendant l’exécution de la requête, il utilise le surachantillon pour récupérer des vecteurs supplémentaires et des informations supplémentaires pour rescoreer les résultats initiaux trouvés par la requête. Les informations supplémentaires sont soit des vecteurs d'origine non compressés et à pleine précision, soit uniquement pour la quantification binaire, avec la possibilité de recalculer le score en utilisant les candidats de documents quantifiés binaires contre le vecteur de requête.
Seuls les graphiques HNSW autorisent le rescoring. Le KNN exhaustif ne prend pas en charge la réévaluation, car par définition, tous les vecteurs sont analysés au moment de la requête, ce qui rend la réévaluation et le suréchantillonnage non pertinents.
Les options de recalcul sont spécifiées dans l’index, mais vous pouvez invoquer le recalcul au moment de la requête en ajoutant le paramètre de requête oversampling.
| Objet | Propriétés |
|---|---|
| Index | Ajoutez RescoringOptions à la section compressions vectorielles. Les exemples de cet article utilisent RescoringOptions. |
| Query | Ajoutez oversampling aux définitions de RawVectorQuery ou VectorizableTextQuery. L’ajout de oversampling invoque le rescoring au moment de la requête. |
Remarque
Les noms des paramètres de recalcul ont changé au fil des dernières versions. Si vous utilisez une ancienne API en préversion, passez en revue les instructions de mise à niveau pour résoudre les changements incompatibles.
Le processus généralisé de rescoring est le suivant :
- La requête vectorielle s’exécute sur des champs vectoriels compressés.
- La requête vectorielle retourne les candidats suréchantillonné du top k.
- Les candidats k suréchantillonnés sont notés à nouveau en utilisant des vecteurs d’origine non compressés pour la quantification scalaire ou du produit de quantification binaire.
- Après le rescoring, les résultats sont ajustés afin que les correspondances plus pertinentes apparaissent en premier.
Le surachantillonnage pour les vecteurs quantifiés scalaires nécessite la disponibilité des vecteurs de précision complets d’origine. Le surachantillonnage pour les vecteurs quantifiés binaires peut utiliser des vecteurs de précision complets (preserveOriginals) ou le produit point du vecteur binaire (discardOriginals). Si vous optimisez le stockage vectoriel, veillez à conserver les vecteurs de précision complets dans l’index si vous en avez besoin à des fins de rescoring. Pour plus d’informations, consultez Éliminer les instances vectorielles facultatives du stockage.
Ajouter « compressions » à un index de recherche
Cette section explique comment spécifier une vectorsSearch.compressions section dans l’index. L’exemple suivant montre une définition d’index partielle avec une collection de champs qui inclut un champ vectoriel.
L’exemple de compression inclut les deux scalarQuantization ou binaryQuantization. Vous pouvez spécifier autant de configurations de compression que nécessaire, puis attribuez celles souhaitées au profil vectoriel.
La syntaxe pour vectorSearch.Compressions varie entre les API REST stables et en préversion, la version préliminaire ajoutant des options supplémentaires pour l'optimisation du stockage, en plus des modifications de la syntaxe existante. La compatibilité descendante est conservée par le biais de mappages d’API internes, mais nous vous recommandons d’adopter les propriétés plus récentes dans le code qui cible 2024-11-01-preview et les versions ultérieures.
Utilisez l'API REST Créer un index ou Créer ou mettre à jour un index pour configurer les paramètres de compression.
POST https://[servicename].search.windows.net/indexes?api-version=2025-09-01
{
"name": "my-index",
"description": "This is a description of this 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": [
{
"name": "vector-profile-1",
"algorithm": "use-hnsw",
"compression": "use-scalar"
}
],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": { },
"exhaustiveKnnParameters": null
}
],
"compressions": [
{
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"name": "mySQ8",
"kind": "scalarQuantization",
"rescoringOptions": {
"enableRescoring": true,
"defaultOversampling": 10,
"rescoreStorageMethod": "preserveOriginals"
},
"truncationDimension": 2
},
{
"name": "myBQC",
"kind": "binaryQuantization",
"rescoringOptions": {
"enableRescoring": true,
"defaultOversampling": 10,
"rescoreStorageMethod": "discardOriginals"
},
"truncationDimension": 2
}
]
},
}
Points essentiels :
kinddoit être défini surscalarQuantizationoubinaryQuantization.rescoringOptionssont une collection de propriétés utilisées pour compenser la compression avec perte en rescorant les résultats de requête à l’aide des vecteurs de précision complète d’origine qui existent avant la quantification. Pour que le rescoring fonctionne, vous devez disposer de l’instance vectorielle qui fournit ce contenu. RéglerrescoreStorageMethodsurdiscardOriginalsvous empêche d’utiliserenableRescoringoudefaultOversampling. Pour plus d’informations sur le stockage vectoriel, voir Éliminer les instances vectorielles facultatives du stockage."rescoreStorageMethod": "preserveOriginals"recalcule des résultats de recherche vectorielle à l’aide des vecteurs originaux à précision totale ce qui peut entraîner des ajustements du score et du classement de la recherche, favorisant ainsi les correspondances les plus pertinentes telles que déterminées par l’étape de recalcul. Pour la quantisation binaire, vous pouvez définirrescoreStorageMethodpourdiscardOriginalsréduire davantage le stockage, sans réduire la qualité. Les vecteurs d’origine ne sont pas nécessaires pour la quantisation binaire.defaultOversamplingconsidère un ensemble plus large de résultats potentiels pour compenser la réduction des informations résultant de la quantification. La formule des résultats potentiels consiste en lekdans la requête, avec un multiplicateur de suréchantillonnage. Par exemple, si la requête spécifie unkde 5 et que le suréchantillonnage est de 20, alors la requête demande effectivement 100 documents à utiliser dans le reclassement, en utilisant le vecteur non compressé d'origine à cette fin. Seuls les résultatskles mieux classés sont renvoyés. Cette propriété est facultative. La valeur par défaut est 4.quantizedDataTypeest facultatif et s’applique à la quantification scalaire uniquement. Si vous l’ajoutez, il doit être défini surint8. Il s’agit du seul type de données primitif pris en charge pour la quantification scalaire à l’heure actuelle. La valeur par défaut estint8.truncationDimensionexploite les capacités inhérentes des modèles text-embedding-3 pour « encoder des informations à divers niveaux de granularité et permet à une seule intégration de s’adapter aux contraintes de calcul des tâches subséquentes » (voir Matryoshka Representation Learning). Vous pouvez utiliser des dimensions tronquées avec ou sans options de rescoring. Pour plus d’informations sur la façon dont cette fonctionnalité est implémentée dans Recherche Azure AI, voir Tronquer des dimensions à l’aide de la compression MRL.
Ajouter l’algorithme de recherche vectorielle
Vous pouvez utiliser l’algorithme HNSW ou eKNN dans l’API REST 2024-11-01-preview ou ultérieure. Pour la version stable, utilisez uniquement HNSW. Si vous souhaitez recalculer les scores, vous devez choisir HNSW.
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
Créer et attribuer un profil vectoriel
Pour utiliser une nouvelle configuration de quantification, vous devez créer un profil vectoriel. La création d'un nouveau profil vectoriel est nécessaire pour créer des index compressés en mémoire. Votre nouveau profil utilise HNSW.
Dans la même définition d’index, créez un profil vectoriel et ajoutez une propriété de compression et un algorithme. Voici deux profils, un pour chaque approche de quantification.
"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> ] }Attribuez un profil vectoriel à un nouveau champ vectoriel. Le type de données du champ est soit float32 ou soit float16.
Dans Recherche Azure AI, les équivalents EDM (Entity Data Model) des types float32 et float16 sont
Collection(Edm.Single)etCollection(Edm.Half), respectivement.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }Chargez l'index à l'aide d'indexeurs pour l'indexation du modèle pull ou d'API pour l'indexation du modèle push.
Interroger un champ vectoriel quantifié en utilisant le suréchantillonnage
La syntaxe de requête d’un champ vectoriel compressé ou quantifié est identique à celle des champs de vecteur non compressés, sauf si vous souhaitez remplacer les paramètres associés à l’échantillonnage et à la rescoring. Vous pouvez ajouter un paramètre oversampling pour invoquer l'oversampling et le rescoring au moment de la requête.
Utilisez Rechercher des documents pour la requête.
N’oubliez pas que la définition de compression vectorielle dans l’index a des paramètres pour enableRescoring, rescoreStorageMethod et defaultOversampling qui permettent d’atténuer les effets d’une compression avec perte. Vous pouvez remplacer les valeurs par défaut afin de faire varier le comportement au moment de la requête. Par exemple, si defaultOversampling est 10.0, vous pouvez le remplacer par autre chose dans la demande de requête.
Vous pouvez définir le paramètre de suréchantillonnage même si l'index n'a pas explicitement d’option de rescoring ou de defaultOversampling définition. Fournir oversampling au moment de la requête remplace les paramètres d'index pour cette requête et exécute la requête enableRescoring avec la valeur true.
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2025-09-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
Points essentiels :
Le surachantillonnage s’applique aux champs vectoriels qui subissent une compression vectorielle, conformément à l’affectation de profil vectoriel.
Le suréchantillonnage dans la requête remplace la valeur
defaultOversamplingdans l'index ou invoque le suréchantillonnage et le reclassement au moment de la requête, même si la configuration de compression de l'index n’a pas spécifié d’options de suréchantillonnage ou de reclassement.