
Alibaba/zvec 是一个轻量级、嵌入式(in-process)的向量数据库,其设计理念可以理解为“向量数据库界的 SQLite”。它由阿里巴巴通义实验室基于内部久经考验的 Proxima 向量检索引擎构建,并于2026年1月开源,旨在为开发者提供一个开箱即用、高性能且能嵌入任何应用的向量检索方案。
🎯 核心定位:填补“高性能嵌入式向量数据库”的空白
在它出现之前,开发者常面临一个困境:像 Faiss 这样的索引库性能好但缺乏数据库的完整能力;而像 ChromaDB 这样的嵌入式方案性能不足(多为Python实现);像 Milvus 这样的服务化方案又过于重量级,需要独立部署。Zvec 的目标正是填补这片空白,将高性能与嵌入式、零运维完美结合。
🏗️ 关键架构与设计
Zvec 采用 C++ 作为核心,通过分层架构设计实现了高性能与完整数据库特性的统一。
- 分层模块化架构:从上层多语言绑定(Python, Node.js, Go, Rust等),到底层的数据库层(管理Collection、Segment、事务)、核心索引层(封装各种向量索引算法)和基础设施层(SIMD指令集加速、内存管理等),各层职责清晰。
- 分段存储与LSM-Tree思想:它的存储引擎借鉴了LSM-Tree的设计。数据先写入内存中的“写入分段(Writing Segment)”,累积到阈值后刷入磁盘成为“持久分段(Persist Segment)”,并会通过后台合并(Compaction) 操作将多个小分段合并成大分段,以优化查询性能并回收磁盘空间。
- 基于软删除的实现:考虑到向量索引(如HNSW图)物理删除成本极高,Zvec 采用了**软删除(Soft Delete)**策略。删除操作仅标记删除位(使用Roaring Bitmap),查询时跳过这些标记。真正的物理清理会在后台合并(Compaction)时进行。
- WAL与崩溃恢复:通过预写日志(Write-Ahead Logging, WAL)机制,确保数据在进程崩溃或断电后也能恢复,保障了数据持久性。
✨ 核心特性与能力
| 特性维度 | 具体能力 |
|---|---|
| 嵌入式与易用性 | 无需独立服务,pip install zvec 或 npm install @zvec/zvec 即可使用。支持Python、Node.js、Go、Rust、Dart/Flutter等多种语言,可在Linux、macOS、Windows上运行。 |
| 高性能检索 | 宣称能对十亿级向量进行毫秒级检索。其QPS(每秒查询数)在基准测试中是同类嵌入式竞品(如ChromaDB)的2倍以上,核心归功于C++实现和运行时SIMD指令集(SSE/AVX2等)加速。 |
| 丰富的索引类型 | 支持 HNSW、IVF、FLAT 等多种索引类型,并包含独家的 HNSW-RaBitQ 量化索引。RaBitQ能将内存占用压缩32倍的同时保持高召回率,大幅节省资源。 |
| 混合检索能力 | 原生支持稠密向量与稀疏向量,并能在一个查询中融合向量相似度搜索、全文关键词搜索(FTS)以及结构化标量过滤,实现精准的混合检索。 |
| 完整的数据库特性 | 提供完整的CRUD(增删改查)操作、Schema管理(强类型、支持动态修改)、标量字段索引,功能上远超纯索引库。 |
💡 典型应用场景
Zvec 的架构特性使其非常适合以下场景:
- 端侧AI与RAG应用:在手机、PC、IoT设备上,构建一个完全本地化、保护隐私的RAG(检索增强生成)助手。数据不离开设备,无网络延迟。
- CLI工具与桌面软件:为命令行工具或桌面软件(如笔记应用、代码编辑器)嵌入强大的本地语义搜索能力。
- 企业级本地知识库:对于有数据合规要求的企业,可以在内网或单机上快速搭建高性能的企业文档知识库。
🤝 Python集成开发
下面是一个完整的 Python 集成 zvec 并进行增删改查(CRUD)操作的示例。zvec 是一个轻量级的嵌入式向量数据库,可以直接在 Python 代码中 import 使用,无需部署独立服务。
1. 环境准备
首先,确保你的 Python 版本在 3.10 到 3.12 之间,然后通过 pip 安装 zvec:
pip install zvec
如果需要使用内置的 embedding 模型(如 SPLADE 稀疏向量),可以额外安装相关依赖:
pip install zvec[all]
2. 初始化与创建 Collection
在 zvec 中,Collection 类似于关系型数据库中的表,是存储文档(Document)的容器。使用前需要定义数据的 Schema(模式)。
import zvec
# 1. 可选:初始化全局配置(不调用则使用默认值)
zvec.init(log_level=zvec.LogLevel.INFO)
# 2. 定义数据模式(Schema)
# 这里创建一个名为 "example_collection" 的集合,包含一个字符串字段 "title" 和一个 4 维浮点向量字段 "embedding"
schema = zvec.CollectionSchema(
name="example_collection",
fields=[
zvec.FieldSchema(name="title", data_type=zvec.DataType.STRING),
],
vectors=[
zvec.VectorSchema(
name="embedding",
data_type=zvec.DataType.VECTOR_FP32,
dimension=4,
index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE),
)
],
)
# 3. 创建并打开 Collection(数据会持久化到本地目录 "./zvec_data")
collection = zvec.create_and_open(
path="./zvec_data",
schema=schema,
)
print("Collection 创建成功!")
3. 插入数据(Create)
数据以 Doc 对象为单位进行插入。upsert 方法可以插入新数据,如果 id 已存在则会更新。
# 插入单条数据
doc1 = zvec.Doc(
id="doc_1",
vectors={"embedding": [0.1, 0.2, 0.3, 0.4]},
fields={"title": "Hello World"},
)
# 插入多条数据
docs = [
zvec.Doc(id="doc_2", vectors={"embedding": [0.2, 0.3, 0.4, 0.1]}, fields={"title": "Zvec Guide"}),
zvec.Doc(id="doc_3", vectors={"embedding": [0.3, 0.4, 0.1, 0.2]}, fields={"title": "Vector Database"}),
]
collection.upsert(doc1)
collection.upsert(docs) # 支持批量插入
print("数据插入成功!")
4. 向量相似度查询(Retrieve)
核心的向量检索功能通过 query 方法实现,你可以传入目标向量,返回最相似的 Top-K 结果。
# 查询与向量 [0.1, 0.2, 0.3, 0.4] 最相似的文档
results = collection.query(
vectors=zvec.VectorQuery(
field_name="embedding", # 指定要检索的向量字段
vector=[0.1, 0.2, 0.3, 0.4], # 查询向量
),
topk=10,
)
print("查询结果:")
for result in results:
print(f"ID: {result.id}, Score: {result.score:.4f}, Title: {result.fields.get('title')}")
5. 带过滤条件的查询
zvec 支持在向量检索的同时,结合标量字段进行过滤(类似 SQL 中的 WHERE 条件),提高检索的精准度。
# 查询相似向量,但只返回 title 包含 "Guide" 的文档
# 注意:此功能依赖于在 FieldSchema 中启用了倒排索引 (InvertIndexParam)
filtered_results = collection.query(
vectors=zvec.VectorQuery(
field_name="embedding",
vector=[0.2, 0.3, 0.4, 0.1],
),
filter=zvec.Filter.expression("title LIKE '%Guide%'"), # 使用过滤表达式
topk=5,
)
print("带过滤条件的查询结果:", filtered_results)
6. 更新和删除数据(Update & Delete)
- 更新:使用
upsert方法,传入相同id的新Doc对象即可覆盖更新。 - 删除:使用
delete方法,可以根据文档 ID 或过滤条件进行删除。
# 更新:重新插入一个 id 相同但字段内容不同的文档
updated_doc = zvec.Doc(
id="doc_1",
vectors={"embedding": [0.9, 0.8, 0.7, 0.6]}, # 更新了向量
fields={"title": "Updated Hello World"}, # 更新了标题
)
collection.upsert(updated_doc)
print("文档 doc_1 已更新")
# 删除:通过文档 ID 删除
collection.delete(ids=["doc_2"])
print("文档 doc_2 已删除")
# 删除:通过过滤条件删除(例如删除所有标题不含 "Vector" 的文档)
# collection.delete(filter=zvec.Filter.expression("title NOT LIKE '%Vector%'"))
7. 查看 Collection 信息与优化
# 查看 Collection 的统计信息
stats = collection.stats()
print("Collection 统计信息:", stats)
# 查看 Collection 的 Schema 定义
print("Collection Schema:", collection.schema)
# 新插入的数据会暂存在内存中,调用 optimize() 可将其持久化并构建索引以加速查询
collection.optimize()
print("Collection 已优化")
8. 关闭 Collection
当操作完成后,最好显式关闭 Collection 以释放资源。
collection.close()
关键点总结
- 嵌入式运行:zvec 直接在进程中运行,数据存储在本地目录(如
./zvec_data),无需额外维护数据库服务。 - Schema 先行:使用前需要明确定义字段(标量)和向量字段的数据类型与维度。
- 向量与标量结合:
VectorQuery用于向量搜索,Filter用于标量条件过滤,两者可同时使用。 - 数据持久化:数据会通过 WAL(预写日志)机制保证持久性,进程重启后数据仍然存在。
以上代码提供了一个 zvec 集成和使用的完整流程。对于真实场景,你通常需要将这里的示例向量(如 [0.1, 0.2, ...])替换为由 embedding 模型(如 sentence-transformers)生成的实际向量。

335

被折叠的 条评论
为什么被折叠?



