Compartir a través de


Almacén vectorial en Azure Cosmos DB for MongoDB de núcleo virtual

Use base de datos vectorial integrada en Azure Cosmos DB para el núcleo virtual de MongoDB para conectar sin problemas las aplicaciones basadas en inteligencia artificial con los datos almacenados en Azure Cosmos DB. Esta integración puede incluir aplicaciones que hayas creado utilizando incrustaciones de Azure OpenAI. La base de datos vectorial integrada de forma nativa permite almacenar, indexar y consultar de forma eficaz los datos vectoriales de alta dimensión que se almacenan directamente en Azure Cosmos DB para núcleo virtual de MongoDB, junto con los datos originales a partir de los cuales se crean los datos vectoriales. Elimina la necesidad de transferir los datos a almacenes de vectores alternativos y conlleva costos adicionales.

¿Qué es un almacén de vectores?

Un almacén de vectores o base de datos vectoriales es una base de datos diseñada para almacenar y administrar incrustaciones de vectores, que son representaciones matemáticas de datos en un espacio de alta dimensión. En este espacio, cada dimensión corresponde a una característica de los datos y es posible que se usen decenas de miles de dimensiones para representar datos sofisticados. La posición de un vector en este espacio representa sus características. Se pueden vectorizar palabras, frases o documentos completos e imágenes, audio y otros tipos de datos.

¿Cómo funciona un almacén de vectores?

En un almacén de vectores, los algoritmos de búsqueda vectorial se usan para indexar e insertar consultas. Entre algunos algoritmos de vector de búsqueda conocidos se incluyen los mundos pequeños navegables jerárquicos (HNSW), archivo invertido (IVF), DiskANN, etc. La búsqueda vectorial es un método que ayuda a encontrar elementos similares en función de sus características de datos en lugar de coincidencias exactas en un campo de propiedad. Esta técnica es útil en aplicaciones como la búsqueda de texto similar, la búsqueda de imágenes relacionadas, la realización de recomendaciones o incluso la detección de anomalías. Se utiliza para consultar las incrustaciones vectoriales (listas de números) de los datos que ha creado mediante un modelo de Machine Learning con una API de inserciones. Algunos ejemplos de API de inserción podrían ser Incrustaciones de OpenAI de Azure o Hugging Face en Azure. El vector de búsqueda mide la distancia entre los vectores de datos y el vector de consulta. Los vectores de datos más cercanos al vector de consulta son los más similares semánticamente.

En la base de datos vectorial integrada de Azure Cosmos DB para núcleo virtual de MongoDB, las incrustaciones se pueden almacenar, indexar y consultar junto con los datos originales. Este enfoque elimina el coste adicional de replicar datos en una base de datos de vectores pura independiente. Además, esta arquitectura reúne las inserciones vectoriales y los datos originales, lo que facilita aún más las operaciones de datos multimodales; también permite una mayor coherencia, escala y rendimiento de los datos.

Azure Cosmos DB para MongoDB (núcleo virtual) proporciona funcionalidades de búsqueda vectorial sólidas, lo que le permite realizar búsquedas de similitud de alta velocidad en conjuntos de datos complejos. Para realizar la búsqueda de vectores en Azure Cosmos DB para MongoDB, primero debe crear un índice vectorial. Cosmos DB admite actualmente tres tipos de índices vectoriales:

  • DiskANN (recomendado): ideal para conjuntos de datos a gran escala, aprovechando los SSD para un uso eficaz de memoria mientras se mantiene una recuperación alta en búsquedas aproximadas de vecinos cercanos (ANN).
  • HNSW: adecuado para conjuntos de datos de tamaño moderado que necesitan una recuperación alta, con una estructura basada en grafos que equilibra la precisión y la eficiencia de los recursos.
  • SIGHT: usa la agrupación en clústeres para optimizar la velocidad de búsqueda en conjuntos de datos expansivos, centrando las búsquedas dentro de los clústeres de destino para acelerar el rendimiento.

Los índices DiskANN están disponibles en los niveles M40 y versiones posteriores. Para crear el índice DiskANN, establezca el parámetro "kind" en "vector-diskann" siguiendo la plantilla siguiente:

{ 
    "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>, 
            } 
        } 
    ] 
}
Campo Tipo Description
index_name string Nombre único del índice.
path_to_property string Ruta de acceso a la propiedad que contiene el vector. Esta ruta de acceso puede ser una propiedad de nivel superior o una ruta de acceso de notación de puntos. Los vectores deben ser un number[] para indexarse y usarse en los resultados de búsqueda vectorial. El uso de otro tipo, como double[], impide que el documento se indexe. Los documentos no indexados no se devolverán en el resultado de un vector de búsqueda.
kind string Tipo de índice vectorial que se va a crear. Las opciones son vector-ivf, vector-hnsw, y vector-diskann.
dimensions integer Número de dimensiones para la similitud vectorial. DiskANN admite hasta 2000 dimensiones, con compatibilidad futura planeada para 40 000+.
similarity string Métrica de similitud que se va a usar con el índice. Las opciones posibles son COS (distancia coseno), L2 (distancia euclidiana) o IP (producto interno).
maxDegree integer Número máximo de bordes por nodo en el gráfico. Este parámetro oscila entre 20 y 2048 (el valor predeterminado es 32). Un maxDegree mayor es adecuado para conjuntos de datos con requisitos de alta dimensionalidad o alta precisión.
lBuild integer Establece el número de vecinos candidatos evaluados durante la construcción del índice DiskANN. Este parámetro, que oscila entre 10 y 500 (el valor predeterminado es 50), equilibra la precisión y la sobrecarga computacional: los valores más altos mejoran la calidad y la precisión del índice, pero aumentan el tiempo de compilación

Realizar una búsqueda vectorial con DiskANN

Para hacer una búsqueda vectorial, use la fase de canalización de agregación $search de la consulta con el operador cosmosSearch. DiskANN permite búsquedas de alto rendimiento en conjuntos de datos masivos con filtrado opcional, como filtros geoespaciales o basados en texto.

{
  "$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>]}}}
      ]}
    }
  }
},
Campo Tipo Descripción
lSearch integer Especifica el tamaño de la lista de candidatos dinámicos para la búsqueda. El valor predeterminado es 40, con un intervalo configurable de 10 a 1000. Aumentar el valor mejora la recuperación, pero puede reducir la velocidad de búsqueda.
k integer Define el número de resultados de búsqueda que se van a devolver. El valor de k debe ser menor o igual que lSearch.

Habilitación de DiskANN en un nuevo clúster

Para habilitar el índice de vectores DiskANN en un clúster de Azure Cosmos DB para MongoDB (núcleo virtual) recién aprovisionado, siga estos pasos para realizar un registro de nivel de clúster mediante la CLI de Azure:

  1. Inicio de sesión en la CLI de Azure
az login
  1. Recupere la configuración actual de las marcas de características del clúster. Esto garantiza que conserva las marcas existentes al agregar la nueva característica.
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. Agregue la marca DiskANNIndex a la lista de características en versión preliminar sin quitar ninguna de las existentes.
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\"]}" 

Ejemplo de uso de un índice DiskANN con filtrado

Adición de vectores a la base de datos

Para usar la búsqueda vectorial con filtros geoespaciales, agregue documentos que incluyan incrustaciones vectoriales y coordenadas de ubicación. Puede crear las incrustaciones mediante su propio modelo, Azure OpenAI Embeddingsu otra API (como Hugging Face en 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)

Creación de un índice de vector DiskANN

En el ejemplo siguiente se muestra cómo configurar un índice de vector DiskANN con funcionalidades de filtrado. Esto incluye la creación del índice vectorial para la búsqueda de similitud, la adición de documentos con propiedades vectoriales y geoespaciales y campos de indexación para el filtrado adicional.

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
            }
        }
    ]
})

Este comando crea un índice vectorial DiskANN en el campo contentVector en exampleCollection, lo que permite búsquedas de similitud. También agrega:

  • Índice en el campo is_open, lo que le permite filtrar los resultados en función de si las empresas están abiertas.
  • Índice geoespacial del campo location para filtrar por proximidad geográfica.

Para buscar documentos con vectores similares dentro de un radio geográfico específico, especifique el queryVector para la búsqueda de similitud e incluya un filtro geoespacial.

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)

En este ejemplo, la búsqueda de similitud de vectores devuelve los vectores más cercanos k principales en función de la métrica de similitud COS especificada, mientras que el filtrado de resultados para incluir solo empresas abiertas dentro de un radio de 100 millas.

[
  {
    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]
    }
  }
]

Este resultado muestra los documentos más similares a queryVector, restringidos a un radio de 100 millas y negocios abiertos. Cada resultado incluye la puntuación de similitud y los metadatos, que muestran cómo DiskANN en Cosmos DB para MongoDB admite consultas vectoriales y geoespaciales combinadas para experiencias de búsqueda enriquecidas y confidenciales en la ubicación.

Obtener definiciones de índice vectorial

Para recuperar la definición del índice vectorial de la colección, use el comando listIndexes:

db.exampleCollection.getIndexes();

Es este ejemplo, se devuelve vectorIndex con todos los parámetros de cosmosSearch que se usaron para crear el índice:

[
  { 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'
  }
]

Búsqueda filtrada de vectores (versión preliminar)

Ahora puede ejecutar búsquedas de vectores con cualquier filtro de consulta compatible, como $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin y $regex. Habilite la característica "búsqueda de vectores con filtro" en la pestaña "Características en versión preliminar" de la suscripción de Azure. Puede encontrar más información sobre las características en versión preliminar aquí.

En primer lugar, deberá definir un índice para el filtro además de un índice vectorial. Por ejemplo, puede definir el índice de filtro en una propiedad.

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

A continuación, puede agregar el término "filter" a la búsqueda de vectores, como se muestra a continuación. En este ejemplo, el filtro busca documentos en los que la propiedad "title" no está en la lista de ["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' }
}
]);

Importante

Mientras se encuentra en versión preliminar, la búsqueda filtrada de vectores puede requerir que ajuste los parámetros de índice vectorial para lograr una mayor precisión. Por ejemplo, aumentar m, efConstruction o efSearch cuando se usa HNSW, o numLists, o nProbes cuando se usa SIGHT, puede dar lugar a mejores resultados. Debe probar la configuración antes de usarla para asegurarse de que los resultados son satisfactorios.

Uso de herramientas de orquestación de LLM

Uso como base de datos vectorial con Semantic Kernel

Ahora puede usar Semantic Kernel para orquestar la recuperación de información desde el núcleo virtual de Azure Cosmos DB for MongoDB y el LLM. Obtenga más información aquí.

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

Uso como base de datos vectorial con LangChain

Use LangChain para orquestar la recuperación de información desde el núcleo virtual de Azure Cosmos DB for MongoDB y el LLM. Obtenga más información aquí.

Uso como caché semántica con LangChain

Use LangChain y Azure Cosmos DB for MongoDB (núcleo virtual) para orquestar el almacenamiento en caché semántico, mediante respuestas de LLM previamente grabadas que pueden ahorrar costos de API de LLM y reducir la latencia de las respuestas. Obtenga más información aquí.

Características y limitaciones

  • Métricas de distancia admitidas: L2 (euclidiano), producto interno y coseno.
  • Métodos de indexación admitidos: IVFFLAT, HNSW y DiskANN (versión preliminar)
  • Indexación de vectores de hasta 2000 dimensiones de tamaño.
  • La indexación solo se aplica a un vector por ruta de acceso.
  • Solo se puede crear un índice por ruta de acceso vectorial.

Resumen

En esta guía se muestra cómo crear un índice vectorial, agregar documentos con datos vectoriales, realizar una búsqueda de similitud y recuperar la definición de índice. Con la base de datos vectorial integrada puede almacenar, indexar y consultar de forma eficaz datos vectoriales de alta dimensión directamente en el núcleo virtual de Azure Cosmos DB for MongoDB. Le permite desbloquear todo el potencial de los datos con incrustaciones vectoriales y le capacita para crear aplicaciones más precisas, potentes y eficaces.

Paso siguiente