核心概念 #
本章介绍 Weaviate 的核心概念和数据模型。
数据模型概览 #
text
Weaviate 数据模型层次:
┌─────────────────────────────────────────────────────────────┐
│ Weaviate │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Schema │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Collection │ │ Collection │ │ Collection │ │ │
│ │ │ (Class) │ │ (Class) │ │ (Class) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Objects │ │ Objects │ │ Objects │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Schema(模式) #
Schema 是 Weaviate 中定义数据结构的顶层概念,类似于关系数据库中的数据库模式。
Schema 的作用 #
text
Schema 定义:
├── Collections(集合/类)
│ └── 定义数据类型
├── Properties(属性)
│ └── 定义字段类型
├── Vectorizer(向量化配置)
│ └── 定义向量化方式
└── Module Config(模块配置)
└── 定义模块参数
Schema 结构 #
json
{
"classes": [
{
"class": "Article",
"description": "文章类",
"vectorizer": "text2vec-openai",
"moduleConfig": {
"text2vec-openai": {
"model": "ada",
"modelVersion": "002",
"type": "text"
}
},
"properties": [
{
"name": "title",
"dataType": ["text"],
"description": "文章标题"
},
{
"name": "content",
"dataType": ["text"],
"description": "文章内容"
},
{
"name": "author",
"dataType": ["Author"],
"description": "作者引用"
}
]
}
]
}
Collection(集合) #
Collection(也称为 Class)是 Weaviate 中存储同类对象的容器,类似于关系数据库中的表。
Collection 定义 #
python
import weaviate.classes as wvc
collection = client.collections.create(
name="Article",
description="文章集合",
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(
model="ada",
model_version="002"
),
properties=[
wvc.config.Property(
name="title",
data_type=wvc.config.DataType.TEXT,
description="文章标题"
),
wvc.config.Property(
name="content",
data_type=wvc.config.DataType.TEXT,
description="文章内容"
),
wvc.config.Property(
name="views",
data_type=wvc.config.DataType.INT,
description="阅读量"
),
wvc.config.Property(
name="published",
data_type=wvc.config.DataType.DATE,
description="发布日期"
)
]
)
数据类型 #
text
Weaviate 支持的数据类型:
基础类型:
├── text: 文本字符串
├── int: 整数
├── number: 浮点数
├── boolean: 布尔值
├── date: 日期时间(ISO 8601 格式)
├── uuid: UUID 标识符
├── geoCoordinates: 地理坐标
├── phoneNumber: 电话号码
└── blob: 二进制数据(Base64)
数组类型:
├── text[]: 文本数组
├── int[]: 整数数组
└── number[]: 浮点数数组
引用类型:
└── 引用其他 Collection(跨类关联)
引用属性 #
python
collection = client.collections.create(
name="Article",
properties=[
wvc.config.Property(
name="title",
data_type=wvc.config.DataType.TEXT
),
wvc.config.Property(
name="author",
data_type=wvc.config.DataType.TEXT
)
],
references=[
wvc.config.ReferenceProperty(
name="writtenBy",
target_collection="Author"
),
wvc.config.ReferenceProperty(
name="hasCategory",
target_collection="Category"
)
]
)
Object(对象) #
Object 是 Weaviate 中存储的单个数据记录,包含属性数据、向量和引用。
Object 结构 #
text
Object 组成:
├── id: UUID 唯一标识符
├── properties: 属性数据
│ ├── title: "文章标题"
│ ├── content: "文章内容..."
│ └── views: 1000
├── vector: [0.1, 0.2, ...] (向量)
├── references: 引用关系
│ └── writtenBy: [Author UUID]
└── creationTimeUnix: 创建时间
创建对象 #
python
articles = client.collections.get("Article")
uuid = articles.data.insert({
"title": "Weaviate 入门指南",
"content": "Weaviate 是一个云原生向量数据库...",
"views": 1000,
"published": "2024-01-15T10:00:00Z"
})
print(f"Created object with UUID: {uuid}")
批量创建对象 #
python
articles = client.collections.get("Article")
objects = [
{
"title": "向量数据库简介",
"content": "向量数据库是 AI 应用的核心...",
"views": 500
},
{
"title": "RAG 应用实战",
"content": "RAG 是检索增强生成的简称...",
"views": 800
},
{
"title": "语义搜索原理",
"content": "语义搜索基于向量相似性...",
"views": 600
}
]
with articles.batch.dynamic() as batch:
for obj in objects:
batch.add_object(properties=obj)
print(f"Batch import completed")
自定义向量 #
python
import numpy as np
articles = client.collections.get("Article")
vector = np.random.rand(1536).tolist()
uuid = articles.data.insert(
properties={
"title": "自定义向量文章",
"content": "这篇文章使用自定义向量..."
},
vector=vector
)
Vector(向量) #
Vector 是对象在高维空间中的数值表示,是实现语义搜索的核心。
向量生成方式 #
text
向量生成方式:
1. 自动向量化
└── 使用 Vectorizer Module 自动生成
2. 自定义向量
└── 用户自己提供向量
3. 混合模式
└── 部分自动,部分自定义
向量化配置 #
python
import weaviate.classes as wvc
collection = client.collections.create(
name="Article",
vectorizer_config=[
wvc.config.Configure.NamedVectors.text2vec_openai(
name="title_vector",
source_properties=["title"]
),
wvc.config.Configure.NamedVectors.text2vec_openai(
name="content_vector",
source_properties=["content"]
)
],
properties=[
wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
]
)
向量索引 #
text
Weaviate 使用 HNSW 索引:
HNSW (Hierarchical Navigable Small World):
├── 多层图结构
├── 快速近似搜索
├── 支持动态更新
└── 可配置精度和性能
索引参数:
├── efConstruction: 构建时搜索范围
├── maxConnections: 最大连接数
├── ef: 查询时搜索范围
└── distance: 距离度量方式
向量配置 #
python
collection = client.collections.create(
name="Article",
vectorizer_config=wvc.config.Configure.Vectorizer.none(),
vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
distance_metric=wvc.config.VectorDistance.COSINE,
ef_construction=128,
max_connections=64
)
)
Module(模块) #
Module 是 Weaviate 的扩展机制,提供向量化、生成等能力。
模块类型 #
text
模块类型:
1. 向量化模块 (Vectorizer)
├── text2vec-openai
├── text2vec-cohere
├── text2vec-huggingface
├── text2vec-palm
├── img2vec-neural
└── multi2vec-clip
2. 生成模块 (Generative)
├── generative-openai
├── generative-cohere
└── generative-palm
3. 重排序模块 (Reranker)
└── reranker-cohere
4. 其他模块
├── qna-openai (问答)
├── text-spellcheck (拼写检查)
└── text2vec-contextionary (内置)
模块配置 #
python
collection = client.collections.create(
name="Article",
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(
model="text-embedding-3-small"
),
generative_config=wvc.config.Configure.Generative.openai(
model="gpt-4"
)
)
查看可用模块 #
python
meta = client.get_meta()
for module_name, module_info in meta.get("modules", {}).items():
print(f"Module: {module_name}")
print(f" Info: {module_info}")
距离度量 #
Weaviate 支持多种向量距离度量方式。
余弦相似度(Cosine) #
text
公式: cos(a, b) = (a · b) / (|a| × |b|)
特点:
├── 关注向量方向
├── 值范围: [-1, 1]
├── 1 表示完全相同方向
└── 适合归一化向量
适用场景:
├── 文本嵌入
├── 语义相似性
└── 推荐系统
点积(Dot Product) #
text
公式: dot(a, b) = Σ(ai × bi)
特点:
├── 计算速度快
├── 适合归一化向量
└── 与余弦相似度等价(归一化时)
适用场景:
├── 推荐系统
├── 性能优先场景
└── 归一化向量
L2 距离(欧几里得) #
text
公式: l2(a, b) = √Σ(ai - bi)²
特点:
├── 计算绝对距离
├── 值范围: [0, ∞)
├── 0 表示完全相同
└── 受向量长度影响
适用场景:
├── 图像特征
├── 物理距离
└── 未归一化向量
配置距离度量 #
python
collection = client.collections.create(
name="Article",
vectorizer_config=wvc.config.Configure.Vectorizer.none(),
vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
distance_metric=wvc.config.VectorDistance.COSINE
)
)
租户与多租户 #
Weaviate 支持多租户架构,实现数据隔离。
启用多租户 #
python
collection = client.collections.create(
name="Article",
multi_tenancy_config=wvc.config.Configure.multi_tenancy(
enabled=True
)
)
租户操作 #
python
articles = client.collections.get("Article")
articles.tenants.create(
tenants=[
wvc.tenants.Tenant(name="tenant1"),
wvc.tenants.Tenant(name="tenant2")
]
)
tenant1_articles = articles.with_tenant("tenant1")
tenant1_articles.data.insert({
"title": "租户1的文章",
"content": "这是租户1的数据..."
})
复制与分片 #
复制配置 #
python
collection = client.collections.create(
name="Article",
replication_config=wvc.config.Configure.replication(
factor=3
)
)
分片配置 #
python
collection = client.collections.create(
name="Article",
sharding_config=wvc.config.Configure.sharding(
virtual_per_physical=128,
desired_count=3
)
)
小结 #
本章介绍了 Weaviate 的核心概念:
- Schema:定义数据结构
- Collection:存储同类对象
- Object:单个数据记录
- Vector:高维向量表示
- Module:扩展能力
下一步 #
理解核心概念后,继续学习 快速开始,动手实践 Weaviate!
最后更新:2026-04-04