Weaviate 多模态搜索
一句话概述
Weaviate 是一个开源向量数据库,最大特色是内置 AI 能力——把嵌入生成、分类、问答都集成到数据库核心中,原生支持文本+图像+音频的多模态搜索,BM25+向量的混合搜索是其 2026 年的招牌功能。
核心知识点表格
| 知识点 | 说明 |
|---|
| 项目地址 | https://github.com/weaviate/weaviate |
| 官网 | https://weaviate.io |
| 开发语言 | Go |
| 核心优势 | 内置 AI、多模态搜索、混合搜索 |
| 嵌入模型集成 | 20+ 模型即插即用 |
| 搜索类型 | 向量搜索、BM25、混合搜索、多模态 |
| API 接口 | REST + GraphQL + gRPC |
| 许可证 | BSD-3-Clause |
| 云服务 | Weaviate Cloud($45/月起) |
| SDK | Python、JavaScript/TypeScript、Go、Java |
安装与配置
方式一:Docker 安装
# 使用 Docker Compose 启动 Weaviate
# 先创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.4'
services:
weaviate:
image: cr.weaviate.io/semitechnologies/weaviate:latest
ports:
- "8080:8080" # REST + GraphQL
- "50051:50051" # gRPC
volumes:
- weaviate_data:/var/lib/weaviate
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers'
ENABLE_MODULES: 'text2vec-transformers,generative-openai'
CLUSTER_HOSTNAME: 'node1'
restart: unless-stopped
volumes:
weaviate_data:
EOF
# 启动
docker compose up -d
Python 客户端安装
pip install weaviate-client # 安装 Python SDK(v4)
连接 Weaviate
import weaviate # 导入 Weaviate 客户端
# 连接到本地 Weaviate(v4 API)
client = weaviate.connect_to_local() # 默认 localhost:8080
# 连接到 Weaviate Cloud
# client = weaviate.connect_to_weaviate_cloud(
# cluster_url="https://xxx.weaviate.network",
# auth_credentials=weaviate.auth.AuthApiKey("your-api-key")
# )
# 检查连接
print(client.is_ready()) # True 表示连接成功
基本使用
创建集合(Collection)
import weaviate
import weaviate.classes.config as wc # 配置类
client = weaviate.connect_to_local()
# 创建集合(定义 Schema)
collection = client.collections.create(
name="BioinfoPaper", # 集合名
vectorizer_config=wc.Configure.Vectorizer.text2vec_transformers(), # 内置嵌入
properties=[
wc.Property(name="title", data_type=wc.DataType.TEXT), # 标题
wc.Property(name="abstract", data_type=wc.DataType.TEXT), # 摘要
wc.Property(name="year", data_type=wc.DataType.INT), # 年份
wc.Property(name="topic", data_type=wc.DataType.TEXT), # 主题
]
)
插入数据
# 获取集合对象
papers = client.collections.get("BioinfoPaper")
# 插入数据(Weaviate 自动生成嵌入向量)
papers.data.insert_many([
{
"title": "肠道菌群与2型糖尿病的关联",
"abstract": "本研究通过宏基因组测序分析了T2D患者的肠道菌群组成...",
"year": 2024,
"topic": "metagenomics"
},
{
"title": "MEGAHIT: 超大宏基因组数据的快速组装",
"abstract": "MEGAHIT利用简洁的de Bruijn图在有限内存下完成大规模组装...",
"year": 2023,
"topic": "assembly"
},
{
"title": "利用机器学习预测抗菌素耐药性",
"abstract": "基于随机森林的模型可以从基因组序列预测耐药表型...",
"year": 2025,
"topic": "machine_learning"
}
])
向量搜索(语义搜索)
papers = client.collections.get("BioinfoPaper")
# 语义搜索(Weaviate 自动将查询文本编码为向量)
results = papers.query.near_text(
query="微生物基因组分析方法", # 自然语言查询
limit=3, # 返回 3 条
return_metadata=weaviate.classes.query.MetadataQuery(distance=True)
)
for obj in results.objects:
print(f"标题: {obj.properties['title']}")
print(f"距离: {obj.metadata.distance:.4f}")
print("---")
混合搜索(BM25 + 向量)
# 混合搜索:结合关键词匹配和语义理解
results = papers.query.hybrid(
query="宏基因组组装工具", # 查询文本
alpha=0.5, # 0=纯BM25,1=纯向量,0.5=各一半
limit=5,
return_metadata=weaviate.classes.query.MetadataQuery(score=True)
)
for obj in results.objects:
print(f"标题: {obj.properties['title']}")
print(f"混合分数: {obj.metadata.score:.4f}")
BM25 关键词搜索
# 纯关键词搜索(BM25 算法)
results = papers.query.bm25(
query="MEGAHIT assembly", # 关键词
limit=3
)
for obj in results.objects:
print(f"标题: {obj.properties['title']}")
高级用法
带过滤的搜索
import weaviate.classes.query as wq # 查询类
# 语义搜索 + 过滤条件
results = papers.query.near_text(
query="菌群多样性分析",
limit=5,
filters=wq.Filter.by_property("year").greater_or_equal(2024) & # 年份 >= 2024
wq.Filter.by_property("topic").equal("metagenomics") # 主题匹配
)
生成式搜索(RAG)
# Weaviate 内置 RAG 能力:搜索 + 生成
results = papers.generate.near_text(
query="糖尿病相关的肠道菌群研究",
limit=3,
single_prompt="用中文总结这篇论文的主要发现:{abstract}", # 对每条结果生成
grouped_task="综合以上论文,总结肠道菌群与糖尿病的关系" # 对所有结果综合生成
)
# 每条结果的生成内容
for obj in results.objects:
print(f"标题: {obj.properties['title']}")
print(f"AI总结: {obj.generated}")
print("---")
# 综合生成内容
print(f"综合分析: {results.generated}")
多模态搜索(图+文)
import weaviate.classes.config as wc
# 创建多模态集合(同时处理文本和图像)
client.collections.create(
name="MultiModalDocs",
vectorizer_config=wc.Configure.Vectorizer.multi2vec_clip(
image_fields=["image"], # 图像字段
text_fields=["caption"] # 文本字段
),
properties=[
wc.Property(name="caption", data_type=wc.DataType.TEXT),
wc.Property(name="image", data_type=wc.DataType.BLOB), # 图像数据
]
)
# 用文本搜索图像,或用图像搜索文本
results = client.collections.get("MultiModalDocs").query.near_text(
query="显微镜下的细菌图像", # 用文本搜索相关图像
limit=5
)
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
Connection refused | Weaviate 未启动 | docker compose up -d |
Collection not found | 集合名拼写错误 | 检查集合名称大小写 |
Vectorizer module not enabled | 未启用嵌入模块 | 在 Docker 环境变量中添加 ENABLE_MODULES |
Rate limit on embedding | 外部嵌入 API 限流 | 使用本地嵌入模型或降低请求频率 |
Object already exists | 数据 UUID 重复 | 使用不同的 UUID 或使用 upsert |
Out of memory | 数据量过大 | 启用量化(RQ)或增加内存 |
速查表
# === Weaviate Python v4 SDK 速查 ===
import weaviate
client = weaviate.connect_to_local() # 连接
# 集合操作
col = client.collections.create(name="Name", ...) # 创建
col = client.collections.get("Name") # 获取
client.collections.delete("Name") # 删除
client.collections.list_all() # 列出所有
# 数据操作
col.data.insert({"key": "value"}) # 插入单条
col.data.insert_many([{...}, {...}]) # 批量插入
col.data.delete_by_id(uuid) # 删除
# 搜索
col.query.near_text(query="...", limit=5) # 语义搜索
col.query.bm25(query="...", limit=5) # 关键词搜索
col.query.hybrid(query="...", alpha=0.5, limit=5) # 混合搜索
col.query.near_text(query="...", filters=Filter(...)) # 带过滤
# 生成式搜索(RAG)
col.generate.near_text(query="...", single_prompt="...")
col.generate.near_text(query="...", grouped_task="...")
client.close() # 关闭连接
与同类工具对比
| 特性 | Weaviate | Qdrant | Milvus | Pinecone |
|---|
| 内置嵌入 | 20+ 模型 | 需外部 | 需外部 | 集成嵌入 |
| 混合搜索 | BM25+向量(冠军级) | 支持 | 支持 | 支持 |
| 多模态 | 原生支持 | 有限 | 有限 | 不支持 |
| RAG 内置 | 原生生成式搜索 | 需自建 | 需自建 | 需自建 |
| GraphQL API | 支持 | 不支持 | 不支持 | 不支持 |
| 适合场景 | 多模态RAG应用 | 高性能搜索 | 大规模分布式 | 快速上手 |
选择建议:如果你的应用涉及文本+图像的多模态搜索,或者需要内置 RAG 能力,Weaviate 是最佳选择。纯文本搜索且追求极致性能用 Qdrant。