← 返回首页
🧠

Weaviate:AI原生向量数据库

📂 llm ⏱ 2 min 335 words

--- title: "Weaviate:AI原生向量数据库" description: "探索Weaviate的独特设计,掌握混合搜索、多模态向量化和GraphQL查询的强大功能" tags: ["Weaviate", "向量数据库", "混合搜索", "GraphQL"] category: "llm" icon: "🧠"

Weaviate:AI原生向量数据库

Weaviate简介

Weaviate是一个开源的AI原生向量数据库,以其独特的设计哲学在众多向量数据库中脱颖而出。它不仅仅是一个向量存储,更是一个完整的AI数据平台,内置了向量化模块和强大的查询语言。

Weaviate的核心特色:

快速开始

Docker部署

# 使用Docker Compose启动
docker-compose up -d

# 或者单容器启动
docker run -p 8080:8080 -p 50051:50051 semitechnologies/weaviate:latest

Python客户端

import weaviate

# 连接到Weaviate实例
client = weaviate.Client("http://localhost:8080")

# 检查连接
client.is_ready()

Schema定义

Weaviate使用强类型Schema来定义数据结构:

# 定义Article类
schema = {
    "class": "Article",
    "vectorizer": "text2vec-openai",  # 使用OpenAI向量化
    "properties": [
        {
            "name": "title",
            "dataType": ["text"],
            "description": "文章标题"
        },
        {
            "name": "content",
            "dataType": ["text"],
            "description": "文章内容"
        },
        {
            "name": "category",
            "dataType": ["text"],
            "description": "文章分类"
        },
        {
            "name": "publishDate",
            "dataType": ["date"],
            "description": "发布日期"
        }
    ]
}

# 创建Schema
client.schema.create_class(schema)

数据操作

添加数据

# Weaviate会自动调用向量化模块生成向量
client.data_object.create(
    {
        "title": "Python机器学习实战",
        "content": "本文介绍Python在机器学习中的应用...",
        "category": "技术",
        "publishDate": "2024-01-15T00:00:00Z"
    },
    "Article"
)

# 批量导入
client.batch.configure(batch_size=100)
with client.batch as batch:
    for article in articles:
        batch.add_data_object(
            article,
            "Article"
        )

更新与删除

# 更新数据
client.data_object.update(
    data_object={"title": "更新后的标题"},
    class_name="Article",
    uuid="article-uuid"
)

# 删除单条
client.data_object.delete(class_name="Article", uuid="article-uuid")

# 删除整个类
client.schema.delete_class("Article")

混合搜索

Weaviate的混合搜索是其最强大的功能之一,结合了向量搜索和BM25关键词搜索:

# 基本混合搜索
result = (
    client.query
    .get("Article", ["title", "content"])
    .with_hybrid(
        query="机器学习算法",
        alpha=0.75,  # 0=纯BM25, 1=纯向量搜索
        properties=["title", "content"]
    )
    .with_limit(10)
    .do()
)

# 带过滤的混合搜索
result = (
    client.query
    .get("Article", ["title", "content"])
    .with_hybrid(
        query="深度学习",
        alpha=0.5
    )
    .with_where({
        "path": ["category"],
        "operator": "Equal",
        "valueString": "技术"
    })
    .with_limit(5)
    .do()
)

GraphQL查询

Weaviate提供强大的GraphQL查询接口:

# 复杂查询示例
query = """
{
  Get {
    Article(
      nearText: {
        concepts: ["人工智能", "应用"],
        distance: 0.6
      }
      where: {
        path: ["publishDate"],
        operator: "GreaterThan",
        valueDate: "2023-01-01T00:00:00Z"
      }
      limit: 10
    ) {
      title
      content
      category
      _additional {
        distance
        id
      }
    }
  }
}
"""

result = client.query.raw(query)

多模态向量化

Weaviate支持多种向量化模块,可以处理不同类型的数据:

# 文本向量化(内置)
# 使用text2vec-openai或text2vec-transformers模块

# 图像向量化(内置)
# 使用img2vec-neural模块

# 多模态搜索示例
schema = {
    "class": "MultiModal",
    "vectorizer": "multi2vec-clip",  # CLIP多模态模型
    "properties": [
        {"name": "text", "dataType": ["text"]},
        {"name": "image", "dataType": ["blob"]}
    ]
}

# 可以用文本搜索图像,或用图像搜索文本
result = (
    client.query
    .get("MultiModal", ["text"])
    .with_near_text({"concepts": ["一只猫"]})
    .with_limit(5)
    .do()
)

与LLM集成

RAG应用示例

from langchain.vectorstores import Weaviate
from langchain.embeddings import OpenAIEmbeddings

# 初始化Weaviate向量存储
vectorstore = Weaviate.from_documents(
    documents,
    OpenAIEmbeddings(),
    client=client,
    index_name="Article",
    text_key="content"
)

# 相似性搜索
docs = vectorstore.similarity_search("查询", k=3)

# 使用RetrievalQA链
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-3.5-turbo"),
    retriever=vectorstore.as_retriever()
)

answer = qa.run("问题是什么?")

性能优化

# 1. 使用HNSW索引参数优化
schema["vectorIndexConfig"] = {
    "ef": 100,
    "maxConnections": 32,
    "dynamicEfMin": 100,
    "dynamicEfMax": 500
}

# 2. 使用批量导入提高写入性能
client.batch.configure(
    batch_size=200,
    dynamic=False,
    timeout_retries=3
)

# 3. 使用GraphQL投影减少返回数据量
result = (
    client.query
    .get("Article", ["title"])  # 只返回需要的字段
    .with_hybrid(query="查询")
    .with_limit(5)
    .do()
)

Weaviate的AI原生设计使其成为构建智能应用的理想选择,特别适合需要混合搜索和多模态能力的场景。