推荐轻量级向量数据库zvec

在这里插入图片描述
Alibaba/zvec 是一个轻量级、嵌入式(in-process)的向量数据库,其设计理念可以理解为“向量数据库界的 SQLite”。它由阿里巴巴通义实验室基于内部久经考验的 Proxima 向量检索引擎构建,并于2026年1月开源,旨在为开发者提供一个开箱即用、高性能且能嵌入任何应用的向量检索方案。

🎯 核心定位:填补“高性能嵌入式向量数据库”的空白

在它出现之前,开发者常面临一个困境:像 Faiss 这样的索引库性能好但缺乏数据库的完整能力;而像 ChromaDB 这样的嵌入式方案性能不足(多为Python实现);像 Milvus 这样的服务化方案又过于重量级,需要独立部署。Zvec 的目标正是填补这片空白,将高性能与嵌入式、零运维完美结合。

🏗️ 关键架构与设计

Zvec 采用 C++ 作为核心,通过分层架构设计实现了高性能与完整数据库特性的统一。

  1. 分层模块化架构:从上层多语言绑定(Python, Node.js, Go, Rust等),到底层的数据库层(管理Collection、Segment、事务)、核心索引层(封装各种向量索引算法)和基础设施层(SIMD指令集加速、内存管理等),各层职责清晰。
  2. 分段存储与LSM-Tree思想:它的存储引擎借鉴了LSM-Tree的设计。数据先写入内存中的“写入分段(Writing Segment)”,累积到阈值后刷入磁盘成为“持久分段(Persist Segment)”,并会通过后台合并(Compaction) 操作将多个小分段合并成大分段,以优化查询性能并回收磁盘空间。
  3. 基于软删除的实现:考虑到向量索引(如HNSW图)物理删除成本极高,Zvec 采用了**软删除(Soft Delete)**策略。删除操作仅标记删除位(使用Roaring Bitmap),查询时跳过这些标记。真正的物理清理会在后台合并(Compaction)时进行。
  4. WAL与崩溃恢复:通过预写日志(Write-Ahead Logging, WAL)机制,确保数据在进程崩溃或断电后也能恢复,保障了数据持久性。

✨ 核心特性与能力

特性维度具体能力
嵌入式与易用性无需独立服务,pip install zvecnpm 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()

关键点总结

  1. 嵌入式运行:zvec 直接在进程中运行,数据存储在本地目录(如 ./zvec_data),无需额外维护数据库服务。
  2. Schema 先行:使用前需要明确定义字段(标量)和向量字段的数据类型与维度。
  3. 向量与标量结合VectorQuery 用于向量搜索,Filter 用于标量条件过滤,两者可同时使用。
  4. 数据持久化:数据会通过 WAL(预写日志)机制保证持久性,进程重启后数据仍然存在。

以上代码提供了一个 zvec 集成和使用的完整流程。对于真实场景,你通常需要将这里的示例向量(如 [0.1, 0.2, ...])替换为由 embedding 模型(如 sentence-transformers)生成的实际向量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许于宝的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值