Compartir a través de


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

Use la base de datos vectorial integrada en Azure Cosmos DB para MongoDB (núcleo virtual) para conectar sin problemas las aplicaciones basadas en inteligencia artificial con los datos almacenados en Azure Cosmos DB. Esta integración puede incluir aplicaciones compiladas mediante 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 pequeño mundo navegable jerarquizado (HNSW), archivo invertido (IVF) y DiskANN. 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 usa para consultar las incrustaciones vectoriales (listas de números) de los datos que has creado mediante un modelo de aprendizaje automático utilizando una API de incrustaciones. Algunos ejemplos de API de inserción podrían ser Inserciones de Azure OpenAI 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 MongoDB (núcleo virtual), 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. Aunque Azure Cosmos DB para MongoDB (núcleo virtual) ofrece varias opciones, estas son algunas directrices generales que le ayudarán a empezar a trabajar en función del tamaño del conjunto de datos:

FIV HNSW DiskANN (recomendado)
Descripción Un índice OBJECTFlat divide los vectores en listas y, a continuación, busca en un subconjunto más cercano al vector de consulta. Un índice HNSW crea un gráfico multicapa. DiskANN es un algoritmo de búsqueda vecino más cercano aproximado diseñado para una búsqueda vectorial eficaz a cualquier escala.
Ventajas clave Pros: Tiempos de compilación más rápidos, menor uso de memoria.
Contras: Rendimiento reducido de las consultas (en términos de compensación entre velocidad y recuperación).
Pros: Se puede crear un mejor rendimiento de las consultas (en términos de equilibrio de velocidad y recuperación) en una tabla vacía.
Contras: Tiempos de compilación más lentos, mayor uso de memoria.
Pros: Eficiente a cualquier escala, recuperación alta, alto rendimiento, baja latencia.
Recuento de vectores Menos de 10 000 Hasta 50 000 Hasta 500 000+
Nivel de clúster recomendado M10 o M20 M30 y versiones posteriores M30 y versiones posteriores

Los índices DiskANN están disponibles en M30 y niveles superiores. Para crear el índice DiskANN, establezca el parámetro "kind" en "vector-diskann" siguiendo esta plantilla:

{ 
    "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 a la propiedad. 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 devuelven en el resultado de una búsqueda vectorial.
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 del producto), con una compatibilidad futura planeada para 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)y 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

Realización de una vector de búsqueda 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

Agregar 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, incrustaciones de Azure OpenAI o una 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 más filtrado.

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 listIndexes comando:

db.exampleCollection.getIndexes();

En este ejemplo, vectorIndex se devuelve con todos los cosmosSearch parámetros 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 prefiltro, primero debe 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. 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 prefiltradas, 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 la 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 las 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. Para más información, consulte el repositorio de GitHub.

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. Para más información, consulte Núcleo virtual de Mongo de Azure Cosmos DB.

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. Para más información, consulte Núcleo virtual de Mongo de Azure Cosmos DB.

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 la cuantificación de productos, 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 que tienen datos vectoriales, realizar una búsqueda de similitud y recuperar la definición del í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