⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Fight/Star-78k-alikaiyuanzuiqiangshiliangshujuku-zvec/ 「芋道源码」欢迎转载,保留摘要,谢谢!

候选标题(用户选用第 2 个):

  1. Star 9.6k!阿里开源最强 AI 数据库——让 RAG 部署再也不用上 Milvus 集群
  2. 9.6k Star!阿里这款新开源 AI 数据库,让向量检索像调 SQLite 一样简单
  3. 阿里最强开源 AI 数据库!9.6k Star,把向量库塞进进程里
  4. Star 9.6k!阿里开源 AI 数据库——RAG 部署从 3 个集群压回 1 个 jar 包
  5. 阿里开源最强 AI 数据库!9.6k Star,让 Milvus 部署成本砍 90%

🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

先把 RAG 部署的尴尬摆桌面

做 RAG 应用的同学这两年多半都被同一件事卡过——

为了几千条 PDF 切片做向量检索——你得先部署一整套 Milvus 集群:

  • 3 个 etcd 节点(做服务发现);
  • 2 个 MinIO 节点(做对象存储);
  • 1 个 Pulsar(做异步队列);
  • 还要再来一组 Milvus Server 做查询节点。

业务代码 200 行 + 基础设施 yaml 2000 行——光部署就比业务代码大 10 倍。这就是杀鸡用牛刀——为了一个内部知识库做语义搜索,你得拖一队”分布式数据库基建”上场。

这种尴尬正好是阿里这款新开源的 AI 数据库要解决的——它把向量检索的形态从”独立服务 + 集群”压回到”嵌入式库”——你 pip install / npm install 一下,丢进 FastAPI / Node 进程里直接跑——Java 团队走 Python 边车的方案,整个 RAG 应用也能从 5 台 K8s Pod 压回到 1-2 个进程。

它叫 Zvec——官方定位 “A lightweight, lightning-fast, in-process vector database”(轻量、闪电级快、跑在进程里的向量数据库)。截至本文发稿 GitHub Star 9.6k+——比刚开源那阵涨了快 25%,仓库 https://github.com/alibaba/zvec,官网 https://zvec.org。

关键词只有一个——嵌入式。它不是一个独立运行的服务、是一个能直接 pip install / npm install 丢进你 Python / Node 进程里跑的库——跟 SQLite 的形态一模一样。这就是为什么官方给它起了个绰号:「向量数据库界的 SQLite」。

横向对比:放到 Milvus / Pinecone / Chroma 里看清位置

向量数据库这个赛道头部就这几家——把 Zvec 放进生态里看清楚位置:

工具 形态 部署成本 适合规模 致命短板
Milvus 独立服务 + 集群 高(etcd / MinIO / Pulsar) 亿级以上 小项目用就是”杀鸡用牛刀”
Pinecone 商用 SaaS 极低(直接 API) 亿级 收费 + 数据出境 + 国内访问慢
Chroma 嵌入式 + 服务态都支持 中 千万级 Python 一等公民,Java / Go 弱
Zvec 嵌入式 + 进程内 极低(pip 一行) 百万到千万级 / 单机读密集 起步晚 + 不解决多机分片,亿级生产仍需 Milvus

Zvec 的差异化生态位很清楚——不是替代 Milvus——是替代「Milvus 杀鸡用牛刀」的那批场景。

一个内部知识库 RAG、一个端侧 AI 检索、一个手机 App 的本地搜索——这些场景过去要么硬上 Milvus、要么自己用 Faiss 拼一个;现在直接 pip install zvec 就完事。

研发能用它干啥:5 个真实场景

按使用频率从高到低:

场景 1:RAG 应用的本地知识库(最高频)

公司内部知识库(比如 Confluence 导出的 5 万篇文档)切片后做 embedding 入向量库。这种规模上 Milvus 是浪费——Zvec 直接嵌进 FastAPI / Node 进程(Java 团队走 Python 边车)——原本要 5 台 K8s Pod 的部署链路,现在 1-2 个进程搞定。

场景 2:端侧 AI 检索

手机 App / IoT 设备需要本地做语义搜索——文档不能传云端、模型要离线跑。Zvec 的 mmap 文件存储正好——用户的 5GB 笔记 + embedding 数据全部存在手机本地——零网络调用。

场景 3:单元测试 / 集成测试

写 RAG 应用的单测时——不可能每跑一个 case 都拉起 Milvus。Zvec 进程内启动——单测里 setUp() 直接 new 一个内存版 Zvec——跑完测试自动销毁——跟用 H2 替代 MySQL 跑单测是一个套路。

场景 4:边缘节点部署

CDN 边缘节点 / 5G MEC 节点 / 车载计算单元——不允许独立部署一个数据库服务。Zvec 跟着业务进程一起部署——资源开销几乎可以忽略。

场景 5:原型验证 / Demo

PoC 阶段验证一个 AI 想法——你不会为了一个 demo 配 Milvus 集群。Zvec 让你 30 秒就能从 0 到”能跑的 RAG demo”——验证完再决定要不要上 Milvus。

核心能力(来自官方 README)

Zvec 的强项不只是”嵌入式”。README 宣称可”Searches billions of vectors in milliseconds”——说明底层检索能力很强、不是玩具级;但工程选型上——综合”单机进程内 + 多读单写 + 没有多机分片”这几个边界来看,Zvec 真正的甜蜜点是百万到千万级、单机读密集的 RAG 场景——真到亿级生产仍然推荐走 Milvus 这一档(这一点和文末”真实边界”段保持一致——别被 README 的宣称数字带偏)。

按 README 列出的核心能力:

  • 零部署,进程内即用——通过 pip / npm 安装、不起独立服务——这是和 Milvus / Pinecone 形态上的根本区别;
  • 数据本地化——所有数据落本地文件、查询也在本地完成——“Pure local, no servers, no config, no fuss”(官方原话);
  • 稠密 + 稀疏向量混合——原生支持 dense / sparse 双向量类型——做混合搜索时不用自己拼;
  • 混合搜索——向量相似度 + 标量字段过滤(按时间、类目、租户 ID 过滤)一次完成,不是后过滤;
  • WAL 持久化——写前日志保证 crash 后数据不丢——这块用过 MySQL 的同学很熟悉;
  • 多进程并发读、单进程互斥写——多读单写的锁模型,跟 SQLite 一模一样——适合”读密集 + 偶尔批量写”的 RAG 场景;
  • 跨平台二进制——Linux x86_64 / ARM64、macOS ARM64、Windows x86_64 全覆盖,树莓派也能跑;
  • 官方 Python / Node 绑定——Python 3.10-3.14 / Node.js 都有官方包——其他语言可以走 C++ 直接调。

最新版本 v0.3.1(2026 年 4 月)刚改善了 Windows 路径处理 + 放宽了 collection 限制——还在快速迭代。

30 秒上手:pip install 一行装好

pip install zvec

按官方 README 写一个最小的语义搜索 demo:

import zvec

# 1. 定义 collection schema(向量字段 + 维度)
schema = zvec.CollectionSchema(
name="example",
vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 4),
)

# 2. 在本地路径创建并打开 collection
collection = zvec.create_and_open(path="./zvec_example", schema=schema)

# 3. 写入文档(每条文档带 id + 向量数据)
collection.insert([
zvec.Doc(id="doc_1", vectors={"embedding": [0.1, 0.2, 0.3, 0.4]}),
zvec.Doc(id="doc_2", vectors={"embedding": [0.2, 0.3, 0.4, 0.1]}),
])

# 4. 向量相似度搜索
results = collection.query(
zvec.VectorQuery("embedding", vector=[0.4, 0.3, 0.3, 0.1]),
topk=10,
)

整个流程跟 SQLite 写 SQL 一样直观——没有任何”先要部署服务、配置网络、设置认证”的环节。混合搜索(向量 + 标量字段过滤)等高级用法可以参照 官方 README 拿到完整 schema 写法。

如果用 Java——Zvec 没有官方 Java 绑定——可选两条路:

  • Python / Node 边车(推荐):跑一个独立的 Python / Node 微服务包 Zvec,对外暴露 HTTP 接口,Java 主服务通过 RestTemplate / WebClient 调用——接入成本 1 天;
  • 自行 C API / JNI 封装:Zvec 内核是 C++、有 C ABI——可以走 JNI / JNA 自己包一层 Java SDK——成本高,适合愿意贡献开源的团队。

业务侧的 OpenAI-compatible 网关可以走 yudao-cloud 的 AI 模块——把”调 embedding 模型 + 调 Zvec 边车 + 拼 prompt”这条 RAG 链路统一起来。

yudao-cloud 仓库:https://github.com/YunaiV/yudao-cloud

真实边界:用之前要知道的 3 件事

按破坏力从高到低:

边界 1:单机方案,分布式不是它的目标(最常见)

Zvec 的设计就是进程内嵌入式——不解决”亿级 + 多机分片”的问题。如果你的向量量级到了 10 亿+——老老实实上 Milvus / TiDB Vector / PolarDB-X 向量版。Zvec 的甜蜜点是百万到千万级——刚好覆盖 80% 的内部知识库 / 端侧 / 中小型 RAG 项目。

Milvus 仓库:https://github.com/milvus-io/milvus

边界 2:Java 生态没有官方一等支持(常见)

官方 README 里只列了 Python / Node 绑定。Java 团队想用,要么走 JNI 自己包一层(成本高)、要么单独跑一个 Python 边车进程对外提供 HTTP 接口。这点对国内 Java 后端不太友好——希望阿里后续补一个 Java SDK。

边界 3:写入吞吐相比 Milvus 弱(高级场景)

嵌入式形态的天然限制——写入要走单进程互斥锁。如果你的场景是「每秒 10 万条向量入库」(比如实时日志向量化)——Zvec 不是最佳选择——这种场景 Milvus 的分布式写入才是答案。Zvec 适合”读密集 + 批量小规模写”——不适合”实时高吞吐写入”。

我的判断

向量数据库这个赛道这两年很热闹——头部 Milvus / Pinecone 已经跑出来——但「为一个小 RAG 部署一整套 Milvus」的痛点一直没解决。

Zvec 抢的就是这个空缺——一行 pip 装上、零部署、跑在进程里。它的反向定位很清晰——「我不是 Milvus,我是 Milvus 不该出现的那个场景的答案」。

如果你最近在考虑做内部知识库 RAG、端侧 AI 检索、给业务系统加个语义搜索功能——Zvec 应该是你第一个尝试的方案——而不是最后一个。

仓库地址:https://github.com/alibaba/zvec | 官网:https://zvec.org

「向量数据库界的 SQLite」这个定位之所以贴切——不是因为 Zvec 像 SQLite 那么轻量——是因为它跟 SQLite 一样,把”重量级数据库的那部分能力”装进了一个普通进程能用的库里。

文章目录
  1. 1. 先把 RAG 部署的尴尬摆桌面
  2. 2. 横向对比:放到 Milvus / Pinecone / Chroma 里看清位置
  3. 3. 研发能用它干啥:5 个真实场景
    1. 3.0.1. 场景 1:RAG 应用的本地知识库(最高频)
    2. 3.0.2. 场景 2:端侧 AI 检索
    3. 3.0.3. 场景 3:单元测试 / 集成测试
    4. 3.0.4. 场景 4:边缘节点部署
    5. 3.0.5. 场景 5:原型验证 / Demo
  • 4. 核心能力(来自官方 README)
  • 5. 30 秒上手:pip install 一行装好
  • 6. 真实边界:用之前要知道的 3 件事
    1. 6.0.1. 边界 1:单机方案,分布式不是它的目标(最常见)
    2. 6.0.2. 边界 2:Java 生态没有官方一等支持(常见)
    3. 6.0.3. 边界 3:写入吞吐相比 Milvus 弱(高级场景)
  • 7. 我的判断