weaviate向量数据库

接入与开发

给 RAG 开发者的 Weaviate 选型速查:讲清它适合什么场景、接入前后要盯哪些工程项、什么情况下别选它。

你在搭 RAG,向量库这一层卡在选型上:同事推荐 Weaviate,但你不确定它跟别的库差在哪、自己的场景合不合适、真要上手又有哪些坑。这篇不吹功能,只给判断标准和可执行动作——从场景对照、接入前的自检清单,到上线后要盯的超时、并发、降级和日志。看完你能决定「用不用它」,以及用的话第一步动什么。

你在搭 RAG,向量库这一层卡在选型上:同事推荐 Weaviate,但你不确定它跟别的库差在哪、自己的场景合不合适、真要上手又有哪些坑。这篇不吹功能,只给判断标准和可执行动作——从场景对照、接入前的自检清单,到上线后要盯的超时、并发、降级和日志。看完你能决定「用不用它」,以及用的话第一步动什么。

先摆正一件事:Weaviate 不是「更好的向量库」,它是「一类定位」的向量库。它把向量召回、条件过滤、元数据检索揉在一次查询里,还给你自托管和托管两条路。这意味着你省掉的是「自己拼两套系统再对齐结果」的活,换来的是多一层服务要运维、多一层查询语义要理解。判断要不要选它,核心就一句:你的查询是不是天生带条件。

什么场景该考虑它,什么场景别凑热闹

你的情形更该考虑 Weaviate先别选它
查询形态向量近似 + 关键词 + 元数据过滤写在一次查询里纯向量近似,过滤在应用层做就够
数据规模中等偏上,单机内存开始吃紧数据很小,重启重建也就几秒
团队运维能接受自托管,也接受托管服务已经重度依赖某云托管检索,不想换运维方式
查询延迟能接受独立服务的网络往返要求进程内零网络开销的调用
  • 判断动作一:先把「查询长什么样」写下来。是纯向量近似,还是带过滤条件的混合检索?把三五个真实查询写出来,比对比参数有用得多。
  • 判断动作二:拿着这几个查询去 /stacks/vector-dbs 对照各库的能力口径,重点看过滤条件下推、混合检索排序、更新删除这几项,别先比参数。
  • 判断动作三:如果不确定,别急着迁移。先用现有方案跑通 RAG 链路,把召回质量调到能接受,再评估换库有没有实际收益。
  • 不适用的情况说清楚:如果你的检索场景几乎不需要过滤条件,或者团队明确只想要一个进程内轻量索引,那 Weaviate 的定位优势你用不上,硬上只会多一层运维。

接入前先定四件事,否则后面全是返工

定 schema
哪些字段参与向量检索、哪些只是过滤字段、哪些要返回;字段类型和必填与否一次定死,别边写边改。
定切分与嵌入
文本怎么切、用哪个嵌入模型、维度是多少。维度对不上,后面所有数据都要重跑。
定写入方式
批量导入还是增量写;批量大小和失败重投策略提前想好。
定连通与延迟基线
先在 /tools/speed-test 量出从你的机器到目标实例的延迟,再决定部署位置。
  1. 先写 schema 再写代码把字段列表摊开,逐个标「向量字段 / 过滤字段 / 返回字段」。参考 /guides 里对召回字段必填性的梳理,把参与召回的字段标成必填,其余留空。验证方式:拿一个真实文档灌进去,再按你预设的过滤条件查一次,看能不能一次命中。
  2. 切分策略先定稿切分粒度直接影响召回粒度。先把进料环节的清洗和切分规则定下来,再决定嵌入模型和维度。验证方式:抽十几段典型文本,人工看切完的块是不是语义完整、有没有被拦腰截断。
  3. 批量导入做小样验证别一上来就全量灌。先用一小批数据跑通导入、查询、删除三条路径,确认写入失败时能重投、重复导入不会产生脏数据。参考分批节奏的处理思路,控制并发别把实例打满。
  4. 量延迟再决定部署位置去 /tools/speed-test 量从你的调用方到目标实例的往返延迟。如果跨区调用延迟明显偏高,优先换部署区域,而不是去调查询参数。验证方式:量三次取中位数,别只看一次。

上线后要盯的工程项:超时、并发、降级、日志

  • 超时:检索查询和写入要分开设,写入通常更慢。整体超时别照抄接口默认值,给连接、读取、整体各设一档,具体档位参考 /guides 里超时调优的分档思路。
  • 并发:索引重建、批量导入、线上查询会互相抢资源,别让它们同时打满。触发限流后按退避节奏处理,不要死循环重试。
  • 降级:向量库挂了别让整个问答直接报错。准备一条「退回关键词检索」或「退回纯模型回答并标注未检索」的路径,把降级开关做成配置项而不是改代码。
  • 日志与评测:每次检索至少记下查询、命中的文档 id、耗时、是否走了降级。改完切分或换嵌入模型后,用固定的一小批问题做回归。
  • 监控口径:把「检索失败率」和「降级触发次数」单独拉出来看,别混在整体接口成功率里,否则降级天天触发你也看不见。
盯什么怎么看异常信号
写入耗时按批次记录 P50 和尾部耗时尾部耗时持续抬升,说明实例开始吃紧
限流触发统计退避重试次数重试次数随流量线性上涨,说明并发上限设低了
降级触发单独计数降级路径降级频繁但整体成功率正常,说明被平均掩盖了
检索质量固定问题集回归切分或嵌入模型一改,命中结果明显漂移

什么时候该回头重新选型

  • 召回质量怎么调都上不去,且问题出在过滤条件下推或混合检索的排序逻辑,而不是数据本身脏——先排查进料,再怀疑库。
  • 运维成本超出预期:自托管要处理的备份、升级、容量规划占掉了开发时间,而团队没有专职运维。
  • 查询模式变了:从「单条查询」变成「大批量离线批处理」,或者还要做多模态检索,这时候要求的能力集可能已经不是当初选的那个。
  • 成本结构变了:真实用量涨上来之后,去 /usage 和 /price-watch 核对当时的数字,看成本构成里哪一块在涨,别凭感觉换库。
  • 重选前先记基线:延迟、召回率口径、成本构成各记一份,再拿新方案跑同一批用例对比,没有基线就不要谈换不换。
换库是最后手段,不是第一反应;先把进料、切分、查询这三层排查干净,再动基础设施。
下一步拿你自己的三五个真实查询,去向量库能力对照页逐项比对过滤、混合检索和更新删除这几项,落成一张对照表再决定要不要动手。

常见问题

Weaviate 适合多大的数据量?

没有一刀切的数字,取决于你的硬件、维度、过滤条件复杂度和查询 QPS 要求。实用做法是:拿你真实数据的十分之一做压测,量出延迟和内存占用,再线性外推并留出余量。别信任何脱离查询模式的容量结论,去 /stacks/vector-dbs 看各库的定位口径更靠谱。

自托管还是用托管服务?

看你有没有运维余力。自托管省的是钱、花的是人力和升级备份的心力;托管省的是事、贵在按量计费且数据出境要过合规。判断动作:把「每月要花多少运维小时」和「托管费用」两边都折算出来对比,决策框架参考 api-vs-self-host-decision 里那套适用条件。

换向量库要重跑嵌入吗?

大概率要。向量是跟具体嵌入模型和维度绑定的,换库同时换模型就必须全量重嵌入;只换库、保留原模型和维度,通常可以复用已有向量。所以接入前把嵌入模型定下来能省一次全量重跑。停服窗口和重嵌入成本要提前算进迁移计划。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。