Weaviate est une base de données vectorielles open source pionnière, conçue pour améliorer la recherche sémantique grâce à l'utilisation de modèles d'apprentissage automatique. Contrairement aux moteurs de recherche traditionnels qui s'appuient sur la correspondance de mots clés, Weaviate utilise des principes de similarité sémantique. Cette approche innovante transforme diverses formes de données (textes, images, etc.) en représentations vectorielles, formes numériques qui capturent l'essence du contexte et de la signification des données. En analysant les similitudes entre ces vecteurs, Weaviate fournit des résultats de recherche qui comprennent véritablement l'intention de l'utilisateur, offrant ainsi un pas de géant au-delà des limites des recherches basées sur des mots clés.
Ce guide vise à démontrer l'intégration transparente de MinIO et Weaviate , en tirant parti du meilleur du stockage d'objets natif de Kubernetes et des capacités de recherche sémantique basées sur l'IA. Tirant parti de Docker Compose pour l'orchestration des conteneurs, ce guide fournit une approche stratégique pour créer un système de gestion de données robuste, évolutif et efficace. Destinée à la manière dont nous stockons, accédons et gérons les données, cette configuration change la donne pour les développeurs, les ingénieurs DevOps et les data scientists qui cherchent à exploiter la puissance des solutions de stockage modernes et de la récupération de données basée sur l'IA.
Dans cette démonstration, nous nous concentrerons sur la sauvegarde de Weaviate avec les buckets MinIO à l'aide de Docker. Cette configuration garantit l'intégrité et l'accessibilité des données dans nos projets de recherche et d'analyse améliorés par l'IA.
Cette démonstration vise à mettre en évidence l'intégration transparente de MinIO et Weaviate à l'aide de Docker, en présentant une méthode fiable de sauvegarde des systèmes de recherche et d'analyse améliorés par l'IA.
Le fichier docker-compose.yaml
fourni ici est conçu pour établir une configuration transparente pour Weaviate, soulignant notre engagement en faveur d'une gestion des données rationalisée et efficace. Cette configuration permet un environnement robuste dans lequel MinIO agit comme un service de stockage sécurisé et Weaviate exploite ce stockage pour des capacités avancées de recherche vectorielle.
Le
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 : Déployez Weaviate avec le module backups-s3
activé et le serveur play.min.io
MinIO
Avec le docker-compose.yaml ci-dessus, Weaviate est finement configuré pour utiliser MinIO pour les sauvegardes, garantissant ainsi l'intégrité et l'accessibilité des données. Cette configuration implique des variables d'environnement essentielles telles que ENABLE_MODULES
définies sur backup-s3
et divers paramètres pour le compartiment S3, le point de terminaison, les clés d'accès et l'utilisation de SSL. De plus, PERSISTENCE_DATA_PATH
est défini pour garantir que les données sont stockées de manière persistante et CLUSTER_NAME
pour l'identification des nœuds.
ENABLE_MODULES
: 'sauvegarde-s3'BACKUP_S3_BUCKET
: 'weaviate-sauvegardes'BACKUP_S3_ENDPOINT
: 'play.min.io:443'BACKUP_S3_ACCESS_KEY_ID
: 'minioadmin'BACKUP_S3_SECRET_ACCESS_KEY
: 'minioadmin'BACKUP_S3_USE_SSL
: 'vrai'PERSISTENCE_DATA_PATH
: '/var/lib/weaviate'CLUSTER_NAME
: 'nœud1'
Le service Weaviate dans ce docker-compose est configuré pour utiliser les volumes montés pour la persistance des données ; cela garantit que vos données persistent à travers les sessions et les opérations.
Remarque : Le bucket MinIO doit exister au préalable, Weaviate ne créera pas le bucket pour vous.
Pour intégrer MinIO et Weaviate dans votre projet à l'aide de Docker Compose, suivez cette procédure détaillée :
Enregistrement ou mise à jour du fichier Docker Compose
Une fois le fichier docker-compose.yaml en place, utilisez la commande suivante dans votre terminal ou votre invite de commande pour lancer le déploiement :
docker-compose up -d --build
Cette commande démarrera les services Weaviate en mode détaché, en les exécutant en arrière-plan de votre système.
Pendant le processus de construction et d'exécution, Docker Compose créera un répertoire persistant comme spécifié dans le fichier docker-compose.yaml. Ce répertoire ( ./weaviate/data
pour Weaviate) est utilisé pour stocker les données de manière persistante, garantissant que vos données restent intactes lors des redémarrages et des déploiements de conteneurs.
Le stockage persistant permet un environnement plus stable dans lequel les données ne sont pas perdues au redémarrage du conteneur.
Une fois que vous avez déployé votre docker-compose, vous pouvez visiter l'URL de votre serveur Weaviate dans un navigateur, suivie de /v1/meta
pour examiner si vos configurations de déploiement sont correctes.
La première ligne de la charge utile JSON sur http://localhost:8080/v1/meta
devrait ressembler à ceci :
{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.min.io:443","useSSL":true}...[truncated]...}
weaviate-backups
Pour intégrer Weaviate à MinIO, le compartiment de sauvegarde dans MinIO a besoin de manière appropriée de la politique d'accès du compartiment de sauvegarde désigné, à savoir weaviate-backups
, à Public. Cet ajustement est nécessaire pour accorder au module Weaviate backup-s3 les autorisations requises pour interagir avec succès avec le compartiment MinIO pour les opérations de sauvegarde.
Remarque : Dans un environnement de production, vous devrez probablement verrouiller cela, ce qui dépasse le cadre de ce didacticiel.
Il est essentiel d'aborder cette configuration avec une compréhension claire des implications en matière de sécurité de la définition d'un bucket sur « public » . Bien que cette configuration facilite le processus de sauvegarde dans un environnement de développement, des approches alternatives doivent être envisagées pour les systèmes de production afin de maintenir la sécurité et l'intégrité des données. Utiliser des contrôles d'accès précis, tels que des politiques IAM ou des URL « présignées ».
À la fin de cette démonstration, vous pourrez voir les objets bucket créés par Weaviate tout au long du processus lors de l'utilisation du module backup-s3
.
Pour activer les sauvegardes S3 dans Weaviate, définissez les variables d'environnement nécessaires dans votre fichier docker-compose.yaml. Cela demande à Weaviate d'utiliser MinIO comme destination de sauvegarde, impliquant les paramètres des modules de sauvegarde et les détails du compartiment MinIO.
Avant de plonger dans les opérations techniques, je voudrais déclarer que je démontre les étapes suivantes dans un environnement JupyterLab pour l'avantage supplémentaire d'encapsuler notre pipeline dans un cahier, disponible ici .
La première étape consiste à configurer l'environnement en installant la bibliothèque weaviate-client
pour python avec pip
. Ce package Python est essentiel pour s'interfacer avec l'API RESTful de Weaviate d'une manière plus pythonique, permettant une interaction transparente avec la base de données pour des opérations telles que la création de schémas, l'indexation des données, la sauvegarde et la restauration. Pour la démonstration, nous illustrerons l'utilisation de la bibliothèque client Weaviate Python.
Dans cette démonstration, nous utilisons l'API Weaviate V3, vous pouvez donc voir un message comme celui ci-dessous lorsque vous exécutez le script 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(`
Ce message est une bannière d'avertissement et peut être ignoré. Pour plus d'informations, vous pouvez visiter ceci
!pip install weaviate-client
Cette section présente la structure des données et le schéma des classes « Article » et « Auteur » , jetant les bases de la manière dont les données seront organisées. Il montre comment définir et gérer le schéma par programmation au sein de Weaviate, démontrant la flexibilité et la puissance de Weaviate pour s'adapter à divers modèles de données adaptés aux besoins spécifiques des applications.
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 : créer des classes de schéma
Après avoir défini le schéma, le bloc-notes vous guide tout au long de l'initialisation du client Weaviate, de la création du schéma dans l'instance Weaviate et de l'indexation des données. Ce processus remplit la base de données avec des ensembles de données initiaux, permettant l'exploration des capacités de recherche vectorielle de Weaviate. Il illustre les étapes pratiques nécessaires pour commencer à tirer parti de Weaviate pour stocker et interroger des données dans un format vectorisé.
# 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 : indexer les données par classe
Une fois les données indexées, l'accent est mis sur la préservation de l'état de la base de données grâce à des sauvegardes. Cette partie du notebook montre comment déclencher une opération de sauvegarde sur 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 : créer une sauvegarde
Attendre:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}
Réponse de sauvegarde réussie
Avant de procéder à une restauration, il est parfois nécessaire d'effacer le schéma existant. Cette section montre les étapes d'un processus de restauration propre. Cela garantit que les données restaurées n'entrent pas en conflit avec les schémas ou les données existants dans la base de données.
client.schema.delete_class("Article") client.schema.delete_class("Author")
Cette section explique comment restaurer les données précédemment sauvegardées, en ramenant la base de données à un bon état connu.
result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print(result)
Python : restaurer la sauvegarde
Attendre:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Réponse réussie de Backup-S3
Cette partie du cahier fournit un exemple de mise en œuvre de la gestion des erreurs pendant le processus de restauration de sauvegarde. Il offre un aperçu des problèmes inattendus lors des opérations de restauration de données.
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.
Attendre:
Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Restauration de sauvegarde réussie
Enfin, pour confirmer que le processus de sauvegarde et de restauration s'est terminé avec succès, le notebook comprend une étape pour récupérer le schéma de la classe 'Article'. Cette vérification garantit que les données et le schéma sont correctement restaurés.
client.schema.get("Article")
Renvoie la classe Article en tant qu'objet JSON
Attendre:
{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}
Chaque section du cahier fournit un guide complet tout au long du cycle de vie de la gestion des données dans Weaviate, depuis la configuration initiale et le remplissage des données jusqu'à la sauvegarde, la restauration et la vérification, le tout effectué au sein de l'écosystème Python à l'aide de la bibliothèque client Weaviate.
Jusqu'à présent, nous vous avons montré comment procéder de manière pythonique. Nous avons pensé qu'il serait utile de montrer en interne via CURL
comment les mêmes opérations pouvaient être réalisées sans écrire de script.
Pour interagir avec une instance Weaviate pour des tâches telles que la création d'un schéma, l'indexation des données, l'exécution de sauvegardes et la restauration de données, des commandes curl spécifiques peuvent être utilisées. Ces commandes envoient des requêtes HTTP à l'API REST de Weaviate. Par exemple, pour créer un schéma, une requête POST avec les détails du schéma est envoyée au point de terminaison du schéma de Weaviate. De même, pour indexer les données, une requête POST avec la charge utile des données est adressée au point de terminaison de l'objet.
Les sauvegardes sont déclenchées via une requête POST adressée au point de terminaison des sauvegardes et la restauration est effectuée via une requête POST adressée au point final de restauration. Chacune de ces opérations nécessite la charge utile JSON appropriée, généralement fournie sous forme de référence de fichier dans la commande curl à l'aide du symbole @
.
Afin de mettre en œuvre Weaviate, nous aurons bien sûr besoin d'échantillons de données avec lesquels travailler, ce qui
J'ai inclus les éléments suivants :
schema.json
décrit la structure des données que nous souhaitons indexer.
data.json
est l'endroit où nos données réelles entrent en jeu, sa structure s'aligne sur les classes du fichier schema.json.
Les fichiers schema.json et data.json sont disponibles dans le référentiel MinIO blog-assets situé
{ "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"} ] } ] }
Exemples de classes de schéma pour l'article et l'auteur
Le
D'un autre côté, le
[ { "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] } } ]
Exemples de données contenant des articles
Le schéma agit comme l'épine dorsale structurelle de notre système de gestion de données, définissant la manière dont les données sont organisées, indexées et interrogées.
Grâce à une simple commande curl et avec nos exemples de fichiers clonés localement dans notre répertoire de travail actuel ; nous pouvons publier notre schéma.json directement sur Weaviate, définissant les règles et les relations auxquelles nos données adhéreront.
curl -X POST -H "Content-Type: application/json" \ --data @schema.json http://localhost:8080/v1/schema
CURL : créer
Une fois notre schéma en place, l'étape suivante consiste à le remplir avec des données réelles. À l'aide d'une autre commande curl, nous indexons notre data.json dans le schéma.
curl -X POST -H "Content-Type: application/json" \ --data @data.json http://localhost:8080/v1/objects
BOUCLE : index
Nous devrons attribuer un identifiant unique, ou "backup-id". Cet identifiant facilite non seulement le suivi et la récupération précis des jeux de sauvegarde, mais garantit également que chaque jeu de données est contrôlé en version.
curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{ "id": "backup-id", "include": [ "Article", "Author" ] }'
CURL : sauvegarde-s3
Attendre:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Réponse réussie de Backup-S3
Cette sortie est formatée en tant qu'objet JSON. Il comprend le backend utilisé (dans ce cas, 's3'
), une liste des classes qui ont été incluses dans la sauvegarde ( 'Article'
, 'Author'
), l'identifiant unique donné à la sauvegarde ( 'backup-id'
) , le chemin indiquant où la sauvegarde est stockée dans le compartiment S3 ( s3://weaviate-backups/backup-id
) et l'état de l'opération ( 'SUCCESS'
).
Cette réponse structurée confirme non seulement la réussite du processus de sauvegarde, mais fournit également des informations essentielles qui peuvent être utilisées pour de futurs processus de référence, d'audit ou de restauration.
La restauration des données au sein de l'écosystème Weaviate est facilitée grâce à un appel API structuré, via une requête POST ciblant le point de terminaison /v1/backups/s3/backup-id/restore, identifié par backup-id. Cet appel curl restaure non seulement les données perdues ou archivées mais vous permet de maintenir la continuité.
curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \ -H 'Content-Type:application/json' \ -d '{ "id": "backup-id", "exclude": ["Author"] }'
CURL : restaurer
Attendre:
{ "backend": "s3", "classes": ["Article"], "id": "backup-id", "path": "s3://weaviate-backups/backup-id", "status": "SUCCESS" }
Réponse de restauration réussie
Chacune de ces commandes doit être adaptée en fonction de votre configuration et de vos besoins spécifiques. Vous devrez peut-être modifier les URL des points de terminaison, les chemins d'accès aux fichiers de données et d'autres paramètres si nécessaire. Assurez-vous également que les fichiers (schema.json, data.json) et les configurations nécessaires sont disponibles dans votre environnement.
En codifiant tout dans Git, les équipes peuvent facilement suivre les modifications, revenir aux états précédents et garantir la cohérence entre les environnements. Les workflows GitOps peuvent être intégrés aux outils d'intégration continue/déploiement continu (CI/CD) et à Kubernetes, simplifiant ainsi davantage l'orchestration des applications conteneurisées et la gestion de l'infrastructure. Nous reviendrons en détail dans un prochain article sur la manière d'automatiser l'utilisation de GitOps.
Weaviate permet de sauvegarder ou de restaurer des classes spécifiques, ce qui est utile dans des cas tels que la migration partielle de données ou les tests de développement.
Sauvegardes multi-nœuds : pour les configurations multi-nœuds, en particulier dans les environnements Kubernetes, assurez-vous que votre configuration spécifie correctement le module de sauvegarde (comme backup-s3 pour MinIO) et les variables d'environnement associées.
Si vous rencontrez des problèmes lors de la sauvegarde ou de la restauration, vérifiez les configurations de vos variables d'environnement, notamment liées aux paramètres SSL pour le stockage compatible S3 comme MinIO. La désactivation de SSL ( BACKUP_S3_USE_SSL: false
) peut résoudre certains problèmes de connexion.
Alors que nous terminons cette exploration de l'intégration de Weaviate avec MinIO à l'aide de Docker Compose, il est évident que cette combinaison n'est pas seulement une solution technique, mais une amélioration stratégique de la gestion des données. Cette intégration s'aligne parfaitement avec l'engagement de MinIO à fournir des solutions de stockage de données évolutives, sécurisées et hautement performantes, désormais amplifiées par les capacités basées sur l'IA de Weaviate. L'utilisation de Docker Compose rationalise davantage cette intégration, en mettant l'accent sur notre objectif de rendre les technologies complexes accessibles et gérables.
Comme toujours, l'équipe MinIO reste déterminée à stimuler l'innovation dans le domaine de la gestion des données. Notre engagement à améliorer et à rationaliser la façon dont les données sont stockées, consultées et analysées est au cœur de notre mission.
En associant les capacités avancées de bases de données vectorielles de Weaviate aux solutions de stockage robustes fournies par MinIO, les utilisateurs sont en mesure de libérer tout le potentiel de leurs données. Cela implique de tirer parti des fonctionnalités de recherche sémantique qui garantissent non seulement l’accessibilité des données, mais également leur sécurité au niveau fondamental.
Nous sommes véritablement inspirés par l’innovation remarquable qui jaillit de l’esprit de développeurs dévoués et passionnés comme vous. Nous sommes ravis d'offrir notre soutien et de faire partie de votre parcours vers l'exploration de solutions avancées et l'atteinte de nouveaux sommets dans vos projets basés sur les données. N'hésitez pas à nous contacter au