Búsqueda vectorial para Amazon DocumentDB - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Búsqueda vectorial para Amazon DocumentDB

La búsqueda vectorial es un método utilizado en el machine learning para encontrar puntos de datos similares a un punto de datos determinado mediante la comparación de sus representaciones vectoriales mediante métricas de distancia o similitud. Cuanto más cerca estén los dos vectores del espacio vectorial, más parecidos se considerarán los elementos subyacentes. Esta técnica ayuda a captar el significado semántico de los datos. Este enfoque es útil en diversas aplicaciones, como los sistemas de recomendación, el procesamiento del lenguaje natural y el reconocimiento de imágenes.

La búsqueda vectorial para Amazon DocumentDB combina la flexibilidad y la amplia capacidad de consulta de una base de datos de documentos basada en JSON con la potencia de la búsqueda vectorial. Si desea utilizar sus datos actuales de Amazon DocumentDB o una estructura de datos de documentos flexible para crear casos de uso de machine learning e IA generativa, como la experiencia de búsqueda semántica, recomendación de productos, personalización, chatbots, detección de fraudes y detección de anomalías, la búsqueda vectorial para Amazon DocumentDB es la opción ideal para usted. La búsqueda vectorial está disponible en los clústeres basados en instancias de Amazon DocumentDB 5.0.

Inserción de vectores

Para insertar vectores en la base de datos de Amazon DocumentDB, puede utilizar los métodos de inserción existentes:

Ejemplo

En el siguiente ejemplo, se crea una colección de cinco documentos dentro de una base de datos de prueba. Cada documento incluye dos campos: el nombre del producto y su incrustación vectorial correspondiente.

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

Creación de un índice vectorial

Amazon DocumentDB admite los métodos de indexación Jerarchical Navigable Small World (HNSW) y de indexación de archivos invertidos con compresión plana (). IVFFlat Un IVFFlat índice segrega los vectores en listas y, posteriormente, busca en un subconjunto seleccionado de las listas más cercanas al vector de consulta. Por otro lado, un índice HNSW organiza los datos vectoriales en un gráfico de varias capas. Si bien HNSW tiene tiempos de creación más lentos en comparación con HNSW IVFFlat, ofrece un mejor rendimiento y recuperación de las consultas. Por el contrario IVFFlat, HNSW no implica ningún paso de entrenamiento, lo que permite generar el índice sin ninguna carga inicial de datos. En la mayoría de los casos de uso, recomendamos utilizar el tipo de índice HNSW para la búsqueda vectorial.

Si no crea un índice vectorial, Amazon DocumentDB hacer una búsqueda exacta del vecino más cercano, lo que garantiza una recuperación perfecta. Sin embargo, en los escenarios de producción, la velocidad es crucial. Recomendamos utilizar índices vectoriales, que pueden cambiar un poco de memoria por mejorar la velocidad. Es importante tener en cuenta que agregar un índice vectorial puede generar resultados de consulta diferentes.

Plantillas

Puede usar las siguientes plantillas de createIndex o runCommand para crear un índice vectorial en un campo vectorial:

Using createIndex

En algunos controladores, como mongosh y Java, el uso de los parámetros vectorOptions de createIndex puede provocar un error. En estos casos, recomendamos utilizar runCommand:

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

En algunos controladores, como mongosh y Java, el uso de los parámetros vectorOptions de createIndex puede provocar un error. En estos casos, recomendamos utilizar runCommand:

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
Parámetro Requisito Tipo de datos: Descripción Valores

name

opcional

cadena

Especifica el nombre del índice.

Alfanumérico

type

opcional

Especifica el tipo de índice.

Compatible: hnsw o ivfflat

Valor predeterminado: HNSW (con el parche del motor a partir de la versión 3.0.4574)

dimensions

obligatorio

entero

Especifica el número de dimensiones de los datos vectoriales.

Máximo de 2000 dimensiones.

similarity

obligatorio

cadena

Especifica la métrica de distancia utilizada para el cálculo de similitud.

  • euclidean

  • cosine

  • dotProduct

lists

necesario para IVFFlat

entero

Especifica el número de clústeres que el IVFFlat índice utiliza para agrupar los datos vectoriales. La configuración recomendada es el número de documentos/1000 para un máximo de un millón de documentos y sqrt(# of documents) para más de un millón de documentos.

Mínimo: 1

Máximo: consulte la tabla de listas por tipo de instancia que aparece en Características y limitaciones a continuación.

m

opcional

entero

Especifica el número máximo de conexiones para un índice HNSW

Predeterminado: 16

Rango: [2, 100]

efConstruction

opcional

entero

Especifica el tamaño de la lista dinámica de candidatos para construir el gráfico del índice de HNSW.

efConstruction debe ser mayor o igual que (2 * m)

Predeterminado: 64

Rango [4, 1000]

Es importante que establezca adecuadamente el valor de los subparámetros, como lists para IVFFlat m y efConstruction para HNSW, ya que esto afectará a la precisión/recuperación, al tiempo de creación y al rendimiento de la búsqueda. Un valor de lista más alto aumenta la velocidad de la consulta, ya que reduce el número de vectores de cada lista, lo que se traduce en regiones más pequeñas. Sin embargo, un tamaño de región más pequeño puede provocar más errores de recuperación, lo que se traduce en una menor precisión. En el caso de HNSW, aumentar el valor m y efConstruction aumenta la precisión, pero también se incrementa el tiempo y el tamaño de creación del índice. Consulte los siguientes ejemplos:

Ejemplos

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

Obtención de una definición de índice

Puede ver los detalles de los índices, incluidos los índices vectoriales, mediante el comando getIndexes:

Ejemplo

db.collection.getIndexes()

Ejemplo de salida

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

Consulta de vectores

Plantilla de consulta vectorial

Utilice la siguiente plantilla para consultar un vector:

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
Parámetro Requisito Tipo Descripción Valores

vectorSearch

obligatorio

operador

Se utiliza dentro del comando $search para consultar los vectores.

vector

obligatorio

array

Indica el vector de consulta que se utilizará para buscar vectores similares.

path

obligatorio

cadena

Define el nombre del campo vectorial.

k

obligatorio

entero

Especifica el número de resultados que devuelve la búsqueda.

similarity

obligatorio

cadena

Especifica la métrica de distancia utilizada para el cálculo de similitud.

  • euclidean

  • cosine

  • dotProduct

probes

opcional

entero

El número de clústeres que desea que inspeccione la búsqueda vectorial. Un valor más alto proporciona una mejor recuperación a costa de la velocidad. Se puede establecer en función del número de listas para la búsqueda exacta del vecino más cercano (momento en el que el planificador no utilizará el índice). La configuración recomendada para iniciar el ajuste preciso es sqrt(# of lists).

Valor predeterminado: 1

efSearch

opcional

entero

Especifica el tamaño de la lista dinámica de candidatos que el índice de HNSW utiliza durante la búsqueda. Un valor más alto de efSearch proporciona una mejor recuperación a costa de la velocidad.

Predeterminado: 40

Rango: [1, 1000]

Es importante ajustar con precisión el valor de efSearch (HNSW) o probes (IVFFlat) para lograr el rendimiento y la precisión deseados. Vea los siguientes ejemplos de operaciones:

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

Ejemplo de salida

La salida de esta operación será similar a lo que se indica a continuación:

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

Características y limitaciones

Compatibilidad de versiones

  • La búsqueda vectorial para Amazon DocumentDB solo está disponible en los clústeres basados en instancias de Amazon DocumentDB 5.0.

Vectores

  • Amazon DocumentDB puede indexar vectores de hasta 2000 dimensiones. Sin embargo, se pueden almacenar hasta 16 000 dimensiones sin un índice.

Índices

  • Para la creación de IVFFlat índices, la configuración recomendada para el parámetro de listas es el número de documentos/1000 para un máximo de 1 millón de documentos y sqrt(# of documents) para más de 1 millón de documentos. Debido al límite de memoria de trabajo, Amazon DocumentDB admite un determinado valor máximo del parámetro de listas en función del número de dimensiones. Como referencia, en la siguiente tabla se proporcionan los valores máximos del parámetro de listas para vectores de 500, 1000 y 2000 dimensiones:

    Tipo de instancia Listas con 500 dimensiones Listas con 1000 dimensiones Listas con 2000 dimensiones

    t3.med

    372

    257

    150

    r5.l

    915

    741

    511

    r5.xl

    1.393

    1.196

    901

    r5.2xl

    5.460

    5.230

    4.788

    r5.4xl

    7.842

    7.599

    7.138

    r5.8xl

    11.220

    10.974

    10.498

    r5.12xl

    13.774

    13.526

    13.044

    r5.16xl

    15.943

    15.694

    15.208

    r5.24xl

    19.585

    19.335

    18.845

  • Los índices vectoriales no admiten otras opciones de índice, como compound, sparse o partial.

  • El índice de HNSW no admite la creación de índices en paralelo. Solo es compatible con el IVFFlat índice.

Consulta vectorial

  • Para una consulta de búsqueda vectorial, es importante afinar los parámetros, por ejemplo, probes o efSearch, para obtener resultados óptimos. Cuanto mayor sea el valor del parámetro probes o efSearch, mayor será la recuperación y menor será la velocidad. La configuración recomendada para iniciar el ajuste preciso del parámetro de sondas es sqrt(# of lists).

Prácticas recomendadas

Descubra las prácticas recomendadas para trabajar con la búsqueda vectorial en Amazon DocumentDB. Esta sección se actualiza continuamente a medida que se identifican nuevas prácticas recomendadas.

  • La creación del índice de archivos invertidos con compresión plana (IVFFlat) implica agrupar y organizar los puntos de datos en función de las similitudes. Por lo tanto, para que un índice sea más eficaz, le recomendamos que cargue al menos algunos datos antes de crearlo.

  • Para consultas de búsqueda vectorial, es importante afinar los parámetros, por ejemplo, probes o efSearch, para obtener resultados óptimos. Cuanto mayor sea el valor del parámetro probes o efSearch, mayor será la recuperación y menor será la velocidad. La configuración recomendada para empezar a afinar el parámetro probes es sqrt(lists).

Recursos