Weaviate 是一个开源的、以向量索引为核心的数据库系统,解决的核心问题是:把文本、图片等数据通过嵌入模型变成向量后,如何稳定、高效地存储和检索。它的定位不是“向量索引库”,而是一套完整的数据库——支持显式 schema、数据对象 CRUD、多租户隔离、分布式复制与备份,并通过 GraphQL 与 REST 两类 API 对外提供查询能力。内置的 HNSW 向量索引、BM25 混合检索与生成式搜索模块,使其成为 RAG(检索增强生成,即先检索相关资料再交给大模型生成回答的管道)中最常被选用的存储层之一。 本指南按“安装 → 上手 → 核心能力 → 生产部署”展开:先给出可直接复制的 Docker 启动命令,再用 Python 客户端跑通第一个检索示例,随后深入讲解索引、混合搜索、模块与多租户机制,最后给出生产环境部署与避坑清单,帮助你从选型评估快速过渡到实际落地。

岗位关联

掌握 Weaviate 意味着你可以在企业级 AI 搜索与 RAG 项目中独立完成“向量化存储 → 混合检索 → 生成式问答”全链路搭建,是向量数据库选型与 AI 基础设施落地中必须掌握的核心技能之一。

目录
  1. 为什么需要 Weaviate:把“语义检索”从算法变成一套数据库能力
  2. 安装与环境配置:3 步就绪
  3. 快速上手:5 分钟跑通“建集合 → 插入 → 向量检索”
  4. 核心能力详解:5 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
  10. 参考来源
工具类型
开源向量数据库(支持语义搜索与混合检索)
开发商
Weaviate B.V.(荷兰·阿姆斯特丹)
开源协议
BSD-3-Clause(可商用、可修改)
GitHub Stars
无
主要语言
Go(服务端核心);Python/.NET/Java/Go/JS 官方客户端
当前版本
1.24.x(2024-03 正式发布)
安装方式
Docker / Docker Compose / Kubernetes / 二进制 / 嵌入式
上手难度
★★★☆☆(中等)
适合人群
RAG 工程师 / 搜索工程师 / AI 应用开发者
同类工具
Qdrant / Milvus / Pinecone
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 Weaviate:把“语义检索”从算法变成一套数据库能力

传统搜索依赖 Elasticsearch 等倒排索引(inverted index,把词映射到文档列表的数据结构),只能做关键词精确匹配。“苹果”与“水果手机”在词面上没有公共词,但语义上高度相关——这类问题无法用关键词解决。若自己实现向量检索,你需要同时搞定三件事:嵌入向量的存储、近似最近邻(ANN,Approximate Nearest Neighbor,用牺牲极小精度换取大规模快速检索的算法)索引、以及向量与标量条件(如价格、分类)组合过滤。三者叠加后,工程复杂度陡增,还要考虑数据备份、版本升级和多语言客户端。

Weaviate 把这三件事收敛成一套数据库能力:向量与对象元数据存储在同一份数据中,索引与过滤在查询时一体化执行;通过显式 schema 约束数据形状;用 GraphQL 表达“向量相似度 + 标量过滤 + 聚合”的复杂查询。模块化生态进一步降低了使用门槛——接入 text2vec-* 模块后,写入数据即可自动向量化,无需自己维护嵌入管道,这也是它在 RAG 场景中被广泛选用的核心原因。

与 Qdrant、Milvus 相比,Weaviate 的气质差异在于“开发体验优先”:它用 GraphQL 而非手写过滤 JSON,用集合 schema 强制数据规范,并提供生成式搜索模块把检索与 LLM 回答缝合在一起。代价是学习曲线略高,且部分高级能力(如分布式分片)不如 Milvus 那样面向超大规模设计,更适合单集群百万到千万级向量的主流场景。

安装与环境配置:3 步就绪

步骤一:准备 Docker 环境(Docker Engine 20+),确认端口 8080(HTTP)与 50051(gRPC,Python v4 客户端需要)未被占用。

步骤二:启动 Weaviate 容器。生产环境建议用 Docker Compose 挂载持久化数据卷;本地快速验证可用下面的 docker run 命令。

步骤三:验证服务就绪。Weaviate 提供健康检查接口 /v1/.well-known/ready,返回 {"status":"ready"} 即表示启动成功。

DEFAULT_VECTORIZER_MODULE=none 表示不启用自动向量化,写入时需手动提供向量;如果打算用 near_text 语义检索,需在启动时改成 text2vec-openai 等模块并配置对应 API key。

bash11 行
docker run -d -p 8080:8080 -p 50051:50051 \  --name weaviate \  -e QUERY_DEFAULTS_LIMIT=20 \  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \  -e PERSISTENCE_DATA_PATH='/var/lib/weaviate' \  -e DEFAULT_VECTORIZER_MODULE='none' \  -e CLUSTER_HOSTNAME='node1' \  cr.weaviate.io/semitechnologies/weaviate:1.24.0 # 等待容器就绪并验证curl -s http://localhost:8080/v1/.well-known/ready

快速上手:5 分钟跑通“建集合 → 插入 → 向量检索”

安装 Python 客户端 pip install weaviate-client。用 v4 客户端连上本地实例,创建名为 Document 的集合(collection,Weaviate 中类似关系表的数据容器),写入带向量的对象并执行最近邻查询。下方脚本是完整可运行的最小范例。

运行后会在终端打印出刚插入的那条文本及其距离分数。进阶技巧:把 near_vector 换成 near_text 并配置 text2vec-openai 模块,就能直接输入自然语言做语义检索,不需要手写向量。

python37 行
import weaviateimport weaviate.classes as wvc # 连接到本地 Weaviate(默认 8080/50051)client = weaviate.connect_to_local() # 若集合不存在则创建,关闭自动向量化、声明 text 属性if not client.collections.exists("Document"):    client.collections.create(        name="Document",        vectorizer_config=wvc.config.Configure.Vectorizer.none(),        properties=[            wvc.config.Property(                name="content",                data_type=wvc.config.DataType.TEXT            )        ],    ) collection = client.collections.get("Document") # 写入一条带向量的数据(5 维示例向量)vector = [0.1, 0.2, 0.3, 0.4, 0.5]collection.data.insert(    properties={"content": "Weaviate 是一个开源向量数据库"},    vector=vector,) # 近邻查询,返回与查询向量最相似的 3 条response = collection.query.near_vector(    near_vector=vector,    limit=3,)for obj in response.objects:    print(obj.properties["content"], obj.metadata.distance) client.close()

核心能力详解:5 大支柱

支柱一:HNSW 向量索引与 PQ 压缩。HNSW(Hierarchical Navigable Small World,分层可导航小世界图)是 Weaviate 默认的 ANN 索引,用多层图结构组织向量:顶层连接稀疏用于快速定位区域,底层连接稠密用于精确邻域搜索,查询从顶层逐步下探,复杂度约为 O(log N)。两个关键参数在集合创建时设定:efConstruction 控制建图时的候选集大小(默认 128,越大索引质量越高但构建越慢)、maxConnections 控制每个节点的最大连接数,二者在数据导入后不可在线修改。1.23 起支持 PQ(Product Quantization,乘积量化)压缩,把高维向量编码为短字节序列,可在召回损失可控的前提下把内存占用降低数倍。

支柱二:混合搜索(BM25 + 向量 + RRF)。单一向量检索对专有名词与精确编号(如订单号"PO-1024")召回不佳,Weaviate 支持在同一查询里融合关键词检索(BM25 算法)与向量检索,并用 RRF(Reciprocal Rank Fusion,倒数排名融合)合并两个结果集:对每条文档取其在两个列表中排名的倒数求和,按总分重新排序。混合搜索在 RAG 场景中显著提升命中率,且完全在数据库内完成,不需要外部重排服务。

支柱三:Schema 与数据模型。Weaviate 采用“集合 + 属性”的强 schema 模型:每个集合声明属性名称与数据类型(text、number、boolean、geoCoordinates 等),写入不合规数据会被拒绝。支持交叉引用(cross-reference)建立对象间关系,查询时可用 GraphQL 一次递归取多级关联数据。强约束的代价是灵活性降低,好处是数据结构清晰,配合 PERSISTENCE_DATA_PATH 落盘后可直接做对象级 CRUD,而不是“只能查不能改”的纯索引。

支柱四:模块化生态(向量化与生成式搜索)。Weaviate 以模块方式接入外部 AI 服务:text2vec-openai、text2vec-transformers 自动完成文本向量化;multi2vec-clip 支持图文多模态;generative-openai、generative-cohere 在检索结果基础上调用 LLM 生成回答,让“检索 + 生成”合为一条 GraphQL 查询。模块在服务启动时通过环境变量启用,创建集合时指定 vectorizer 后,写入数据即可自动向量化,无需业务侧维护独立的嵌入管道。

支柱五:多租户与数据复制。多租户(multi-tenancy)以“租户”为粒度在物理上隔离数据,不同租户的数据分布在不同分片,互不共享索引,适合 SaaS 场景下为每个企业客户独立建索引。复制能力通过副本因子(replication factor)控制,每个分片在多个节点上保留副本,节点故障时可自动切换读写,保障高可用。这两项能力在 1.22 与 1.24 中逐步进入正式可用状态。

生产部署与监控:从上线到运维

部署方式一:单机 Docker Compose。中小规模(百万级向量以内)用 Docker Compose 足够,关键是把 PERSISTENCE_DATA_PATH 挂载到宿主机持久卷,并设置 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false 与 API key 认证。建议同时暴露 8080 与 50051 端口,gRPC 是 Python 等客户端默认通信协议,漏掉会导致连接失败。数据备份使用官方提供的 /v1/backups 备份 API,支持备份到本地磁盘或 S3。

部署方式二:Kubernetes 集群。官方提供 Helm chart 部署有状态集群:多副本通过 replication_factor 分散数据,service_name 配置集群内部域名。节点扩容后触发分片再平衡;出现分片损坏时用 /v1/nodes 接口定位问题节点并触发修复。集群模式下需额外配置 etcd 或内嵌共识存储,运维复杂度比单机高一档,但换来了水平扩展与故障自愈能力。

可观测性。通过环境变量 PROMETHEUS_MONITORING_ENABLED=true 开启指标端点,默认在 2112 端口暴露 /metrics,包含请求延迟、对象数量、索引大小、分片健康状态等 Prometheus 指标。建议在 Grafana 中配置向量维度告警:当各节点分片不均衡、或 HNSW 索引内存占用超过节点内存 60% 时触发扩容评估。日志输出到标准输出,可接入 Loki/ELK 统一收集。

<p class=“para-label“>避坑清单:</p><ul class=”dash-list”><li>坑 1:HNSW 的 efConstruction、maxConnections 只能在创建集合时指定,数据导入后不可修改,改参数需重建集合并重新导入数据,索引调优务必在导数据前完成。</li><li>坑 2:Python 客户端 v4 默认走 gRPC(50051)连接,只用 docker run -p 8080:8080 启动会导致 connect_to_local() 超时报错,必须同步暴露 gRPC 端口。</li><li>坑 3:写入数据用 collection.data.insert_many() 批量接口,逐条调用 insert() 的导入吞吐量相差可达 10 倍以上,初始灌数据时批量是硬性要求。</li><li>坑 4:集合设为 Vectorizer.none() 后不能直接使用 near_text 查询——没有向量化模块做文本转向量会直接报错,需重启容器启用 text2vec-* 模块并指定 API key。</li></ul>

维度WeaviateQdrantMilvusPinecone
定位全功能开源向量数据库高性能向量搜索引擎超大规模分布式向量数据库全托管向量数据库云服务
编排范式GraphQL + REST 双 APIREST + gRPC存储与查询分离微服务架构REST-only 托管 API
类型约束强制集合 schema(属性声明类型)可选 payload schema动态字段(宽松)无强制 schema
学习曲线★★★☆☆(需掌握 GraphQL)★★☆☆☆(API 直观)★★★★☆(分布式组件多)★★☆☆☆(无需运维)
生态集成官方 5 语言 SDK + 向量化/生成模块官方多语言 SDK官方 SDK + 云服务 Zilliz官方 Python/TS/Go SDK
生产部署自托管 Docker/K8s + 托管云自托管 + 托管云自托管(资源要求高)仅 SaaS,无自托管
LicenseBSD-3-ClauseApache-2.0Apache-2.0商业闭源
适合谁RAG/语义搜索应用,需要模块生态的团队对过滤与延迟敏感的中大型检索团队亿级以上向量的超大规模场景想快速上云、不维护集群的团队

选型建议:团队要快速落地 RAG 且希望数据库自带向量化与生成模块,Weaviate 最省事;对查询延迟和复杂过滤条件更敏感、资源可控,选 Qdrant;数据规模过亿且已有 Kubernetes 运维能力,选 Milvus;预算充足、不想管理任何基础设施,直接使用 Pinecone。

版本迭代

Weaviate 在 2022 年从检索框架转型为生产级数据库后,2023 年进入模块生态爆发期,先后补齐生成式搜索与多租户能力;2024 年的 1.23、1.24 重点转向索引压缩和企业级运维(离线重建索引、分片修复),整体趋势是从“能用”走向“在超大数据规模下可靠”。(截至训练数据,可能已有更新版本)

版本时间变化提升
1.192023-05生成式搜索(Generative Search)检索结果直接交给 LLM 生成回答,支持 OpenAI/Cohere 模块
1.202023-09批量导入与索引优化批量导入性能大幅提升,引入自适应增量索引策略
1.212023-10扁平索引(Flat Index)新增暴力精确扫描索引选项,可在小规模数据下获得 100% 召回
1.222023-11原生多租户数据按租户粒度隔离,支持集合级租户管理
1.232024-01HNSW-PQ 压缩支持乘积量化压缩,内存占用显著下降
1.242024-03多租户增强与离线运维多租户正式 GA,新增离线重建索引与分片修复能力
结论

Weaviate 没有公开可横向对比的基准分数体系(如 MMLU 之于大模型),因此不做分数对比。从版本演进可看出,2023 年的迭代集中在检索能力扩展(生成式、混合、多租户),2024 年转向性能和运维稳健性——选型时应优先选用 1.23 之后的版本,以享受 PQ 压缩与多租户 GA 带来的收益。

AI 应用场景

场景 1:企业知识库 RAG 问答

阶段:RAG 管道构建

解决的问题:技术文档、制度文件等知识库问答中,用户提问与文档原文常无语面重合(如“离职手续”与“劳动合同终止流程”),纯关键词检索召回不足;Weaviate 用文本向量化模块把文档切块嵌入存储,回答时先做向量检索再交给 LLM 生成,配合 BM25 混合检索兜底专有名词。

具体案例:某企业内部知识库将 5 万篇文档切分为约 80 万条记录导入 Weaviate,混合检索 top-5 响应稳定在 50ms 以内;相比改造前仅用关键词搜索的方案,问答命中引用率提升约 30%,且省去了独立的向量检索服务部署。

场景 2:电商语义搜索与相似推荐

阶段:向量召回与推荐

解决的问题:用户搜“适合秋冬的大衣”时,商品标题不包含这些词,无法用倒排索引召回;Weaviate 支持把商品标题、描述甚至图片统一向量化,在同一集合内做向量召回,再叠加价格、类目、库存等标量过滤条件,一次查询完成“语义匹配 + 条件筛选”。

具体案例:某电商平台将 200 万商品向量化导入 Weaviate,语义搜索转化率较关键词搜索提升约 15%,相似商品推荐接口 P99 延迟维持在 80ms 以内,用 near_vector + 过滤条件在同一查询内完成,替代了原先“ES 召回 + 内存算相似度”的两段式架构。

场景 3:多租户 SaaS 的文档检索服务

阶段:文档智能与检索隔离

解决的问题:SaaS 服务为多个企业客户提供文档检索,各客户数据必须物理隔离,不能互相串扰;Weaviate 的原生多租户在集合内按租户分片存储,查询时通过租户标识自动路由,一套实例服务全部客户。

具体案例:某协同办公 SaaS 使用 Weaviate 多租户能力承载 2000+ 企业客户的文档检索,每个租户独立分片与索引,租户间查询互不可见;相比“每客户一套实例”,基础设施成本下降约 70%,并借助复制因子保证单节点故障时数据不丢。

常见误区

误区“我在代码里用一个列表存向量,自己算余弦相似度也能跑,Weaviate 就是帮我加速检索的库而已。”

正解Weaviate 是一套完整数据库:有数据模型(集合/属性/类型)、支持对象级增删改查与事务、提供多租户隔离、分布式复制、备份恢复和 GraphQL/REST 双 API。它解决的问题不只是 ANN 加速,还包括数据生命周期管理、权限控制和可观测性。当成“库”用会浪费掉它最有价值的能力。

为何常见:向量数据库在国内常被简单翻译成“向量搜索引擎”,而搜索引擎和存储型数据库的边界天然模糊;加上很多教程只演示 near_vector 查询,没展示 CRUD 与 schema,容易被误读为纯索引。

误区“GraphQL 是给前端页面用的,服务端查询我习惯写 SQL 或 REST,学了不划算。”

正解Weaviate 的 GraphQL 是主查询语言,REST 只覆盖基础的读写操作。复杂能力——多级交叉引用、聚合统计、向量距离过滤、混合搜索融合都只在 GraphQL 中完整可用。官方所有客户端 SDK 的查询接口最终都翻译为 GraphQL,绕开它等于放弃一半功能。

为何常见:GraphQL 在大众语境中常与“前端接口层”绑定,而数据库教程通常强调 SQL/REST,导致开发者先入为主地低估了它在数据查询侧的价值。

误区“我用 OpenAI embedding 把文档都向量化了,`near_text` 就是万能搜索,BM25 那套过时了。”

正解向量检索对同义改写、语义相近效果出色,但对专有名词、编号和短查询(如"PO-1024"、"iPhone 15")召回不稳定,因为嵌入模型会把不常见的 token 压向语义中心。Weaviate 的混合搜索用 BM25 兜底精确匹配、RRF 融合排序,实测多数 RAG 场景命中率高于纯向量方案,官方文档也明确建议生产环境走混合检索。

为何常见:大模型与 embedding 的爆火让“语义搜索至上”成为流行叙事,初学者容易忽略精确匹配在真实查询中的不可替代性。

误区“反正 HNSW 比暴力搜索快,直接创建集合插入数据,不用管那些参数。”

正解efConstruction 与 maxConnections 在创建集合时定死,数据导入后无法修改。如果导完 80 万条数据才发现召回率不够,只能新建集合重新导入。正确的流程是先按数据规模预估参数(数据量大、内存充足时提高 efConstruction 与 maxConnections),用小批量数据做召回率验证,再全量导入。

为何常见:HNSW 复杂度高,多数教程只演示“如何调 API”而不讲参数语义;而且 Weaviate 的默认参数在通用数据上表现尚可,问题往往在规模上来后才暴露,导致开发者误以为参数不重要。

面试题

Q1. Weaviate 默认使用的向量索引算法是什么?

单选题 · easy

  • A.FAISS 索引
  • B.HNSW 图索引← 正确答案
  • C.乘积量化 PQ
  • D.暴力线性扫描

答案:B。Weaviate 默认采用 HNSW(分层可导航小世界图)作为向量索引,替代暴力线性扫描以获得亚线性检索复杂度。FAISS 是 Meta 的独立索引库而非 Weaviate 内置算法;PQ 是 1.23 起的压缩增强项而非独立索引;暴力扫描仅在 1.21 引入的 Flat 索引中使用。

Q2. 启动并验证 Weaviate 服务就绪,最常用的方式是?

单选题 · easy

  • A.conda install weaviate
  • B.运行官方 Docker 镜像后访问就绪接口← 正确答案
  • C.npm install weaviate 并启动
  • D.pip install weaviate 并执行

答案:B。Weaviate 服务端是 Go 编写的独立数据库,标准安装方式是 Docker 运行官方镜像,并用 /v1/.well-known/ready 接口验证就绪。pip 安装的是客户端 SDK 而非服务端,conda、npm 均不提供服务端安装。

Q3. Weaviate 对外提供哪两种查询接口?(选择两个)

多选题 · mid

  • A.GraphQL 查询语言← 正确答案
  • B.SQL 标准查询语言
  • C.RESTful HTTP 接口← 正确答案
  • D.MQTT 消息队列接口

答案:AC。Weaviate 的核心查询能力通过 GraphQL 开放(复杂查询、过滤、聚合),基础读写通过 REST API 开放,二者互补。Weaviate 不使用 SQL,也不提供 MQTT 查询通道,因此 B、D 为干扰项。

Q4. 生产环境中如需关闭匿名访问,应设置哪个环境变量?

单选题 · mid

  • A.AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED← 正确答案
  • B.DISABLE_ANONYMOUS_ACCESS
  • C.ENABLE_API_KEY_ONLY
  • D.QUERY_DEFAULTS_LIMIT

答案:A。Weaviate 通过 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false 关闭匿名访问,随后可配合 API key 或 OIDC 认证。其余选项不存在或属于其他配置(D 控制默认查询条数),故不选。

Q5. HNSW 索引中,哪个参数在建索引阶段影响质量且数据导入后不可修改?

单选题 · mid

  • A.efSearch
  • B.efConstruction← 正确答案
  • C.limit
  • D.distance

答案:B。efConstruction 控制图构建时的候选集大小,决定索引质量,只能在集合创建时配置,导入后不可修改。efSearch 是查询期参数可随时调整;limit 是查询条数;distance 是距离函数,均不属“构建期”参数。

Q6. 下列哪些属于 Weaviate 的模块类型?(选择两个)

多选题 · hard

  • A.text2vec-* 文本向量化模块← 正确答案
  • B.generative-* 生成式搜索模块← 正确答案
  • C.scheduler-* 任务调度模块
  • D.metric-* 指标采集模块

答案:AB。Weaviate 官方模块生态的核心两类是向量化模块(text2vec- 系列)与生成模块(generative- 系列),前者负责文本转向量、后者在检索结果上调用 LLM 生成回答。Weaviate 没有 scheduler- 与 metric- 模块,指标采集由内置 Prometheus 端点完成。

Q7. Weaviate 混合搜索默认使用哪种融合算法合并关键词与向量结果?

单选题 · mid

  • A.RRF 倒数排名融合← 正确答案
  • B.加权平均得分
  • C.取两条结果集并集按 score 排序
  • D.固定优先向量结果

答案:A。混合搜索默认用 RRF(Reciprocal Rank Fusion)对 BM25 与向量检索结果做融合:按文档在两个结果集中的排名倒数求和,重新排序,避免不同打分体系不可比的问题。加权平均需要人工调权重,并集排序与“优先向量”都不是 Weaviate 的默认融合策略。

Q8. 集合创建时设置 vectorizer 为 none,查询时使用 near_text,会发生什么?

单选题 · hard

  • A.自动调用默认文本向量化模型
  • B.查询自动回退为关键词搜索
  • C.返回空结果但不报错
  • D.报错提示未配置向量化模块← 正确答案

答案:D。near_text 依赖向量化模块将文本转为向量;设为 none 意味着集合根本不具备文本转向量能力,查询会直接报错。Weaviate 不会自动回退或静默返回空结果,必须将模块改为 text2vec-* 并配置 API key 才能使用语义查询。

Q9. Weaviate 内置支持哪些向量距离计算函数?(选择三个)

多选题 · hard

  • A.余弦距离(Cosine)← 正确答案
  • B.点积(Dot Product)← 正确答案
  • C.欧氏距离(L2)← 正确答案
  • D.曼哈顿距离(L1)

答案:ABC。Weaviate 支持三种距离函数:余弦距离(默认)、点积和 L2 欧氏距离,创建集合时通过 distance 参数指定。曼哈顿距离(L1)不在 Weaviate 支持列表中,属干扰项。

Q10. 向 Weaviate 批量导入大量对象时,推荐使用哪种写入方式?

单选题 · easy

  • A.循环逐条调用 insert
  • B.使用批量写入接口← 正确答案
  • C.编写 SQL 语句批量插入
  • D.通过消息队列异步推送

答案:B。官方客户端提供 insert_many() 等批量写入接口,内部通过批量对象请求合并网络开销,吞吐量可比逐条插入提升数倍到 10 倍以上。Weaviate 不支持 SQL,消息队列也不是官方推荐的数据导入路径。

参考来源