Weaviate 是一个开源的、以向量索引为核心的数据库系统,解决的核心问题是:把文本、图片等数据通过嵌入模型变成向量后,如何稳定、高效地存储和检索。它的定位不是“向量索引库”,而是一套完整的数据库——支持显式 schema、数据对象 CRUD、多租户隔离、分布式复制与备份,并通过 GraphQL 与 REST 两类 API 对外提供查询能力。内置的 HNSW 向量索引、BM25 混合检索与生成式搜索模块,使其成为 RAG(检索增强生成,即先检索相关资料再交给大模型生成回答的管道)中最常被选用的存储层之一。 本指南按“安装 → 上手 → 核心能力 → 生产部署”展开:先给出可直接复制的 Docker 启动命令,再用 Python 客户端跑通第一个检索示例,随后深入讲解索引、混合搜索、模块与多租户机制,最后给出生产环境部署与避坑清单,帮助你从选型评估快速过渡到实际落地。
掌握 Weaviate 意味着你可以在企业级 AI 搜索与 RAG 项目中独立完成“向量化存储 → 混合检索 → 生成式问答”全链路搭建,是向量数据库选型与 AI 基础设施落地中必须掌握的核心技能之一。
目录
速览卡是工具类内容的固定首屏模块: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。
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 模块,就能直接输入自然语言做语义检索,不需要手写向量。
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>
| 维度 | Weaviate | Qdrant | Milvus | Pinecone |
|---|---|---|---|---|
| 定位 | 全功能开源向量数据库 | 高性能向量搜索引擎 | 超大规模分布式向量数据库 | 全托管向量数据库云服务 |
| 编排范式 | GraphQL + REST 双 API | REST + gRPC | 存储与查询分离微服务架构 | REST-only 托管 API |
| 类型约束 | 强制集合 schema(属性声明类型) | 可选 payload schema | 动态字段(宽松) | 无强制 schema |
| 学习曲线 | ★★★☆☆(需掌握 GraphQL) | ★★☆☆☆(API 直观) | ★★★★☆(分布式组件多) | ★★☆☆☆(无需运维) |
| 生态集成 | 官方 5 语言 SDK + 向量化/生成模块 | 官方多语言 SDK | 官方 SDK + 云服务 Zilliz | 官方 Python/TS/Go SDK |
| 生产部署 | 自托管 Docker/K8s + 托管云 | 自托管 + 托管云 | 自托管(资源要求高) | 仅 SaaS,无自托管 |
| License | BSD-3-Clause | Apache-2.0 | Apache-2.0 | 商业闭源 |
| 适合谁 | RAG/语义搜索应用,需要模块生态的团队 | 对过滤与延迟敏感的中大型检索团队 | 亿级以上向量的超大规模场景 | 想快速上云、不维护集群的团队 |
选型建议:团队要快速落地 RAG 且希望数据库自带向量化与生成模块,Weaviate 最省事;对查询延迟和复杂过滤条件更敏感、资源可控,选 Qdrant;数据规模过亿且已有 Kubernetes 运维能力,选 Milvus;预算充足、不想管理任何基础设施,直接使用 Pinecone。
版本迭代
Weaviate 在 2022 年从检索框架转型为生产级数据库后,2023 年进入模块生态爆发期,先后补齐生成式搜索与多租户能力;2024 年的 1.23、1.24 重点转向索引压缩和企业级运维(离线重建索引、分片修复),整体趋势是从“能用”走向“在超大数据规模下可靠”。(截至训练数据,可能已有更新版本)
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 1.19 | 2023-05 | 生成式搜索(Generative Search) | 检索结果直接交给 LLM 生成回答,支持 OpenAI/Cohere 模块 |
| 1.20 | 2023-09 | 批量导入与索引优化 | 批量导入性能大幅提升,引入自适应增量索引策略 |
| 1.21 | 2023-10 | 扁平索引(Flat Index) | 新增暴力精确扫描索引选项,可在小规模数据下获得 100% 召回 |
| 1.22 | 2023-11 | 原生多租户 | 数据按租户粒度隔离,支持集合级租户管理 |
| 1.23 | 2024-01 | HNSW-PQ 压缩 | 支持乘积量化压缩,内存占用显著下降 |
| 1.24 | 2024-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 默认使用的向量索引算法是什么?
- A.FAISS 索引
- B.HNSW 图索引← 正确答案
- C.乘积量化 PQ
- D.暴力线性扫描
答案:B。Weaviate 默认采用 HNSW(分层可导航小世界图)作为向量索引,替代暴力线性扫描以获得亚线性检索复杂度。FAISS 是 Meta 的独立索引库而非 Weaviate 内置算法;PQ 是 1.23 起的压缩增强项而非独立索引;暴力扫描仅在 1.21 引入的 Flat 索引中使用。
Q2. 启动并验证 Weaviate 服务就绪,最常用的方式是?
- 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 对外提供哪两种查询接口?(选择两个)
- A.GraphQL 查询语言← 正确答案
- B.SQL 标准查询语言
- C.RESTful HTTP 接口← 正确答案
- D.MQTT 消息队列接口
答案:AC。Weaviate 的核心查询能力通过 GraphQL 开放(复杂查询、过滤、聚合),基础读写通过 REST API 开放,二者互补。Weaviate 不使用 SQL,也不提供 MQTT 查询通道,因此 B、D 为干扰项。
Q4. 生产环境中如需关闭匿名访问,应设置哪个环境变量?
- 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 索引中,哪个参数在建索引阶段影响质量且数据导入后不可修改?
- A.efSearch
- B.efConstruction← 正确答案
- C.limit
- D.distance
答案:B。efConstruction 控制图构建时的候选集大小,决定索引质量,只能在集合创建时配置,导入后不可修改。efSearch 是查询期参数可随时调整;limit 是查询条数;distance 是距离函数,均不属“构建期”参数。
Q6. 下列哪些属于 Weaviate 的模块类型?(选择两个)
- A.text2vec-* 文本向量化模块← 正确答案
- B.generative-* 生成式搜索模块← 正确答案
- C.scheduler-* 任务调度模块
- D.metric-* 指标采集模块
答案:AB。Weaviate 官方模块生态的核心两类是向量化模块(text2vec- 系列)与生成模块(generative- 系列),前者负责文本转向量、后者在检索结果上调用 LLM 生成回答。Weaviate 没有 scheduler- 与 metric- 模块,指标采集由内置 Prometheus 端点完成。
Q7. Weaviate 混合搜索默认使用哪种融合算法合并关键词与向量结果?
- A.RRF 倒数排名融合← 正确答案
- B.加权平均得分
- C.取两条结果集并集按 score 排序
- D.固定优先向量结果
答案:A。混合搜索默认用 RRF(Reciprocal Rank Fusion)对 BM25 与向量检索结果做融合:按文档在两个结果集中的排名倒数求和,重新排序,避免不同打分体系不可比的问题。加权平均需要人工调权重,并集排序与“优先向量”都不是 Weaviate 的默认融合策略。
Q8. 集合创建时设置 vectorizer 为 none,查询时使用 near_text,会发生什么?
- A.自动调用默认文本向量化模型
- B.查询自动回退为关键词搜索
- C.返回空结果但不报错
- D.报错提示未配置向量化模块← 正确答案
答案:D。near_text 依赖向量化模块将文本转为向量;设为 none 意味着集合根本不具备文本转向量能力,查询会直接报错。Weaviate 不会自动回退或静默返回空结果,必须将模块改为 text2vec-* 并配置 API key 才能使用语义查询。
Q9. Weaviate 内置支持哪些向量距离计算函数?(选择三个)
- A.余弦距离(Cosine)← 正确答案
- B.点积(Dot Product)← 正确答案
- C.欧氏距离(L2)← 正确答案
- D.曼哈顿距离(L1)
答案:ABC。Weaviate 支持三种距离函数:余弦距离(默认)、点积和 L2 欧氏距离,创建集合时通过 distance 参数指定。曼哈顿距离(L1)不在 Weaviate 支持列表中,属干扰项。
Q10. 向 Weaviate 批量导入大量对象时,推荐使用哪种写入方式?
- A.循环逐条调用 insert
- B.使用批量写入接口← 正确答案
- C.编写 SQL 语句批量插入
- D.通过消息队列异步推送
答案:B。官方客户端提供 insert_many() 等批量写入接口,内部通过批量对象请求合并网络开销,吞吐量可比逐条插入提升数倍到 10 倍以上。Weaviate 不支持 SQL,消息队列也不是官方推荐的数据导入路径。
参考来源
- webpageWeaviate 官网产品总览、云服务入口与最新公告