From atum-ai-ml
Weaviate vector database pattern library — open-source vector database with native hybrid BM25 + vector retrieval (the most architecturally coherent hybrid in 2026), GraphQL + REST APIs, schema-first design with classes + properties + cross-references (graph-like relations between vectors), modular vectorizer architecture (text2vec-openai, text2vec-cohere, text2vec-huggingface, text2vec-transformers self-hosted, multi2vec-clip for multimodal text+image), generative search modules (generative-openai, generative-cohere, generative-anthropic for in-database LLM calls without round-trip), multi-tenancy with isolated tenant data + per-tenant indexes, named vectors (multiple embeddings per object for different fields/perspectives), backup + restore via S3 / GCS / Azure Blob, replication for HA, sharding for horizontal scale, Weaviate Cloud Services (WCS) managed vs self-hosted Docker / Helm, and migration from Pinecone or Qdrant. Use when building RAG with hybrid retrieval as core requirement, implementing multimodal search (text + images), needing in-database generation calls, or running on-prem with hybrid search built-in. Differentiates from Pinecone by hybrid BM25 + vector being native (not bolted-on) and from Qdrant by GraphQL API + generative modules.
npx claudepluginhub arnwaldn/atum-plugins-collection --plugin atum-ai-mlThis skill uses the workspace's default tool permissions.
Patterns canoniques pour utiliser **Weaviate** — particulièrement quand le besoin est **hybrid retrieval BM25 + vector natif**.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Executes pre-written implementation plans: critically reviews, follows bite-sized steps exactly, runs verifications, tracks progress with checkpoints, uses git worktrees, stops on blockers.
Guides idea refinement into designs: explores context, asks questions one-by-one, proposes approaches, presents sections for approval, writes/review specs before coding.
Patterns canoniques pour utiliser Weaviate — particulièrement quand le besoin est hybrid retrieval BM25 + vector natif.
# docker-compose.yml
version: '3.4'
services:
weaviate:
image: cr.weaviate.io/semitechnologies/weaviate:1.27.0
ports:
- "8080:8080"
- "50051:50051"
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'mykey'
AUTHENTICATION_APIKEY_USERS: 'admin@example.com'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
ENABLE_MODULES: 'text2vec-openai,generative-openai,backup-s3'
DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
OPENAI_APIKEY: ${OPENAI_API_KEY}
volumes:
- weaviate_data:/var/lib/weaviate
volumes:
weaviate_data:
import weaviate
client = weaviate.connect_to_weaviate_cloud(
cluster_url="https://your-cluster.weaviate.network",
auth_credentials=weaviate.auth.AuthApiKey("YOUR_API_KEY"),
headers={"X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"]},
)
import weaviate.classes.config as wvc
client.collections.create(
name="Document",
description="Tech documentation chunks",
vectorizer_config=wvc.Configure.Vectorizer.text2vec_openai(
model="text-embedding-3-large",
),
generative_config=wvc.Configure.Generative.openai(model="gpt-5"),
properties=[
wvc.Property(name="title", data_type=wvc.DataType.TEXT),
wvc.Property(name="content", data_type=wvc.DataType.TEXT),
wvc.Property(name="source", data_type=wvc.DataType.TEXT, skip_vectorization=True),
wvc.Property(name="page", data_type=wvc.DataType.INT),
wvc.Property(name="published_at", data_type=wvc.DataType.DATE),
wvc.Property(name="tags", data_type=wvc.DataType.TEXT_ARRAY),
],
)
collection = client.collections.get("Document")
with collection.batch.dynamic() as batch:
for doc in documents:
batch.add_object(
properties={
"title": doc.title,
"content": doc.content,
"source": doc.source,
"page": doc.page,
},
# Pas besoin de vector — Weaviate appelle text2vec-openai automatiquement
)
results = collection.query.hybrid(
query="Comment configurer Postgres ?",
alpha=0.5, # 0=pure BM25, 1=pure vector, 0.5=50/50
limit=10,
return_metadata=wvc.MetadataQuery(score=True, explain_score=True),
)
for r in results.objects:
print(f"{r.metadata.score:.3f} - {r.properties['title']}")
C'est la killer feature de Weaviate — hybrid retrieval est natif, fusionné en interne, pas un workaround côté client.
# Query qui fait retrieval + generation en 1 appel
result = collection.generate.near_text(
query="Comment configurer Postgres ?",
limit=5,
grouped_task="Réponds en français en citant les sources",
)
print(result.generated) # Réponse LLM générée
for obj in result.objects:
print(f" Source: {obj.properties['source']}")
Pas besoin d'orchestrer retrieval + LLM côté client — Weaviate gère le pipeline.
# Activate multi-tenancy à la création
client.collections.create(
name="TenantDocs",
multi_tenancy_config=wvc.Configure.multi_tenancy(enabled=True),
# ... properties ...
)
# Add tenants
collection = client.collections.get("TenantDocs")
collection.tenants.create([wvc.Tenant(name="acme-corp"), wvc.Tenant(name="globex")])
# Insert into a tenant
acme_collection = collection.with_tenant("acme-corp")
acme_collection.data.insert(properties={"title": "Acme private doc", "content": "..."})
# Search a tenant (impossible to leak cross-tenant)
results = acme_collection.query.hybrid(query="...", limit=5)
client.collections.create(
name="Product",
vectorizer_config=[
wvc.Configure.NamedVectors.text2vec_openai(name="title_vector", source_properties=["title"]),
wvc.Configure.NamedVectors.text2vec_openai(name="description_vector", source_properties=["description"]),
wvc.Configure.NamedVectors.text2vec_cohere(name="multilingual_vector", source_properties=["title", "description"]),
],
properties=[
wvc.Property(name="title", data_type=wvc.DataType.TEXT),
wvc.Property(name="description", data_type=wvc.DataType.TEXT),
],
)
# Search par vector spécifique
results = collection.query.near_text(
query="laptop powerful",
target_vector="title_vector",
limit=5,
)
Use case : produits e-commerce avec multiple "perspectives" (title vs description vs reviews).
# Schema avec references
client.collections.create(name="Author", properties=[
wvc.Property(name="name", data_type=wvc.DataType.TEXT),
])
client.collections.create(
name="Article",
properties=[
wvc.Property(name="title", data_type=wvc.DataType.TEXT),
wvc.Property(name="content", data_type=wvc.DataType.TEXT),
],
references=[
wvc.ReferenceProperty(name="author", target_collection="Author"),
],
)
# Query qui fetch les references (graph-like)
articles = client.collections.get("Article").query.fetch_objects(
return_references=wvc.QueryReference(link_on="author", return_properties=["name"]),
)
for a in articles.objects:
print(f"{a.properties['title']} by {a.references['author'].objects[0].properties['name']}")
# Backup vers S3 (configuré dans le module backup-s3)
client.backup.create(
backup_id="my-backup-2026-04-08",
backend="s3",
include_collections=["Document", "Product"],
wait_for_completion=True,
)
# Restore
client.backup.restore(
backup_id="my-backup-2026-04-08",
backend="s3",
wait_for_completion=True,
)
alpha=1.0 (pure vector) sans réfléchir — perd le bénéfice hybridskip_vectorization sur les fields techniques (id, source, date) — embeddings polluésskip_vectorization sur fields non-textuelsrag-architect (ce plugin)pinecone-patterns (ce plugin)qdrant-patterns (ce plugin)supabase-patterns (atum-stack-backend)