模块与向量化 #

本章详细介绍 Weaviate 的模块系统和向量化功能。

模块系统概述 #

text
Weaviate 模块架构:

┌─────────────────────────────────────────────────────────────┐
│                      Weaviate 核心                           │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    模块层                            │   │
│  │                                                      │   │
│  │  向量化模块          生成模块          其他模块      │   │
│  │  ┌──────────┐       ┌──────────┐      ┌──────────┐  │   │
│  │  │text2vec  │       │generative│      │ qna      │  │   │
│  │  │ -openai  │       │ -openai  │      │ -openai  │  │   │
│  │  │ -cohere  │       │ -cohere  │      │          │  │   │
│  │  │ -palm    │       │ -palm    │      │reranker  │  │   │
│  │  │ -hugging │       │          │      │ -cohere  │  │   │
│  │  │  face    │       │          │      │          │  │   │
│  │  └──────────┘       └──────────┘      └──────────┘  │   │
│  │                                                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

向量化模块 #

text2vec-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,
        base_url="https://api.openai.com/v1"
    ),
    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
        )
    ]
)

OpenAI 模型选择 #

text
OpenAI Embedding 模型:

text-embedding-3-small:
├── 维度: 1536 (可配置)
├── 性价比高
├── 适合大规模应用
└── 推荐用于大多数场景

text-embedding-3-large:
├── 维度: 3072 (可配置)
├── 更高精度
├── 成本较高
└── 推荐用于高精度需求

text-embedding-ada-002:
├── 维度: 1536
├── 旧版模型
└── 仍可使用

维度配置 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(
        model="text-embedding-3-small",
        dimensions=512
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

text2vec-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)
    ]
)

Cohere 模型选择 #

text
Cohere Embedding 模型:

embed-english-v3.0:
├── 维度: 1024
├── 英文优化
└── 适合英文内容

embed-multilingual-v3.0:
├── 维度: 1024
├── 多语言支持
└── 推荐用于中文

embed-english-light-v3.0:
├── 维度: 384
├── 轻量级英文
└── 适合快速检索

embed-multilingual-light-v3.0:
├── 维度: 384
├── 轻量级多语言
└── 适合大规模应用

text2vec-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,
            "useCache": True
        }
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

推荐的 HuggingFace 模型 #

text
推荐的 HuggingFace 模型:

多语言模型:
├── paraphrase-multilingual-MiniLM-L12-v2
│   └── 维度: 384,支持 50+ 语言
├── paraphrase-multilingual-mpnet-base-v2
│   └── 维度: 768,更高精度
└── distiluse-base-multilingual-cased-v1
    └── 维度: 768,15 种语言

中文模型:
├── shibing624/text2vec-base-chinese
│   └── 维度: 768,中文优化
└── DMetaSoul/sbert-chinese-general-v2
    └── 维度: 768,通用中文

英文模型:
├── all-MiniLM-L6-v2
│   └── 维度: 384,快速
└── all-mpnet-base-v2
    └── 维度: 768,高精度

text2vec-palm #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_palm(
        model_id="textembedding-gecko@latest",
        project_id="your-project-id"
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

img2vec-neural #

python
images = client.collections.create(
    name="Image",
    vectorizer_config=wvc.config.Configure.Vectorizer.img2vec_neural(
        image_paths=["media"]
    ),
    properties=[
        wvc.config.Property(name="image", data_type=wvc.config.DataType.BLOB),
        wvc.config.Property(name="description", data_type=wvc.config.DataType.TEXT)
    ]
)

multi2vec-clip #

python
multimodal = client.collections.create(
    name="Multimodal",
    vectorizer_config=wvc.config.Configure.Vectorizer.multi2vec_clip(
        image_fields=["image"],
        text_fields=["description"]
    ),
    properties=[
        wvc.config.Property(name="image", data_type=wvc.config.DataType.BLOB),
        wvc.config.Property(name="description", data_type=wvc.config.DataType.TEXT)
    ]
)

生成模块 #

generative-openai #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    generative_config=wvc.config.Configure.Generative.openai(
        model="gpt-4",
        max_tokens=1000,
        temperature=0.7
    ),
    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.generate.near_text(
    query="向量数据库",
    limit=3,
    grouped_task="总结这些文章的主要内容"
)

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

单对象生成 #

python
response = articles.generate.near_text(
    query="向量数据库",
    limit=3,
    single_prompt="为这篇文章写一个简短的摘要: {title} - {content}"
)

for obj in response.objects:
    print(f"Title: {obj.properties['title']}")
    print(f"Generated: {obj.generated}")

generative-cohere #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_cohere(),
    generative_config=wvc.config.Configure.Generative.cohere(
        model="command",
        max_tokens=1000,
        temperature=0.7
    ),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

重排序模块 #

reranker-cohere #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    reranker_config=wvc.config.Configure.Reranker.cohere(
        model="rerank-multilingual"
    ),
    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="向量数据库教程",
    limit=10,
    rerank=True
)

for obj in response.objects:
    print(f"- {obj.properties['title']}")
    print(f"  Rerank score: {obj.metadata.rerank_score}")

问答模块 #

qna-openai #

python
documents = client.collections.create(
    name="Document",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

documents.data.insert({
    "title": "Weaviate 简介",
    "content": "Weaviate 是一个云原生向量数据库,支持语义搜索和 RAG 应用。它使用 Go 语言编写,支持 GraphQL 查询。"
})

问答查询 #

python
documents = client.collections.get("Document")

response = documents.generate.near_text(
    query="Weaviate 是什么",
    limit=1,
    grouped_task="回答问题: Weaviate 使用什么语言编写?"
)

print(f"Answer: {response.generated}")

模块配置 #

Docker Compose 配置 #

yaml
version: '3.8'
services:
  weaviate:
    image: cr.weaviate.io/semitechnologies/weaviate:1.25.0
    ports:
      - "8080:8080"
      - "50051:50051"
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
      ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,generative-openai,reranker-cohere'
      OPENAI_APIKEY: 'your-openai-api-key'
      COHERE_APIKEY: 'your-cohere-api-key'
      CLUSTER_HOSTNAME: 'node1'
    volumes:
      - weaviate_data:/var/lib/weaviate

volumes:
  weaviate_data:

查看可用模块 #

python
meta = client.get_meta()

print("Available modules:")
for module_name, module_info in meta.get("modules", {}).items():
    print(f"  - {module_name}")

运行时配置 #

python
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(
        model="text-embedding-3-small"
    ),
    module_config={
        "text2vec-openai": {
            "model": "text-embedding-3-small",
            "modelVersion": "latest",
            "type": "text"
        }
    },
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT)
    ]
)

模块最佳实践 #

向量化模块选择 #

text
向量化模块选择指南:

OpenAI text-embedding-3-small:
├── 适合: 大多数应用
├── 优点: 性价比高,效果好
└── 缺点: 需要付费 API

Cohere embed-multilingual:
├── 适合: 多语言应用
├── 优点: 多语言支持好
└── 缺点: 需要付费 API

HuggingFace:
├── 适合: 自托管、成本敏感
├── 优点: 免费,可自托管
└── 缺点: 需要自己部署

自定义向量:
├── 适合: 特殊需求
├── 优点: 完全控制
└── 缺点: 需要自己管理

性能优化 #

text
模块性能优化:

1. 跳过不需要向量化的属性
   └── skip_vectorization=True

2. 使用合适的模型
   └── 平衡精度和成本

3. 批量操作
   └── 使用 batch 插入

4. 缓存配置
   └── 启用模型缓存

5. 异步处理
   └── 大规模数据异步导入

小结 #

本章介绍了 Weaviate 的模块系统:

  • 向量化模块(OpenAI、Cohere、HuggingFace、PaLM)
  • 生成模块(OpenAI、Cohere)
  • 重排序模块(Cohere)
  • 问答模块
  • 模块配置和最佳实践

下一步 #

继续学习 索引与性能,了解如何优化 Weaviate 的性能!

最后更新:2026-04-04