Weaviate:混合检索和 multi-location
Weaviate 是一个开源的向量数据库,可通过容器部署,其特点有三点:它能通过模块自行计算向量(包括 Ollama,因此可在本地运行);支持可调节权重的关键词与向量混合检索;并支持按数据租户隔离数据。对于严格本地化的 RAG 应用,需配置三个参数:本地向量编码器、关闭遥测功能(默认启用)以及关闭匿名访问。
选择 Weaviate,更多是看重它的功能,而不是它的简单易用:它是一个真正的服务,需要运行容器,并规划存储和内存容量。本指南介绍它相较于 ChromaDB 或 pgvector 能带来什么,如何将它连接到 Ollama,让一切都留在您的机器上,如何调整混合搜索,多租户功能有什么用,以及它需要多少内存。
#Weaviate 与其他向量数据库的区别
Weaviate 是一个开源向量数据库,其代码发布在 GitHub 上。与 FAISS 等库不同,它是一个服务器:存储对象(文本和属性)、向量及搜索索引,并通过 API 响应查询。它有三项功能,使其区别于简单的向量存储。第一项是内置编码:您插入对象后,配置好的模块会将文本转换为向量;查询使用自然语言编写,而非浮点数数组。这种设计消除了一类程序错误(维度不兼容、问题与语料库使用不同的模型编码),因为同一个模块会处理两端的编码。
第二项是混合检索,在一次查询中结合关键词和向量。第三项是多租户:同一个部署可以托管多个相互隔离的数据集,每个客户、部门或用户各有一个。这些功能的代价是需要运行一个组件,并管理其内存、备份和更新;相比之下,文件模式下的 ChromaDB 只是一个 Python 库。
#让一切都留在本地:需要检查的三个设置
你的文档,你的 AI:基于你的 PDF、笔记和邮件的可靠本地 RAG——无需向云端发送任何内容。
- 在线空间,终身可用
- PDF + 文件
- 30 天内退款
编码模块是一种具有定位的依赖项。选择第三方托管的向量化器,相当于将您的每一份文档和每一个问题都发送到别处;而选择 Ollama 模块则可将计算保留在本地设备上。另外两个设置不太明显,同样需要同等关注。
- 向量编码器
- 使用 text2vec-ollama,该工具调用您本地的 Ollama 实例;文档说明此情况下无需 API 密钥。请注意地址:如果 Weaviate 运行在容器中且 Ollama 部署在主机上,文档建议使用 host.docker.internal,以便容器能够访问主机。
- 遥测数据
- Weaviate 的文档指出,其默认会收集遥测数据:服务器版本、操作系统、使用的模块、对象和集合的数量,每 24 小时发送一次;文档明确说明,不会收集您数据中的任何内容。如需禁用该功能,请将 DISABLE_TELEMETRY 设置为 true。在需要完全封闭的安装环境中,请设置该参数。
- 匿名访问
- 快速启动的docker run命令将AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED设置为true,但文档强烈建议在非开发或评估场景下禁用匿名访问。一旦从除本地设备外的其他设备可访问8080端口,请立即启用API密钥认证。
#搭配 Docker 和 Ollama 安装 Weaviate
- 01准备好 Ollama 和嵌入模型安装 Ollama,然后使用命令 ollama pull bge-m3 下载模型。
- 02编写docker-compose.yml文件该文件声明了 Weaviate 容器及其数据卷、启用 Ollama 模块、关闭遥测,以及对宿主机的访问。
- 03启动并验证运行 docker compose up -d,然后测试地址 http://localhost:8080/v1/meta:响应将列出当前激活的模块。
- 04创建与模块关联的集合集合中指定了由哪个 Ollama 模型对哪些属性进行向量化。
版本号 1.39.7 是撰写本文时 Weaviate 官方文档的版本;请以安装页面上显示的当前版本为准。文档中的快速启动配置使用端口 8080(HTTP)和 50051(gRPC)。
#数据模式:集合、属性、向量化器、租户
| 概念 | 这是什么 | 为什么这很重要 |
|---|---|---|
| 集合 | 同一类型对象的集合及其结构模式 | 独立的语料库保持独立,从而确保精确的检索 |
| 属性 | 每个对象都有明确类型的字段 | 使用经过验证的过滤器(日期、作者、服务)而非在提示中加入指令 |
| 向量化器 | 负责文本与问题编码的模块 | 索引和查询使用相同模型 |
| Tenant | 集合中一个隔离的分区,拥有自己的分片 | 每个组仅看到自己的数据 |
| 向量索引 | 驻留在内存中的搜索图(HNSW) | 它决定了运行速度和所需内存 |
该结构遵循官方文档:vector_config、一个具名的向量化器、源属性以及一个 Ollama 端点。Weaviate 默认将文本类型的属性按字母顺序排序并拼接后进行向量化;source_properties 可以将计算范围限制在所需属性上,使文件名不参与向量计算。
#Weaviate中的混合搜索功能
语义搜索能够找到语义相近的段落,但无法匹配精确的字符串,例如发票号码、物料编号、错误代码或专有名词。Weaviate的混合搜索结合向量搜索和BM25F关键词搜索的结果,通过融合两个结果集并采用可配置的权重和融合方法实现。参数alpha用于调节平衡:根据文档说明,alpha值为1时表示纯向量搜索,alpha值为0时表示纯关键词搜索。若不设置alpha,实际权重将取决于客户端,因此应始终显式指定。
自 1.24 版本起,默认的融合方法为相对分数融合;另一种选择是排名融合。其原理及两种方法的选择详见混合检索指南。在技术语料库上,这通常体现为用户信任的系统与被放弃的系统之间的差异:纯向量检索的失败恰恰体现在用户认为是显而易见的查询上。
#多租户:每个用户组对应一个租户
多租户功能将一个集合划分为多个分片,每个租户对应一个分片。文档对此的描述是:每个租户都存储在独立的分片中,一个租户的数据对另一个租户不可见。该功能默认关闭,可在集合定义中通过 multi_tenancy_config 启用。如果多个群体查询同一个系统(中小企业的客户、企业的各个部门、家庭成员),这就在系统结构层面回答了“这个人能否检索到这份文档?”这一问题,比事后应用的过滤器安全得多,也比提示词中的一条指令安全得多得多。
租户很轻量:文档指出,每个节点可以有 50,000 个或更多活跃分片。租户有不同的状态(ACTIVE、INACTIVE、OFFLOADED):非活跃租户存储在磁盘上,不占用内存,因此可以托管大量小型数据集,只让实际使用的数据集保持活跃。租户名称只允许包含字母、数字、下划线和连字符。
#Weaviate 运行所需的成本
Weaviate 是一个需要实际部署的服务:需要容器、持久化存储,以及与向量规模成正比的内存。容量规划文档明确指出了这一限制:HNSW 索引必须存放在内存中,内存容量决定数据集的最大规模,但不会直接影响查询速度。文档给出的经验法则是:按所有向量内存占用总量的两倍来预估内存需求。
这里将 bge-m3 的维度假定为 1 024,需查阅您所用模型的说明页面加以核实。对于个人或中小企业的语料库(数万段文本),索引占用的内存较少;当文本段落达到数百万时,内存占用才成为需要关注的问题。Weaviate 提供向量压缩功能:文档推荐旋转量化(RQ),也提到乘积量化(PQ)、二进制量化(BQ)和标量量化(SQ),代价是少量信息损失。还要加上本地编码模块:Ollama 在与语言模型相同的机器上运行嵌入模型。在单台机器上,需要决定由哪个模型占用显卡,或者接受索引构建与推理相互影响。
#提供自定义向量,或从ChromaDB迁移
编码模块并非必需。Weaviate 的文档介绍了“自带向量”(bring your own vectors)的方法:您不让数据库计算嵌入向量,而是提供自己已有的向量,无论是自定义的还是预先生成的。在 Python 客户端中,此时通过 Configure.Vectors.self_provided 声明一个具名向量。这是从 ChromaDB 迁移最经济的方式:重新读取文档和已经计算好的向量(Chroma 可以通过 include 选项返回它们),然后将它们发送到 Weaviate,无需再次调用嵌入模型。检查两点可以避免意外问题:整个集合中的向量维度必须一致,而且问题必须使用原来的模型进行编码,因为 Weaviate 不会替您完成这一步。
什么时候应优先选择内置编码?当您希望直接用文本编写查询、添加文档时无需编写计算代码,并由配置保证所用模型的一致性时。什么时候应优先使用自己的向量?当您已有嵌入处理流程、必须使用所有模块都未提供的模型,或希望更换向量数据库而不必重新计算全部向量时。
#Weaviate 或其他向量数据库
| 情况 | 选择 |
|---|---|
| 混合检索与丰富的筛选功能,中到大规模的技术语料库 | Weaviate或Qdrant |
| 同一部署中相互隔离的多个用户组 | Weaviate(原生多区域支持) |
| 已部署 PostgreSQL,规模较小 | pgvector |
| 原型或个人语料库,无需维护服务器 | ChromaDB文件模式 |
| 单一进程,固定语料库,无过滤机制 | 如FAISS这样的库 |
如果您犹豫不决,就从最简单的方案开始:用 ChromaDB 制作原型,等出现具体需求(隔离、原生混合检索、数据规模)时,再迁移到服务。只要保留源文档和索引脚本,就可以改变这一选择。
#关于Weaviate的常见问题
Weaviate 是免费的吗?+
Weaviate 是否自行计算嵌入向量?+
Weaviate 是否会将数据发送到外部?+
如何设置混合搜索中的alpha参数?+
一百万段文本需要多少内存?+
个人使用必须启用多租户功能吗?+
- 混合搜索:BM25 + 向量搜索
- Qdrant:本地 RAG 的向量数据库
- pgvector:PostgreSQL 中的向量搜索
- FAISS:向量搜索背后的库
- 使用 ChromaDB 和 Ollama 进行本地 RAG
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。