Weaviate

Weaviate

同时存储对象与向量的开源数据库,检索可叠加结构化过滤

核心功能

Weaviate 是 Go 编写的开源向量数据库,把对象和向量存在同一个库里,检索能直接叠加结构化字段过滤。它内置 vectorizer 与 generative 模块,导入时自动向量化,查询时可直接产出 RAG 结果。适合想少写胶水代码的团队;相比纯向量存取的同类,它更像自带模型集成的检索层。

功能亮点

导入自动向量化

集合配好 text2vec 模块后直接 ingest 原始文本,无需自己调模型

一次调用出 RAG

generate.near_text 传 grouped_task,检索与生成一次返回

一致性可调

读写都能选 ONE、QUORUM 或 ALL,默认 QUORUM 按 n/2+1 计算

原生多租户

租户可设为 active、inactive 或 offloaded 以释放闲置资源

适用场景

• 企业知识库问答,文档导入后由 text2vec 模块自动向量化并用 near_text 做语义召回
• 多租户 SaaS 的检索后端,按租户隔离数据并把闲置租户设为 offloaded 释放资源
• 电商语义搜索,向量召回结果再按品类、库存等结构化属性二次过滤

安装配置

bash
Docker(默认配置单容器):
docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.38.8

Docker Compose(官方 quickstart 的 Weaviate + Ollama 组合,需先把官方给出的 docker-compose.yml 保存到项目目录):
docker compose up -d
docker compose exec ollama ollama pull nomic-embed-text
docker compose exec ollama ollama pull llama3.2

Python 客户端:
pip install -U "weaviate-client[agents]"

说明:8080 是 HTTP 端口,50051 是 gRPC 端口。镜像标签会随版本更新,请以官方安装页当前给出的 tag 为准。Weaviate 默认开启遥测数据收集,可按官方文档关闭。

使用方法

python
建集合并导入数据(导入时由 Ollama 模块完成向量化):
import weaviate
from weaviate.classes.config import Configure

with weaviate.connect_to_local() as client:
    movies = client.collections.create(
        name="Movie",
        vector_config=Configure.Vectors.text2vec_ollama(
            api_endpoint="http://ollama:11434",
            model="nomic-embed-text",
        ),
    )

    data_objects = [
        {"title": "The Matrix", "description": "A computer hacker learns about the true nature of reality.", "genre": "Science Fiction"},
        {"title": "Spirited Away", "description": "A young girl becomes trapped in a mysterious world of spirits.", "genre": "Animation"},
    ]

    movies = client.collections.use("Movie")
    movies.data.ingest(data_objects)

语义检索(nearText):
import weaviate
import json

with weaviate.connect_to_local() as client:
    movies = client.collections.use("Movie")

    response = movies.query.near_text(
        query="sci-fi",
        limit=2
    )

    for obj in response.objects:
        print(json.dumps(obj.properties, indent=2))

检索加生成(RAG):
import weaviate
from weaviate.classes.generate import GenerativeConfig

with weaviate.connect_to_local() as client:
    movies = client.collections.use("Movie")

    response = movies.generate.near_text(
        query="sci-fi",
        limit=1,
        grouped_task="Write a tweet with emojis about this movie.",
        generative_provider=GenerativeConfig.ollama(
            api_endpoint="http://ollama:11434",
            model="llama3.2",
        ),
    )

    print(response.generative.text)

关键指标

尚未核验对标产品,此处只列本工具自身指标,不做对比结论。

指标Weaviate
价格免费
开源
上手难度进阶

相关工具

优点

  • 对象与向量存在同一数据库,官方描述其定位就是把向量检索与结构化过滤结合
  • 读写一致性可逐请求在 ONE / QUORUM / ALL 之间调整,集群元数据另用 Raft 保证强一致
  • 内置 text2vec、generative 等模块,导入自动向量化、查询直接出 RAG 结果,省掉外部向量化服务
  • 官方维护 Python、JavaScript/TypeScript、Go、Java、C# 五种客户端,服务同时开放 HTTP 与 gRPC

缺点

  • 读一致性级别只影响返回对象的版本,官方明确即使设为 ALL 也不会查询多个副本再合并结果列表
  • 副本修复只在读取时触发(repair-on-read),节点处于不一致状态时用 ONE 级别读可能拿到过期数据
  • 多租户下租户状态变更与数据操作各自独立执行,设为 inactive 或 offloaded 后数据仍可能有一段时间可查
  • 默认开启遥测数据收集,需要按文档手动 opt-out