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 aprendizaje automático para encontrar puntos de datos similares a un punto de datos dado 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 aprendizaje automático e IA generativa, como la experiencia de búsqueda semántica, la recomendación de productos, la personalización, los chatbots, la detección de fraudes y la 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 correspondiente incrustación vectorial.

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]} ]);

Crear 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 índice IVFFlat segrega los vectores en listas y, posteriormente, busca en un subconjunto seleccionado de esas listas que esté más cerca del 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 IVFFlat, ofrece un mejor rendimiento y recuperación de las consultas. A diferencia de IVFFlat, HNSW no implica ningún paso de entrenamiento, lo que permite generar el índice sin ninguna carga inicial de datos. Para 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 realiza 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 añadir un índice vectorial puede generar resultados de consulta diferentes.

Plantillas

Puedes usar lo siguiente createIndex o runCommand plantillas para crear un índice vectorial en un campo vectorial:

Using createIndex

En algunos controladores, como mongosh y Java, el uso de los vectorOptions parámetros de createIndex puede provocar un error. En estos casos, se recomienda 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 vectorOptions parámetros de createIndex puede provocar un error. En estos casos, se recomienda 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 Valor (s)

name

opcional

cadena

Especifica el nombre del índice.

Alfanumérico

type

opcional

Especifica el tipo de índice.

Compatible: hnsw o ifflat

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

dimensions

obligatorio

integer

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 IVF-Flat

integer

Especifica el número de clústeres que el índice IVFFlat utiliza para agrupar los datos vectoriales. La configuración recomendada 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.

Mínimo: 1

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

m

opcional

integer

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

Predeterminado: 16

Rango [2, 100]

efConstruction

opcional

integer

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

efConstructiondebe ser mayor o igual a (2 * m)

Predeterminado: 64

Rango [4, 1000]

Es importante que defina adecuadamente el valor de los subparámetros, como lists los de IVFflat m y efConstruction 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, al aumentar el valor m y efConstruction la precisión, 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 } } )

Obtener una definición de índice

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

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

Consultando 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 Valor (s)

vectorSearch

obligatorio

operador

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

vector

obligatorio

matriz

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

path

obligatorio

cadena

Define el nombre del campo vectorial.

k

obligatorio

integer

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

integer

El número de conglomerados 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

integer

Especifica el tamaño de la lista dinámica de candidatos que el índice 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 (IVFlat) para lograr el rendimiento y la precisión deseados. Consulte 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 índices IVFFlat, 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 lists en función del número de dimensiones. Como referencia, la siguiente tabla proporciona 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,4 x l

    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

  • No hay otras opciones de índicecompound, como los índices vectoriales, sparse ni partial compatibles con ellos.

  • El índice HNSW no admite la creación de índices paralelos. Solo se admite para el índice IVFFlat.

Consulta vectorial

  • Para una consulta de búsqueda vectorial, es importante ajustar los parámetros, por ejemplo, efSearch para obtener resultados óptimos. probes Cuanto mayor sea el valor del efSearch parámetro probes o, mayor será la recuperación y menor será la velocidad. El ajuste recomendado para empezar a ajustar con precisión el parámetro de las sondas essqrt(# of lists).

Prácticas recomendadas

Conozca 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 las consultas de búsqueda vectorial, es importante ajustar los parámetros, por ejemplo, efSearch para obtener resultados óptimos. probes Cuanto mayor sea el valor del efSearch parámetro probes o, mayor será la recuperación y menor será la velocidad. El ajuste recomendado para iniciar el ajuste preciso del probes parámetro essqrt(lists).

Recursos