Logotipo de Zephyrnet

Weaviate: Hacia la nueva era de los motores de búsqueda de vectores

Fecha:

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

https://github.com/semi-technologies/weaviate

¿Cómo encontraste este blog? Escribió algunas palabras clave relacionadas con la ciencia de datos en su navegador. sus motores de búsqueda. Los motores de búsqueda que usamos hoy en día pueden manejar miles de millones de flujos de datos en milisegundos. Entonces, ¿qué pasa con un nuevo motor de búsqueda que puede vencer a los motores de búsqueda actuales en velocidad y precisión semántica? Todas las comunidades de procesamiento de lenguaje natural y aprendizaje automático están discutiendo las posibilidades de tales motores de búsqueda, a los que llamaron buscadores de vectores. Uno de los buscadores vectoriales más utilizados en la actualidad es tejido. En este blog, presentaré el buscador de vectores – Weaviate para ti. En este blog, vamos a cubrir estos temas.

                                  • Introducción a Tejer
                                  • Por qué un buscador de vectores
                                  • ¿Cómo funciona Weaviate? Arquitectura
                                  • Configuración de tejido
                                  • Consultas de muestra

Introducción a Tejer

Weaviate es una base de datos vectorial y un motor de búsqueda. Es un motor de búsqueda vectorial de baja latencia que admite varios tipos de medios (texto, imágenes, etc.). Weaviate utiliza el aprendizaje automático para vectorizar y almacenar datos y encontrar respuestas a preguntas en lenguaje natural. Incluye búsqueda semántica, extracción de preguntas y respuestas, clasificación y modelos personalizables (PyTorch/TensorFlow/Keras). También puede usar Weaviate para escalar sus modelos de aprendizaje automático personalizados en producción.

Weaviate almacena objetos de medios (texto, imágenes, etc.) y sus vectores correspondientes, lo que permite combinar la búsqueda de vectores con el filtrado estructurado con la tolerancia a fallas de una base de datos nativa de la nube. La búsqueda de Weaviate se puede realizar a través de diferentes métodos, como GraphQL, REST y varios clientes de idiomas. Python, Javascript, Go y Go son lenguajes de programación populares que admiten clientes de Weaviate.

Hoy en día, los ingenieros de software utilizan Weaviate como la primera base de datos de ML para sus aplicaciones, los ingenieros de datos utilizan una base de datos vectorial construida desde cero con ANN en su núcleo, los científicos de datos implementan sus aplicaciones de búsqueda con MLOps.

Algunas características principales de Weaviate son

Consultas rápidas – En menos de 100 milisegundos, Weaviate ejecuta una búsqueda de 10 vecinos más cercanos (NN) en millones de elementos.

Soporte de diferentes medios – Utilice la inferencia de modelo de IA de última generación (p. ej., transformadores) para imágenes, texto, etc.

Combinando búsqueda escalar y vectorial – Weaviate guarda tanto sus objetos como sus vectores, asegurando que la recuperación sea siempre rápida. No se requiere un sistema de almacenamiento de objetos de terceros.

Escalabilidad horizontal– Weaviate puede escalar horizontalmente en producción dependiendo del caso de uso.

Conexiones tipo gráfico – Realice conexiones similares a gráficos entre los elementos de datos para imitar las conexiones de la vida real entre los puntos de datos. GraphQL se utiliza para atravesar esas conexiones.

¿Por qué un motor de búsqueda vectorial?

Considere el siguiente objeto de datos.

{
“data”: “El Charminar construido en 1591, es un monumento ubicado en Hyderabad, India.”
}

El objeto de datos anterior en el motor de búsqueda tradicional puede almacenarse como un índice de búsqueda invertido. Entonces, para recuperar los datos, necesitamos buscar con palabras clave como "charminar"O" monumento“, etc., para encontrarlo. Pero, ¿qué sucede si tiene muchos datos y está buscando un documento sobre el Charminar, pero está buscando "Lugares de interés en Telangana" ¿en lugar de? Los motores de búsqueda tradicionales no pueden ayudarlo en esta situación, que es donde entran en juego los motores de búsqueda de vectores. Para representar los datos, Weaviate se basa en métodos de indexación de vectores. El objeto de datos mencionado anteriormente se vectoriza en un espacio vectorial cerca del texto "Lugares de interés en Telangana” por los módulos de vectorización. Weaviate no puede producir una combinación perfecta, pero puede hacer una muy buena para mostrarle los resultados.

Al igual que vectorizó el texto, weaviate puede vectorizar cualquier medio, como imágenes, videos, etc., y realizar la búsqueda. Por la misma razón que usa un motor de búsqueda estándar para su aprendizaje automático, debe usar un motor de búsqueda vectorial. Puede ser un entorno de producción sólido porque le permite crecer rápidamente, buscar y clasificar en tiempo real.

¿Cómo funciona Weaviate? 

 

https://www.semi.technology/img/weaviate-architecture-overview.svg

Weaviate es una base de datos persistente y tolerante a fallas. Internamente, cada clase en el esquema definido por el usuario de Weaviate da como resultado el desarrollo de un índice. Un tipo de contenedor que consta de uno o más fragmentos se denomina índicey fragmentos son unidades de almacenamiento independientes dentro de un índice. Se pueden utilizar varios fragmentos para dividir automáticamente la carga entre varios nodos de servidor, actuando como un equilibrador de carga. Cada casa de fragmentos consta de tres componentes principales. almacén de objetos, índice invertidoalmacén de índices vectoriales. 

 

El proyecto tienda de objetos y almacenamiento invertido han sido desarrollados utilizando una arquitectura LSM-Tree. Esto significa que los datos se pueden consumir a la velocidad de la memoria y, si se alcanza un umbral, Weaviate escribirá la tabla de memoria completa (ordenada) en un segmento de disco. Weaviate primero examinará Memtable para la actualización más reciente de un objeto específico cuando reciba una solicitud de lectura. Weaviate verificará todos los segmentos escritos previamente, comenzando con el más reciente, si no está presente en la tabla de memoria. Filtros de floración evitar examinar segmentos que no contengan los objetos solicitados.

Importante: El almacenamiento de objetos/invertido emplea una técnica LSM basada en segmentación. El índice vectorial, por otro lado, no se ve afectado por la segmentación y es independiente del almacenamiento de esos objetos.

Almacenamiento de índice de vector HNSW

Hjerárquico Ndisponible Scentro comercial-Wundo gráficao HNSW para abreviar, es uno de los algoritmos de búsqueda de vecinos más cercanos aproximados más rápidos ampliamente utilizados en aplicaciones de ciencia de datos. HNSW es ​​el primer tipo de índice vectorial compatible con Weaviate que actúa como un gráfico multicapa Además de las tiendas jerárquicas indicadas anteriormente. Por otro lado, la tienda de vectores no se preocupa por las partes internas del almacenamiento de objetos y, como resultado, no tiene ningún problema de segmentación. Weaviate puede garantizar que cada fragmento sea una unidad totalmente autónoma que pueda atender solicitudes de los datos que contiene agrupando un índice vectorial con almacenamiento de objetos dentro de un fragmento. Weaviate puede evitar los inconvenientes de un índice vectorial segmentado al ubicar el índice vectorial al lado (en lugar de dentro) del almacén de objetos.

https://www.semi.technology/img/guides/hnsw-layers.svg

Se recopila cada objeto en la base de datos (capa 0 en la imagen). Estos elementos de datos están inextricablemente vinculados. Hay menos puntos de datos representados en cada capa por encima de la capa inferior y estos puntos de datos corresponden a las capas inferiores. Sin embargo, el número de puntos en cada capa superior disminuye exponencialmente. Si se envía una consulta de búsqueda, se identificarán los puntos de datos más cercanos en la capa superior. Solo hay un punto de datos adicional en la imagen. Luego baja una capa, encuentra los puntos de datos más cercanos desde el punto de datos inicial identificado en la capa más alta y busca los vecinos más cercanos desde allí. El objeto de datos más cercano a la consulta de búsqueda se descubrirá en la capa más profunda.

text2vec-contexcional

Text2vec-contextionary es el propio módulo vectorizador de lenguaje de Weaviate. Pone las palabras en su conjunto de datos en perspectiva (hay versiones contextuales disponibles para varios idiomas). El contextonario es un módulo vectorizador que puede interactuar con modelos comunes como fastText y GloVe y utiliza la media ponderada de incrustaciones de palabras (WMOWE). FastText en Wiki y los datos de CommonCrawl se usaron para entrenar el text2vec-contextionary más reciente. Los desarrolladores de Weaviate quieren que el Contextionario esté disponible para casos de uso en todos los dominios, ya sean relacionados con los negocios, académicos o algo completamente diferente. Sin embargo, si es necesario, puede crear su propio vectorizador.

El text2vec-contextionary es un espacio de 300 dimensiones donde se colocan los datos. Se asignará un vector de 300 números a cada punto de datos. Este vector se calcula usando el contextorio, que ya ha sido entrenado (no se requiere entrenamiento).

El contextonario calcula la posición en el espacio vectorial que representa la entidad del mundo real cuando agrega datos. La conversión de un objeto de datos a una posición vectorial se calcula utilizando el centroide de las palabras, ponderado por el número de veces que aparece cada palabra en el corpus de texto de entrenamiento original.

Extendiendo el contextorio

Al extender el contexto, las palabras o abreviaturas personalizadas (es decir, "conceptos") se pueden introducir directamente en Weaviate. Este punto final llenará el contexto con sus propias palabras, abreviaturas y conceptos en contexto mediante la transferencia del aprendizaje. Weaviate aprende varios conceptos en tiempo real usando el v1/modules/text2vec-contextionary/extensiones/ punto final Este punto final también se puede utilizar para sobrescribir conceptos. Antes de agregar datos, primero debe aprender Weaviate los nuevos conceptos.

parámetros

El término extendido o la abreviatura que desea agregar al contexto en un cuerpo (en JSON o YAML) con los siguientes campos:

  • "concept"    : Una cadena con la palabra, palabra compuesta o abreviatura
  • "definition" : Una descripción clara del concepto, que se utilizará para crear el contexto del concepto y ubicarlo en el espacio contextual de alta dimensión.
  • "weight"     : Un número de coma flotante con el peso relativo del concepto (conceptos predeterminados en el peso de Contextionary 1.0)

Persistencia y recuperación de fallas

En algún momento durante el viaje de ingestión, tanto los almacenes LSM para objetos y el almacenamiento invertido como el almacén de índice vectorial HNSW requieren memoria. Cada operación también se escribe en un Registro de escritura anticipada para proteger los datos en caso de accidente (WAL). Los WAL son archivos de solo anexar que son rápidos de escribir y rara vez son el cuello de botella en el proceso de ingesta.

Configuración de tejido

Hay varias formas de configurar una instancia de Weaviate. Es mejor empezar con docker-componer al configurar la versión de prueba. Soluciones Despliegues Se puede utilizar para proyectos pequeños y grandes. Para entornos de producción y grandes proyectos, se recomienda utilizar Kubernetes. Aquí voy a describir cómo configurar weaviate usando docker-compose

Para iniciar Weaviate con docker-compose, necesitamos un archivo de configuración de docker-compose. El archivo Docker-compose es un archivo YAML (.yml)

Un documento de configuración de instancia docker-compose con el modelo de transformador sentencia-transformadores/msmarco-distilroberta-base-v2 :

versión: '3.4' servicios: weaviate: imagen: semitechnologies/weaviate:1.9.0 reinicio: on-failure:0 puertos: - "8080:8080" entorno: QUERY_DEFAULTS_LIMIT: 20 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: "./data" DEFAULT_VECTORIZER_MODULE: text2vec-transformers ENABLE_MODULES: text2vec-transformers TRANSFORMERS_INFERENCE_API: http://t2v-transformers:8080 t2v-transformers: image: semitechnologies/transformers-inference:sentence-transformers-msmarco-distilroberta-base-v2 environment: ENABLE_CUDA: 0 # Establézcalo en 1 para habilitar # NVIDIA_VISIBLE_DEVICES: todo # habilitado si se ejecuta con CUDA

Uso de un modelo de transformador de lenguaje previamente entrenado como un módulo de vectorización Weaviate con el módulo text2vec-transformers. Los modelos de transformador difieren de los modelos contextuales en que le permiten conectar un módulo NLP listo para usar y adaptado a su caso de uso.

Guarde el fragmento anterior como docker-compose.yml y correr docker-componer desde dentro de la misma carpeta para ejecutar cualquiera de los ejemplos a continuación.

Ahora verifique el host local en el navegador como http://localhost:8080. Puede ver la ventana GUI de weaviate allí. Una vez que el tejido está en su sistema, la siguiente tarea es crear el esquema de datos (el Skelton/estructura del conjunto de datos). En este ejemplo, usaremos el conjunto de datos de vino y puede descargarlo de esta página.

Crear un esquema de datos

Tenemos una clase, “Vino," con un "título y descripción” en nuestro ejemplo. Utilizando el cliente tejido, cargue el esquema en formato JSON a http://localhost:8080/v1/schema.

import weaviate client = weaviate.Client("http://localhost:8080") class_obj = { "clase": "Vino", "propiedades": [ { "nombre": "título", "tipo de datos": ["texto "] }, { "nombre": "descripción", "tipo de datos": ["texto"] } ] } nueva_clase = client.schema.create_class(class_obj)

Subir datos

Ahora los datos reales del vino deben cargarse en Weaviate.

importar pandas como pd importar weaviate # iniciar el cliente de Weaviate client = weaviate.Client("http://localhost:8080") # abrir el conjunto de datos de vino df = pd.read_csv('winemag-data-130k-v2.csv', index_col =0) def add_wines(data, batch_size=20): no_items_in_batch = 0 para índice, fila en data.iterrows(): wine_object = { "título": fila["título"] + '.', "descripción": fila ["descripción"], } client.batch.add_data_object(wine_object, "Wine") no_items_in_batch += 1 if no_items_in_batch >= batch_size: resultados = client.batch.create_objects() no_items_in_batch = 0 client.batch.create_objects() add_wines( df.cabeza (2500))

Consultas de muestra

Una vez que todos los objetos se hayan cargado correctamente, puede comenzar a consultar los datos. Podemos desarrollar consultas simples y complicadas con GraphQL utilizando el cliente weaviate. Podemos usar las siguientes consultas de graphQL para recuperar los 20 mejores resultados semánticamente coincidentes

texto cercano

Supongamos que vamos a comer pollo esta noche y queremos saber qué vinos van muy bien con él.

importar tejido importar pprint
# iniciar el cliente de Weaviate
cliente = weaviate.Client("http://localhost:8080") near_text_filter = { "conceptos": ["vino que combina con el pollo"], "certeza": 0.5 } consulta_resultado = cliente.consulta .get("Vino" , ["título","descripción"]) .with_near_text(near_text_filter) .with_limit(20) .do() pprint.pprint(query_result)

Salida

 

alejarse de

Supongamos que estamos buscando vinos saludables relacionados con el chardonnay pero no muy especiados y no muy relacionados con la aireación.

importar tejido importar pprint
# iniciar el cliente de Weaviate
cliente = weaviate.Client("http://localhost:8080") near_text_filter = { "conceptos": ['saludable vino Chardonnay"], "certeza": 0.5, "moveAwayFrom":{ "conceptos":["picante y Aireación"], "fuerza":0.6 } } consulta_resultado = cliente.consulta .get("Vino", ["título","descripción"]) .with_near_text(near_text_filter) .with_limit(20) .do() pprint.pprint (resultado_consulta)

Salida

Más

Supongamos que tenemos pescado esta noche y queremos saber qué vinos van bien con él, pero no mucho especiados y no muy relacionados con Aeration y más relacionados con Chardonnay y con corcho.

importar tejido importar pprint
# iniciar el cliente de Weaviate
client = weaviate.Client("http://localhost:8080") near_text_filter = { "conceptos": ["vino que encaja con el pescado"], "certeza": 0.5, "moveAwayFrom": { "conceptos": [" picante y aireación"], "fuerza": 0.45 }, "moveTo": { "conceptos": ["Chardonnay con corcho"], "fuerza": 0.85 } } query_result = client.query .get("Vino", [ "título","descripción"]) .with_near_text(near_text_filter) .with_limit(20) .do() pprint.pprint(query_result)

Salida

Podemos usar el certeza y forzar parámetros en los ejemplos anteriores para fines de ajuste de resultados.

Eso es todo. Ahora aprendiste un poco sobre la búsqueda semántica y el almacenamiento de vectores en este blog. En este artículo, traté de demostrar cómo crear su propia base de datos vectorial utilizando sus propios datos en Weaviate y cómo recuperarlos semánticamente paso a paso. En el futuro, los motores de búsqueda de vectores como weaviate y la búsqueda semántica se convertirán en una parte inextricable de nuestra vida cotidiana.

Feliz codificación..🤗

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor. 

punto_img

café vc

vidacienciav

Información más reciente

café vc

punto_img