Weaviate : recherche hybride et multi-location
Weaviate est une base vectorielle open source à installer en conteneur, qui se distingue par trois choses : elle peut calculer elle-même les vecteurs via des modules (dont Ollama, donc en local), elle propose la recherche hybride mots-clés plus vectorielle avec un poids réglable, et elle isole les données par tenant. Pour un RAG strictement local, trois réglages comptent : un vectoriseur local, la télémétrie désactivée (elle est active par défaut) et l'accès anonyme fermé.
Weaviate se choisit pour ses fonctions plus que pour sa simplicité : c'est un vrai service, avec un conteneur, du stockage et de la mémoire à dimensionner. Ce guide montre ce qu'il apporte face à ChromaDB ou pgvector, comment le brancher à Ollama pour que tout reste sur votre machine, comment régler l'hybride, à quoi sert la multi-location, et ce que sa mémoire coûte.
#Ce qui distingue Weaviate des autres bases vectorielles
Weaviate est une base de données vectorielle open source, dont le code est publié sur GitHub. Contrairement à des bibliothèques comme FAISS, c'est un serveur : il stocke les objets (texte et propriétés), les vecteurs, et l'index de recherche, et répond à des requêtes par API. Trois fonctions le distinguent d'un simple magasin de vecteurs. La première est l'encodage intégré : vous insérez des objets, un module configuré transforme le texte en vecteurs, et les requêtes s'écrivent en langage naturel plutôt qu'en tableaux de flottants. Ce choix élimine une classe de bogues (dimensions incompatibles, question encodée avec un autre modèle que le corpus), puisque le même module traite les deux côtés.
La deuxième est la recherche hybride, qui combine mots-clés et vecteurs dans une seule requête. La troisième est la multi-location : un même déploiement peut héberger plusieurs jeux de données isolés, un par client, service ou utilisateur. Le prix de ces fonctions est un composant à faire tourner, avec sa mémoire, ses sauvegardes et ses mises à jour, là où ChromaDB en mode fichier n'est qu'une bibliothèque Python.
#Garder tout en local : trois réglages à vérifier
Tes documents, ton IA : un RAG local fiable sur tes PDF, notes et mails — sans rien envoyer dans le cloud.
- Espace en ligne à vie
- PDF + fichiers
- Mises à jour à vie
Un module d'encodage est une dépendance qui a une localisation. Choisir un vectoriseur hébergé chez un tiers revient à expédier chacun de vos documents et chacune de vos questions ailleurs ; choisir le module Ollama garde le calcul sur votre matériel. Deux autres réglages sont moins visibles et méritent la même attention.
- Le vectoriseur
- Utilisez text2vec-ollama, qui appelle votre instance Ollama locale ; la documentation indique qu'il ne demande aucune clé d'API dans ce cas. Attention à l'adresse : si Weaviate tourne dans un conteneur et Ollama sur la machine hôte, la documentation recommande host.docker.internal pour que le conteneur atteigne l'hôte.
- La télémétrie
- La documentation de Weaviate indique qu'il collecte des données de télémétrie par défaut : version du serveur, système d'exploitation, modules utilisés, nombre d'objets et de collections, envoyés toutes les 24 heures ; elle précise qu'aucun contenu de vos données n'est collecté. Pour la désactiver, la variable est DISABLE_TELEMETRY à true. Dans une installation qui doit rester hermétique, mettez-la.
- L'accès anonyme
- La commande docker run de démarrage rapide règle AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED à true, et la documentation déconseille fortement l'accès anonyme hors développement ou évaluation. Dès que le port 8080 est joignable depuis autre chose que votre poste, activez l'authentification par clé d'API.
#Installer Weaviate avec Docker et Ollama
- 01Avoir Ollama et un modèle d'embeddingsInstallez Ollama et récupérez le modèle avec ollama pull bge-m3.
- 02Écrire le fichier docker-compose.ymlIl déclare le conteneur Weaviate, son volume de données, l'activation du module Ollama, la télémétrie coupée et l'accès à l'hôte.
- 03Démarrer et vérifierLancez docker compose up -d, puis testez l'adresse http://localhost:8080/v1/meta : la réponse liste les modules actifs.
- 04Créer une collection reliée au moduleLa collection indique quel modèle Ollama vectorise quelles propriétés.
Le numéro de version 1.39.7 est celui de la documentation officielle de Weaviate à la date de rédaction ; prenez la version courante indiquée sur la page d'installation. Les ports 8080 (HTTP) et 50051 (gRPC) sont ceux du démarrage rapide de la documentation.
#Le schéma : collections, propriétés, vectoriseur, tenants
| Concept | Ce que c'est | Pourquoi ça compte |
|---|---|---|
| Collection | Un ensemble d'objets du même type, avec son schéma | Les corpus distincts restent distincts, ce qui garde la récupération précise |
| Propriétés | Des champs typés sur chaque objet | Des filtres vérifiés (date, auteur, service) plutôt que des consignes dans le prompt |
| Vectoriseur | Le module qui encode texte et questions | Même modèle à l'indexation et à l'interrogation |
| Tenant | Une partition isolée de la collection, avec son propre fragment | Chaque groupe ne voit que ses données |
| Index vectoriel | Le graphe de recherche (HNSW), résident en mémoire | Il détermine la vitesse et la mémoire nécessaire |
La structure suit la documentation officielle : vector_config, un vectoriseur nommé, des propriétés sources et un point d'accès Ollama. Weaviate vectorise par défaut les propriétés de type texte, triées par ordre alphabétique puis concaténées ; source_properties permet de restreindre le calcul à la propriété utile, et de laisser le nom du fichier hors du vecteur.
#La recherche hybride dans Weaviate
La recherche sémantique retrouve des passages de sens proche, et échoue sur les chaînes exactes : un numéro de facture, une référence de pièce, un code d'erreur, un nom propre. La recherche hybride de Weaviate combine les résultats d'une recherche vectorielle et d'une recherche par mots-clés BM25F en fusionnant les deux jeux de résultats, avec des poids et une méthode de fusion configurables. Le paramètre alpha règle l'équilibre : d'après la documentation, 1 correspond à une recherche vectorielle pure et 0 à une recherche par mots-clés pure. Sans alpha, le poids effectif dépend de votre client : fixez-le toujours explicitement.
Depuis la version 1.24, la méthode de fusion par défaut est la fusion par scores relatifs ; l'alternative est la fusion par rangs. Le principe et le choix entre les deux sont expliqués dans le guide sur la recherche hybride. Sur un corpus technique, c'est souvent la différence entre un système auquel on fait confiance et un système qu'on abandonne : les échecs du vectoriel pur portent justement sur les recherches que les utilisateurs jugent triviales.
#Multi-location : un tenant par groupe d'utilisateurs
La multi-location partitionne une collection en fragments, un par tenant. La documentation la décrit ainsi : chaque tenant est stocké dans un fragment séparé, et les données d'un tenant ne sont pas visibles d'un autre. Elle est désactivée par défaut et s'active dans la définition de la collection avec multi_tenancy_config. Si plusieurs groupes interrogent un même système (clients d'une PME, services d'une entreprise, membres d'une famille), c'est une réponse structurelle à la question « cette personne peut-elle récupérer ce document ? », bien plus sûre qu'un filtre appliqué après coup, et infiniment plus sûre qu'une consigne dans le prompt.
Les tenants sont légers : la documentation indique qu'on peut avoir 50 000 fragments actifs ou plus par nœud. Ils ont un état (ACTIVE, INACTIVE, OFFLOADED) : un tenant inactif est sur disque et n'occupe pas de mémoire, ce qui permet d'héberger beaucoup de petits jeux de données en ne gardant actifs que ceux qui servent. Le nom d'un tenant n'accepte que des caractères alphanumériques, le tiret bas et le tiret.
#Ce que Weaviate coûte à faire tourner
Weaviate est un vrai service : un conteneur, du stockage persistant, de la mémoire proportionnelle à vos vecteurs. La documentation de dimensionnement est claire sur la contrainte : l'index HNSW doit être stocké en mémoire, la mémoire détermine la taille maximale du jeu de données, et elle n'influence pas directement la vitesse des requêtes. La règle empirique de la documentation est de compter deux fois l'empreinte mémoire de tous les vecteurs.
Les 1 024 dimensions de bge-m3 sont ici une hypothèse à vérifier auprès de la fiche de votre modèle. Pour un corpus personnel ou de PME (quelques dizaines de milliers de passages), la mémoire de l'index est faible ; elle devient un sujet à partir de plusieurs millions de passages. Weaviate propose la compression des vecteurs : la documentation recommande la quantification rotationnelle (RQ) et cite aussi la quantification par produit (PQ), binaire (BQ) et scalaire (SQ), au prix d'une légère perte d'information. Ajoutez le module d'encodage local : Ollama fait tourner un modèle d'embeddings sur la même machine que votre modèle de langage. Sur une machine unique, décidez lequel des deux occupe la carte graphique, ou acceptez que l'indexation et l'inférence se gênent.
#Fournir ses propres vecteurs, ou migrer depuis ChromaDB
Le module d'encodage n'est pas obligatoire. La documentation de Weaviate décrit l'approche « bring your own vectors » : au lieu de laisser la base calculer les embeddings, vous fournissez ceux que vous avez déjà, qu'ils soient personnalisés ou pré-générés. Dans le client Python, on déclare alors un vecteur nommé avec Configure.Vectors.self_provided. C'est la voie de migration la plus économique depuis ChromaDB : vous relisez les documents et les vecteurs déjà calculés (Chroma sait les renvoyer avec l'option include), puis vous les envoyez à Weaviate, sans rappeler le modèle d'embeddings. Deux vérifications évitent les mauvaises surprises : la dimension des vecteurs doit être la même sur toute la collection, et les questions doivent être encodées avec le modèle d'origine, puisque Weaviate ne le fera pas à votre place.
Quand faut-il préférer l'encodage intégré ? Si vous voulez que les requêtes s'écrivent directement en texte, que l'ajout de documents ne demande aucun code de calcul, et que la cohérence du modèle soit garantie par la configuration. Quand préférer vos propres vecteurs ? Si vous avez déjà un pipeline d'embeddings, si vous devez utiliser un modèle qu'aucun module ne propose, ou si vous voulez pouvoir changer de base vectorielle sans tout recalculer.
#Weaviate ou une autre base vectorielle
| Situation | Choix |
|---|---|
| Hybride et filtres riches, corpus technique de taille moyenne à grande | Weaviate ou Qdrant |
| Plusieurs groupes d'utilisateurs isolés sur un même déploiement | Weaviate (multi-location native) |
| PostgreSQL déjà en place, échelle modeste | pgvector |
| Prototype ou corpus personnel, sans serveur à maintenir | ChromaDB en mode fichier |
| Processus unique, corpus figé, aucun filtrage | Une bibliothèque comme FAISS |
Si vous hésitez, commencez par la solution la plus simple : ChromaDB pour un prototype, puis migrez vers un service quand un besoin précis apparaît (isolation, hybride natif, volumétrie). Le choix est réversible tant que vous gardez les documents sources et le script d'indexation.
#Questions fréquentes sur Weaviate
Weaviate est-il gratuit ?+
Weaviate calcule-t-il les embeddings lui-même ?+
Weaviate envoie-t-il des données à l'extérieur ?+
Comment régler alpha dans la recherche hybride ?+
Combien de mémoire faut-il pour un million de passages ?+
La multi-location est-elle indispensable pour un usage personnel ?+
- Recherche hybride : BM25 + vectoriel
- Qdrant : la base vectorielle d'un RAG local
- pgvector : la recherche vectorielle dans PostgreSQL
- FAISS : la bibliothèque derrière la recherche vectorielle
- RAG en local avec ChromaDB et Ollama
- Source : Weaviate, recherche hybride
- Source : Weaviate, module Ollama
- Source : Weaviate, télémétrie
- Source : Weaviate, ressources et mémoire
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.