View a markdown version of this page

Trabajo con colecciones de búsqueda vectorial - OpenSearch Servicio Amazon

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.

Trabajo con colecciones de búsqueda vectorial

Con el tipo de colección de búsqueda vectorial de OpenSearch Serverless, puede realizar búsquedas de similitud escalables y de alto rendimiento. Puede crear experiencias de búsqueda aumentada de aprendizaje automático (ML) modernas y aplicaciones de inteligencia artificial generativa (IA) sin administrar la infraestructura de base de datos vectorial subyacente.

Los casos de uso de las colecciones de búsquedas vectoriales incluyen búsquedas de imágenes, búsquedas de documentos, recuperación de música, recomendaciones de productos, búsquedas de vídeos, búsquedas basadas en la ubicación, detección de fraudes y detección de anomalías.

El motor vectorial de OpenSearch Serverless utiliza la función de búsqueda del vecino más cercano (k-NN) en. OpenSearch Obtiene la misma funcionalidad con la simplicidad de un entorno sin servidor. El motor es compatible con la API del complemento k-NN. Con estas operaciones, puede utilizar la búsqueda de texto completo, el filtrado avanzado, las agregaciones, las consultas geoespaciales y las consultas anidadas para recuperar los datos más rápidamente y mejorar los resultados de búsqueda.

El motor vectorial proporciona métricas de distancia, como la distancia euclidiana, la similitud de coseno y la similitud de productos de puntos, y puede acomodar 16 000 dimensiones. Puede almacenar campos con varios tipos de datos para los metadatos, como números, valores booleanos, fechas, palabras clave y geopuntos. También puede almacenar campos con texto para obtener información descriptiva y añadir más contexto a los vectores almacenados. La ubicación de los tipos de datos reduce la complejidad, aumenta la capacidad de mantenimiento y evita la duplicación de datos, los problemas de compatibilidad de versiones y los problemas de licencia.

NextGen colecciones de búsquedas vectoriales

NextGen La búsqueda vectorial se escala según la demanda en función de la carga de trabajo para optimizar el equilibrio entre el coste y el rendimiento. Solo se cargan en la memoria los bloques de datos necesarios para atender las solicitudes de búsqueda activas, y los trabajadores escalan de forma dinámica en función de los recursos de memoria y CPU necesarios. Cuando la recopilación está inactiva y no hay solicitudes en curso, tanto la indexación como la búsqueda se escalan hasta cero, lo que supone un ahorro de costes adicional. De forma predeterminada, NextGen incluye optimizaciones integradas que mejoran la recuperación y, al mismo tiempo, reducen los costes y la latencia.

  • ID de documento personalizado: las NextGen colecciones admiten identificadores de documentos personalizados, lo que facilita a los clientes realizar actualizaciones o indexar documentos con los ID proporcionados por los usuarios.

  • Índices de compresión de 32 veces: todos los índices se crean de forma predeterminada con una técnica avanzada de compresión de 32 veces. Puede anular el nivel de compresión predeterminado y seleccionar cualquier nivel de compresión compatible: 1x, 2x, 8x, 16x o 32x (predeterminado).

  • Aceleración de creación de índices: la aceleración de la GPU está habilitada de forma predeterminada para ayudar a crear índices vectoriales a gran escala de forma más rápida y eficiente. Reduce el tiempo necesario para indexar los datos en índices vectoriales, lo que proporciona una experiencia de indexación de alto rendimiento y un ahorro de costes. Los recursos de la GPU se aprovisionan solo cuando son necesarios durante las operaciones de creación de índices. Puedes controlar el uso de la GPU por índice mediante la configuraciónindex.knn.remote_index_build.enabled. Para obtener más información, consulte Aceleración de GPU para indexación vectorial.

  • API simplificada: las colecciones de búsqueda NextGen vectorial no requieren los mode parámetros engine y en las asignaciones de índices. El sistema determina automáticamente la configuración óptima internamente, lo que reduce la complejidad de la creación de índices.

  • Respuesta de búsqueda optimizada: de forma predeterminada, las respuestas de búsqueda en NextGen las colecciones de vectores excluyen el vector original de los resultados. Esto reduce la latencia de búsqueda integral y el tamaño de la carga útil de respuesta. Para incluir vectores en la respuesta de búsqueda, consulteRecupere el documento completo con vectores.

  • NextGen Las colecciones de vectores tienen una latencia de lectura después de escritura (refresh_interval) de 10 segundos.

Introducción a las colecciones de búsqueda vectorial

En este tutorial, debe completar los siguientes pasos para almacenar, buscar y recuperar incrustaciones vectoriales en tiempo real:

Paso 1: configurar permisos

Para completar este tutorial (y para usar OpenSearch Serverless en general), debe tener los permisos AWS Identity and Access Management (de IAM) correctos. En este tutorial, crea una colección, carga y busca datos y, a continuación, elimina la colección.

Su usuario o rol debe tener adjunta una política basada en la identidad con los siguientes permisos mínimos:

JSON
{ "Version":"2012-10-17", "Statement": [ { "Action": [ "aoss:CreateCollection", "aoss:ListCollections", "aoss:BatchGetCollection", "aoss:DeleteCollection", "aoss:CreateAccessPolicy", "aoss:ListAccessPolicies", "aoss:UpdateAccessPolicy", "aoss:CreateSecurityPolicy", "iam:ListUsers", "iam:ListRoles" ], "Effect": "Allow", "Resource": "*" } ] }

Para obtener más información sobre los permisos de IAM OpenSearch sin servidor, consulte. Identity and Access Management para Amazon OpenSearch Serverless

Paso 2: crear una colección

Para crear una nueva colección, siga el flujo unificado de creación de colecciones (NextGen Express Create), que configura automáticamente las políticas de cifrado, red y acceso a los datos. Para obtener instrucciones, consulte Cree una NextGen colección (Express Create).

Durante el resto de este tutorial, la colección de ejemplo recibe el nombre housing y es una colección de búsqueda NextGen vectorial.

nota

Si opta por crear una colección vectorial clásica, consulte Trabajando con colecciones vectoriales clásicas los procedimientos específicos de las colecciones clásicas.

Paso 3: cargar y buscar datos

Un índice es una colección de documentos con un esquema de datos común que permite almacenar, buscar y recuperar las incrustaciones vectoriales y otros campos. Puede crear y cargar datos en índices de una colección OpenSearch sin servidor mediante la consola Dev Tools de OpenSearch Dashboards o una herramienta HTTP como Postman o awscurl. En este tutorial se utilizan Herramientas para desarrolladores. Para obtener acceso mediante programación mediante el SDK de Python, consulteIngerir datos en colecciones de Amazon OpenSearch Serverless.

Para indexar y buscar datos en la colección de viviendas
  1. Para crear un índice para su nueva colección, envíe la siguiente solicitud a la consola de Dev Tools. De forma predeterminada, se crea un índice con una distancia euclidiana y una compresión de 32x.

    PUT housing-index { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "space_type": "l2" }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. Para usar un nivel de compresión diferente, configúrelo compression_level en el mapeo de campos. En el siguiente ejemplo, se crea un índice compression_level con el valor 1x.

    PUT housing-index-1x { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "compression_level": "1x", "space_type": "l2" }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }

    Los niveles de compresión admitidos son 1x, 2x, 8x, 16x y 32x.

  3. Para indexar documentoshousing-index, puede utilizar un ID generado por el sistema (POST) o un ID proporcionado por el usuario (PUT).

    # System-generated document ID POST housing-index/_doc { "housing-vector": [10, 20, 30], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" } # User-provided document ID PUT housing-index/_doc/100 { "housing-vector": [10, 20, 30], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  4. Para buscar propiedades similares a las de su índice, envíe la siguiente consulta. De forma predeterminada, la respuesta de búsqueda excluye el vector original _source para reducir la latencia y el tamaño de la carga útil.

    GET housing-index/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [10, 20, 30], "k": 2 } } } }

    La respuesta excluye el campo dehousing-vector: _source

    { "took": 10, "timed_out": false, "_shards": { "total": 0, "successful": 0, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "housing-index", "_id": "100", "_score": 1, "_source": { "price": "2800", "location": "47.71, 122.00", "title": "2 bedroom in downtown Seattle" } } ] } }

Recupere el documento completo con vectores

Para anular el comportamiento predeterminado, establézcalo _source true en la solicitud de búsqueda. También puede utilizar las excludes opcionesincludes/de _source para recuperar campos específicos.

GET housing-index/_search { "size": 5, "_source": true, "query": { "knn": { "housing-vector": { "vector": [10, 20, 30], "k": 2 } } } }

La respuesta ahora incluye el housing-vector campo en_source:

{ "took": 10, "timed_out": false, "_shards": { "total": 0, "successful": 0, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "housing-index", "_id": "100", "_score": 1, "_source": { "housing-vector": [10, 20, 30], "price": "2800", "location": "47.71, 122.00", "title": "2 bedroom in downtown Seattle" } } ] } }

Paso 4: eliminar la colección

Como la colección de carcasas es para fines de prueba, elimínala cuando termines de experimentar.

Para eliminar una colección OpenSearch sin servidor
  1. Abre la consola OpenSearch de Amazon Service.

  2. En el panel de navegación izquierdo, selecciona Colecciones y selecciona la colección de viviendas.

  3. Para confirmar la eliminación, seleccione Eliminar.

Búsqueda filtrada

Puede usar filtros para mejorar los resultados de búsqueda semántica. Para crear un índice y realizar una búsqueda filtrada en sus documentos, sustituya los datos de carga y búsqueda en el tutorial anterior por las siguientes instrucciones. Los demás pasos siguen siendo los mismos. Para obtener más información acerca de los filtros, consulte búsqueda k-NN con filtros.

Para indexar y buscar datos en la colección de viviendas
  1. Para crear un índice único para su colección, envíe la siguiente solicitud en la consola de Herramientas para desarrolladores:

    PUT housing-index-filtered { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "space_type": "l2", "method": { "name": "hnsw" } }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. Para indexar un solo documento en housing-index-filtered, envíe la siguiente solicitud:

    POST housing-index-filtered/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. Para buscar los datos de un apartamento en Seattle por un precio determinado y dentro de una distancia determinada de un punto geográfico, envíe la siguiente solicitud:

    GET housing-index-filtered/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 0.1, 0.2, 0.3 ], "k": 5, "filter": { "bool": { "must": [ { "query_string": { "query": "Find me 2 bedroom apartment in Seattle under $3000 ", "fields": [ "title" ] } }, { "range": { "price": { "lte": 3000 } } }, { "geo_distance": { "distance": "100miles", "location": { "lat": 48, "lon": 121 } } } ] } } } } } }

Limitaciones

  • La búsqueda radial no se admite en los índices NextGen vectoriales que utilizan una compresión de 32x.

Trabajando con colecciones vectoriales clásicas

Las colecciones vectoriales clásicas son la generación original de la búsqueda vectorial OpenSearch sin servidor. Utilice los procedimientos de esta sección si ya tiene una colección vectorial clásica. Para colecciones nuevas, le recomendamos NextGen que consulte Creación de colecciones para crear una colección de NextGen vectores.

nota
  • Las colecciones Amazon OpenSearch Serverless Classic admiten la cuantificación escalar de 16 bits de Faiss, que realiza conversiones entre vectores flotantes de 32 bits y vectores de 16 bits. Para obtener más información, consulte Cuantificación escalar de 16 bits de Faiss. También puede utilizar vectores binarios para reducir los costos de memoria. Para obtener más información, consulte Vectores binarios.

  • Las colecciones Amazon OpenSearch Serverless Classic admiten la búsqueda vectorial basada en disco, lo que reduce considerablemente los costes operativos de las cargas de trabajo vectoriales en entornos con poca memoria. Para obtener más información, consulte la búsqueda vectorial. Disk-based

Los siguientes ejemplos se aplican a las colecciones de vectores clásicas, que utilizan el nmslib motor de forma predeterminada e incluyen el vector original en las respuestas de búsqueda.

Para indexar y buscar datos en una colección de viviendas clásica
  1. Para crear un índice para su colección clásica, envíe la siguiente solicitud a la consola de Dev Tools. De forma predeterminada, se crea un índice con el nmslib motor y la distancia euclidiana.

    PUT housing-index { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3 }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. Para indexar un solo documento en housing-index, envíe la siguiente solicitud:

    POST housing-index/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. Para buscar propiedades similares a las de su índice, envíe la siguiente consulta:

    GET housing-index/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 10, 20, 30 ], "k": 5 } } } }

Para crear un índice y realizar una búsqueda filtrada, utilice los siguientes ejemplos. Para obtener más información acerca de los filtros, consulte búsqueda k-NN con filtros.

Para indexar y realizar una búsqueda filtrada en una colección de viviendas clásica
  1. Para crear un índice único para su colección, envíe la siguiente solicitud en la consola de Herramientas para desarrolladores:

    PUT housing-index-filtered { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "method": { "engine": "faiss", "name": "hnsw" } }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. Para indexar un solo documento en housing-index-filtered, envíe la siguiente solicitud:

    POST housing-index-filtered/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. Para buscar los datos de un apartamento en Seattle por un precio determinado y dentro de una distancia determinada de un punto geográfico, envíe la siguiente solicitud:

    GET housing-index-filtered/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 0.1, 0.2, 0.3 ], "k": 5, "filter": { "bool": { "must": [ { "query_string": { "query": "Find me 2 bedroom apartment in Seattle under $3000 ", "fields": [ "title" ] } }, { "range": { "price": { "lte": 3000 } } }, { "geo_distance": { "distance": "100miles", "location": { "lat": 48, "lon": 121 } } } ] } } } } } }

Las colecciones de vectores clásicas tienen las siguientes limitaciones:

  • Las colecciones de búsqueda vectorial no son compatibles con el motor ANN Apache Lucene.

  • Las colecciones de búsqueda vectorial solo admiten el algoritmo HNSW con Faiss. No son compatibles con la FIV ni la FIVQ.

  • Las colecciones de búsqueda vectorial no admiten las operaciones de la API de calentamiento, estadística y entrenamiento de modelos.

  • Las colecciones de búsqueda vectorial no admiten scripts en línea ni almacenados.

  • La información sobre el recuento de índices no está disponible en las colecciones de Consola de administración de AWS búsqueda vectorial.

  • El intervalo de actualización de los índices de las colecciones de búsqueda vectorial es de 60 segundos.

Billion-scale cargas de trabajo

Las colecciones de búsqueda vectorial clásicas admiten cargas de trabajo con miles de millones de vectores. No necesita volver a indexar para escalar porque el escalado automático lo hace por usted. Si tienes millones de vectores (o más) con un gran número de dimensiones y necesitas más de 200 OCU, ponte en contacto con AWS Support para aumentar el número máximo de unidades de OpenSearch cómputo (OCU) de tu cuenta.

Siguientes pasos

Ahora que sabe cómo crear una colección de búsquedas vectoriales e indexar datos, puede realizar los siguientes ejercicios:

  • Utilice el cliente OpenSearch Python para trabajar con colecciones de búsqueda vectorial. Consulte este tutorial en GitHub.

  • Utilice el cliente OpenSearch Java para trabajar con colecciones de búsquedas vectoriales. Consulte este tutorial en GitHub.

  • Configurado LangChain para usarse OpenSearch como una tienda de vectores. LangChain es un marco de código abierto para desarrollar aplicaciones basadas en modelos de lenguaje. Para obtener más información, consulte la Documentación de LangChain .