Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Use la base de datos vectorial integrada en Azure DocumentDB para conectar sin problemas las aplicaciones basadas en inteligencia artificial con los datos almacenados en Azure DocumentDB. 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 almacenados directamente en Azure DocumentDB, junto con los datos originales de los que 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 una base de datos vectorial es una base de datos diseñada para almacenar y administrar incrustaciones vectoriales, que son representaciones matemáticas de datos en un espacio dimensional. 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 DocumentDB, puede almacenar, indexar e insertar consultas 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 mantiene juntas las incrustaciones vectoriales y los datos originales, lo que facilita mejor las operaciones de datos incrementales y permite una mayor coherencia, escala y rendimiento de los datos.
Casos de uso de las base de datos vectoriales
Las bases de datos vectoriales se usan en muchas áreas de inteligencia artificial y análisis de datos. Ayudan con tareas como la comprensión del lenguaje natural, el reconocimiento de imágenes y vídeos, la creación de sistemas de recomendación y la potenciación de las características de búsqueda. Puede encontrarlos en aplicaciones de inteligencia artificial analítica y de inteligencia artificial generativa.
Por ejemplo, puede usar una base de datos vectorial para:
- Identifique imágenes, documentos y canciones similares en función de su contenido, temas, opiniones y estilos.
- Identifique productos similares en función de sus características, funcionalidades y grupos de usuarios.
- Recomendar contenido, productos o servicios en función de las preferencias de las personas.
- Recomendar contenido, productos o servicios en función de las similitudes de los grupos de usuarios.
- Identifique las opciones potenciales más adecuadas de un gran grupo de opciones para satisfacer los requisitos complejos.
- Identifique anomalías de datos o actividades fraudulentas que no son similares a los patrones predominantes o normales.
- Implemente la memoria persistente para los agentes de IA.
- Habilite la generación aumentada mediante recuperación (RAG).
Base de datos vectorial integrada frente a base de datos vectorial pura
Existen dos tipos comunes de implementaciones de base de datos vectoriales: base de datos vectorial pura y base de datos vectorial integrada en una base de datos NoSQL o relacional.
Una base de datos vectorial pura almacena y administra eficazmente las incrustaciones de vectores junto con una pequeña cantidad de metadatos. Es independiente del origen de datos del que se derivan las incrustaciones.
Una base de datos vectorial que se integra en una base de datos NoSQL o relacional altamente eficaz proporciona funcionalidades adicionales. La base de datos vectorial integrada en una base de datos noSQL o relacional puede almacenar, indexar e insertar consultas junto con los datos originales correspondientes. Este enfoque elimina el coste adicional de replicar datos en una base de datos de vectores pura independiente. Además, mantener juntos las incrustaciones de vectores y los datos originales facilita mejor las operaciones de datos incrementales y permite una mayor coherencia, escala y rendimiento de los datos.
Bases de datos vectoriales de código abierto
Cuando los desarrolladores seleccionan bases de datos vectoriales, las opciones de código abierto proporcionan numerosas ventajas. Código abierto significa que el código fuente del software está disponible libremente, lo que permite a los usuarios personalizar la base de datos según sus necesidades específicas. Esta flexibilidad es beneficiosa para las organizaciones que están sujetas a requisitos normativos únicos para los datos, como las empresas del sector de servicios financieros.
Otra ventaja de las bases de datos vectoriales de código abierto es el fuerte apoyo de la comunidad del que gozan. Las comunidades de usuarios activas suelen contribuir al desarrollo de estas bases de datos, proporcionan ayuda y comparten procedimientos recomendados, lo que promueve la innovación.
Algunas personas optan por bases de datos vectoriales de código abierto porque son "gratuitas", lo que significa que no hay ningún costo para adquirir o usar el software. Una alternativa consiste en usar los niveles gratuitos ofrecidos por los servicios de bases de datos vectoriales administradas. Estos servicios administrados no solo proporcionan acceso gratuito hasta un determinado límite de uso, sino que también simplifican la carga operativa al gestionar el mantenimiento, las actualizaciones y la escalabilidad. Por lo tanto, mediante el nivel gratuito de servicios de base de datos vectoriales administrados, puede ahorrar costos al reducir la sobrecarga de administración. Este enfoque le permite centrarse más en las actividades principales en lugar de en la administración de bases de datos.
Selección de la mejor base de datos de vectores de código abierto
La elección de la mejor base de datos vectorial de código abierto requiere tener en cuenta varios factores. El rendimiento y la escalabilidad de la base de datos son cruciales, ya que afectan a si la base de datos puede controlar los requisitos específicos de la carga de trabajo. Las bases de datos con funcionalidades eficaces de indexación y consulta suelen ofrecer un rendimiento óptimo. Otro factor es la ayuda de la comunidad y la documentación disponibles para la base de datos. Una sólida comunidad y una amplia documentación pueden proporcionar ayuda valiosa. Por ejemplo, DocumentDB es una base de datos vectorial de código abierto popular:
Es posible que la opción más popular no sea la mejor opción para usted. Por lo tanto, debe comparar diferentes opciones en función de las características, los tipos de datos admitidos y la compatibilidad con las herramientas y marcos existentes que use. También debe tener en cuenta los desafíos de las bases de datos vectoriales de código abierto.
Desafíos de las bases de datos vectoriales de código abierto
La mayoría de las bases de datos vectoriales de código abierto, incluidas las enumeradas anteriormente, son bases de datos vectoriales puras. En otras palabras, están diseñados para almacenar y administrar incrustaciones de vectores solo, junto con una pequeña cantidad de metadatos. Dado que funcionan por separado de los datos originales, debe mover datos entre distintos servicios. Esta complejidad agrega costos adicionales, hace que las cosas sean más complejas y pueden ralentizar los sistemas de producción.
También plantean los desafíos típicos de las bases de datos de código abierto:
- Instalación: necesita conocimientos detallados para instalar, configurar y operar la base de datos, especialmente para implementaciones complejas. Optimizar los recursos y la configuración y, al mismo tiempo, ampliar su funcionamiento, requiere supervisión y ajustes continuos.
- Mantenimiento: debe administrar sus propias actualizaciones, revisiones y mantenimiento. La experiencia en aprendizaje automático no es suficiente; También debe tener una amplia experiencia en la administración de bases de datos.
- Soporte técnico: el soporte técnico oficial puede ser limitado en comparación con los servicios administrados, por lo que se recurre más a la ayuda de la comunidad.
Por tanto, aunque gratuitas al principio, las bases de datos vectoriales de código abierto incurren en costos significativos cuando se amplían. La expansión de las operaciones requiere más hardware, personal de TI cualificado y administración avanzada de la infraestructura, lo que conduce a mayores gastos en hardware, personal y costos operativos. El escalado de las bases de datos vectoriales de código abierto puede ser financieramente exigente a pesar de la falta de tarifas de licencia.
Cómo abordar los desafíos de las bases de datos vectoriales de código abierto
Una base de datos vectorial totalmente administrada que se integra en una base de datos NoSQL o relacional altamente eficaz evita el costo adicional y la complejidad de las bases de datos vectoriales de código abierto. Esta base de datos almacena, indexa y consulta inserciones junto con los datos originales correspondientes. Este enfoque elimina el coste adicional de replicar datos en una base de datos de vectores pura independiente. Además, mantener las incrustaciones de vectores y los datos originales juntos facilita mejor las operaciones de datos incrementales y permite una mayor coherencia, escala y rendimiento de los datos. Mientras tanto, el servicio totalmente administrado ayuda a los desarrolladores a evitar las molestias de configurar y mantener una base de datos vectorial de código abierto y de recurrir a la ayuda de la comunidad cuando hay problemas. Además, algunos servicios de base de datos vectoriales administrados ofrecen un nivel de servicio gratuito de por vida.
Un ejemplo es la base de datos vectorial integrada en Azure DocumentDB. Esta configuración permite a los desarrolladores ahorrar dinero como lo harían con bases de datos vectoriales de código abierto. Pero a diferencia de las opciones de código abierto, el proveedor de servicios se encarga del mantenimiento, las actualizaciones y el escalado automáticamente. La actualización es rápida y sencilla, al tiempo que mantiene un bajo costo total de propiedad (TCO) cuando es el momento de escalar verticalmente las operaciones. También puede usar este servicio para escalar convenientemente aplicaciones de MongoDB que ya están en producción.
Realizar búsqueda de similitud vectorial
Azure DocumentDB 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 DocumentDB, primero debe crear un índice vectorial. Aunque Azure DocumentDB 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 |
Puede usar índices DiskANN 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 | Description |
|---|---|---|
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. Un vector que usa 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 | Description |
|---|---|---|
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. En este ejemplo se 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 obtener más filtrados.
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
is_opencampo, por lo que puede filtrar los resultados en función de si las empresas están abiertas. - Índice geoespacial del campo
locationpara filtrar por proximidad geográfica.
Realizar una búsqueda de vectores
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 a las empresas abiertas. Cada resultado incluye la puntuación de similitud y los metadatos, que muestran cómo DiskANN en Azure DocumentDB admite consultas vectoriales y geoespaciales combinadas para experiencias de búsqueda enriquecidas y sensibles a 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'
}
]
Búsqueda de vectores filtrados
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 desea 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 agregar 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 herramientas de orquestación del modelo de lenguaje grande (LLM)
Uso como base de datos vectorial con Semantic Kernel
Utilice el Kernel Semántico para orquestar la recuperación de información de Azure DocumentDB y LLM. Para más información, consulte el repositorio de GitHub.
Uso como base de datos vectorial con LangChain
Usa LangChain para orquestar la recuperación de información de Azure DocumentDB y el LLM. Para más información, consulte Integraciones de LangChain para Azure DocumentDB.
Uso como caché semántica con LangChain
Use LangChain y Azure DocumentDB para orquestar el almacenamiento en caché semántico, mediante respuestas LLM grabadas anteriormente que pueden ahorrar costos de la API de LLM y reducir la latencia de las respuestas. Para más información, consulte Integración de LangChain con Azure DocumentDB.
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.
- Puede crear un solo í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. Mediante el uso de nuestra base de datos vectorial integrada, puede almacenar, indexar y consultar datos vectoriales de alta dimensión de forma eficaz directamente en Azure DocumentDB. 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 de venta minorista con patrón RAG de .NET
- 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