在众多向量数据库中,Weaviate 凭借其独特的 GraphQL 原生接口、多租户架构和内置的模块化生态系统,在 AI 基础设施领域占据了一席之地。与 Milvus 专注于高性能检索、ChromaDB 追求轻量级不同,Weaviate 最大的差异化优势在于:它把向量检索、语义搜索、对象存储和 GraphQL 查询接口打包成了一个开箱即用的产品。本文将深入 Weaviate 的架构设计、部署方式、数据建模和实际应用场景,帮助你在生产环境中快速落地。

Weaviate 的核心架构设计
理解 Weaviate 的架构是正确使用它的前提。Weaviate 采用微服务架构,核心组件包括以下部分。
对象存储与向量索引的融合
Weaviate 不像其他向量数据库那样将向量与原数据分开存储。它采用 Object-Store 设计,每个数据对象同时包含结构化字段(文本、数字、布尔值等)和向量嵌入。这意味着你不需要额外维护一个关系数据库来存储原数据——Weaviate 本身就是完整的存储系统。
1
2
3
4
5
6
7
8
9
10
11
12 # Weaviate 数据对象的结构示例
{
"class": "Article",
"id": "b4f5e6a7-8c9d-0e1f-2a3b-4c5d6e7f8a9b",
"properties": {
"title": "Weaviate 架构详解",
"content": "Weaviate 采用混合存储架构...",
"word_count": 3421,
"published_at": "2026-07-07T00:00:00Z"
},
"vector": [0.0123, 0.0456, -0.0789, ...]
}
向量索引引擎:HNSW 与乘积量化
Weaviate 默认使用 HNSW(Hierarchical Navigable Small World) 作为向量索引算法。HNSW 通过构建多层图结构,在搜索时从顶层逐层向下,实现 O(log n) 级别的近似最近邻搜索。Weaviate 对 HNSW 做了深度优化,支持以下配置参数:
| 参数 | 默认值 | 说明 | 调优建议 | ||
|---|---|---|---|---|---|
|
128 | 构建索引时的动态候选列表大小 | 值越大索引质量越高,但构建速度越慢 | ||
|
64 | 每个节点允许的最大连接数 | 值越大检索精度越高,但内存占用越大 | ||
|
-1 | 搜索时的动态候选列表大小(-1 表示自动计算) | 查询时设置,值越大召回率越高但延迟增加 | ||
|
禁用 | 乘积量化压缩,可降低 80% 的内存占用 | 精度-内存的权衡场景使用 |
此外,Weaviate 在 1.18+ 版本中引入了 乘积量化(PQ) 支持,可以将向量索引的内存占用降低 4-8 倍,适合对精度要求不那么极致但内存有限的生产场景。
模块化架构:向量化与推理引擎
Weaviate 最强大的特性之一是它的模块化系统。向量化模块可以自动将文本、图像等数据转换为向量嵌入,无需你在外部调用模型再手动写入。支持的模块包括:
- text2vec-transformers:集成 Hugging Face Transformer 模型进行文本向量化
- text2vec-openai:使用 OpenAI 的 embeddings API
- text2vec-cohere:使用 Cohere 的 embeddings API
- multi2vec-clip:CLIP 多模态模型,支持文本和图片的联合向量化
- generative-openai:与 LLM 集成,实现生成式检索(RAG)
- qna-transformers:面向问答场景的模块
这些模块以 sidecar 容器 的形式运行,与 Weaviate 核心进程通过 gRPC 通信。这种设计使得向量化计算不会阻塞核心检索服务。

生产环境部署方案
Weaviate 支持多种部署方式,从单机 Docker 到 Kubernetes 集群。这里给出两种经过验证的生产部署方案。
Docker Compose 部署(单机生产)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 version: '3.8'
services:
weaviate:
image: semitechnologies/weaviate:1.25.0
ports:
- "8080:8080"
environment:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'your-api-key-here'
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
AUTHORIZATION_ADMINLIST_USERS: 'admin@example.com'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers'
ENABLE_MODULES: 'text2vec-transformers,generative-openai,qna-transformers'
CLUSTER_HOSTNAME: 'node1'
volumes:
- /data/weaviate:/var/lib/weaviate
deploy:
resources:
limits:
memory: 8G
reservations:
memory: 4G
text2vec-transformers:
image: semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1
environment:
ENABLE_CUDA: '1'
deploy:
resources:
reservations:
memory: 4G
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
这个配置的关键点:
- 启用 API Key 认证而非匿名访问
- 使用 GPU 加速向量化推理(Transformer 模型)
- 限制内存防止 OOM,Weaviate 主进程建议至少 4GB
- 持久化数据到宿主机,避免容器重建丢失数据
- 选择 sentence-transformers/multi-qa-MiniLM-L6-cos-v1 模型,它在中文语义搜索上表现优秀且体积只有 80MB
Kubernetes 集群部署(高可用)
对于生产级别的多节点部署,推荐使用 Weaviate 官方的 Helm Chart:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 # values.yaml
replicaCount: 3
image:
tag: 1.25.0
service:
type: ClusterIP
persistence:
size: 100Gi
storageClass: fast-ssd
resources:
requests:
memory: "6Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
config:
default_vectorizer_module: text2vec-transformers
enable_modules: text2vec-transformers,generative-openai
authentication:
apikey:
enabled: true
allowed_keys:
- ${WEAVIATE_API_KEY}
authorization:
adminlist:
enabled: true
users:
- admin@example.com
modules:
text2vec_transformers:
enabled: true
replicas: 2
resources:
requests:
memory: "4Gi"
nvidia.com/gpu: 1
env:
CLUSTER_GOSSIP_BIND_PORT: "7100"
CLUSTER_DATA_BIND_PORT: "7101"
Kubernetes 部署需要注意:
- Weaviate 使用 Raft 共识算法 进行集群协调,建议奇数个节点
- 存储卷必须使用低延迟 SSD,否则写入性能会急剧下降
- 每个节点独立存储数据分片,不是共享存储架构
- 推荐使用节点亲和性将 Weaviate 调度到 GPU 节点
数据建模与 Schema 设计
Weaviate 的 Schema 设计直接影响搜索质量。下面以构建一个中文技术文档搜索引擎为例,演示完整的数据建模流程。
定义 Class 与属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 # 通过 GraphQL 创建 Schema
POST /v1/schema
{
"class": "Documentation",
"description": "技术文档库",
"vectorizer": "text2vec-transformers",
"moduleConfig": {
"text2vec-transformers": {
"vectorizeClassName": false,
"poolingStrategy": "masked_mean"
}
},
"properties": [
{
"name": "title",
"dataType": ["text"],
"description": "文档标题",
"moduleConfig": {
"text2vec-transformers": {
"skip": false,
"vectorizePropertyName": true
}
}
},
{
"name": "content",
"dataType": ["text"],
"description": "文档正文",
"moduleConfig": {
"text2vec-transformers": {
"skip": false,
"vectorizePropertyName": false
}
}
},
{
"name": "category",
"dataType": ["string"],
"description": "文档分类",
"moduleConfig": {
"text2vec-transformers": {
"skip": true
}
}
},
{
"name": "tags",
"dataType": ["text[]"],
"description": "标签数组"
},
{
"name": "view_count",
"dataType": ["int"],
"description": "浏览次数"
}
]
}
Schema 设计的关键原则:
- 选择性向量化:用
1skip: true
排除不需要参与语义搜索的字段(如分类名、ID),减少向量噪声
- 属性命名策略:
1vectorizePropertyName: true
让属性名本身也参与向量化,增强语义理解
- 数据类型选择:Weaviate 支持 text、string、int、number、boolean、date、geoCoordinates、text[]、string[]、int[]、number[]、boolean[]、cross-reference 等类型
配置向量索引参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # 创建 Schema 时指定索引配置
POST /v1/schema
{
"class": "Documentation",
"vectorIndexType": "hnsw",
"vectorIndexConfig": {
"skip": false,
"efConstruction": 256,
"maxConnections": 64,
"ef": -1,
"efDynamic": true,
"dynamicEfMin": 100,
"dynamicEfMax": 500,
"dynamicEfFactor": 8,
"vectorCacheMaxObjects": 500000,
"pq": {
"enabled": false,
"trainingLimit": 100000,
"segments": 0
},
"distance": "cosine"
}
}
数据导入与索引构建
Weaviate 提供了批量导入接口,使用得当可以大幅提升写入吞吐量。
Python 批量导入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import weaviate
import weaviate.classes as wvc
client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": "your-openai-key"
}
)
batch_size = 100
with client.batch.configure(
batch_size=batch_size,
dynamic=True,
timeout_retries=3,
num_workers=2,
consistency_level=wvc.config.ConsistencyLevel.ONE,
) as batch:
for doc in documents:
batch.add_object(
collection="Documentation",
properties={
"title": doc["title"],
"content": doc["content"],
"category": doc["category"],
"tags": doc["tags"],
"view_count": doc["view_count"]
},
)
client.wait_for_all()
print(f"批量导入完成,共导入 {len(documents)} 条文档")
client.close()
批量导入的性能优化要点:
- batch_size:建议 100-500 之间,需要根据每条记录的大小做实验
- num_workers:不要超过 CPU 核心数,否则上下文切换会降低性能
- consistency_level:ONE 性能最高,ALL 保证强一致性但写入慢
- 使用 automatic batch:让客户端自动决定批次大小和提交时机

GraphQL 查询实战
Weaviate 最大的特色就是提供了完整的 GraphQL 查询接口,支持向量搜索、关键字搜索和混合搜索三种模式。
纯向量语义搜索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 # 查询:与"如何部署微服务架构"语义相似的文档
{
Get {
Documentation(
nearText: {
concepts: ["如何部署微服务架构"]
distance: 0.7
}
limit: 10
) {
title
content
category
_additional {
distance
certainty
}
}
}
}
混合搜索:向量 + 关键字过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 # 在向量搜索的基础上,增加 BM25 关键词加权和属性过滤
{
Get {
Documentation(
hybrid: {
query: "Kubernetes 部署 微服务"
alpha: 0.5
vector: null
}
where: {
operator: And
operands: [
{
path: ["category"]
operator: Equal
valueString: "Kubernetes"
},
{
path: ["view_count"]
operator: GreaterThan
valueInt: 1000
}
]
}
limit: 20
) {
title
_additional {
score
explainScore
}
}
}
}
1 | alpha |
参数是混合搜索的核心控制点:
-
1alpha = 0
:纯 BM25 关键词搜索,适合精确匹配场景
-
1alpha = 0.5
:平衡搜索,语义和关键词各占一半权重
-
1alpha = 1
:纯向量语义搜索,适合同义词、近义词场景
生成式搜索(RAG 模式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # 在搜索结果上直接调用 LLM 生成回答
{
Get {
Documentation(
nearText: {
concepts: ["Weaviate 如何配置集群"]
}
limit: 3
) {
title
content
_additional {
generate(
singleResult: {
prompt: "基于以下文档内容,用中文简洁地回答用户问题。文档标题:{title},文档内容:{content}。请提炼出关键配置步骤。"
}
) {
singleResult
error
}
}
}
}
}
生成式搜索是 Weaviate 区别于其他向量数据库的杀手级功能。它直接在查询层集成了 RAG 流程,无需在应用层写额外的 LLM 调用代码。
多租户支持与数据隔离
对于 SaaS 场景,Weaviate 提供了原生多租户支持,可以在同一个集群中为不同客户提供完全隔离的数据空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import weaviate.classes as wvc
client.collections.create(
name="Documentation",
multi_tenancy_config=wvc.config.Configure.multi_tenancy(
enabled=True,
auto_tenant_creation=True
)
)
for tenant_id in ["tenant_001", "tenant_002", "tenant_003"]:
client.collections.get("Documentation").tenants.create(tenant_id)
tenant_client = client.collections.get(
"Documentation",
tenant="tenant_001"
)
tenant_client.data.insert({
"title": "客户A的文档",
"content": "这是租户隔离的数据..."
})
性能监控与运维
生产环境中的 Weaviate 需要关注以下关键指标。
Prometheus 监控指标
Weaviate 原生暴露 Prometheus 指标,通过以下配置开启:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # 在 docker-compose 中配置
environment:
PROMETHEITY_MONITORING_ENABLED: 'true'
# 在 K8s 中通过 ServiceMonitor 采集
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: weaviate
spec:
endpoints:
- port: http
path: /metrics
selector:
matchLabels:
app: weaviate
需要重点关注的指标:
| 指标名称 | 说明 | 告警阈值 | ||
|---|---|---|---|---|
|
总请求数 | 与基线对比突增/突降 | ||
|
请求延迟直方图 | P99 > 500ms | ||
|
内存使用量 | 超过 80% 限制 | ||
|
向量索引大小 | 监控增长趋势 | ||
|
批量导入错误数 | > 0 时检查日志 | ||
|
Go 协程数 | 突增通常表示异常 |
常见运维问题
- OOM 崩溃:HNSW 索引在构建时需要大量内存。使用 PQ 压缩可以缓解,或限制单节点数据量不超过 500 万条 768 维向量。
- 写入速度慢:检查磁盘 IOPS,Weaviate 使用 WAL 写前日志,磁盘延迟直接决定写入吞吐。
- 搜索精度下降:定期重建索引(
1POST /v1/classes/{className}/reindex
),特别是大量更新后。
- 模块启动失败:检查 sidecar 容器的 CUDA 驱动版本,PyTorch 对 CUDA 版本要求严格。
实际应用场景
场景一:企业知识库 RAG 系统
Weaviate 的生成式搜索模块天然适合 RAG 应用。一个典型的架构是:
1
2 用户提问 -> Weaviate 向量搜索 -> 检索 Top-K 相关文档
-> 调用 generative-openai 模块 -> 基于检索结果生成回答 -> 返回给用户
相比自行搭建 RAG pipeline(Embedding -> 向量数据库 -> LLM 调用),Weaviate 提供了一体化的查询接口,减少了网络延迟和系统复杂度。
场景二:多模态内容搜索
利用
1 | multi2vec-clip |
模块,可以实现图片和文本的联合搜索:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 # 导入图片时自动向量化
POST /v1/objects
{
"class": "ProductImage",
"properties": {
"filename": "product_001.jpg",
"image": "base64编码的图片数据..."
}
}
# 使用文本搜索图片
{
Get {
ProductImage(
nearText: {
concepts: ["红色运动鞋"]
}
) {
filename
_additional {
distance
}
}
}
}
场景三:推荐系统召回层
Weaviate 的向量搜索可以替代传统推荐系统中的 Faiss 召回层,同时提供更丰富的过滤能力:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 # 根据用户历史行为向量,召回相似物品
{
Get {
Product(
nearVector: {
vector: [0.123, 0.456, ...]
}
where: {
operator: Not
operands: [{
path: ["category"]
operator: Equal
valueString: "已购买品类"
}]
}
limit: 50
) {
product_id
title
price
_additional {
distance
}
}
}
}
总结与最佳实践
Weaviate 在 RAG 系统、多模态搜索和需要同时管理结构化数据+向量的场景中具有明显优势。以下是几个核心建议:
- 选择合适的向量化模型:中文场景推荐
1shibing624/text2vec-base-chinese
或
1sentence-transformers/all-MiniLM-L6-v2,前者中文语义理解更好,后者通用性更强。
- 善用混合搜索:不要只依赖纯向量搜索。设置
1alpha = 0.5
或根据业务场景动态调整,可以在语义搜索和关键词匹配之间取得平衡。
- 合理规划数据分片:单节点 500 万条以下无需分片。超过此规模时,使用 Weaviate 的集群模式,每个节点处理 200-300 万条为宜。
- 监控内存使用:HNSW 索引占用内存大约是原始向量的 1.3-1.5 倍。100 万条 768 维 float32 向量占用约 3GB,HNSW 索引额外占用约 1.5GB。
- 利用 GraphQL 的灵活性:Weaviate 的 GraphQL 接口支持嵌套查询、cross-reference 关联查询和聚合查询,充分利用可以减少多次 API 调用。
如果你正在构建一个需要同时管理文档、向量和 RAG 流程的 AI 应用,Weaviate 值得成为你的技术栈中的核心组件。它的 GraphQL 原生接口和模块化设计,让很多原本需要多系统协作的工作变得简单和高效。
汤不热吧