Weaviate:AI原生向量数据库
--- title: "Weaviate:AI原生向量数据库" description: "探索Weaviate的独特设计,掌握混合搜索、多模态向量化和GraphQL查询的强大功能" tags: ["Weaviate", "向量数据库", "混合搜索", "GraphQL"] category: "llm" icon: "🧠"
Weaviate:AI原生向量数据库
Weaviate简介
Weaviate是一个开源的AI原生向量数据库,以其独特的设计哲学在众多向量数据库中脱颖而出。它不仅仅是一个向量存储,更是一个完整的AI数据平台,内置了向量化模块和强大的查询语言。
Weaviate的核心特色:
- 混合搜索:同时支持向量搜索和关键词搜索
- 内置向量化:集成多种向量化模型,无需外部处理
- GraphQL API:提供灵活强大的查询接口
- 多模态支持:文本、图像、音频等多种数据类型
快速开始
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原生设计使其成为构建智能应用的理想选择,特别适合需要混合搜索和多模态能力的场景。