跳转至

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/月起)
SDKPython、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 refusedWeaviate 未启动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()  # 关闭连接

与同类工具对比

特性WeaviateQdrantMilvusPinecone
内置嵌入20+ 模型需外部需外部集成嵌入
混合搜索BM25+向量(冠军级)支持支持支持
多模态原生支持有限有限不支持
RAG 内置原生生成式搜索需自建需自建需自建
GraphQL API支持不支持不支持不支持
适合场景多模态RAG应用高性能搜索大规模分布式快速上手

选择建议:如果你的应用涉及文本+图像的多模态搜索,或者需要内置 RAG 能力,Weaviate 是最佳选择。纯文本搜索且追求极致性能用 Qdrant。