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).
Temas
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
COSINEpara 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.COSINEes 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
COSINEes la opción segura predeterminada cuando no se tiene claro qué función utilizar. -
DOT_PRODUCT-
DOT_PRODUCTes sensible tanto a la dirección como a la magnitud (la longitud de un vector). ElijaDOT_PRODUCTcuando 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_PRODUCTes 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_PRODUCTclasifica los resultados de la misma manera queCOSINE. 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.
EUCLIDEANes sensible a la magnitud. Úselo cuando la posición absoluta en el espacio de incrustación importe.EUCLIDEANes 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:
-
COSINEignora la magnitud. Puntúa[1, 0, 0, 0]y[10, 0, 0, 0]de forma idéntica (ambas0.0) porque apuntan en la misma dirección.EUCLIDEANsitú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_PRODUCTpueden 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
CategoryoCountry. 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
SearchConditionExpressioncuando llame aSearchVectors.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
SearchVectorsse 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 (
=) enSearchConditionExpression. 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 atributosKEYS_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
StreamSpecificational crear la tabla o medianteUpdateTable. 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,
SearchVectorsen 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 deSearchVectorsde 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
IndexStatusseaACTIVEyBackfillingseafalseen el índice restaurado antes de ejecutarSearchVectors. - 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
SearchVectorsuna 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 solicitudesSearchVectorsdirectamente 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.