Index et vecteurs de requête dans Azure Cosmos DB for NoSQL en JavaScript
S’APPLIQUE À : NoSQL
La fonctionnalité de recherche vectorielle Azure Cosmos DB for NoSQL est en préversion. Avant d’utiliser cette fonctionnalité, vous devez d’abord vous inscrire pour la préversion. Cet article couvre les étapes suivantes :
Inscription à la préversion de la recherche vectorielle dans Azure Cosmos DB for NoSQL
Configuration du conteneur Azure Cosmos DB pour la recherche vectorielle
Création de la stratégie d’incorporation de vecteurs
Ajout d’index vectoriels à la stratégie d’indexation du conteneur
Création d’un conteneur avec des index vectoriels et une stratégie d’incorporation de vecteurs
Exécution d’une recherche vectorielle sur les données stockées
Ce guide décrit le processus de création de données vectorielles, d’indexation des données, et d’interrogation des données d’un conteneur.
Prérequis
- Un compte Azure Cosmos DB for NoSQL existant.
- Si vous n’avez pas d’abonnement Azure, essayez gratuitement Azure Cosmos DB for NoSQL.
- Si vous disposez d’un abonnement Azure, créez un compte Azure Cosmos DB for SQL.
- Dernière version du Kit de développement logiciel (SDK) (SDK) JavaScript Azure Cosmos DB (Version 4.1.0 ou ultérieure)
S’inscrire pour la préversion
La recherche vectorielle pour Azure Cosmos DB for NoSQL nécessite une inscription aux fonctionnalités en préversion. Suivez les étapes ci-dessous pour vous inscrire :
Accédez à votre page de ressource Azure Cosmos DB for NoSQL.
Sélectionnez le volet « Fonctionnalités » sous l’élément de menu « Paramètres ».
Sélectionnez « Recherche vectorielle dans Azure Cosmos DB for NoSQL ».
Lisez la description de la fonctionnalité pour confirmer que vous souhaitez vous inscrire à la préversion.
Sélectionnez « Activer » pour vous inscrire avec la préversion.
Remarque
La demande d’inscription est approuvée automatiquement, mais l’opération peut prendre parfois plusieurs minutes.
Comprendre les étapes impliquées dans la recherche vectorielle
Les étapes suivantes supposent que vous savez comment configurer un compte NoSQL Cosmos DB et créer une base de données. La fonctionnalité de recherche vectorielle n’est actuellement prise en charge que sur les nouveaux conteneurs, et non sur un conteneur existant. Vous devez créer un conteneur, puis spécifier la stratégie d’incorporation de vecteurs au niveau du conteneur et la stratégie d’indexation vectorielle au moment de la création.
Prenons un exemple de création d’une base de données pour une librairie basée sur Internet où vous stockez le titre, l’auteur, l’ISBN et la description pour chaque livre. Nous définissons également deux propriétés pour contenir des incorporations vectorielles. La première est la propriété « contentVector » qui contient les incorporations de texte générées à partir du contenu textuel du livre (par exemple, en concaténant les propriétés « title » « author » « isbn » et « description » avant de créer l’incorporation). La seconde est la propriété « coverImageVector » qui est générée à partir des images de la couverture du livre.
- Créez et stockez des incorporations de vecteurs pour les champs sur lesquels vous souhaitez effectuer une recherche vectorielle.
- Spécifiez les chemins d’accès d’incorporation de vecteurs dans la stratégie d’incorporation de vecteurs.
- Incluez les index vectoriels souhaités dans la stratégie d’indexation du conteneur.
Dans les sections suivantes de cet article, nous prenons en compte cette structure pour les éléments stockés au sein de notre conteneur :
{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}
Créer une stratégie d’incorporation de vecteurs pour votre conteneur
Vous devez ensuite définir une stratégie vectorielle de conteneur. Cette stratégie fournit des informations utilisées pour indiquer au moteur de requête Azure Cosmos DB comment gérer les propriétés vectorielles dans les fonctions système VectorDistance. Cette stratégie donne également à la stratégie d’indexation de vecteurs les informations nécessaires, si vous choisissez d’en spécifier une.
Les informations suivantes sont incluses dans la stratégie de vecteur contenu :
Description | |
---|---|
path |
Chemin d’accès de propriété qui contient les vecteurs |
datatype |
Type des éléments du vecteur (Float32 par défaut) |
dimensions |
Longueur de chaque vecteur du chemin d’accès (1536 par défaut) |
distanceFunction |
Métrique utilisée pour calculer la distance/similarité (Cosine par défaut) |
Pour notre exemple avec des détails de livre, la stratégie vectorielle peut ressembler à l’exemple JSON :
const vectorEmbeddingPolicy: VectorEmbeddingPolicy = {
vectorEmbeddings: [
{
path: "/coverImageVector",
dataType: "float32",
dimensions: 8,
distanceFunction: "dotproduct",
},
{
path: "contentVector",
dataType: "float32",
dimensions: 10,
distanceFunction: "cosine",
},
],
};
Créer un index vectoriel dans la stratégie d’indexation
Une fois les chemins d’accès d’incorporation de vecteurs choisis, les index vectoriels doivent être ajoutés à la stratégie d’indexation. Vous devez appliquer la stratégie vectorielle pendant le temps de création du conteneur et elle ne peut pas être modifiée plus tard. Pour cet exemple, la stratégie d’indexation se présente comme suit :
const indexingPolicy: IndexingPolicy = {
vectorIndexes: [
{ path: "/coverImageVector", type: "quantizedFlat" },
{ path: "/contentVector", type: "diskANN" },
],
inlcludedPaths: [
{
path: "/*",
},
],
excludedPaths: [
{
path: "/coverImageVector/*",
},
{
path: "/contentVector/*",
},
]
};
Créez maintenant votre conteneur comme d’habitude.
const containerName = "vector embedding container";
// create container
const { resource: containerdef } = await database.containers.createIfNotExists({
id: containerName,
vectorEmbeddingPolicy: vectorEmbeddingPolicy,
indexingPolicy: indexingPolicy,
});
Important
Pour le moment, la recherche vectorielle dans Azure Cosmos DB for NoSQL est prise en charge uniquement sur les nouveaux conteneurs. Vous devez définir à la fois la stratégie vectorielle du conteneur et une stratégie d’indexation vectorielle au moment de la création du conteneur, car aucune modification n’est possible par la suite. Les deux stratégies seront modifiables dans une future amélioration de la fonctionnalité en préversion.
Exécuter une requête de recherche de similarité vectorielle
Une fois que vous avez créé un conteneur avec la stratégie vectorielle souhaitée, et que vous avez inséré des données vectorielles dans le conteneur, vous pouvez effectuer une recherche vectorielle à l’aide de la fonction système Distance vectorielle dans une requête. Supposons que vous souhaitez rechercher des livres de recettes de cuisine en regardant la description. Vous devez d’abord obtenir les incorporations pour le texte de votre requête. Dans ce cas, vous pouvez être amené à générer des incorporations pour le texte de requête « recettes de cuisine ». Une fois que vous disposez de l’incorporation pour votre requête de recherche, vous pouvez l’utiliser dans la fonction VectorDistance de la requête de recherche vectorielle, et obtenir tous les éléments similaires à votre requête, comme indiqué ici :
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])
Cette requête récupère les titres de livres ainsi que les scores de similarité par rapport à votre requête. Voici un exemple en JavaScript :
const { resources } = await container.items
.query({
query: "SELECT c.title, VectorDistance(c.contentVector, @embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector, @embedding)"
parameters: [{ name: "@embedding", value: [1,2,3,4,5,6,7,8,9,10] }]
})
.fetchAll();
for (const item of resources) {
console.log(`${itme.title}, ${item.SimilarityScore} is a capitol `);
}