Mittelstufe 11 Min.Stack

Weaviate: hybride Suche und multi-location

Direkte Antwort

Weaviate ist eine Open-Source-Vektordatenbank zur Installation in einem Container, die sich durch drei Merkmale auszeichnet: Sie kann die Vektoren selbst über Module berechnen (darunter Ollama, also lokal), sie bietet eine hybride Suche aus Stichwort- und Vektorsuche mit einstellbarer Gewichtung, und sie isoliert die Daten pro Tenant. Für ein strikt lokales RAG sind drei Einstellungen entscheidend: ein lokaler Vektorisierer, deaktivierte Telemetrie (sie ist standardmäßig aktiv) und deaktivierter anonymer Zugriff.

Weaviate wählt man eher wegen seiner Funktionen als wegen seiner Einfachheit: Es ist ein vollwertiger Dienst mit einem Container sowie Speicherplatz und Arbeitsspeicher, deren Kapazität geplant werden muss. Dieser Leitfaden zeigt, was Weaviate gegenüber ChromaDB oder pgvector bietet, wie Sie es mit Ollama verbinden, damit alles auf Ihrem Rechner bleibt, wie Sie die hybride Suche einstellen, wozu die Mandantenfähigkeit dient und welche Kosten der Arbeitsspeicher verursacht.

Von Mohamed Meguedmi·Aktualisierung 2026-09-30·Unter Windows, macOS und Linux getestet

#Was Weaviate von anderen Vektordatenbanken unterscheidet

Weaviate ist eine Open-Source-Vektordatenbank, deren Code auf GitHub veröffentlicht ist. Im Gegensatz zu Bibliotheken wie FAISS ist es ein Server: Er speichert die Objekte (Text und Eigenschaften), die Vektoren und den Suchindex und beantwortet Abfragen über eine API. Drei Funktionen unterscheiden ihn von einem einfachen Vektorspeicher. Die erste ist die integrierte Kodierung: Sie fügen Objekte ein, ein konfiguriertes Modul wandelt den Text in Vektoren um, und die Abfragen werden in natürlicher Sprache statt als Arrays von Gleitkommazahlen formuliert. Diese Entscheidung beseitigt eine ganze Klasse von Fehlern (inkompatible Dimensionen, eine Frage, die mit einem anderen Modell als der Korpus kodiert wurde), da dasselbe Modul beide Seiten verarbeitet.

Die zweite Funktion ist die hybride Suche, die Schlüsselwörter und Vektoren in einer einzigen Abfrage kombiniert. Die dritte ist die Mandantenfähigkeit: Eine einzige Bereitstellung kann mehrere isolierte Datensätze beherbergen, jeweils einen pro Kunde, Dienst oder Benutzer. Der Preis für diese Funktionen ist eine Komponente, die betrieben werden muss – mit ihrem Speicherbedarf, ihren Backups und ihren Updates –, während ChromaDB im Dateimodus lediglich eine Python-Bibliothek ist.

#Alles lokal halten: drei Einstellungen, die Sie überprüfen sollten

Das RAG-Local-Kit

Ihre Dokumente, Ihre KI: ein zuverlässiges lokales RAG für Ihre PDFs, Notizen und E-Mails – ohne Daten in die Cloud zu senden.

  • Lebenslanger Online-Zugang
  • PDF + Dateien
  • Erstattung binnen 30 Tagen

Ein Encoder-Modul ist eine Abhängigkeit mit einem bestimmten Standort. Wenn Sie einen bei einem Drittanbieter gehosteten Vektorisierer wählen, senden Sie jedes Ihrer Dokumente und jede Ihrer Fragen an einen anderen Ort; mit dem Ollama-Modul bleiben die Berechnungen auf Ihrer Hardware. Zwei weitere Einstellungen sind weniger sichtbar und verdienen dieselbe Aufmerksamkeit.

Der Vektorisierer
Verwenden Sie text2vec-ollama, das Ihre lokale Ollama-Instanz aufruft; laut Dokumentation ist in diesem Fall kein API-Schlüssel erforderlich. Achten Sie auf die Adresse: Wenn Weaviate in einem Container läuft und Ollama auf dem Host-Rechner, empfiehlt die Dokumentation host.docker.internal, damit der Container den Host erreichen kann.
Die Telemetrie
Laut der Weaviate-Dokumentation erfasst Weaviate standardmäßig Telemetriedaten: Serverversion, Betriebssystem, verwendete Module sowie die Anzahl der Objekte und Collections. Diese werden alle 24 Stunden gesendet; die Dokumentation stellt klar, dass keine Inhalte Ihrer Daten erfasst werden. Um die Telemetrie zu deaktivieren, setzen Sie die Variable DISABLE_TELEMETRY auf true. Bei einer Installation, die vollständig abgeschottet bleiben muss, sollten Sie diese Einstellung vornehmen.
Anonymer Zugriff
Der docker run-Befehl für die schnelle Einrichtung setzt AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED auf true, und die Dokumentation empfiehlt dringend, anonymen Zugriff außer im Entwicklungs- oder Evaluationskontext zu deaktivieren. Sobald der Port 8080 von außerhalb Ihres eigenen PCs erreichbar ist, aktivieren Sie die Authentifizierung über einen API-Schlüssel.
!
Version des Encoder-Modells
Vektoren, die von zwei unterschiedlichen Modellen erzeugt wurden, sind selbst bei gleicher Dimension nicht vergleichbar. Die Modellwahl muss vor dem ersten umfangreichen Import erfolgen: Ein Modellwechsel erfordert den erneuten Import der gesamten Sammlung. Wählen Sie ein Modell, das die Sprache Ihres Korpus korrekt verarbeitet (zum Beispiel bge-m3 für Französisch).

#Weaviate mit Docker und Ollama installieren

  1. 01
    Ollama und ein Embedding-Modell zur Verfügung haben
    Installieren Sie Ollama und laden Sie das Modell mit ollama pull bge-m3 herunter.
  2. 02
    Die Datei docker-compose.yml erstellen
    Die Datei definiert den Weaviate-Container, dessen Daten-Volume, die Aktivierung des Ollama-Moduls, die Deaktivierung der Telemetrie und den Zugriff auf den Host.
  3. 03
    Starten und prüfen
    Führen Sie docker compose up -d aus und testen Sie anschließend die Adresse http://localhost:8080/v1/meta: Die Antwort listet die aktiven Module auf.
  4. 04
    Eine mit dem Modul verknüpfte Sammlung erstellen
    Die Collection gibt an, welches Ollama-Modell welche Eigenschaften vektorisiert.
docker-compose.yml
services:
  weaviate:
    image: cr.weaviate.io/semitechnologies/weaviate:1.39.7
    ports:
      - "8080:8080"
      - "50051:50051"
    volumes:
      - weaviate_data:/var/lib/weaviate
    restart: on-failure:0
    extra_hosts:
      - "host.docker.internal:host-gateway"   # utile sous Linux pour joindre Ollama sur l'hôte
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'   # à fermer si le port est exposé
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      ENABLE_MODULES: 'text2vec-ollama'
      DISABLE_TELEMETRY: 'true'
      CLUSTER_HOSTNAME: 'node1'
volumes:
  weaviate_data:

Die Versionsnummer 1.39.7 ist diejenige, die zum Zeitpunkt der Erstellung in der offiziellen Weaviate-Dokumentation angegeben war; verwenden Sie die aktuelle Version, die auf der Installationsseite angegeben ist. Die Ports 8080 (HTTP) und 50051 (gRPC) entsprechen denen der Schnellstartanleitung in der Dokumentation.

#Schema: Collections, Eigenschaften, Vektorisierer, Tenants

Die Konzepte von Weaviate und ihre Nützlichkeit
KonzeptWas es istWarum das zählt
SammlungEine Ansammlung von Objekten gleichen Typs mit ihrem SchemaDie getrennten Korpora bleiben getrennt, wodurch der Informationsabruf präzise bleibt
EigenschaftenTypisierte Felder für jedes ObjektGeprüfte Filter (Datum, Autor, Dienst) anstelle von Anweisungen im Prompt
VektorisiererDas Modul, das Text und Fragen kodiertIdentisches Modell bei Indexierung und Abfrage
TenantEine isolierte Partition der Sammlung mit ihrem eigenen FragmentJede Gruppe sieht nur ihre eigenen Daten
VektorindexDer Suchgraph (HNSW), der im Arbeitsspeicher liegtBestimmt die Geschwindigkeit und den benötigten Speicher
Eine von Ollama vektorisierte Collection erstellen (Python-Client v4)
import weaviate
from weaviate.classes.config import Configure, Property, DataType

client = weaviate.connect_to_local()

client.collections.create(
    "Document",
    vector_config=[
        Configure.Vectors.text2vec_ollama(
            name="contenu_vecteur",
            source_properties=["contenu"],
            api_endpoint="http://host.docker.internal:11434",
            model="bge-m3",
        )
    ],
    properties=[
        Property(name="contenu", data_type=DataType.TEXT),
        Property(name="source", data_type=DataType.TEXT),
    ],
)

coll = client.collections.use("Document")
coll.data.insert_many([
    {"contenu": "Le délai de préavis est de trois mois.", "source": "contrat.pdf"},
    {"contenu": "Le loyer est révisé chaque année au 1er janvier.", "source": "bail.pdf"},
])
client.close()

Die Struktur folgt der offiziellen Dokumentation: vector_config, ein benannter Vektorisierer, Quelleigenschaften und ein Ollama-Endpunkt. Weaviate vektorisiert standardmäßig Eigenschaften vom Typ Text, die alphabetisch sortiert und anschließend aneinandergehängt werden; source_properties ermöglicht es, die Berechnung auf die relevante Eigenschaft zu beschränken und den Dateinamen aus dem Vektor herauszuhalten.

#Die hybride Suche in Weaviate

Die semantische Suche findet Textstellen mit ähnlicher Bedeutung und scheitert an exakten Zeichenfolgen: einer Rechnungsnummer, einer Teilenummer, einem Fehlercode oder einem Eigennamen. Die hybride Suche von Weaviate kombiniert die Ergebnisse einer Vektorsuche und einer BM25F-Schlüsselwortsuche, indem sie die beiden Ergebnismengen zusammenführt; die Gewichtungen und die Fusionsmethode sind konfigurierbar. Der Parameter alpha regelt das Verhältnis: Laut Dokumentation entspricht 1 einer reinen Vektorsuche und 0 einer reinen Schlüsselwortsuche. Ohne alpha hängt die tatsächliche Gewichtung von Ihrem Client ab: Legen Sie alpha immer ausdrücklich fest.

Hybride Abfrage
coll = client.collections.use("Document")
res = coll.query.hybrid(query="préavis contrat CDI", alpha=0.5, limit=5)
for o in res.objects:
    print(o.properties["source"], o.properties["contenu"][:80])

Seit Version 1.24 ist die Fusion anhand relativer Scores die Standardmethode; die Alternative ist die rangbasierte Fusion. Das Prinzip und die Wahl zwischen den beiden werden im Leitfaden zur hybriden Suche erklärt. Bei einem technischen Korpus macht das oft den Unterschied zwischen einem System, dem man vertraut, und einem System, das man aufgibt: Die Fehler der rein vektorbasierten Suche betreffen gerade die Suchanfragen, die Nutzer für trivial halten.

#Mandantenfähigkeit: ein Tenant pro Benutzergruppe

Mandantenfähigkeit partitioniert eine Collection in Shards, einen pro Mandant. Die Dokumentation beschreibt es so: Jeder Mandant wird in einem separaten Shard gespeichert, und die Daten eines Mandanten sind für andere Mandanten nicht sichtbar. Die Funktion ist standardmäßig deaktiviert und wird in der Definition der Collection mit multi_tenancy_config aktiviert. Wenn mehrere Gruppen dasselbe System abfragen (Kunden eines kleinen oder mittleren Unternehmens, Abteilungen eines Unternehmens, Familienmitglieder), ist dies eine strukturelle Antwort auf die Frage „Kann diese Person dieses Dokument abrufen?“ — wesentlich sicherer als ein nachträglich angewendeter Filter und unendlich viel sicherer als eine Anweisung im Prompt.

Multi-Tenant-Collection
from weaviate.classes.config import Configure
from weaviate.classes.tenants import Tenant

client.collections.create(
    "DocumentClient",
    multi_tenancy_config=Configure.multi_tenancy(enabled=True),
)
coll = client.collections.use("DocumentClient")
coll.tenants.create([Tenant(name="client_a"), Tenant(name="client_b")])

# Toute requête passe par un tenant : les autres restent invisibles
res = coll.with_tenant("client_a").query.hybrid(query="préavis", limit=3)

Tenants benötigen nur wenige Ressourcen: Laut Dokumentation sind 50.000 oder mehr aktive Fragmente pro Knoten möglich. Sie haben einen Status (ACTIVE, INACTIVE, OFFLOADED): Ein inaktiver Tenant liegt auf dem Datenträger und belegt keinen Arbeitsspeicher. Dadurch lassen sich viele kleine Datensätze hosten, wobei nur diejenigen aktiv bleiben, die gebraucht werden. Der Name eines Tenants darf nur alphanumerische Zeichen, Unterstriche und Bindestriche enthalten.

#Was der Betrieb von Weaviate kostet

Weaviate ist ein vollwertiger Dienst: ein Container, persistenter Speicher und ein Arbeitsspeicherbedarf, der proportional zu Ihren Vektoren wächst. Die Dokumentation zur Dimensionierung benennt die Einschränkung klar: Der HNSW-Index muss im Arbeitsspeicher gespeichert sein; der Arbeitsspeicher bestimmt die maximale Größe des Datensatzes und beeinflusst die Abfragegeschwindigkeit nicht direkt. Als Faustregel empfiehlt die Dokumentation, das Doppelte des Arbeitsspeicherbedarfs aller Vektoren einzuplanen.

Speicherberechnung (Regel aus der Dokumentation)
empreinte d'un vecteur = dimensions × 4 octets (float32)
mémoire estimée   = 2 × nombre de vecteurs × empreinte d'un vecteur

Exemple, bge-m3 (1 024 dimensions) :
  1 024 × 4 = 4 096 octets par vecteur
  100 000 passages → 2 × 100 000 × 4 096 ≈ 0,8 Go
  1 000 000 passages → 2 × 1 000 000 × 4 096 ≈ 8,2 Go

Die 1.024 Dimensionen von bge-m3 sind hier eine Annahme, die anhand der Modellkarte Ihres Modells zu überprüfen ist. Bei einem persönlichen Korpus oder einem Korpus eines kleinen oder mittleren Unternehmens (einige Zehntausend Textpassagen) ist der Speicherbedarf des Index gering; ab mehreren Millionen Textpassagen wird er relevant. Weaviate bietet Vektorkompression an: Die Dokumentation empfiehlt die Rotationsquantisierung (RQ) und nennt außerdem die Produktquantisierung (PQ), die binäre Quantisierung (BQ) und die skalare Quantisierung (SQ), jeweils auf Kosten eines leichten Informationsverlusts. Fügen Sie das lokale Encoder-Modul hinzu: Ollama führt ein Embedding-Modell auf demselben Rechner wie Ihr Sprachmodell aus. Entscheiden Sie bei einem einzelnen Rechner, welches der beiden Modelle die Grafikkarte belegt, oder nehmen Sie in Kauf, dass sich Indexierung und Inferenz gegenseitig beeinträchtigen.

#Eigene Vektoren bereitstellen oder von ChromaDB migrieren

Das Encoding-Modul ist nicht zwingend erforderlich. Die Weaviate-Dokumentation beschreibt den Ansatz „bring your own vectors“: Statt die Datenbank die Embeddings berechnen zu lassen, stellen Sie die bereits vorhandenen bereit, ob individuell angepasst oder vorab erzeugt. Im Python-Client deklarieren Sie dafür einen benannten Vektor mit Configure.Vectors.self_provided. Das ist der kostengünstigste Migrationsweg von ChromaDB: Sie lesen die Dokumente und die bereits berechneten Vektoren erneut aus (Chroma kann sie mit der Option include zurückgeben) und senden sie anschließend an Weaviate, ohne das Embedding-Modell erneut aufzurufen. Zwei Prüfungen verhindern böse Überraschungen: Die Vektoren müssen in der gesamten Collection dieselbe Dimension haben, und die Fragen müssen mit dem ursprünglichen Modell encodiert werden, da Weaviate dies nicht für Sie übernimmt.

Wann sollten Sie die integrierte Vektorisierung bevorzugen? Wenn Sie Abfragen direkt als Text formulieren möchten, das Hinzufügen von Dokumenten keinen Code zur Berechnung erfordern soll und die Konsistenz des Modells durch die Konfiguration gewährleistet sein soll. Wann sollten Sie eigene Vektoren bevorzugen? Wenn Sie bereits eine Embedding-Pipeline haben, ein Modell verwenden müssen, das kein Modul anbietet, oder die Vektordatenbank wechseln können möchten, ohne alles neu zu berechnen.

#Weaviate oder eine andere Vektordatenbank

Je nach Situation wählen
SituationAuswahl
Hybride Suche und umfangreiche Filtermöglichkeiten, mittelgroßes bis großes technisches KorpusWeaviate oder Qdrant
Mehrere isolierte Benutzergruppen auf einem einzigen DeploymentWeaviate (native Mandantenfähigkeit)
PostgreSQL bereits vorhanden, überschaubarer Umfangpgvector
Prototyp oder persönlicher Korpus, ohne einen Server warten zu müssenChromaDB im Dateimodus
Einzelner Prozess, festes Korpus, kein FilterEine Bibliothek wie FAISS

Wenn Sie unsicher sind, beginnen Sie mit der einfachsten Lösung: ChromaDB für einen Prototyp. Wechseln Sie dann zu einem Dienst, sobald ein konkreter Bedarf entsteht (Isolation, native hybride Suche, Datenvolumen). Die Entscheidung lässt sich rückgängig machen, solange Sie die Quelldokumente und das Indexierungsskript aufbewahren.

#Häufige Fragen zu Weaviate

FAQ
Ist Weaviate kostenlos?+
Die Datenbank ist Open Source und lässt sich ohne Lizenzkosten selbst hosten; Weaviate bietet separat einen kostenpflichtigen, verwalteten Cloud-Dienst an. Für eine lokale Installation eignet sich das Selbsthosting in einem Container. Die tatsächlichen Kosten entstehen durch Speicher und Administration: Backups, Updates und die Überwachung des Festplattenspeichers.
Berechnet Weaviate die Embeddings selbst?+
Ja, über Module, die als Vektorisierer bezeichnet werden; alternativ akzeptiert es Vektoren, die Sie selbst berechnen. Mit dem Modul text2vec-ollama übernimmt Ihre lokale Ollama-Instanz die Berechnung, ohne API-Schlüssel. Ein bei einem Drittanbieter gehosteter Vektorisierer würde Ihre Dokumente und Fragen aus dem Rechner heraus übertragen: bei sensiblen Daten zu vermeiden.
Sendet Weaviate Daten nach außen?+
Standardmäßig sendet Weaviate alle 24 Stunden Telemetriedaten: Version, System, Module sowie die Anzahl der Objekte und Sammlungen, laut Dokumentation jedoch keine Inhalte Ihrer Daten. Um dies zu deaktivieren, setzen Sie in der Konfiguration DISABLE_TELEMETRY auf true. Bei einer Installation, die vollständig nach außen abgeschottet bleiben muss, tun Sie dies gleich bei der Installation.
Wie wird alpha in der hybriden Suche eingestellt?+
alpha hat den Wert 1 für eine rein vektorbasierte Suche und 0 für eine reine Stichwortsuche. Beginnen Sie mit 0,5 und messen Sie dann anhand von 30 bis 50 echten Fragen den Recall in den ersten fünf Ergebnissen: Erhöhen Sie alpha, wenn die Fragen in natürlicher Sprache formuliert sind, und senken Sie den Wert, wenn sie Referenzen und Kennungen enthalten. Legen Sie den Wert immer ausdrücklich fest.
Wie viel Speicher benötigt man für eine Million Textpassagen?+
Bei Vektoren mit 1.024 Dimensionen in float32 sollten Sie mit etwa 4 KB pro Vektor rechnen, also 4 GB für eine Million Textpassagen und etwa 8 GB nach der Faustregel aus der Dokumentation, die den Speicherbedarf verdoppelt, um den Index zu berücksichtigen. Die Kompression (empfohlen wird die Rotationsquantisierung) reduziert diesen Wert erheblich, allerdings mit einem kleinen Genauigkeitsverlust.
Ist Mandantenfähigkeit für die persönliche Nutzung unverzichtbar?+
Nein. Ein einzelner Benutzer benötigt keine Partitionen: Eine Collection reicht aus. Mandantenfähigkeit ist nützlich, sobald mehrere Gruppen eine Bereitstellung gemeinsam nutzen und die Daten der jeweils anderen nicht einsehen dürfen (Kunden, Abteilungen, Haushalte). Sie ist standardmäßig deaktiviert und wird bei der Erstellung der Collection aktiviert.
Hat Ihnen dieser Guide geholfen?

Haben Sie Feedback, einen Fehler entdeckt oder möchten Sie etwas präzisieren? Geben Sie uns Bescheid – so wird der Guide für alle besser.