Partager via


Stockage vectoriel dans Azure Cosmos DB for MongoDB sur vCore

Utilisez la base de données vectorielle intégrée dans Azure Cosmos DB for MongoDB (vCore) pour connecter facilement vos applications IA à vos données stockées dans Azure Cosmos DB. Cette intégration peut inclure des applications que vous avez créées à l’aide des incorporations Azure OpenAI. La base de données vectorielle intégrée nativement vous permet de stocker, indexer et interroger efficacement les données vectorielles avec de nombreuses dimensions stockées directement dans Azure Cosmos DB for MongoDB (vCore) ainsi que les données d’origine à partir desquelles les données vectorielles sont créées. Elle élimine la nécessité de transférer vos données vers d’autres magasin de vecteurs et de subir des coûts supplémentaires.

Qu'est-ce qu'un stockage vectoriel ?

Un stockage vectoriel ou une base de données vectorielle est une base de données conçue pour stocker et gérer des incorporations vectorielles, qui sont des représentations mathématiques de données dans un espace de grande dimension. Dans cet espace, chaque dimension correspond à une caractéristique des données, et des dizaines de milliers de dimensions peuvent être utilisées pour représenter des données sophistiquées. La position d’un vecteur dans cet espace représente ses caractéristiques. Les mots, expressions ou documents entiers, ainsi que les images, l’audio et d’autres types de données peuvent tous être vectorisés.

Comment fonctionne un magasin de vecteurs ?

Dans un magasin de vecteurs, des algorithmes de recherche vectorielle sont utilisés pour indexer et interroger les incorporations. Parmi les algorithmes de recherche vectorielle connus figurent entre autres HNSW (Hierarchical Navigable Small World), IVF (Inverted File), DiskANN. La recherche vectorielle est une méthode qui vous aide à trouver des éléments similaires en fonction de leurs caractéristiques de données, plutôt que des correspondances exactes sur un champ de propriété. Cette technique est utile dans des applications comme la recherche de texte similaire, la recherche d’images associées, la création de recommandations ou même la détection d’anomalies. Elle est utilisée pour interroger les incorporations vectorielles (listes de nombres) des données que vous avez créées en utilisant un modèle Machine Learning à l’aide d’une API d’incorporation. Des exemples d’API d’incorporation sont Incorporations Azure OpenAI et Hugging Face sur Azure. La recherche vectorielle mesure la distance entre les vecteurs de données et votre vecteur de requête. Les vecteurs de données les plus proches de votre vecteur de requête sont ceux qui se révèlent les plus similaires sémantiquement.

Dans la base de données vectorielle intégrée dans Azure Cosmos DB for MongoDB (vCore), les incorporations peuvent être stockées, indexées et interrogées parallèlement aux données d’origine. Cette approche élimine le coût supplémentaire dû à la réplication des données dans une base de données vectorielle pure distincte. De plus, cette architecture conserve les incorporations vectorielles et les données d’origine ensemble, ce qui facilite les opérations de données multimodales et permet d’accroître la cohérence, la mise à l’échelle et le niveau de performance des données.

Azure Cosmos DB for MongoDB (vCore) fournit des fonctionnalités de recherche vectorielle robustes, qui vous permettent d’effectuer des recherches de similarité très rapides dans des jeux de données complexes. Pour effectuer une recherche vectorielle dans Azure Cosmos DB for MongoDB, vous devez d’abord créer un index vectoriel. Cosmos DB prend actuellement en charge trois types d’index vectoriels :

  • DiskANN (recommandé) : idéal pour les jeux de données à grande échelle, tirant parti des disques SSD pour une utilisation efficace de la mémoire tout en conservant un rappel élevé dans les recherches des plus proches voisins approximatifs (ANN, Approximate Nearest Neighbor).
  • HNSW : adapté aux jeux de données de taille modérée nécessitant un rappel élevé, avec une structure basée sur un graphe qui équilibre l’exactitude et l’efficacité des ressources.
  • IVF : utilise le clustering pour optimiser la rapidité des recherches dans les jeux de données de grande taille, en concentrant les recherches dans des clusters ciblés pour accélérer les performances.

Les index DiskANN sont disponibles sur les niveaux M40 et supérieurs. Pour créer l’index DiskANN, définissez le paramètre "kind" sur "vector-diskann" en suivant le modèle ci-dessous :

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-diskann", 
                "dimensions": <integer_value>,
                "similarity": <string_value>,
                "maxDegree" : <integer_value>, 
                "lBuild" : <integer_value>, 
            } 
        } 
    ] 
}
Champ Type Description
index_name string Nom unique de l’index.
path_to_property string Chemin d’accès à la propriété qui contient le vecteur. Ce chemin peut être une propriété de niveau supérieur ou un chemin d’accès en notation par points à la propriété. Les vecteurs doivent être un number[] pour être indexés et utilisés dans les résultats de la recherche vectorielle. L’utilisation d’un autre type, tel que double[], empêche l’indexation du document. Les documents non indexés ne seront pas renvoyés dans le résultat d’une recherche vectorielle.
kind string Type d’index vectoriel à créer. Les options sont vector-ivf, vector-hnsw et vector-diskann.
dimensions entier Nombre de dimensions pour la similarité vectorielle. DiskANN prend en charge jusqu’à 2 000 dimensions, avec une prise en charge future prévue pour plus de 40 000.
similarity string Métrique de similarité à utiliser avec l’index. Les options possibles sont COS (distance cosinus), L2 (distance euclidienne) et IP (produit interne).
maxDegree entier Nombre maximal d’arêtes par nœud dans le graphe. Ce paramètre est compris entre 20 et 2 048 (la valeur par défaut est 32). Une valeur de maxDegree plus élevée convient aux jeux de données avec une dimensionnalité élevée et/ou des exigences d’exactitude élevées.
lBuild entier Définit le nombre de voisins candidats évalués lors de la construction de l’index DiskANN. Ce paramètre, qui varie de 10 à 500 (la valeur par défaut est 50), équilibre l’exactitude et la charge de calcul : des valeurs plus élevées améliorent la qualité et la précision de l’index, mais augmentent la durée de la construction.

Effectuer une recherche vectorielle avec DiskANN

Pour effectuer une recherche vectorielle, utilisez l’étape de pipeline d’agrégation $search et interrogez avec l’opérateur cosmosSearch. DiskANN permet des recherches à hautes performances sur des jeux de données massifs avec un filtrage facultatif, comme des filtres géospatiaux ou textuels.

{
  "$search": {
    "cosmosSearch": {
      "path": "<path_to_property>",
      "query": "<query_vector>",  
      "k": <num_results_to_return>,  
      "filter": {"$and": [
        { "<attribute_1>": { "$eq": <value> } },
        {"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
      ]}
    }
  }
},
Champ Type Description
lSearch entier Spécifie la taille de la liste de candidats dynamiques pour la recherche. La valeur par défaut est 40, avec une plage configurable de 10 à 1000. L’augmentation de la valeur améliore le rappel, mais peut réduire la rapidité de la recherche.
k entier Définit le nombre de résultats de la recherche à retourner. La valeur de k doit être inférieure ou égale à lSearch.

Activer DiskANN sur un nouveau cluster

Pour activer l’index vectoriel DiskANN sur un cluster Azure Cosmos DB pour MongoDB (vCore) récemment provisionné, procédez comme suit pour effectuer une inscription au niveau du cluster via Azure CLI :

  1. Se connecter à Azure CLI
az login
  1. Récupérez les paramètres actuels des indicateurs de fonctionnalité sur votre cluster. Cela garantit que vous conservez tous les indicateurs existants lors de l’ajout de la nouvelle fonctionnalité.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
  1. Ajoutez l’indicateur DiskANNIndex à la liste des fonctionnalités d’aperçu sans supprimer des fonctionnalités existantes.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}" 

Exemple d’utilisation d’un index DiskANN avec filtrage

Ajoutez des vecteurs à votre base de données

Pour utiliser la recherche vectorielle avec des filtres géospatiaux, ajoutez des documents qui incluent des incorporations vectorielles et des coordonnées d’emplacements. Vous pouvez créer les incorporations en utilisant votre propre modèle, des incorporations Azure OpenAI ou une autre API (comme Hugging Face sur Azure).

from pymongo import MongoClient

client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]

documents = [
    {"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
    {"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
    {"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
    {"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]

collection.insert_many(documents)

Créer un index vectoriel DiskANN

L’exemple suivant montre comment configurer un index vectoriel DiskANN avec des capacités de filtrage. Ceci inclut la création de l’index vectoriel pour la recherche de similarité, l’ajout de documents avec des propriétés vectorielles et géospatiales, et l’indexation de champs pour un filtrage supplémentaire.

db.command({
    "createIndexes": "testCollection",
    "indexes": [
        {
            "name": "DiskANNVectorIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "dimensions": 3,
                "similarity": "COS",
                "maxDegree": 32,
                "lBuild": 64
            }
        },
        { 
            "name": "is_open",
            "key": { 
                "is_open": 1 
            }      
        },
        {
            "name": "locationIndex",
            "key": {
                "location": 1
            }
        }
    ]
})

Cette commande crée un index vectoriel DiskANN sur le champ contentVector dans exampleCollection, ce qui permet des recherches de similarité. Elle ajoute également :

  • Un index sur le champ is_open, ce qui vous permet de filtrer les résultats en fonction de l’ouverture ou non des entreprises.
  • Un index géospatial sur le champ location pour filtrer par proximité géographique.

Pour rechercher des documents avec des vecteurs similaires dans un rayon géographique spécifique, spécifiez le queryVector pour la recherche de similarité et incluez un filtre géospatial.

query_vector = [0.52, 0.28, 0.12]
pipeline = [
    {
        "$search": {
            "cosmosSearch": {
                "path": "contentVector",
                "vector": query_vector,
                "k": 5,
                "filter": {
                    "$and": [
                        {"is_open": {"$eq": 1}},
                        {"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
                    ]
                }
            }
        }
    }
]

results = list(collection.aggregate(pipeline))
for result in results:
    print(result)

Dans cet exemple, la recherche de similarité vectorielle retourne les premiers k vecteurs les plus proches en fonction de la métrique de similarité COS spécifiée , tout en filtrant les résultats pour inclure seulement les entreprises ouvertes dans un rayon de 100 milles (160 kilomètres).

[
  {
    similarityScore: 0.9745354109084544,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'CEO of AdventureWorks',
      is_open: 1,
      location: [-118.9865, 34.0145],
      contentVector: [0.52, 0.20, 0.23]
    }
  },
  {
    similarityScore: 0.9006955671333992,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'President of Our Planet initiative',
      is_open: 1,
      location: [-119.7302, 34.4005],
      contentVector: [0.91, 0.76, 0.83]
    }
  }
]

Ce résultat montre les documents les plus similaires à queryVector, limités à un rayon de 100 milles et à des entreprises ouvertes. Chaque résultat inclut le score de similarité et les métadonnées, montrant comment DiskANN dans Cosmos DB for MongoDB prend en charge les requêtes vectorielles et géospatiales combinées pour des expériences de recherche enrichies et sensibles à l’emplacement.

Obtenir des définitions d’index vectoriel

Pour récupérer votre définition d’index vectoriel à partir de la collection, utilisez la commande listIndexes :

db.exampleCollection.getIndexes();

Dans cet exemple, vectorIndex est renvoyé avec tous les paramètres cosmosSearch qui ont été utilisés pour créer l’index :

[
  { v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
  {
    v: 2,
    key: { vectorContent: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Recherche vectorielle filtrée (préversion)

Vous pouvez désormais exécuter des recherches vectorielles avec n’importe quel filtre de requête pris en charge, tel que $lt, $lte, $eq, $neq, $gte, $gt, $in, $ninet $regex. Activez la fonctionnalité « recherche vectorielle de filtrage » sous l’onglet « Fonctionnalités en préversion » de votre abonnement Azure. En savoir plus sur les fonctionnalités en préversion ici.

Tout d’abord, vous devez définir un index pour votre filtre en plus d’un index vectoriel. Par exemple, vous pouvez définir l’index de filtre sur une propriété

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

Ensuite, vous pouvez ajouter le terme "filter" à votre recherche vectorielle, comme indiqué ci-dessous. Dans cet exemple, le filtre recherche des documents où la propriété "title" n’est pas dans la liste des ["not in this text", "or this text"].


db.exampleCollection.aggregate([
  {
      '$search': {
          "cosmosSearch": {
              "vector": "<query_vector>",
              "path": <path_to_vector>,
              "k": num_results,
              "filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
          },
          "returnStoredSource": True }},
      {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);

Important

Dans la préversion, la recherche vectorielle filtrée peut vous obliger à ajuster vos paramètres d’index vectoriel pour obtenir une précision plus élevée. Par exemple, augmenter m, efConstructionou efSearch lors de l’utilisation de HNSW, ou numLists, ou nProbes lors de l’utilisation d’IVF, peut entraîner de meilleurs résultats. Vous devez tester votre configuration avant d’utiliser pour vous assurer que les résultats sont satisfaisants.

Utiliser les outils d’orchestration LLM

Utiliser comme base de données vectorielle avec le noyau sémantique

Utilisez le noyau sémantique pour orchestrer la récupération des informations à partir d’Azure Cosmos DB for MongoDB vCore et de votre LLM. En savoir plus ici.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

Utiliser comme base de données vectorielle avec LangChain

Utilisez LangChain pour orchestrer votre récupération d’informations à partir d’Azure Cosmos DB for MongoDB vCore et de votre LLM. En savoir plus ici.

Utiliser comme cache sémantique avec LangChain

Utilisez LangChain et Azure Cosmos DB for MongoDB (vCore) pour orchestrer la mise en cache sémantique, en utilisant les réponses du LLM précédemment enregistrées, qui peuvent vous permettre d’économiser les coûts de l’API LLM et réduire la latence des réponses. Apprenez-en davantage ici.

Fonctionnalités et limitations

  • Mesures de distance prises en charge : L2 (euclidienne), produit interne et cosinus.
  • Méthodes d’indexation prises en charge : IVFFLAT, HNSW et DiskANN (préversion)
  • Indexation de vecteurs d’une taille maximale de 2 000 dimensions.
  • L’indexation ne s’applique qu’à un seul vecteur par tracé.
  • Un seul index peut être créé par tracé vectoriel.

Résumé

Ce guide montre comment créer un index vectoriel, ajouter des documents contenant des données vectorielles, effectuer une recherche de similarité et récupérer la définition d’index. En utilisant notre base de données vectorielle intégrée, vous pouvez stocker, indexer et interroger efficacement des données vectorielles à haute dimension directement dans Azure Cosmos DB for MongoDB vCore. Elle vous permet de libérer le potentiel de vos données grâce à des incorporations vectorielles et vous permet de générer des applications plus précises, plus efficaces et plus puissantes.

Étape suivante