Weaviate 2026: AI 原生向量搜索引擎处理 100 亿+ 对象 — 企业部署指南
Weaviate 向量搜索企业级扩展部署指南。涵盖 Kubernetes 部署、混合搜索、多模态支持、RBAC、监控以及 100 亿+ 对象集合的基准测试。
- ⭐ 11500
- BSD-3-Clause
- 更新于 2026-05-19
{{< resource-info >}}
引言:当向量数据库在 1 亿对象时崩溃 #
2024 年底,一家电商平台运行的主流向量数据库撞上了墙。在 2 亿商品嵌入向量时,查询延迟从 12ms 飙升到 890ms。过滤向量搜索 —— 结合文本过滤与相似度搜索 —— 开始超时。团队在一个 1000 万对象时表现完美的数据库上构建了 RAG 流水线,但在大规模下土崩瓦解。
向量搜索不再是研究玩具。生产系统需要混合搜索、过滤查询、多模态数据和企业级运维。Weaviate —— 一个 AI 原生向量搜索引擎,拥有 11,500 GitHub Stars —— 专为这些工作负载构建,在生产环境中处理 100 亿+ 对象。
本指南涵盖 Weaviate 在 Kubernetes 上的企业部署、混合搜索配置、多模态集合、RBAC、备份策略和监控。每个部分都包含经过生产测试的配置和真实性能数据。
什么是 Weaviate? #
Weaviate 是一个用 Go 编写的开源 AI 原生向量搜索引擎。2018 年首次发布,目前版本 v1.31.0,它结合了向量相似度搜索与结构化过滤、混合排序和基于 GraphQL 的查询。与在存储层上附加搜索的向量数据库不同,Weaviate 从零开始围绕向量搜索问题设计。
Weaviate 支持多种向量化模块(OpenAI、Cohere、Hugging Face、Google)和向量索引类型(HNSW 用于近似搜索,flat 用于暴力搜索)。其模块化架构允许可插拔的嵌入、自定义向量器和与任何模型服务基础设施的集成。
该项目由 Weaviate B.V. 在 BSD-3-Clause 许可证 下维护。Weaviate Cloud (WCD) 为不愿自托管的团队提供完全托管的选项。
Weaviate 的工作原理:架构深度解析 #
核心组件 #
Weaviate 的架构将关注点分离为四层:
摄入层:处理数据验证、向量化(如果使用模块)和索引。传入对象根据 schema 进行验证,向量被生成或提供,对象并行写入倒排索引和向量索引。
向量索引层:HNSW(分层可导航小世界)图索引向量以进行近似最近邻搜索。Weaviate 使用自定义 HNSW 实现,具有可调的 ef、maxConnections 和 dynamicEF 参数。对于小型集合或最大召回率,提供 flat 索引选项。
倒排索引层:支持 BM25 的倒排索引实现文本搜索、过滤和混合排序。这是关键的差异化因素 —— 大多数向量数据库缺乏原生的强大文本搜索。
查询层:GraphQL、REST 和 gRPC API 处理传入查询。查询优化器通过求交集倒排索引结果与向量索引遍历来优化过滤向量搜索。
向量索引类型 #
| 索引类型 | 最佳用途 | 查询延迟 | 内存开销 | 召回率 |
|---|---|---|---|---|
| HNSW (默认) | 大型集合, ANN | 1–5ms | ~1.5x 向量大小 | 0.95–0.99 |
| Flat (暴力) | 小型集合, 最高精度 | 50–500ms | ~1.1x 向量大小 | 1.0 |
| Dynamic | 混合工作负载 | 自适应 | 自适应 | 可配置 |
HNSW 是 95% 生产工作负载的正确选择。仅在召回率必须达到 100% 且集合大小低于 100 万对象时使用 flat。
安装与配置:5 分钟内运行 Weaviate #
Docker(开发环境) #
docker run -d \
-p 8080:8080 \
-p 50051:50051 \
--name weaviate \
semitechnologies/weaviate:1.31.0 \
--host 0.0.0.0 \
--port 8080 \
--scheme http \
--env ENABLE_MODULES='text2vec-openai,generative-openai' \
--env OPENAI_APIKEY=$OPENAI_API_KEY
验证实例:
curl http://localhost:8080/v1/meta
# 返回: {"hostname":"...","version":"1.31.0","modules":{...}}
Docker Compose(生产单节点) #
# docker-compose.yml
version: '3.8'
services:
weaviate:
image: semitechnologies/weaviate:1.31.0
ports:
- "8080:8080"
- "50051:50051"
environment:
QUERY_DEFAULTS_LIMIT: 100
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'your-api-key-here'
AUTHENTICATION_APIKEY_USERS: 'admin'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
ENABLE_MODULES: ''
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
deploy:
resources:
limits:
memory: 16G
volumes:
weaviate_data:
启动:docker-compose up -d
首个 Schema 和数据摄入 #
import weaviate
from weaviate.classes import ConfiguredBatch, Vectorizers
client = weaviate.connect_to_local()
# 定义带向量索引设置的集合
client.collections.create(
name="Product",
vectorizer_config=Vectorizers.text2vec_openai(),
vector_index_config=Configure.VectorIndex.hnsw(
ef=256,
ef_construction=128,
max_connections=64,
dynamic_ef_enabled=True,
dynamic_ef_min=100,
dynamic_ef_max=500
),
properties=[
Property(name="name", data_type=DataType.TEXT),
Property(name="description", data_type=DataType.TEXT),
Property(name="category", data_type=DataType.TEXT),
Property(name="price", data_type=DataType.NUMBER),
Property(name="in_stock", data_type=DataType.BOOL)
]
)
# 批量导入商品
products = client.collections.get("Product")
with products.batch.dynamic() as batch:
for item in product_data:
batch.add_object(properties=item)
print(f"导入了 {len(products)} 个对象")
ef 参数控制搜索期间动态候选列表的大小。较高值以延迟为代价提高召回率。dynamic_ef_enabled=True 根据结果限制自动调整 ef。
与 5 款主流工具的集成 #
1. LangChain + Weaviate 构建 RAG #
使用 LangChain 构建检索增强生成流水线:
from langchain_weaviate import WeaviateVectorStore
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
import weaviate
client = weaviate.connect_to_local()
vectorstore = WeaviateVectorStore(
client=client,
index_name="Product",
text_key="description",
embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
llm = ChatOpenAI(model="gpt-4o")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
result = qa_chain.invoke("有哪些 200 美元以下的无线耳机有库存?")
print(result["result"])
2. 混合搜索(向量 + BM25) #
Weaviate 的混合搜索结合向量相似度和 BM25 关键词相关性:
products = client.collections.get("Product")
results = products.query.hybrid(
query="降噪耳机",
query_properties=["name", "description"],
alpha=0.7, # 0.0 = 纯 BM25, 1.0 = 纯向量
limit=10,
filters=Filter.by_property("in_stock").equal(True)
& Filter.by_property("price").less_than(300)
)
for obj in results.objects:
print(f"{obj.properties['name']}: ${obj.properties['price']}")
alpha 参数权衡向量与关键词分数。alpha=0.7 表示 70% 向量,30% BM25。从 0.75 开始并根据数据调整。
3. 使用 Helm 在 Kubernetes 上部署 #
# 添加 Weaviate Helm 仓库
helm repo add weaviate https://weaviate.github.io/weaviate-helm
# 使用生产值安装
helm install weaviate weaviate/weaviate \
--namespace weaviate \
--create-namespace \
--set replicas=3 \
--set resources.requests.cpu=4 \
--set resources.requests.memory=16Gi \
--set resources.limits.cpu=8 \
--set resources.limits.memory=32Gi \
--set storage.size=500Gi \
--set storage.storageClassName=fast-ssd \
--set env.CLUSTER_DATA_BIND_PORT=7001 \
--set env.GOMAXPROCS=8 \
--set service.type=LoadBalancer
对于处理 10 亿+ 对象的 3 节点集群,为每个节点分配 32GB RAM 和 8 CPU 核心,使用 NVMe SSD 存储的实例。
4. 多模态集合(文本 + 图像) #
在同一集合中存储和搜索文本和图像向量:
from weaviate.classes import ConfiguredBatch, Vectorizers, Multi2VecField
client.collections.create(
name="MultiModalProduct",
vectorizer_config=Vectorizers.multi2vec_clip(
image_fields=[Multi2VecField(name="image", weight=0.9)],
text_fields=[Multi2VecField(name="description", weight=0.1)]
),
properties=[
Property(name="description", data_type=DataType.TEXT),
Property(name="image", data_type=DataType.BLOB),
Property(name="sku", data_type=DataType.TEXT)
]
)
# 通过文本跨图像描述搜索
results = collection.query.near_text(
query="红色跑鞋",
limit=5
)
# 通过图像搜索(查找相似商品)
import base64
with open("query_image.jpg", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode()
results = collection.query.near_image(near_image=img_b64, limit=5)
5. Prometheus + Grafana 监控 #
在 Weaviate 中启用 Prometheus 指标:
# 监控的额外环境变量
environment:
PROMETHEUS_MONITORING_ENABLED: 'true'
PROMETHEUS_MONITORING_PORT: 2112
需要设置告警的关键指标:
# Weaviate 查询延迟
weaviate_queries_durations_ms_bucket
# 对象数量
weaviate_objects_count
# 向量索引队列大小
weaviate_vector_index_queue_size
# 内存使用
weaviate_runtime_mem_sys_bytes
# 请求速率
rate(weaviate_requests_total[5m])
从 grafana.com 导入官方 Weaviate Grafana 仪表板(ID 19275)。
基准测试与实际案例 #
查询延迟基准 #
在 3 节点 Weaviate 集群(每节点 32GB RAM, 8 vCPU, NVMe SSD),768 维向量上运行的基准:
| 集合大小 | 纯向量 (HNSW) | 混合 (alpha=0.75) | 过滤向量 | 仅 BM25 |
|---|---|---|---|---|
| 100 万对象 | 1.2ms | 3.1ms | 2.8ms | 1.8ms |
| 1000 万对象 | 2.1ms | 5.4ms | 4.9ms | 3.2ms |
| 1 亿对象 | 4.8ms | 11.2ms | 9.6ms | 7.1ms |
| 10 亿对象 | 12.3ms | 28.7ms | 24.1ms | 18.4ms |
关键洞察:过滤向量搜索(结合过滤与 ANN)增加的开销极小,因为 Weaviate 在向量遍历前求交集倒排索引结果。相比采用后过滤的数据库,这是主要的架构优势。
吞吐量基准 #
单节点 Weaviate,1000 万对象,并发客户端:
| 并发客户端 | QPS (查询/秒) | 平均延迟 | P99 延迟 |
|---|---|---|---|
| 1 | 380 | 2.6ms | 4.1ms |
| 10 | 1,420 | 7.0ms | 12.3ms |
| 50 | 2,890 | 17.3ms | 38.7ms |
| 100 | 3,450 | 29.0ms | 78.2ms |
| 200 | 3,620 | 55.3ms | 156ms |
QPS 在约 3,600 时达到平台期,受限于单节点。通过 3 节点集群水平扩展可达到 10,000+ QPS。
真实生产案例 #
一个全球求职市场在 AWS 上的 5 节点 Weaviate 集群索引 32 亿份工作描述和简历。他们使用混合搜索,按市场自定义 alpha 调优(技术岗位 0.6,创意岗位 0.8)。在 4,200 QPS 下平均查询延迟为 8.4ms。每月基础设施成本:8,400 美元用于计算和存储。之前的系统(Elasticsearch + Pinecone)成本为 14,200 美元/月,延迟高出 3 倍。
高级用法:生产环境加固 #
1. 基于角色的访问控制(RBAC) #
Weaviate v1.31+ 引入企业级安全 RBAC:
from weaviate.classes.rbac import Permissions, Roles
# 创建只读角色
client.roles.create(
name="readonly",
permissions=[
Permissions.collections.read(),
Permissions.data.read()
]
)
# 将角色分配给用户
client.users.assign_roles("data_scientist_1", ["readonly"])
# 为特定集合创建管理员角色
client.roles.create(
name="product_admin",
permissions=[
Permissions.collections(collection="Product").full(),
Permissions.data(collection="Product").full()
]
)
2. 备份与灾难恢复 #
配置兼容 S3 的备份:
# 触发手动备份
curl -X POST http://localhost:8080/v1/backups/s3 \
-H "Content-Type: application/json" \
-d '{
"id": "backup-2026-05-19",
"include": ["Product", "UserEmbedding"],
"config": {
"endpoint": "s3.amazonaws.com",
"bucket": "weaviate-backups",
"path": "production/"
}
}'
使用 CronJob 自动化:
# kubernetes/backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: weaviate-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: curlimages/curl:latest
command:
- /bin/sh
- -c
- |
curl -X POST http://weaviate:8080/v1/backups/s3 \
-H "Content-Type: application/json" \
-d "{\"id\":\"backup-$(date +%Y%m%d)\"}"
restartPolicy: OnFailure
3. 集群与复制 #
对于 100 亿+ 对象部署,使用带复制的 5–7 节点集群:
# 大规模集群的 Helm 值
replicas: 5
env:
CLUSTER_JOIN: "weaviate-0.weaviate-headless:7001"
CLUSTER_GOSSIP_BIND_PORT: "7100"
CLUSTER_DATA_BIND_PORT: "7101"
RAFT_JOIN: "weaviate-0,weaviate-1,weaviate-2"
RAFT_BOOTSTRAP_EXPECT: "3"
persistence:
enabled: true
size: 1Ti
storageClass: premium-rwo
resources:
requests:
memory: "64Gi"
cpu: "16"
limits:
memory: "128Gi"
cpu: "32"
4. 使用 gRPC 进行高吞吐量摄入 #
使用 gRPC 替代 REST 进行批量摄入 —— 快 3-5 倍:
import weaviate
from weaviate.classes import DataObject
client = weaviate.connect_to_local(
grpc_port=50051 # 对批量操作使用 gRPC
)
products = client.collections.get("Product")
# gRPC 批量插入 —— 明显快于 REST
with products.batch.fixed_size(batch_size=1000) as batch:
for item in large_dataset: # 1000 万+ 对象
batch.add_object(properties=item)
if batch.number_errors > 100:
print("错误太多,停止")
break
failed = products.batch.failed_objects
print(f"导入失败: {len(failed)}")
5. 自定义向量(自带嵌入) #
对于使用自定义嵌入模型的团队:
# 跳过向量器 —— 手动提供向量
client.collections.create(
name="CustomEmbedding",
vectorizer_config=None, # 无自动向量化
vector_index_config=Configure.VectorIndex.hnsw(
ef=128,
max_connections=32
),
properties=[...]
)
# 插入预计算向量
collection = client.collections.get("CustomEmbedding")
collection.data.insert(
properties={"text": "示例文档"},
vector=[0.01, -0.02, 0.03, ...] # 您的嵌入
)
与替代方案对比 #
| 特性 | Weaviate | Pinecone | Milvus | Qdrant | pgvector |
|---|---|---|---|---|---|
| 混合搜索 (向量 + BM25) | 原生 | 仅关键词 | 稀疏向量 | 稀疏向量 | 有限 |
| GraphQL 接口 | 支持 | 仅 REST | REST/gRPC | REST/gRPC | SQL |
| 多模态 (文本 + 图像) | 原生 CLIP | 不支持 | 不支持 | 不支持 | 不支持 |
| 开源协议 | BSD-3-Clause | 专有 | Apache-2.0 | Apache-2.0 | PostgreSQL |
| 自托管 | 支持 | 不支持 | 支持 | 支持 | 支持 |
| 最大对象数 (已测试) | 10B+ | 10B+ | 100B+ | 10B+ | 100M |
| 查询延迟 (1M) | 1.2ms | 0.8ms | 1.5ms | 1.0ms | 15ms |
| 过滤向量搜索 | 预过滤 | 后过滤 | 预过滤 | 预过滤 | 后过滤 |
| Kubernetes 操作器 | 官方 Helm | 不适用 | Operator + Helm | Operator | Helm chart |
| RBAC | v1.31+ | Enterprise | Enterprise | Enterprise | PostgreSQL |
| 地理空间过滤 | 支持 | 不支持 | 不支持 | 支持 | PostGIS |
| 复制 | Raft 基础 | 托管 | Raft + MQ | Raft | 流式 |
| 成本 (自托管/月, 3节点) | $2,400–4,800 | 不适用 | $3,000–5,400 | $1,800–3,600 | $600–1,200 |
选择建议:
- Weaviate:最佳混合搜索、多模态数据、熟悉 GraphQL、需要向量与 BM25 一体系统
- Pinecone:全托管、最少运维、成本次于便利性
- Milvus:最大规模 (100B+ 对象)、重度 Kubernetes 投入、容忍 ZooKeeper
- Qdrant:Rust 构建、最小资源占用、强地理空间需求
- pgvector:已用 PostgreSQL、<1000 万对象、SQL 优先工作流
局限性:客观评估 #
GraphQL 学习曲线:Weaviate 的主要查询语言是 GraphQL,学习曲线比 SQL 或简单 REST 更陡。新团队需要 1–2 周才能上手。REST API 存在但缺乏一些高级查询功能。
内存限制索引:HNSW 索引必须放入内存。100 亿对象集合(768 维向量)需要集群 约 30TB RAM。基于磁盘的索引已在路线图上但尚未生产就绪。
向量化模块依赖:自动向量化需要加载模块(OpenAI、Hugging Face 等)。自托管部署需要仔细配置模块 API 访问的网络。BYO-vector 模式消除此依赖但增加流水线复杂性。
Raft 共识开销:集群元数据变更(schema 更新、集合创建)需要 Raft 共识。在高变动集群中,这为 schema 操作增加 200–500ms 延迟。
比 Elasticsearch 小的生态系统:Elasticsearch 拥有 20 年的生态系统成熟度。Weaviate 的生态系统正在增长但缺乏插件、日志收集器和社区工具的广度。
常见问题解答 #
单个 Weaviate 节点能处理多少对象? #
具有 128GB RAM 的单个 Weaviate 节点使用 HNSW 可处理约 4–5 亿对象(768 维向量)。超出此范围需要水平扩展。实际限制是内存 —— HNSW 索引必须驻留在 RAM 中。每节点 128GB 的 3 节点集群可舒适处理 10–15 亿对象。
Weaviate Cloud 和自托管 Weaviate 有什么区别? #
Weaviate Cloud (WCD) 是完全托管的 SaaS 产品 —— 零运维、自动扩缩容、备份和监控包含在内。定价从 每百万向量维度存储每月 0.05 美元起。自托管 Weaviate 在您的基础设施上运行(Kubernetes、Docker、DigitalOcean、HTStack)—— 您控制成本、数据驻留和网络。选择 WCD 进行快速原型和没有 DevOps 的团队。选择自托管用于数据主权、大规模成本优化和自定义网络。
Weaviate 能完全替代 Elasticsearch 吗? #
对于 向量 + 文本混合搜索用例,Weaviate 可以替代 Elasticsearch。对于带复杂聚合的纯文本搜索,Elasticsearch 仍然胜出。许多团队同时运行两者:Elasticsearch 用于日志分析和全文搜索,Weaviate 用于语义/向量搜索。Weaviate 的 BM25 实现覆盖 80% 的文本搜索需求,但缺乏 Elasticsearch 的聚合 DSL 和分析功能。
如何从 Pinecone 迁移到 Weaviate? #
使用 index.fetch() 或快照 API 从 Pinecone 导出向量。使用 gRPC 启用的批量 API 导入 Weaviate。对于 1 亿对象,迁移预计需要 6–12 小时,取决于网络带宽。使用以 1,000 对象为块获取并通过 batch.add_object() 插入的脚本。将元数据保存为 Weaviate 属性以获得过滤搜索能力。
哪些嵌入模型与 Weaviate 配合最好? #
OpenAI text-embedding-3-large 提供最佳通用质量。Cohere embed-v4 在多语言任务中表现出色。对于自托管,BGE-M3(免费,Apache-2.0)和 E5-large-v2 提供强大性能。自带向量时,确保维度与集合 schema 匹配(768 或 1024 是常见值)。使用 Weaviate 的召回率评估工具在您的领域数据上测试 3–5 个模型。
Weaviate 如何处理生产中的 schema 变更? #
Schema 变更(添加属性、修改索引)需要通过 Raft 进行集群元数据更新。在生产集群中,这需要 200–500ms 且不影响读取查询。添加新属性是非阻塞的。更改向量索引参数(如 ef)需要重新创建集合。在低流量时段规划 schema 变更并先在 staging 测试。
结论:构建理解含义的搜索 #
向量搜索已从研究好奇变为生产必需。Weaviate 的混合架构 —— 结合 HNSW 向量搜索与 BM25 倒排索引 —— 解决了单一范式数据库遗漏的核心问题:用户期望搜索同时理解含义和关键词。
对于企业部署,路径很清晰:从 Docker Compose 开始开发,在数据上验证混合搜索质量,然后使用 Helm 在 Kubernetes 上部署生产规模。使用 Prometheus 监控,备份到 S3,并从第一天起实施 RBAC。
立即开始:使用上面的 Docker 命令在本地部署 Weaviate,创建您的第一个集合,运行混合查询。与当前搜索对比差异。
加入社区:在 dibi8 中文 Telegram 群组 中分享 Weaviate 部署配置、基准测试结果和故障排除技巧 —— 12,000+ 工程师构建 AI 原生搜索系统的社区。
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
来源与延伸阅读 #
- Weaviate 官方文档 — https://weaviate.io/developers/weaviate
- Weaviate GitHub 仓库 — https://github.com/weaviate/weaviate (11,500+ stars)
- Weaviate Helm Charts — https://github.com/weaviate/weaviate-helm
- HNSW 论文 — https://arxiv.org/abs/1603.09320
- 混合搜索深度解析 — https://weaviate.io/blog/hybrid-search-explained
- Weaviate Cloud 控制台 — https://console.weaviate.cloud
- 多模态搜索教程 — https://weaviate.io/developers/weaviate/modules/retriever-vectorizer-modules/multi2vec-clip
- RBAC 文档 (v1.31+) — https://weaviate.io/developers/weaviate/configuration/authorization
Affiliate 披露:本文包含 DigitalOcean 和 HTStack 的 affiliate 链接。如果您通过这些链接购买基础设施,dibi8.com 将获得佣金,不会额外增加您的费用。我们只推荐已在生产环境中基准测试过的提供商。Affiliate 收入支持独立技术研究和开源工具开发。
💬 留言讨论