























今天在 GitHub Trending 上看到一个非常有实力的项目:阿里巴巴开源的 Zvec——一款嵌入应用内部的轻量级向量数据库,专为低延迟、高吞吐的相似性搜索场景设计,已经在阿里集团内部经受了大规模生产环境的考验。
Zvec 的核心理念是将向量数据库直接嵌入应用程序进程,而不是作为独立服务部署。这种设计带来了几个关键优势:
在 v0.5.0(2026年6月12日发布)中,Zvec 引入了多项重量级更新,包括原生全文检索(FTS)、混合查询(Hybrid Retrieval)、DiskANN 磁盘索引,以及全新的 Go/Rust SDK,生态扩展非常迅速。
Zvec 采用 C++17 内核 + 多语言绑定的架构。核心向量引擎完全用 C++ 编写,上层通过 pybind11(Python)、N-API(Node.js)、cgo(Go)、FFI(Rust)等方式提供语言绑定。从 CMakeLists.txt 可以看出其构建体系的几个关键设计:
cmake_minimum_required(VERSION 3.13)
project(zvec)
set(CC_CXX_STANDARD 17)
option(BUILD_ZVEC_SHARED "Build all-in-one C++ shared library libzvec" ON)
option(BUILD_PYTHON_BINDINGS "Build Python bindings using pybind11" OFF)
option(BUILD_C_BINDINGS "Build C bindings" ON)
架构分为三个核心层:
Zvec 支持多种向量索引类型,可根据场景在内存与磁盘之间灵活选择:
if(COMPILER_SUPPORTS_AVX2 OR COMPILER_SUPPORTS_AVX512)
set(RABITQ_SUPPORTED ON)
if(RABITQ_ENABLE_AVX512 AND COMPILER_SUPPORTS_AVX512)
set(RABITQ_ARCH_FLAG "${MATH_RABITQ_ARCH_FLAG_AVX512}")
endif()
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(DISKANN_SUPPORTED ON)
add_definitions(-DDISKANN_SUPPORTED=1)
endif()
v0.5.0 引入的 FTS 功能非常值得关注。Zvec 支持对任意字符串字段附加全文索引,内置 jieba 中文分词器,分词字典会被打包到 Python wheel 中:
install(FILES
"${ZVEC_JIEBA_DICT_SRC}/jieba.dict.utf8"
"${ZVEC_JIEBA_DICT_SRC}/hmm_model.utf8"
DESTINATION ${ZVEC_PY_INSTALL_DIR}/zvec/data/jieba_dict)
混合查询(MultiQuery)可以在单次查询中同时融合稠密向量相似度、稀疏向量相似度、全文检索相关性和标量字段过滤,避免了传统方案中需要两次独立调用再合并结果的繁琐流程。
Zvec 通过 WAL 实现持久化——所有写操作先写入日志,再应用到内存索引。即使进程意外终止,重启后也能从 WAL 恢复数据。并发模型上,Zvec 支持多进程同时读取同一集合,写操作保持单进程独占。
Python 安装一行命令搞定:
Node.js 同样简洁:
还提供 Go、Rust、Dart/Flutter 官方 SDK。
import zvec
# 定义集合 Schema(含一个 4 维浮点向量字段)
schema = zvec.CollectionSchema(
name="example",
vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 4),
)
# 创建并打开集合
collection = zvec.create_and_open(path="./zvec_example", schema=schema)
# 插入文档
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]}),
])
# 向量相似度搜索
results = collection.query(
zvec.VectorQuery("embedding", vector=[0.4, 0.3, 0.3, 0.1]),
topk=10
)
print(results)
整个流程只有定义 Schema → 插入数据 → 查询三步,无需配置服务器、连接字符串或任何外部依赖。
Zvec 支持在同一集合中创建多个向量字段,每个字段可以独立选择索引类型:
schema = zvec.CollectionSchema(
name="multimodal",
vectors={
"dense": zvec.VectorSchema("dense", zvec.DataType.VECTOR_FP32, 768),
"sparse": zvec.VectorSchema("sparse", zvec.DataType.VECTOR_SPARSE),
},
)
这在多模态检索场景中非常实用——例如同时用 CLIP 图像嵌入和 BM25 文本嵌入进行联合检索。
schema = zvec.CollectionSchema(
name="articles",
vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 768),
fields=[
zvec.FieldSchema("title", zvec.DataType.STRING),
zvec.FieldSchema("content", zvec.DataType.STRING),
],
)
中文全文检索开箱即用,内置 jieba 分词,无需额外配置。
results = collection.query(
zvec.MultiQuery(
vector=zvec.VectorQuery("embedding", vector=query_vec, topk=10),
text=zvec.TextQuery("content", query="机器学习入门", topk=10),
filter=zvec.Filter("category == 'tech'"),
)
)
官方还提供了 Zvec Studio 可视化工具,可以直观地浏览数据、调试查询,无需编写任何代码。
DiskANN 依赖 Linux 特有的 libaio 异步 I/O 库,目前仅在 Linux x86_64 上构建。在 macOS 或 ARM64 Linux 上,建议使用 HNSW 或 RaBitQ 索引作为替代。
RaBitQ 依赖 AVX2 或 AVX-512 SIMD 指令集。在 ARM64(如 Apple Silicon)和未检测到这些指令集的 x86 平台上会自动禁用。
Zvec 的设计是单进程写、多进程读。如果需要多写入者,需要在应用层引入分布式锁或消息队列进行协调。
Zvec 在"进程内向量数据库"这个细分领域做得非常扎实:C++ 内核保证性能、多语言 SDK 保证易用性、WAL 保证可靠性。v0.5.0 带来的全文检索和混合查询能力使其从纯粹的向量搜索工具升级为全能型的嵌入式搜索引擎。对于不想维护独立向量数据库服务、追求极致查询延迟、或者在边缘设备上运行向量检索的开发者来说,Zvec 是一个值得认真考虑的选择。
项目地址:https://github.com/alibaba/zvec | 文档:https://zvec.org | 许可证:Apache 2.0
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。