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 M30 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 Descripción
index_name cuerda / cadena Nombre único del índice.
path_to_property cuerda / cadena 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 cuerda / cadena Tipo de índice vectorial que se va a crear. Las opciones son vector-ivf, vector-hnsw, y vector-diskann.
dimensions entero Número de dimensiones para la similitud vectorial. DiskANN admite hasta 16 000 dimensiones (con cuantificación de productos), con compatibilidad futura planeada para más de 40 000.
similarity cuerda / cadena 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 entero 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 entero 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 entero 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 entero 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.

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

Ahora puede ejecutar búsquedas de vectores con cualquier filtro de consulta compatible, como $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin y $regex.

Para usar el filtrado previo, primero deberá definir un índice estándar en la propiedad por la que pretende filtrar, además del índice vectorial. Este es un ejemplo de creación de un índice de filtro:

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

Una vez implementado el índice de filtro, puede incorporar la cláusula directamente a la "filter" consulta de búsqueda vectorial, como se muestra a continuación. En este ejemplo se muestra cómo filtrar los resultados en los que el valor de la "title" propiedad no está presente en la lista proporcionada:

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

Para optimizar el rendimiento y la precisión de las búsquedas vectoriales filtradas previamente, considere la posibilidad de ajustar los parámetros del índice vectorial. En el caso de los índices DiskANN , aumentar maxDegree o lBuild podría producir mejores resultados. En el caso de los índices de HNSW , experimentar con valores más altos para m, efConstructiono efSearch puede mejorar el rendimiento. Del mismo modo, para los índices IVF, la optimización de numLists o nProbes podría dar lugar a resultados más satisfactorios. Es fundamental probar su configuración específica con los datos para asegurarse de que los resultados cumplen sus requisitos. Estos parámetros influyen en la estructura del índice y el comportamiento de búsqueda, y los valores óptimos pueden variar en función de las características de los datos y los patrones de consulta.

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.
  • Con DiskANN y Product Quantization, puede indexar vectores hasta 16 000 dimensiones.
  • El uso de HNSW o IVF con media precisión permite la indexación de vectores de hasta 4,000 dimensiones.
  • Sin ninguna compresión, la dimensión de vector máxima predeterminada para la indexación es de 2000.
  • 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