Almacén de vectores en Azure Cosmos DB basado en núcleo virtual para MongoDB
SE APLICA A: núcleo virtual de MongoDB
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.
Realizar búsqueda de similitud de vectores
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 |
Nota:
Habilite la característica "Índice de vectores de DiskANN para Azure Cosmos DB for MongoDB" () en la pestaña "Características de versión preliminar" de la suscripción de Azure. Puede encontrar más información sobre las características en versión preliminar aquí.
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 . |
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.
Realización de una búsqueda vectorial
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í.
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.
Contenido relacionado
- Solución de referencia comercial .NET RAG Pattern
- Tutorial de .NET: bot de chat de recetas
- Patrón RAG de C#: integración de servicios OpenAI con Cosmos
- Patrón RAG de Python: bot de chat de productos de Azure
- Tutorial del cuaderno de Python: integración de bases de datos vectoriales a través de LangChain
- Tutorial del cuaderno de Python: integración del almacenamiento en caché de LLM a través de LangChain
- Python: Integración LlamaIndex
- Python: Integración de memoria de kernel semántica