向量操作 #

本章详细介绍 Weaviate 的向量操作功能。

向量生成方式 #

向量生成流程 #

text
向量生成方式:

┌─────────────────────────────────────────────────────────────┐
│                     Weaviate 向量生成                        │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  方式一:自动向量化                                          │
│  ┌─────────┐     ┌─────────────┐     ┌─────────┐           │
│  │ 文本数据 │ ──→ │ Vectorizer  │ ──→ │  向量   │           │
│  └─────────┘     │   Module    │     └─────────┘           │
│                  └─────────────┘                             │
│                                                              │
│  方式二:自定义向量                                          │
│  ┌─────────┐     ┌─────────────┐     ┌─────────┐           │
│  │ 文本数据 │ ──→ │ 外部模型    │ ──→ │  向量   │           │
│  └─────────┘     └─────────────┘     └─────────┘           │
│                        │                                    │
│                        ▼                                    │
│                  ┌─────────────┐                            │
│                  │  Weaviate   │                            │
│                  │   存储      │                            │
│                  └─────────────┘                            │
│                                                              │
└─────────────────────────────────────────────────────────────┘

自动向量化 #

OpenAI 向量化 #

python
import weaviate.classes as wvc

articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(
        model="text-embedding-3-small",
        model_version="latest",
        type="text",
        vectorize_class_name=False
    ),
    properties=[
        wvc.config.Property(
            name="title",
            data_type=wvc.config.DataType.TEXT,
            skip_vectorization=False
        ),
        wvc.config.Property(
            name="content",
            data_type=wvc.config.DataType.TEXT,
            skip_vectorization=False
        ),
        wvc.config.Property(
            name="category",
            data_type=wvc.config.DataType.TEXT,
            skip_vectorization=True
        )
    ]
)

articles.data.insert({
    "title": "Weaviate 入门指南",
    "content": "Weaviate 是一个云原生向量数据库...",
    "category": "技术"
})

Cohere 向量化 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_cohere(
        model="embed-multilingual-v3.0",
        truncate="END",
        vectorize_class_name=False
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

HuggingFace 向量化 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_huggingface(
        model="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
        options={
            "waitForModel": True,
            "useGPU": False
        }
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

自定义向量 #

插入自定义向量 #

python
import numpy as np
from openai import OpenAI

openai_client = OpenAI()

def get_embedding(text):
    response = openai_client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.none(),
    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 是一个云原生向量数据库"
vector = get_embedding(text)

articles.data.insert(
    properties={
        "title": "Weaviate 简介",
        "content": text
    },
    vector=vector
)

批量自定义向量 #

python
texts = [
    "向量数据库是 AI 应用的核心组件",
    "语义搜索基于向量相似性",
    "RAG 结合检索和生成能力"
]

vectors = [get_embedding(t) for t in texts]

with articles.batch.dynamic() as batch:
    for text, vector in zip(texts, vectors):
        batch.add_object(
            properties={"title": text[:20], "content": text},
            vector=vector
        )

多向量配置 #

创建多向量 Collection #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=[
        wvc.config.Configure.NamedVectors.text2vec_openai(
            name="title_vector",
            source_properties=["title"],
            model="text-embedding-3-small"
        ),
        wvc.config.Configure.NamedVectors.text2vec_openai(
            name="content_vector",
            source_properties=["content"],
            model="text-embedding-3-large"
        ),
        wvc.config.Configure.NamedVectors.text2vec_openai(
            name="full_vector",
            source_properties=["title", "content"],
            model="text-embedding-3-small"
        )
    ],
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

指定向量搜索 #

python
articles = client.collections.get("Article")

response = articles.query.near_text(
    query="向量数据库",
    target_vector="title_vector",
    limit=5
)

print("基于标题向量的搜索结果:")
for obj in response.objects:
    print(f"- {obj.properties['title']}")

response = articles.query.near_text(
    query="向量数据库",
    target_vector="content_vector",
    limit=5
)

print("\n基于内容向量的搜索结果:")
for obj in response.objects:
    print(f"- {obj.properties['title']}")

多向量组合搜索 #

python
response = articles.query.near_text(
    query="向量数据库",
    target_vector=["title_vector", "content_vector"],
    limit=5
)

向量量化 #

量化可以显著减少内存占用,适合大规模向量数据。

PQ 量化 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.COSINE,
        quantizer=wvc.config.Configure.VectorIndex.Quantizer.pq(
            segments=64,
            centroids=256,
            training_limit=100000
        )
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

BQ 量化 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.COSINE,
        quantizer=wvc.config.Configure.VectorIndex.Quantizer.bq(
            cache=True
        )
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

量化对比 #

text
量化方式对比:

┌─────────────────────────────────────────────────────────────┐
│                        量化对比                              │
├──────────────┬──────────────┬──────────────┬───────────────┤
│     方式     │   内存占用   │    召回率    │     速度      │
├──────────────┼──────────────┼──────────────┼───────────────┤
│ 无量化       │ 100%         │ 100%         │ 基准          │
│ PQ 量化      │ ~10%         │ ~95%         │ 更快          │
│ BQ 量化      │ ~3%          │ ~90%         │ 最快          │
└──────────────┴──────────────┴──────────────┴───────────────┘

向量索引配置 #

HNSW 参数详解 #

python
articles = 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=256,
        max_connections=64,
        ef=128,
        dynamic_ef_min=100,
        dynamic_ef_max=500,
        dynamic_ef_factor=8,
        skip=False,
        cleanup_interval_seconds=300
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT)
    ]
)

参数说明 #

text
HNSW 参数说明:

ef_construction:
├── 构建索引时的搜索范围
├── 值越大,索引质量越高
├── 构建时间越长
└── 推荐值: 128-512

max_connections:
├── 每个节点的最大连接数
├── 值越大,召回率越高
├── 内存占用越大
└── 推荐值: 16-64

ef:
├── 查询时的搜索范围
├── 值越大,召回率越高
├── 查询时间越长
└── 推荐值: 64-256

动态 EF 配置 #

python
vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
    ef=-1,
    dynamic_ef_min=50,
    dynamic_ef_max=500,
    dynamic_ef_factor=8
)

距离度量 #

配置距离度量 #

python
articles_cosine = client.collections.create(
    name="ArticleCosine",
    vectorizer_config=wvc.config.Configure.Vectorizer.none(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.COSINE
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT)
    ]
)

articles_dot = client.collections.create(
    name="ArticleDot",
    vectorizer_config=wvc.config.Configure.Vectorizer.none(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.DOT
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT)
    ]
)

articles_l2 = client.collections.create(
    name="ArticleL2",
    vectorizer_config=wvc.config.Configure.Vectorizer.none(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.L2_SQUARED
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT)
    ]
)

距离度量选择 #

text
距离度量选择指南:

余弦相似度 (Cosine):
├── 最常用的度量方式
├── 关注向量方向
├── 适合文本嵌入
└── 推荐用于归一化向量

点积 (Dot Product):
├── 计算速度最快
├── 适合归一化向量
├── 与余弦等价(归一化时)
└── 推荐用于推荐系统

L2 距离:
├── 计算绝对距离
├── 受向量长度影响
├── 适合图像特征
└── 推荐用于未归一化向量

向量检索优化 #

预过滤 vs 后过滤 #

python
articles = client.collections.get("Article")

response = articles.query.near_text(
    query="向量数据库",
    filters=Filter.by_property("category").equal("技术"),
    limit=10
)

向量搜索参数 #

python
response = articles.query.near_text(
    query="向量数据库",
    certainty=0.7,
    distance=0.3,
    limit=10,
    offset=0,
    autocut=1
)

向量搜索与分页 #

python
response = articles.query.near_text(
    query="向量数据库",
    limit=10,
    offset=20
)

print(f"Total: {response.total_count}")
for obj in response.objects:
    print(f"- {obj.properties['title']}")

向量操作示例 #

完整示例 #

python
import weaviate
import weaviate.classes as wvc
from openai import OpenAI
import numpy as np

client = weaviate.connect_to_local()

openai_client = OpenAI()

def get_embedding(text):
    response = openai_client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

client.collections.delete("Document")

documents = client.collections.create(
    name="Document",
    vectorizer_config=wvc.config.Configure.Vectorizer.none(),
    vector_index_config=wvc.config.Configure.VectorIndex.hnsw(
        distance_metric=wvc.config.VectorDistance.COSINE,
        ef_construction=256,
        max_connections=64
    ),
    properties=[
        wvc.config.Property(name="text", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="source", data_type=wvc.config.DataType.TEXT)
    ]
)

docs = [
    ("Weaviate 是一个云原生向量数据库", "官方文档"),
    ("向量搜索基于高维向量相似性", "技术博客"),
    ("RAG 结合检索和生成能力", "论文"),
    ("知识图谱表示实体间关系", "百科"),
    ("Embedding 将文本转为向量", "教程")
]

with documents.batch.dynamic() as batch:
    for text, source in docs:
        vector = get_embedding(text)
        batch.add_object(
            properties={"text": text, "source": source},
            vector=vector
        )

print("Documents inserted\n")

query = "什么是向量数据库"
query_vector = get_embedding(query)

response = documents.query.near_vector(
    near_vector=query_vector,
    limit=3,
    return_properties=["text", "source"]
)

print(f"Query: {query}")
print("\nResults:")
for obj in response.objects:
    print(f"- {obj.properties['text']} ({obj.properties['source']})")
    print(f"  Distance: {obj.metadata.distance:.4f}")

client.close()

小结 #

本章介绍了 Weaviate 的向量操作:

  • 自动向量化配置
  • 自定义向量插入
  • 多向量配置
  • 向量量化
  • 索引参数优化
  • 距离度量选择

下一步 #

继续学习 搜索查询,了解 Weaviate 强大的搜索能力!

最后更新:2026-04-04