Zvec 架构深度解析:阿里巴巴开源的轻量级进程内向量数据库
Zvec 架构深度解析:阿里巴巴开源的轻量级进程内向量数据库
Zvec 是阿里巴巴开源的一个轻量级、闪电般快速的进程内向量数据库。本文将深入分析 Zvec 的代码架构,揭示其核心设计理念和技术实现细节。
一、项目概览
1.1 核心特性
Zvec 基于 Alibaba 久经考验的 Proxima 向量搜索引擎构建,提供生产级的低延迟、可扩展的相似度搜索能力:
- 极致性能:毫秒级搜索数十亿级向量
- 简单易用:无需服务器配置,零依赖安装
- 混合向量支持:同时支持稠密向量(Dense)和稀疏向量(Sparse)
- 混合搜索:语义相似度 + 结构化过滤
- 随处运行:嵌入到应用进程内运行
1.2 技术栈
| 组件 | 技术 |
|---|---|
| 语言 | C++17 |
| 构建系统 | CMake |
| Python绑定 | Pybind11 |
| 存储引擎 | RocksDB |
| 向量索引 | Proxima (IVF, HNSW, Flat) |
| 序列化 | Protobuf |
| 压缩 | LZ4 |
| 位图 | CRoaring |
| 距离计算 | SIMD 加速 |
1.3 目录结构
zvec/ ├── src/ │ ├── include/zvec/ # 公共头文件 │ │ ├── core/ # 核心索引框架 │ │ │ ├── framework/ # 索引组件框架 │ │ │ └── interface/ # 索引接口定义 │ │ ├── db/ # 数据库层 │ │ └── ailego/ # 基础工具库 │ ├── binding/python/ # Python 绑定 │ └── ailego/ # 辅助工具实现 ├── thirdparty/ # 第三方依赖 ├── python/ # Python 包 ├── tests/ # 测试用例 └── CMakeLists.txt 二、分层架构设计
2.1 整体架构图
存储层
Proxima引擎
核心索引框架
数据库层
绑定层
用户层
继承
继承
继承
Python API
Node.js API
Pybind11
N-API
Collection
Schema
SegmentManager
IDMap
DeleteStore
SQLEngine
Index Base Class
FlatIndex
IVFIndex
HNSWIndex
IndexBuilder
IndexSearcher
IndexStorage
IndexHolder
IndexMetric
IVF算法
HNSW算法
Flat算法
RocksDB
标量字段
MMap文件
向量索引
BufferManager
内存池
架构层次说明:
- 用户层:Python/Node.js 提供的 API 接口
- 绑定层:Pybind11/N-API 实现 Python 到 C++ 的桥接
- 数据库层:Collection 管理 Schema、Segment、ID 映射等
- 核心索引框架:抽象的索引接口和实现
- Proxima 引擎:实际的向量搜索算法实现
- 存储层:RocksDB 处理结构化数据,MMap 处理向量索引
三、核心索引框架详解
3.1 索引类型与选择策略
Zvec 提供三种索引类型,根据数据规模自动选择最优算法:
| 索引类型 | 适用场景 | 特点 |
|---|---|---|
| Flat | 小数据集 (<10万) | 100% 召回率,暴力搜索 |
| IVF | 中等数据集 (10万-1亿) | 聚类分区,速度与精度平衡 |
| HNSW | 大数据集 (>1亿) | 图结构,极快查询 |
核心代码实现 (src/include/zvec/core/interface/index.h):
classIndex{public:virtualintAdd(const VectorData &vector,uint32_t doc_id);virtualintSearch(const VectorData &query, SearchParams *, SearchResult *);virtualintTrain();virtualintOpen(const std::string &file_path, StorageOptions);};// 三种索引类型实现classFlatIndex:publicIndex{};// 暴力搜索classIVFIndex:publicIndex{};// 倒排文件索引classHNSWIndex:publicIndex{};// 层次导航小世界图3.2 IndexHolder 系统:模板化的数据管理
IndexHolder 是一个精心设计的模板系统,用于在索引构建和搜索期间管理向量数据。
三个设计维度
- 迭代模式:
OnePass*Holder:单次遍历,迭代时消耗数据(使用std::list)MultiPass*Holder:支持多次遍历(使用std::vector)RandomAccessIndexHolder:O(1) 随机访问
- 数据类型:
NumericalIndexHolder:FP16, FP32, FP64, INT8, INT16BinaryIndexHolder:Binary32, Binary64SparseIndexHolder:稀疏向量(indices + values)HybridIndexHolder:稠密 + 稀疏组合
- 元素大小计算:
element_size()返回dimension * sizeof(type)- 二进制向量使用
(dim + 7) / 8 * sizeof(T)公式
内存管理策略
OnePass holders 使用 std::list<std::pair<key, vector>>:
- 元素在迭代时被消费
- 迭代器在前进时擦除元素
- 数据随处理释放内存
MultiPass holders 使用 std::vector<std::pair<key, vector>>:
- 支持多次迭代
- 迭代器仅前进
- 内存保留直到 holder 销毁
稀疏与混合向量支持
structSparseVector{uint32_t count;constvoid*indices;// uint32_t*constvoid*values;// 类型特定*};structHybridVector{// 组合稠密和稀疏向量// 支持混合搜索策略};IndexHolder 类型层次结构
模板特化 - 编译时类型绑定
RandomAccess - 紧凑存储 + key向量
MultiPass 系列 - 使用 std::vector
OnePass 系列 - 使用 std::list
IndexHolder 基类
继承
继承
继承
继承
继承
继承
继承
继承
继承
特化
特化
特化
特化
特化
特化
特化
特化
IndexHolder
count
dimension
data_type
element_size
multipass
create_iterator
is_matched
OnePassNumerical
OnePassBinary
OnePassSparse
OnePassHybrid
迭代时消费数据
MultiPassNumerical
MultiPassBinary
MultiPassSparse
MultiPassHybrid
支持多次遍历
RandomAccessIndexHolder
O1 随机访问
DT_FP32
DT_FP64
DT_INT8
DT_INT16
DT_BINARY32
DT_BINARY64
E
设计决策表:
| Holder 类型 | 容器 | 迭代特性 | 内存策略 | 适用场景 |
|---|---|---|---|---|
| OnePass | std::list | 消费数据 | 迭代后释放 | 单次遍历(索引构建) |
| MultiPass | std::vector | 保留数据 | holder 销毁时释放 | 多次遍历(搜索精炼) |
| RandomAccess | 紧凑数组 + key向量 | 随机访问 | 紧凑布局 | O(1) 查找需求 |
数据类型支持矩阵:
| Holder | FP16 | FP32 | FP64 | INT8 | INT16 | Binary32 | Binary64 |
|---|---|---|---|---|---|---|---|
| OnePassNumerical | ✓ | ✓ | ✓ | ✓ | ✓ | - | - |
| MultiPassNumerical | ✓ | ✓ | ✓ | ✓ | ✓ | - | - |
| OnePassBinary | ✓ | ✓ | - | - | - | ✓ | ✓ |
| MultiPassBinary | ✓ | ✓ | - | - | - | ✓ | ✓ |
模板特化模式
3.3 查询参数系统
classHnswQueryParams:publicQueryParams{int ef_;// 探索因子float radius_;// 搜索半径bool is_linear_;// 是否使用线性扫描bool is_using_refiner_;// 是否使用精炼器};classIVFQueryParams:publicQueryParams{int nprobe_;// 探测的簇数量float scale_factor_;// 缩放因子};四、数据库层架构
4.1 CollectionImpl 结构
classCollectionImpl:publicCollection{// 路径管理 std::string path_;bool destroyed_{false};// Schema 和选项 CollectionSchema::Ptr schema_; CollectionOptions options_;mutable std::shared_mutex schema_handle_mtx_;// 分片管理 std::atomic<SegmentID> segment_id_allocator_; std::atomic<SegmentID> tmp_segment_id_allocator_; Segment::Ptr writing_segment_; SegmentManager::Ptr segment_manager_;// 版本管理 VersionManager::Ptr version_manager_;// 并发控制mutable std::shared_mutex write_mtx_;// 文件锁和元数据 ailego::File lock_file_; IDMap::Ptr id_map_; DeleteStore::Ptr delete_store_; sqlengine::SQLEngine::Ptr sql_engine_;};4.2 写入模式
enumclassWriteMode:uint8_t{ UNDEFINED =0, INSERT,// 仅插入新文档 UPDATE,// 更新现有文档 UPSERT,// 更新或插入};4.3 分片管理策略
Writing Segment:用于写入的活动分片
- 任意时刻仅使用单个分片
- 当达到
max_doc_count_per_segment(1000万)时自动切换
Segment Manager:管理所有非写入分片
- 按 doc_id 范围排序分片
- 高效的范围查询
ID 分配:分片 ID 的原子分配
SegmentID allocate_segment_id(){return segment_id_allocator_.fetch_add(1);}4.4 并发策略
Schema 操作:std::shared_mutex schema_handle_mtx_
- 多读单写
- Schema 变更很少发生
写入操作:std::shared_mutex write_mtx_
- 防止集合的并发写入
分段读取:无锁
- 允许分片的并发读取
五、存储与持久化架构
5.1 文件组织结构
collection_root/ ├── _CollectionLock # 进程锁文件 ├── meta/ # 元数据 │ ├── schema.pb # 集合 schema │ ├── config.pb # 选项配置 │ └── version.pb # 版本信息 ├── segments/ # 数据分片 │ ├── segment_00001/ │ │ ├── meta.pb # 分片元数据 │ │ ├── data/ # 原始向量数据 │ │ ├── indexes/ # 向量索引 │ │ │ ├── flat/ │ │ │ ├── ivf/ │ │ │ └── hnsw/ │ │ ├── forward/ # 标量字段 │ │ │ └── rocksdb/ │ │ └── sql.db # SQL 引擎数据库 │ └── ... ├── writing_segment/ # 活动写入分片 ├── id_map/ # PK → DocID 映射 ├── delete_store/ # 删除墓碑标记 └── version_manager/ # 版本跟踪 5.2 存储层组件
IndexStorage (src/include/zvec/core/framework/index_storage.h):
structMemoryBlock{enumMemoryBlockType{ MBT_MMAP =1,// 内存映射文件 MBT_BUFFERPOOL =2,// 内存池缓冲区};// 支持零拷贝访问constvoid*data; BufferHandle buffer_handle_;};classIndexStorage{// 段管理virtualintopen(const std::string &path,bool create)=0;virtualintappend(const std::string &id, size_t size)=0;virtual Segment::Pointer get(const std::string &id)=0;};RocksDB 集成:
- 文档索引:ID 到文档位置的映射
- 字段索引:结构化字段的倒排索引
- 元数据存储:集合配置和状态
5.3 MMap 优化
// 内存映射文件,零拷贝访问classMMapFile{int fd_;void*mapped_data_; size_t size_;intmap(const std::string &path, size_t size,int prot,int flags);intunmap();};优势:
- 零拷贝读取
- 操作系统级页面缓存
- 支持超大文件(超过内存)
六、Python 绑定架构
6.1 绑定模块结构
PYBIND11_MODULE(_zvec, m){ZVecPyTyping::Initialize(m);// 类型定义ZVecPyParams::Initialize(m);// 参数绑定ZVecPySchemas::Initialize(m);// Schema 绑定ZVecPyConfig::Initialize(m);// 配置绑定ZVecPyDoc::Initialize(m);// 文档绑定ZVecPyCollection::Initialize(m);// 集合绑定}6.2 错误处理机制
C++ Status → Python Exception:
voidthrow_if_error(const Status &status){switch(status.code()){case StatusCode::NOT_FOUND:throw py::key_error(status.message());case StatusCode::INVALID_ARGUMENT:throw py::value_error(status.message());default:throw std::runtime_error(status.message());}}6.3 结果解包
template<typenameT> T unwrap_expected(const tl::expected<T, Status>&exp){if(exp.has_value()){return exp.value();}throw_if_error(exp.error());}6.4 Python API 示例
import zvec # 定义 Schema 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)七、性能优化技术
7.1 向量化计算
// SIMD 优化的批量计算namespace math_batch {// 批量点积计算voiddot_product_simd(constfloat*a,constfloat*b, size_t n,float*result);// 批量 L2 距离计算voidl2_distance_simd(constfloat*a,constfloat*b, size_t n,float*result);}7.2 内存池管理
classBufferManager{// 预分配内存池void*allocate(size_t size);// 回收内存到池中voiddeallocate(void*ptr);// 批量分配,减少系统调用 std::vector<void*>batch_allocate(size_t size, size_t count);};7.3 压缩与位图
- LZ4 压缩:极致快的压缩/解压
- CRoaring 位图:高效的集合运算
- SparseHash:Google 的稀疏哈希表
八、核心依赖库分析
| 依赖 | 用途 | 原因 |
|---|---|---|
| RocksDB | 结构化数据存储 | 高性能 KV 引擎 |
| Arrow | 列式数据格式 | 零拷贝互操作性 |
| Protobuf | 元数据序列化 | 跨语言兼容 |
| LZ4 | 数据压缩 | 极快压缩/解压 |
| CRoaring | 位图索引 | 压缩集合运算 |
| SparseHash | 稀疏数据存储 | 内存高效 |
| glog | 日志记录 | Google 风格日志 |
| ANTLR | 表达式解析 | 过滤表达式 |
| googletest | 单元测试 | Google 测试框架 |
九、数据流详解
9.1 插入流程
渲染错误: Mermaid 渲染失败: Parse error on line 26: ... WritingSeg = 新分片 end alt 无需 -----------------------^ Expecting 'SOLID_OPEN_ARROW', 'DOTTED_OPEN_ARROW', 'SOLID_ARROW', 'BIDIRECTIONAL_SOLID_ARROW', 'DOTTED_ARROW', 'BIDIRECTIONAL_DOTTED_ARROW', 'SOLID_CROSS', 'DOTTED_CROSS', 'SOLID_POINT', 'DOTTED_POINT', got 'NEWLINE'
流程关键点:
- 写锁保护:使用
std::shared_mutex确保写入串行化 - 自动分片:达到 1000 万文档自动创建新分片
- ID 分配:IDMap 提供 PK → DocID 映射
- 混合存储:向量数据 → VectorStorage,标量数据 → RocksDB
- 版本控制:每次写入更新版本信息
Python API ↓ Pybind11 包装器 (throw_if_error) ↓ Collection::Insert() ↓ CollectionImpl::write_impl(INSERT) ↓ 1. 获取写锁 (std::shared_mutex) 2. 检查分片容量 3. 如需要切换到新分片 4. 分配文档 ID (IDMap) 5. 写入向量数据 (VectorSegment) 6. 写入标量数据 (RocksDB) 7. 更新分片元数据 8. 释放写锁 ↓ 返回 WriteResults ↓ Python WriteResults 对象 9.2 查询流程
IndexFilterFlatIndexIVFIndexHNSWIndexSegmentManagerCollectionImplPybind11Python API用户IndexFilterFlatIndexIVFIndexHNSWIndexSegmentManagerCollectionImplPybind11Python API用户par[查询每个分片]alt[有过滤器]alt[启用精炼器]collection.query(vector)转换为 C++ VectorQueryvalidate parametersQuery(&query)parse query paramsidentify relevant segmentsget_active_segments()返回活动分片列表Search(query)Search(query)Search(query)apply_filter(results)返回过滤后结果refine_top_k_results()merge_and_rank(results)返回 DocPtrListunwrap_expected返回文档列表
Python VectorQuery ↓ Pybind11 包装器 ↓ Collection::Query() ↓ CollectionImpl::Query() ↓ 1. 解析查询参数 2. 识别相关分片 3. 查询每个分片索引 - HNSWIndex::Search() - 或 IVFIndex::Search() - 或 FlatIndex::Search() 4. 应用过滤器(如果有) 5. 合并和排序结果 6. 精炼 top-K 结果(如果配置) ↓ 返回 DocPtrList ↓ Python Doc 对象列表 十、与服务器型向量数据库对比
| 特性 | Zvec (进程内) | Milvus/Pinecone (服务器) |
|---|---|---|
| 延迟 | ~1ms | ~10-100ms |
| 部署 | 嵌入式 | 独立服务 |
| 扩展性 | 单机 | 水平扩展 |
| 配置 | 无 | 必需 |
| 资源占用 | 与应用共享 | 专用 |
十一、架构亮点总结
11.1 设计优势
- 进程内设计
- 无网络开销
- 共享内存访问
- 零配置启动
- 模块化架构
- 索引类型可插拔
- 存储引擎可替换
- 语言绑定可扩展
- 性能优化
- SIMD 向量化计算
- 内存池管理
- MMap 零拷贝 I/O
- 类型安全
- 编译时类型检查
- Schema 验证
- 明确的向量类型
11.2 技术亮点
- 混合向量搜索: 同时支持稠密和稀疏向量
- 多语言绑定: Python + Node.js,易于扩展
- 持久化设计: MMap + RocksDB 双重存储
- 分片架构: 自动分片,水平扩展
- Proxima 基因: 继承 Alibaba 生产级引擎
十二、适用场景
Zvec 的架构设计使其特别适合以下场景:
- RAG 应用: 文档检索 + 向量相似度
- 推荐系统: 实时物品召回
- 语义搜索: 自然语言查询
- 图像检索: 多模态向量搜索
- 边缘计算: 嵌入式设备上的向量搜索
- 实时应用: 需要极低延迟的场景
- 轻量级部署: 无法运行独立服务的环境
十三、代码位置参考
| 功能 | 文件路径 |
|---|---|
| 索引接口 | src/include/zvec/core/interface/index.h |
| 集合接口 | src/include/zvec/db/collection.h |
| 索引 Holder | src/include/zvec/core/framework/index_holder.h |
| 索引存储 | src/include/zvec/core/framework/index_storage.h |
| 集合实现 | src/db/collection.cc |
| Python 绑定 | src/binding/python/model/python_collection.cc |
| Schema | src/include/zvec/db/schema.h |
| 查询参数 | src/include/zvec/db/query_params.h |
十四、用户体验分析
注意:由于 Zvec 的 PyPI 包尚未发布,本文无法完成实际的端到端用户测试。以下分析基于代码架构和预期体验推断。
14.1 安装现状
根据 README 文档,Zvec 声称支持 Python 3.10-3.12 版本,可通过 pip install zvec 安装。但实际尝试中发现:
- PyPI 包未发布:
pip install zvec返回 “No matching distribution found” - 源码构建问题:尝试从源码构建时,遇到以下问题:
- 部分第三方依赖缺少 CMakeLists.txt(thirdparty/googletest、thirdparty/gflags)
- 需要 scikit-build-core 构建系统
- 构建配置较复杂
建议:关注 GitHub Releases 获取预构建包,或等待 PyPI 正式发布。
14.2 从代码分析推断的用户体验
# 激活 Python 3.11 环境source ~/miniforge3/bin/activate py311 # 创建虚拟环境 python -m venv ~/venvofzvec # 激活虚拟环境source ~/venvofzvec/bin/activate 14.3 从代码推断的用户体验
虽然无法完成实际测试,但通过代码分析可以推断用户使用体验:
简洁的 API 设计:
import zvec # 定义集合 schema - 类型定义清晰 schema = zvec.CollectionSchema( name="my_collection", vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32,128),)# 创建并打开集合 - 一行代码完成 collection = zvec.create_and_open(path="./data", schema=schema)代码分析显示的优点:
零配置设计:进程内运行,无需服务器
// 集合实现直接管理文件系统classCollectionImpl{// 自动管理分片、ID 分配、版本控制};清晰的错误处理:C++ Status → Python Exception
// 优雅的错误转换voidthrow_if_error(const Status &status){switch(status.code()){case StatusCode::NOT_FOUND:throw py::key_error(status.message());case StatusCode::INVALID_ARGUMENT:throw py::value_error(status.message());// ...}}类型安全:所有 API 都有明确的类型定义
# Python 绑定代码 (python_collection.cc)classZVecPyCollection{ static void bind_db_methods(py::class_<Collection, Collection::Ptr>&col); static void bind_dml_methods(py::class_<Collection, Collection::Ptr>&col); static void bind_dql_methods(py::class_<Collection, Collection::Ptr>&col);};预期的快速操作:
# 批量插入 - 基于 MMap 和内存池优化 docs =[ zvec.Doc(id=f"doc_{i}", vectors={"embedding": generate_vector()})for i inrange(1000)] results = collection.insert(docs)# 应该快速完成# 向量搜索 - 基于 HNSW/IVF 索引 results = collection.query( zvec.VectorQuery("embedding", vector=generate_query_vector()), topk=10)# 毫秒级延迟代码架构显示的潜在优势:
多索引支持:根据数据量自动选择最优索引类型
// 小数据: Flat// 中等数据: IVF// 大数据: HNSW内存优化:SIMD 计算、内存池、MMap 零拷贝
// math_batch 提供 SIMD 加速namespace math_batch {voiddot_product_simd(...);voidl2_distance_simd(...);}自动分片:1000 万文档自动分片,无需手动管理
constuint64_t MAX_DOC_COUNT_PER_SEGMENT =10000000;boolneed_switch_to_new_segment()const;// 自动切换14.4 从代码分析得出的建议
对于潜在用户:
- 等待正式发布:关注 PyPI 发布后再尝试
pip install zvec - 检查 GitHub Releases:可能有预构建的 wheel 包可用
- 准备构建环境:如需从源码构建,确保有 CMake、C++ 编译器、Pybind11
从代码架构看出的设计考量:
- 类型安全优先:模板系统确保编译时类型检查
- 性能至上的设计:SIMD、内存池、MMap 都是性能关键
- 零配置理念:进程内运行,降低部署复杂度
- 模块化架构:索引类型、存储后端都可插拔
14.5 从架构分析得出的适用场景
基于代码设计,Zvec 的架构使其适合以下场景:
- 本地 RAG 应用:文档嵌入 + 向量检索,无需网络开销
- 边缘计算设备:内存受限环境下的向量搜索
- 实时推荐系统:需要极低延迟的物品召回
- 原型开发:快速验证向量搜索想法
- 嵌入式应用:无法运行独立服务的场景
- 多语言集成:通过 Python/Node.js 绑定集成到不同技术栈
十五、实际安装尝试总结
重要说明:以下是基于实际安装尝试的真实记录,展示了从开发者角度使用 Zvec 会遇到的问题。
15.1 完整的尝试过程
尝试 1: PyPI 直接安装
source ~/env-set &&source ~/miniforge3/bin/activate py311 pip install zvec 结果: ❌ “No matching distribution found for zvec”
原因: PyPI 包尚未发布(尽管 README 中有 PyPI badge)
尝试 2: 从源码安装(Python 3.12)
python -m venv ~/venvofzvec source ~/venvofzvec/bin/activate pip install -e .结果: ❌ 构建失败
错误:
ERROR: CMake Error at thirdparty/googletest/CMakeLists.txt ERROR: CMake Error at thirdparty/gflags/CMakeLists.txt 原因: Git submodules 未初始化
尝试 3: 初始化 Git Submodules
cd ~/desktop/zvec git submodule update --init --recursive 状态: ⏳ 正在执行(后台运行)
结果: 需要下载大量第三方依赖
尝试 4: CMake 配置
mkdir -p test_build cd test_build cmake -S .. -B . -DCMAKE_BUILD_PYTHON_BINDINGS=OFF 结果: ❌ CMake 配置失败
错误: 缺少多个第三方依赖的 CMakeLists.txt 文件
15.2 遇到的核心问题
- PyPI 包未发布
- README 声称
pip install zvec可用 - 实际 PyPI 搜索找不到该包
- 这是最主要的障碍
- README 声称
- Git Submodules 未初始化
- googletest、gflags 等多个第三方依赖是 Git submodules
- 不初始化会导致 CMake 配置失败
- 需要
git submodule update --init --recursive
- 构建依赖复杂
- 需要 CMake 3.26+
- 需要 Pybind11
- 需要 ninja 构建工具
- 需要完整的第三方依赖链
- 文档与实际情况不匹配
- README 中的安装方法无法直接使用
- 构建指南链接到 zvec.org(不包含在源码中)
15.3 建议的替代方案
对于想要尝试 Zvec 的开发者,建议:
方案 1: 等待 PyPI 正式发布
# 关注 GitHub Releases https://github.com/alibaba/zvec/releases # 发布后使用 pip install zvec 方案 2: 从 GitHub Releases 下载
- 检查是否有预构建的 wheel 包
- 下载对应的 cp311 wheel
- 直接
pip install zvec-xxx-py3-none-any.whl
方案 3: C++ 直接使用(无需 Python)
#include<zvec/db/collection.h>#include<zvec/db/doc.h>intmain(){ CollectionSchema schema("test"); schema.add_field(std::make_shared<FieldSchema>("embedding", DataType::VECTOR_FP32,false,nullptr,4));auto result =Collection::CreateAndOpen("./test_data", schema);// 直接使用 C++ API,无需 Python 绑定}方案 4: 使用 Docker 镜像
# 如果项目提供 Docker 镜像(未在 README 中提到,但可能存在)docker run --rm -v $(pwd):/workspace -w /workspace zvec:latest 15.4 最新尝试结果:C++ 构建尝试
尝试 5: 初始化 Git Submodules 后重新构建
cd ~/desktop/zvec git submodule update --init --recursive # 完成!克隆了 13 个第三方依赖尝试 6: CMake 配置(成功)
mkdir -p test_build &&cd test_build cmake -S .. -B . -DCMAKE_BUILD_PYTHON_BINDINGS=OFF -DCMAKE_CXX_COMPILER=/home/relis/gcc-12.3.0-portable/bin/g++ 结果: ✅ CMake 配置成功
输出:
-- Found PythonInterp: /home/relis/miniforge3/bin/python (found version "3.12.12") -- Found Threads: TRUE -- Found ZLIB: /usr/lib64/libz.so -- Found lz4: /home/relis/desktop/zvec/test_build/external/usr/local/lib//liblz4.a -- Configuring done 尝试 7: Make 构建(部分成功)
cd test_build make -j4 结果: ⚠️ 构建进行中但最终链接失败
观察:
- ANTLR4 静态库成功构建
- 多个第三方依赖开始编译
- 最终链接阶段失败:
make: *** [Makefile:166: all] Error 2
15.4 Latest Attempt: Using System Arrow
尝试 8: 使用系统 Arrow 重新配置
# 发现 ~/env-set 中已安装 ArrowexportARROW_HOME=/home/relis/software/arrow exportLD_LIBRARY_PATH=$ARROW_HOME/lib64:$LD_LIBRARY_PATH# 使用系统 Arrow 构建 cmake -S .. -B . -DARROW_ROOT=/home/relis/software/arrow \ -DARROW_DEPENDENCY_USE_SHARED=OFF \ -DCMAKE_BUILD_PYTHON_BINDINGS=OFF 结果: ⚠️ CMake 配置成功,但最终构建失败
输出:
-- Configuring done -- Generating done 观察:
- CMake 配置成功,检测到系统 Arrow
- ANTLR4 和其他依赖继续编译
- 最终链接阶段仍然失败:
make: *** [Makefile:166: all] Error 2
结论:即使使用系统 Arrow,构建仍然失败
- 问题可能出在其他地方(缺失库、链接问题等)
- 需要更深入调试或使用预构建包
15.4 Lessons Learned
| 问题 | 状态 | 解决方案 |
|---|---|---|
| PyPI 包不存在 | ❌ 未解决 | 等待官方发布或使用 GitHub Releases |
| Git Submodules 未初始化 | ✅ 已解决 | 运行 git submodule update --init --recursive |
| CMake 配置失败 | ✅ 已解决 | 指定完整编译器,Git submodules 初始化 |
| 缺少构建依赖 | ⚠️ 部分解决 | 需要更多依赖调整 |
| CMake 构建部分成功 | ✅ | 配置成功,开始编译 |
| 使用系统 Arrow 仍然失败 | ❌ 未解决 | 问题更复杂,需要深入调试 |
| 文档过时/不匹配 | ❓ 待验证 | 查看最新文档和 GitHub Issues |
给潜在用户建议:
- 先检查官方文档:确保使用最新安装方法
- 验证构建环境:检查 CMake、编译器版本
- 考虑 C++ 直接使用:如果只需要核心功能,可以绕过 Python 绑定
- 查看 CI/CD 配置:GitHub Actions 的构建流程可能提供参考
重要提示:以上所有分析基于代码架构研究,由于 PyPI 包尚未发布,无法完成实际用户测试验证。建议等官方正式发布后再进行生产环境部署。
总结
Zvec 是一个设计精良的向量数据库,其核心优势在于:
- ✅ 轻量级: 进程内运行,零依赖
- ✅ 高性能: 基于 Proxima,毫秒级搜索
- ✅ 易用性: 简单 API,快速上手
- ✅ 灵活性: 模块化设计,易于定制
- ✅ 类型安全: 模板系统保证编译时检查
GitHub: https://github.com/alibaba/zvec
文档: https://zvec.org
Stars: 1,563+ (截至 2026-02-15)
作者注: 本文基于 Zvec 源码深度分析,主要版本为 2026 年 2 月的 main 分支。架构细节可能随版本演进而变化。
关键词: 向量数据库、Zvec、向量搜索、架构设计、C++、RocksDB、HNSW、IVF、阿里巴巴