欢迎光临
我们一直在努力

Weaviate 向量数据库实战:从架构设计到 GraphQL 语义搜索的完整部署指南

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

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 做了深度优化,支持以下配置参数:

参数 默认值 说明 调优建议
1
efConstruction
128 构建索引时的动态候选列表大小 值越大索引质量越高,但构建速度越慢
1
maxConnections
64 每个节点允许的最大连接数 值越大检索精度越高,但内存占用越大
1
ef
-1 搜索时的动态候选列表大小(-1 表示自动计算) 查询时设置,值越大召回率越高但延迟增加
1
pq
禁用 乘积量化压缩,可降低 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 设计的关键原则:

  • 选择性向量化:用
    1
    skip: true

    排除不需要参与语义搜索的字段(如分类名、ID),减少向量噪声

  • 属性命名策略
    1
    vectorizePropertyName: 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 查询

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

参数是混合搜索的核心控制点:

  • 1
    alpha = 0

    :纯 BM25 关键词搜索,适合精确匹配场景

  • 1
    alpha = 0.5

    :平衡搜索,语义和关键词各占一半权重

  • 1
    alpha = 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

需要重点关注的指标:

指标名称 说明 告警阈值
1
weaviate_requests_total
总请求数 与基线对比突增/突降
1
weaviate_request_duration_seconds
请求延迟直方图 P99 > 500ms
1
weaviate_memory_usage_bytes
内存使用量 超过 80% 限制
1
weaviate_vector_index_size
向量索引大小 监控增长趋势
1
weaviate_batch_import_errors_total
批量导入错误数 > 0 时检查日志
1
go_goroutines
Go 协程数 突增通常表示异常

常见运维问题

  1. OOM 崩溃:HNSW 索引在构建时需要大量内存。使用 PQ 压缩可以缓解,或限制单节点数据量不超过 500 万条 768 维向量。
  2. 写入速度慢:检查磁盘 IOPS,Weaviate 使用 WAL 写前日志,磁盘延迟直接决定写入吞吐。
  3. 搜索精度下降:定期重建索引(
    1
    POST /v1/classes/{className}/reindex

    ),特别是大量更新后。

  4. 模块启动失败:检查 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 系统、多模态搜索和需要同时管理结构化数据+向量的场景中具有明显优势。以下是几个核心建议:

  1. 选择合适的向量化模型:中文场景推荐
    1
    shibing624/text2vec-base-chinese

    1
    sentence-transformers/all-MiniLM-L6-v2

    ,前者中文语义理解更好,后者通用性更强。

  2. 善用混合搜索:不要只依赖纯向量搜索。设置
    1
    alpha = 0.5

    或根据业务场景动态调整,可以在语义搜索和关键词匹配之间取得平衡。

  3. 合理规划数据分片:单节点 500 万条以下无需分片。超过此规模时,使用 Weaviate 的集群模式,每个节点处理 200-300 万条为宜。
  4. 监控内存使用:HNSW 索引占用内存大约是原始向量的 1.3-1.5 倍。100 万条 768 维 float32 向量占用约 3GB,HNSW 索引额外占用约 1.5GB。
  5. 利用 GraphQL 的灵活性:Weaviate 的 GraphQL 接口支持嵌套查询、cross-reference 关联查询和聚合查询,充分利用可以减少多次 API 调用。

如果你正在构建一个需要同时管理文档、向量和 RAG 流程的 AI 应用,Weaviate 值得成为你的技术栈中的核心组件。它的 GraphQL 原生接口和模块化设计,让很多原本需要多系统协作的工作变得简单和高效。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » Weaviate 向量数据库实战:从架构设计到 GraphQL 语义搜索的完整部署指南
分享到: 更多 (0)