View a markdown version of this page

Uso de índices vectoriales en DynamoDB - Amazon DynamoDB

Uso de índices vectoriales en DynamoDB

Los índices vectoriales son un tipo de índice de Amazon DynamoDB que permite buscar similitudes en incrustaciones vectoriales almacenadas en los elementos de la tabla. A diferencia de los índices secundarios globales y los índices secundarios locales, que admiten consultas de coincidencia exacta y de rango mediante las operaciones Query y Scan, los índices vectoriales utilizan la búsqueda aproximada del vecino más cercano (ANN) para encontrar los elementos cuyos vectores son más similares a un vector de consulta que proporcione. Estas búsquedas de similitud se realizan mediante una llamada a la API SearchVectors, que devuelve los elementos más similares clasificados según una puntuación de similitud.

Con los índices vectoriales, puede almacenar incrustaciones vectoriales junto con los datos operativos en DynamoDB y realizar búsquedas de similitud sin necesidad de una base de datos vectorial independiente. Esto elimina la necesidad de canalizaciones de replicación de datos complejas entre DynamoDB y los almacenes vectoriales externos.

Los índices vectoriales se administran mediante las mismas API CreateTable y UpdateTable que ya utiliza, con el parámetro VectorIndexes (para CreateTable) y el parámetro VectorIndexUpdates (para UpdateTable).

Casos de uso para índices vectoriales

Los índices vectoriales admiten una variedad de casos de uso que implican la búsqueda de elementos similares en función de representaciones vectoriales:

  • Búsqueda semántica: cree motores de búsqueda que entiendan el significado de las consultas en lugar de hacer coincidir las palabras clave. Almacene las incrustaciones de texto generadas por los modelos de machine learning y busque contenido semánticamente similar.

  • Generación aumentada por recuperación (RAG): conecte modelos de lenguaje de gran tamaño (LLM) con bases de conocimiento relevantes. Almacene incrustaciones de documentos en DynamoDB y recupere el contexto más relevante para las solicitudes de LLM.

  • Sistemas de recomendaciones: busque productos, contenido o usuarios similares en función de representaciones vectoriales de sus características o comportamiento.

  • Memoria de agentes de IA: almacene las incrustaciones de conversaciones para mantener el contexto entre sesiones y mejorar el rendimiento de los agentes de IA.

  • Detección de anomalías y fraudes: compare eventos nuevos con incrustaciones de comportamientos normales conocidos para detectar valores atípicos, como transacciones inusuales o actividades fraudulentas.

Comparación de índices vectoriales con índices secundarios

En la tabla siguiente, se comparan los índices vectoriales con los índices secundarios globales y los índices secundarios locales.

Característica Índice vectorial Índice secundario global Índice secundario local
Tipo de consulta Búsqueda de similitud Coincidencia exacta y rango Coincidencia exacta y rango
API de lectura SearchVectors Query, Scan Query, Scan
Esquema Atributo vectorial, además del SearchSchema opcional (clave de partición, filtros en línea) Claves de partición y claves de clasificación opcionales Misma clave de partición, clave de clasificación diferente
Máximo por tabla 5 20 5
Modo de capacidad Solo bajo demanda Bajo demanda o aprovisionada Bajo demanda o aprovisionada

Funciones de distancia

Cuando crea un índice vectorial, elige una función de distancia. La función de distancia determina cómo DynamoDB mide la similitud entre los vectores. Su elección afecta a la calidad de la clasificación y a la precisión de la búsqueda. Amazon DynamoDB admite tres funciones de distancia.

Función de distancia Interpretación de la puntuación Mejor coincidencia
COSINE Las puntuaciones más bajas indican una mayor similitud. Mide la distancia del coseno (1 menos la similitud del coseno) entre dos vectores. Los valores van desde 0 (dirección idéntica) hasta 2 (dirección opuesta). Puntuaciones más bajas
DOT_PRODUCT Las puntuaciones más altas indican una mayor similitud. Mide el producto de puntos entre dos vectores. Puntuaciones más altas
EUCLIDEAN Las puntuaciones más bajas indican una mayor similitud. Mide la distancia en línea recta entre dos vectores. Puntuaciones más bajas

Para comparar cómo las funciones de distancia clasifican el mismo vector de consulta, consulte Cómo clasifican los resultados las funciones de distancia.

La guía siguiente ayuda a elegir la función de distancia adecuada para la carga de trabajo.

COSINE

Compara la dirección e ignora la magnitud. Use COSINE para establecer similitudes semánticas con modelos de incrustación de texto. Estos modelos codifican el significado en la dirección y la longitud del vector puede variar. Los ejemplos incluyen Amazon Titan Text Embeddings y Cohere Embed.

COSINE es especialmente adecuado para los siguientes casos de uso:

  • Búsqueda semántica sobre descripciones de productos o documentos

  • Generación aumentada de recuperación (RAG)

  • Coincidencia de preguntas frecuentes

COSINE es la opción segura predeterminada cuando no se tiene claro qué función utilizar.

DOT_PRODUCT

DOT_PRODUCT es sensible tanto a la dirección como a la magnitud (la longitud de un vector). Elija DOT_PRODUCT cuando la documentación del modelo de incrustación recomiende el producto de puntos como medida de similitud o cuando desee que la longitud del vector influya en la clasificación.

DOT_PRODUCT es especialmente adecuado para los siguientes casos de uso:

  • Sistemas de recomendación que utilizan puntuaciones de popularidad o confianza para escalar las incrustaciones e influir en la clasificación

  • Modelos cuya documentación recomienda específicamente el producto de puntos como medida de similitud

  • Clasificación sensible a la magnitud en la que la longitud del vector transmite una señal significativa

Recomendamos normalizar las incrustaciones a una longitud unitaria. Cuando se normaliza, DOT_PRODUCT clasifica los resultados de la misma manera que COSINE. Omita la normalización solo si desea que la magnitud afecte a la clasificación.

Ejemplo de caso de uso: un sistema de recomendación de productos en el que se escala la incrustación de cada producto en función de su puntuación de popularidad. Los productos más populares obtienen vectores más largos y ocupan un lugar más alto en los resultados de búsqueda.

EUCLIDEAN

Mide la distancia en línea recta entre dos vectores. EUCLIDEAN es sensible a la magnitud. Úselo cuando la posición absoluta en el espacio de incrustación importe.

EUCLIDEAN es especialmente adecuado para los siguientes casos de uso:

  • Incrustaciones de imagen o audio donde la distancia espacial importa

  • Detección de casi duplicados

  • Agrupación y detección de anomalías

Ejemplo de caso de uso: encontrar imágenes casi duplicadas a partir de incrustaciones de imágenes.

Elección de una función de distancia que coincida con el modelo de incrustación

Si no tiene claro qué función utilizar, consulte la documentación del modelo de incrustación. Valide su elección con un conjunto de datos representativo. No puede cambiar la función de distancia después de crear el índice. Para obtener más información, consulte Hacer coincidir la función de distancia con las incrustaciones.

Cómo clasifican los resultados las funciones de distancia

La función de distancia que elija al crear el índice determina el valor de Score y el orden de clasificación de los resultados. La misma consulta puede clasificar los mismos elementos de forma diferente en distintas funciones de distancia. En el ejemplo siguiente, se utiliza el vector de consulta [1, 0, 0, 0] comparándolo con cuatro vectores almacenados.

Vector almacenado COSINE (cuanto menor, más similar) EUCLIDEAN (cuanto menor, más similar) DOT_PRODUCT (cuanto mayor, más similar)
[1, 0, 0, 0] 0.0 0.0 1.0
[10, 0, 0, 0] 0.0 9.0 10.0
[0.7071, 0.7071, 0, 0] 0.29 0.77 0.71
[-1, 0, 0, 0] 2.0 2.0 -1.0

Cabe destacar dos comportamientos:

  • COSINE ignora la magnitud. Puntúa [1, 0, 0, 0] y [10, 0, 0, 0] de forma idéntica (ambas 0.0) porque apuntan en la misma dirección. EUCLIDEAN sitúa [10, 0, 0, 0] en último lugar para la misma consulta porque mide la distancia absoluta, que aumenta con la magnitud de un vector.

  • Las puntuaciones de DOT_PRODUCT pueden ser negativas. Un vector que apunta en la dirección opuesta ([-1, 0, 0, 0]) puntúa -1.0. No dé por sentado que las puntuaciones son siempre no negativas al ordenar o aplicar umbrales a los resultados.

SearchSchema

Al crear un índice vectorial, si lo desea, puede definir un SearchSchema que especifique las claves de partición del índice vectorial y los atributos de filtro en línea.

HASH (clave de partición de índice vectorial)

Una clave de partición de índice vectorial divide los datos del índice para un escalado independiente. Al especificar una clave de partición de índice vectorial, los elementos con el mismo valor de clave de partición se almacenan juntos, lo que permite al sistema buscar solo los datos relevantes. A gran escala, esto reduce la latencia de la búsqueda, ya que la búsqueda examina solo un subconjunto del espacio vectorial en lugar de examinar todo el índice. Utilice atributos con una cardinalidad de baja a media, como Category o Country. Puede especificar como máximo una clave de partición de índice vectorial.

Si define una clave de partición de índice vectorial en el SearchSchema, debe proporcionar su valor en SearchConditionExpression cuando llame a SearchVectors.

Uso de una clave de partición para escalar el rendimiento de la búsqueda

Defina una clave de partición de índice vectorial cuando espere un índice grande o un volumen de búsquedas elevado. Como cada llamada a SearchVectors se limita a un único valor de clave de partición, distribuir los datos entre varios valores de clave de partición permite ejecutar más operaciones de búsqueda por segundo y reduce la cantidad de datos que examina cada búsqueda. Consulte Elección de una clave de partición que coincida con los patrones de consulta.

INLINE_FILTER

Los atributos del filtro en línea se proyectan en el índice vectorial para que DynamoDB pueda filtrar durante la búsqueda en la capa de almacenamiento.

Los filtros en línea admiten el operador de igualdad (=) en SearchConditionExpression. Los operadores de comparación, rango y pertenencia a conjuntos (<>, <, <=, >, >=, IN) aún no están disponibles. A diferencia de las claves de partición de índice vectorial, los filtros en línea son opcionales durante la búsqueda.

Puede crear un índice vectorial sin definir una clave de partición en el SearchSchema. En este caso, cada llamada a SearchVectors busca en todo el índice. Esto es más sencillo porque no se necesita una SearchConditionExpression, pero no se escala horizontalmente. A medida que el índice crece, cada búsqueda examina más datos, lo que aumenta la latencia y el costo. Si la carga de trabajo requiere un alto rendimiento o si el índice contiene una gran cantidad de vectores, defina una clave de partición para distribuir los datos entre las particiones y escalarlos de forma independiente. Consulte Elección de una clave de partición que coincida con los patrones de consulta.

Proyecciones

Al igual que los índices secundarios globales, los índices vectoriales admiten proyecciones que controlan qué atributos de la tabla base se copian en el índice. La proyección se especifica al crear el índice vectorial.

  • KEYS_ONLY: solo se proyectan en el índice los atributos de clave principal de la tabla base, el atributo vectorial y cualquier atributo de filtro en línea definido en el SearchSchema.

  • INCLUDE: además de los atributos KEYS_ONLY, se especifican otros atributos sin clave para proyectar. No puede cambiar el conjunto de atributos incluidos después de crear el índice vectorial. Para proyectar un conjunto diferente de atributos, elimine el índice y vuelva a crearlo con la proyección que desee.

  • ALL: todos los atributos de la tabla base se proyectan en el índice.

La proyección limita lo que puede devolver SearchVectors

Los atributos que no se proyectan en el índice vectorial no se pueden devolver en las respuestas de SearchVectors. Si necesita atributos específicos en los resultados de búsqueda, inclúyalos en la proyección o utilice ALL.

Uso de índices vectoriales con otras características de DynamoDB

DynamoDB Streams

Puede habilitar DynamoDB Streams en una tabla que tenga un índice vectorial, ya sea con el parámetro StreamSpecification al crear la tabla o mediante UpdateTable. La secuencia captura los cambios por elemento en la tabla base y funciona de forma independiente del índice vectorial.

Tablas globales

Puede agregar un índice vectorial a una tabla global y convertir una tabla que tenga un índice vectorial en una tabla global agregando una réplica con UpdateTable. La definición del índice vectorial, incluidas sus dimensiones, la función de distancia, el esquema de búsqueda y la proyección, se replica automáticamente en cada nueva región de réplica. El índice vectorial no se crea de forma independiente en la región de la réplica.

Los elementos que escriba en cualquier región de réplica se replican en las demás regiones y se indexan allí. Una vez completada la replicación, SearchVectors en cada región busca el mismo conjunto de vectores. Como la búsqueda vectorial utiliza el vecino más cercano aproximado (ANN), las búsquedas independientes en distintas regiones pueden arrojar resultados o un orden ligeramente diferentes para la misma consulta, incluso con datos idénticos. La replicación y la indexación de vectores en las demás regiones son asincrónicas, incluso para las tablas globales de coherencia alta multirregional (MRSC). Es posible que un vector que acaba de escribir en una región no aparezca todavía en los resultados de SearchVectors de otra región hasta que el cambio se haya propagado.

Capacidad bajo demanda requerida

Los índices vectoriales requieren el modo de capacidad bajo demanda, que también admiten las tablas globales. Cree el índice vectorial y la réplica en una tabla que ya utilice la capacidad bajo demanda.

Recuperación en un momento dado (PITR) y copias de seguridad

Al restaurar una tabla a partir de una recuperación en un momento dado o una copia de seguridad bajo demanda, DynamoDB restaura los datos de la tabla base y la definición del índice vectorial. Al igual que con los índices secundarios globales, DynamoDB reconstruye el índice vectorial a partir de los datos de la tabla base restaurados en lugar de copiarlos byte por byte, de modo que el índice se rellena antes de estar listo para la búsqueda. Espere a que IndexStatus sea ACTIVE y Backfilling sea false en el índice restaurado antes de ejecutar SearchVectors.

Periodo de vida (TTL)

Puede usar DynamoDB TTL en una tabla que tenga un índice vectorial. Cuando TTL elimina un elemento caducado de la tabla base, DynamoDB elimina la entrada correspondiente del índice vectorial, del mismo modo que lo hace una eliminación manual. Por lo tanto, los elementos caducados dejan de aparecer en los resultados de SearchVectors una vez que la eliminación se propaga al índice.

Importación y exportación de datos de tabla

Puede exportar una tabla que tenga un índice vectorial a Amazon S3; la exportación contiene los elementos de la tabla base, incluidos los atributos vectoriales almacenados en ellos. Cuando importe datos de Amazon S3 a una tabla nueva, defina el índice vectorial en la solicitud de importación del mismo modo que lo haría con CreateTable. DynamoDB indexa los elementos importados a medida que se escriben y el índice vectorial pasa a estar disponible una vez finalizada la importación.

DAX

DynamoDB Accelerator (DAX) no admite la operación SearchVectors. Envíe las solicitudes SearchVectors directamente a DynamoDB, incluso cuando la aplicación utilice DAX para otras operaciones de lectura. El almacenamiento en caché de las lecturas de la tabla base con DAX no se ve afectado por la presencia de un índice vectorial.