Weaviate es una base de datos vectorial pionera de código abierto, diseñada para mejorar la búsqueda semántica mediante la utilización de modelos de aprendizaje automático. A diferencia de los motores de búsqueda tradicionales que dependen de la concordancia de palabras clave, Weaviate emplea principios de similitud semántica. Este enfoque innovador transforma diversas formas de datos (textos, imágenes y más) en representaciones vectoriales, formas numéricas que capturan la esencia del contexto y el significado de los datos. Al analizar las similitudes entre estos vectores, Weaviate ofrece resultados de búsqueda que realmente comprenden la intención del usuario, ofreciendo un salto significativo más allá de las limitaciones de las búsquedas basadas en palabras clave.
Esta guía tiene como objetivo demostrar la perfecta integración de MinIO y Weaviate , aprovechando lo mejor del almacenamiento de objetos nativo de Kubernetes y las capacidades de búsqueda semántica impulsadas por IA. Aprovechando Docker Compose para la orquestación de contenedores, esta guía proporciona un enfoque estratégico para construir un sistema de gestión de datos sólido, escalable y eficiente. Dirigida a cómo almacenamos, accedemos y administramos datos, esta configuración cambia las reglas del juego para los desarrolladores, ingenieros de DevOps y científicos de datos que buscan aprovechar el poder de las soluciones de almacenamiento modernas y la recuperación de datos impulsada por IA.
En esta demostración, nos centraremos en realizar una copia de seguridad de Weaviate con depósitos MinIO utilizando Docker. Esta configuración garantiza la integridad y accesibilidad de los datos en nuestros proyectos de búsqueda y análisis mejorados por IA.
Esta demostración tiene como objetivo resaltar la perfecta integración de MinIO y Weaviate utilizando Docker, mostrando un método confiable para realizar copias de seguridad de sistemas de búsqueda y análisis mejorados por IA.
El archivo docker-compose.yaml
que se proporciona aquí está diseñado para establecer una configuración perfecta para Weaviate, destacando nuestro compromiso con una gestión de datos optimizada y eficiente. Esta configuración permite un entorno sólido donde MinIO actúa como un servicio de almacenamiento seguro y Weaviate aprovecha este almacenamiento para capacidades avanzadas de búsqueda vectorial.
El
version: '3.8' services: weaviate: container_name: weaviate_server image: semitechnologies/weaviate:latest ports: - "8080:8080" environment: AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'backup-s3' BACKUP_S3_BUCKET: 'weaviate-backups' BACKUP_S3_ENDPOINT: 'play.min.io:443' BACKUP_S3_ACCESS_KEY_ID: 'minioadmin' BACKUP_S3_SECRET_ACCESS_KEY: 'minioadmin' BACKUP_S3_USE_SSL: 'true' CLUSTER_HOSTNAME: 'node1' volumes: - ./weaviate/data:/var/lib/weaviate
Docker-Compose: Implemente Weaviate con el módulo backups-s3
habilitado y el servidor play.min.io
MinIO
Con el docker-compose.yaml anterior, Weaviate está configurado de manera intrincada para utilizar MinIO para copias de seguridad, lo que garantiza la integridad y accesibilidad de los datos. Esta configuración implica variables de entorno esenciales, como ENABLE_MODULES
configuradas en backup-s3
, y varias configuraciones para el depósito S3, el punto final, las claves de acceso y el uso de SSL. Además, PERSISTENCE_DATA_PATH
está configurado para garantizar que los datos se almacenen de forma persistente y CLUSTER_NAME
para la identificación del nodo.
ENABLE_MODULES
: 'copia de seguridad-s3'BACKUP_S3_BUCKET
: 'weaviate-backups'BACKUP_S3_ENDPOINT
: 'play.min.io:443'BACKUP_S3_ACCESS_KEY_ID
: 'miniadministrador'BACKUP_S3_SECRET_ACCESS_KEY
: 'miniadmin'BACKUP_S3_USE_SSL
: 'verdadero'PERSISTENCE_DATA_PATH
: '/var/lib/weaviate'CLUSTER_NAME
: 'nodo1'
El servicio Weaviate en este Docker-Compose está configurado para utilizar volúmenes montados para la persistencia de los datos; esto garantiza que sus datos persistan en todas las sesiones y operaciones.
Nota: El depósito MinIO debe existir de antemano; Weaviate no creará el depósito por usted.
Para integrar MinIO y Weaviate en su proyecto usando Docker Compose, siga este procedimiento detallado:
Guardar o actualizar el archivo Docker Compose
Una vez que el archivo docker-compose.yaml esté en su lugar, use el siguiente comando en su terminal o símbolo del sistema para iniciar la implementación:
docker-compose up -d --build
Este comando iniciará los servicios de Weaviate en modo independiente, ejecutándolos en segundo plano de su sistema.
Durante el proceso de compilación y ejecución, Docker Compose creará un directorio persistente como se especifica en el archivo docker-compose.yaml. Este directorio ( ./weaviate/data
para Weaviate) se utiliza para almacenar datos de forma persistente, lo que garantiza que sus datos permanezcan intactos durante los reinicios e implementaciones del contenedor.
El almacenamiento persistente permite un entorno más estable donde los datos no se pierden cuando se reinicia el contenedor.
Una vez que haya implementado su docker-compose, puede visitar la URL de su servidor Weaviate en un navegador, seguido de /v1/meta
para examinar si sus configuraciones de implementación son correctas.
La primera línea de la carga útil JSON en http://localhost:8080/v1/meta
debería verse así:
{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.min.io:443","useSSL":true}...[truncated]...}
weaviate-backups
Para integrar Weaviate con MinIO, el depósito de respaldo en MinIO necesita adecuadamente la Política de acceso del depósito de respaldo designado, es decir, weaviate-backups
, a Público. Este ajuste es necesario para otorgar al módulo Weaviate backup-s3 los permisos necesarios para interactuar exitosamente con el depósito MinIO para las operaciones de respaldo.
Nota: En un entorno de producción probablemente necesite bloquear esto, lo cual está fuera del alcance de este tutorial.
Es esencial abordar esta configuración con una comprensión clara de las implicaciones de seguridad de configurar un depósito como " público " . Si bien esta configuración facilita el proceso de copia de seguridad en un entorno de desarrollo, se deben considerar enfoques alternativos para que los sistemas de producción mantengan la seguridad e integridad de los datos. Emplear controles de acceso detallados, como políticas de IAM o URL " prefirmadas ".
Al final de esta demostración, podrá ver los objetos del depósito que Weaviate crea durante todo el proceso cuando utiliza el módulo backup-s3
.
Para habilitar las copias de seguridad de S3 en Weaviate, configure las variables de entorno necesarias en su archivo docker-compose.yaml. Esto indica a Weaviate que utilice MinIO como destino de la copia de seguridad, lo que implica la configuración de los módulos de copia de seguridad y los detalles del depósito de MinIO.
Antes de profundizar en las operaciones técnicas, me gustaría afirmar que estoy demostrando los siguientes pasos en un entorno JupyterLab con el beneficio adicional de encapsular nuestra canalización en una computadora portátil, disponible aquí .
El primer paso consiste en configurar el entorno instalando la biblioteca weaviate-client
para Python con pip
. Este paquete de Python es esencial para interactuar con la API RESTful de Weaviate de una manera más Pythonic, lo que permite una interacción perfecta con la base de datos para operaciones como la creación de esquemas, la indexación de datos, la copia de seguridad y la restauración. Para la demostración, ilustraremos el uso de la biblioteca cliente Weaviate Python.
En esta demostración utilizamos la API Weaviate V3, por lo que es posible que vea un mensaje como el siguiente cuando ejecute el script de Python:
`DeprecationWarning: Dep016: You are using the Weaviate v3 client, which is deprecated. Consider upgrading to the new and improved v4 client instead! See here for usage: https://weaviate.io/developers/weaviate/client-libraries/python warnings.warn(`
Este mensaje es un banner de advertencia y puede ignorarse. Para obtener más información, puede visitar este
!pip install weaviate-client
Esta sección presenta la estructura de datos y el esquema para las clases 'Artículo' y 'Autor' , sentando las bases sobre cómo se organizarán los datos. Demuestra cómo definir y gestionar mediante programación el esquema dentro de Weaviate, mostrando la flexibilidad y el poder de Weaviate para adaptarse a varios modelos de datos adaptados a las necesidades de aplicaciones específicas.
import weaviate client = weaviate.Client("http://localhost:8080") # Schema classes to be created schema = { "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] } client.schema.delete_class('Article') client.schema.delete_class('Author') client.schema.create(schema)
Python: crear clases de esquema
Después de definir el esquema, el cuaderno le guía a través de la inicialización del cliente Weaviate, la creación del esquema en la instancia de Weaviate y la indexación de los datos. Este proceso llena la base de datos con conjuntos de datos iniciales, lo que permite la exploración de las capacidades de búsqueda vectorial de Weaviate. Ilustra los pasos prácticos necesarios para comenzar a aprovechar Weaviate para almacenar y consultar datos en un formato vectorizado.
# JSON data to be Ingested data = [ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ] for item in data: client.data_object.create( data_object=item["properties"], class_name=item["class"] )
Python: indexar datos por clase
Con los datos indexados, la atención se centra en preservar el estado de la base de datos mediante copias de seguridad. Esta parte del cuaderno muestra cómo activar una operación de copia de seguridad en MinIO.
result = client.backup.create( backup_id="backup-id", backend="s3", include_classes=["Article", "Author"], # specify classes to include or omit this for all classes wait_for_completion=True, ) print(result)
Python: crear copia de seguridad
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}
Respuesta de copia de seguridad exitosa
Antes de proceder con una restauración, a veces es necesario borrar el esquema existente. Esta sección muestra los pasos para un proceso de restauración limpio. Esto garantiza que los datos restaurados no entren en conflicto con los esquemas o datos existentes dentro de la base de datos.
client.schema.delete_class("Article") client.schema.delete_class("Author")
Esta sección explica cómo restaurar los datos respaldados previamente, devolviendo la base de datos a un buen estado conocido.
result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print(result)
Python: restaurar copia de seguridad
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Respuesta exitosa de Backup-S3
Esta parte del cuaderno proporciona un ejemplo de implementación del manejo de errores durante el proceso de restauración de la copia de seguridad. Ofrece información sobre problemas inesperados durante las operaciones de restauración de datos.
from weaviate.exceptions import BackupFailedError try: result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print("Backup restored successfully:", result) except BackupFailedError as e: print("Backup restore failed with error:", e) # Here you can add logic to handle the failure, such as retrying the operation or logging the error.
Esperar:
Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Restauración exitosa de la copia de seguridad
Finalmente, para confirmar que el proceso de copia de seguridad y restauración se completó correctamente, el cuaderno incluye un paso para recuperar el esquema de la clase 'Artículo'. Esta verificación garantiza que los datos y el esquema se restauren correctamente.
client.schema.get("Article")
Devuelve la clase Artículo como un objeto JSON
Esperar:
{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}
Cada sección del cuaderno proporciona una guía completa a través del ciclo de vida de la gestión de datos en Weaviate, desde la configuración inicial y el llenado de datos hasta la copia de seguridad, la restauración y la verificación, todo realizado dentro del ecosistema Python utilizando la biblioteca del cliente Weaviate.
Hasta ahora le hemos mostrado cómo hacer esto de la manera Pythonic. Pensamos que sería útil mostrar internamente a través de CURL
cómo se pueden lograr las mismas operaciones sin escribir un script.
Para interactuar con una instancia de Weaviate para tareas como crear un esquema, indexar datos, realizar copias de seguridad y restaurar datos, se pueden utilizar comandos curl específicos. Estos comandos realizan solicitudes HTTP a la API REST de Weaviate. Por ejemplo, para crear un esquema, se envía una solicitud POST con los detalles del esquema al punto final del esquema de Weaviate. De manera similar, para indexar datos, se realiza una solicitud POST con la carga de datos al punto final del objeto.
Las copias de seguridad se activan mediante una solicitud POST al punto final de las copias de seguridad y la restauración se realiza mediante una solicitud POST al punto final de restauración. Cada una de estas operaciones requiere la carga útil JSON adecuada, que generalmente se proporciona como una referencia de archivo en el comando curl usando el símbolo @
.
Para implementar Weaviate, por supuesto, necesitaremos datos de muestra con los que trabajar, que
He incluido lo siguiente:
schema.json
describe la estructura de los datos que queremos indexar.
data.json
es donde entran en juego nuestros datos reales, su estructura se alinea con las clases en el archivo esquema.json.
Los archivos esquema.json y data.json están disponibles en el repositorio de activos del blog MinIO ubicado
{ "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] }
Clases de esquema de ejemplo para artículo y autor
El
Por otra parte, el
[ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ]
Datos de muestra que contienen artículos
El esquema actúa como la columna vertebral estructural de nuestro sistema de gestión de datos, definiendo cómo se organizan, indexan y consultan los datos.
A través de un simple comando curl y con nuestros archivos de muestra clonados localmente en nuestro directorio de trabajo actual; podemos publicar nuestro esquema.json directamente en Weaviate, estableciendo las reglas y relaciones a las que se adherirán nuestros datos.
curl -X POST -H "Content-Type: application/json" \ --data @schema.json http://localhost:8080/v1/schema
CURL: crear
Una vez implementado nuestro esquema, el siguiente paso consiste en completarlo con datos reales. Usando otro comando curl, indexamos nuestro data.json en el esquema.
curl -X POST -H "Content-Type: application/json" \ --data @data.json http://localhost:8080/v1/objects
CURL: índice
Necesitaremos asignar un identificador único o "backup-id". Este identificador no solo facilita el seguimiento y la recuperación precisos de los conjuntos de copias de seguridad, sino que también garantiza que la versión de cada conjunto de datos esté controlada.
curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{ "id": "backup-id", "include": [ "Article", "Author" ] }'
CURL: copia de seguridad-s3
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Respuesta exitosa de Backup-S3
Esta salida está formateada como un objeto JSON. Incluye el backend utilizado (en este caso, 's3'
), una lista de clases que se incluyeron en la copia de seguridad ( 'Article'
, 'Author'
), el identificador único proporcionado a la copia de seguridad ( 'backup-id'
) , la ruta que indica dónde se almacena la copia de seguridad dentro del depósito de S3 ( s3://weaviate-backups/backup-id
) y el estado de la operación ( 'SUCCESS'
).
Esta respuesta estructurada no solo confirma la finalización exitosa del proceso de respaldo, sino que también proporciona información esencial que puede usarse para futuros procesos de referencia, auditoría o restauración.
La restauración de datos dentro del ecosistema Weaviate se facilita a través de una llamada API estructurada, a través de una solicitud POST dirigida al punto final /v1/backups/s3/backup-id/restore, identificado por backup-id. Esta llamada curl no solo restaura los datos perdidos o archivados, sino que también le permite mantener la continuidad.
curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \ -H 'Content-Type:application/json' \ -d '{ "id": "backup-id", "exclude": ["Author"] }'
CURL: restaurar
Esperar:
{ "backend": "s3", "classes": ["Article"], "id": "backup-id", "path": "s3://weaviate-backups/backup-id", "status": "SUCCESS" }
Respuesta de restauración exitosa
Cada uno de estos comandos debe adaptarse según su configuración y requisitos específicos. Es posible que deba modificar las URL de los puntos finales, las rutas de los archivos de datos y otros parámetros según sea necesario. Además, asegúrese de que los archivos necesarios (schema.json, data.json) y las configuraciones estén disponibles en su entorno.
Al codificar todo en Git, los equipos pueden rastrear fácilmente los cambios, retroceder a estados anteriores y garantizar la coherencia en todos los entornos. Los flujos de trabajo de GitOps se pueden integrar con herramientas de integración/implementación continua (CI/CD) y Kubernetes, simplificando aún más la orquestación de aplicaciones en contenedores y la gestión de infraestructura. Entraremos en detalles en una publicación futura sobre cómo automatizar usando GitOps.
Weaviate permite realizar copias de seguridad o restaurar clases específicas, lo cual es útil para casos como migración parcial de datos o pruebas de desarrollo.
Copias de seguridad de múltiples nodos: para configuraciones de múltiples nodos, especialmente en entornos de Kubernetes, asegúrese de que su configuración especifique correctamente el módulo de respaldo (como backup-s3 para MinIO) y las variables de entorno relacionadas.
Si tiene problemas durante la copia de seguridad o la restauración, verifique las configuraciones de las variables de entorno, especialmente las relacionadas con la configuración de SSL para el almacenamiento compatible con S3 como MinIO. Deshabilitar SSL ( BACKUP_S3_USE_SSL: false
) podría resolver ciertos problemas de conexión.
A medida que concluimos esta exploración de la integración de Weaviate con MinIO usando Docker Compose, es evidente que esta combinación no es solo una solución técnica, sino una mejora estratégica para la gestión de datos. Esta integración se alinea perfectamente con el compromiso de MinIO de proporcionar soluciones de almacenamiento de datos escalables, seguras y de alto rendimiento, ahora amplificadas por las capacidades impulsadas por IA de Weaviate. El uso de Docker Compose agiliza aún más esta integración, enfatizando nuestro enfoque en hacer que las tecnologías complejas sean accesibles y manejables.
Como siempre, el equipo de MinIO sigue comprometido a impulsar la innovación en el campo de la gestión de datos. Nuestra dedicación a mejorar y optimizar la forma en que se almacenan, acceden y analizan los datos es el núcleo de nuestra misión.
Al combinar las capacidades avanzadas de bases de datos vectoriales de Weaviate con las sólidas soluciones de almacenamiento proporcionadas por MinIO, los usuarios pueden desbloquear todo el potencial de sus datos. Esto incluye aprovechar las funcionalidades de búsqueda semántica que garantizan no sólo la accesibilidad de los datos sino también su seguridad en el nivel fundamental.
Estamos realmente inspirados por la notable innovación que surge de las mentes de desarrolladores dedicados y apasionados como usted. Nos entusiasma ofrecer nuestro apoyo y ser parte de su viaje hacia la exploración de soluciones avanzadas y alcanzar nuevas alturas en sus proyectos basados en datos. Por favor, no dude en comunicarse con nosotros en