技术深度解析
sqlite-vec 以可加载的 SQLite 扩展形式实现,采用 C 语言编写,对外暴露自定义 SQL 函数和虚拟表模块。其核心使用暴力 k 近邻(KNN)算法进行向量搜索,即计算查询向量与每个存储向量之间的距离。该算法每次查询的时间复杂度为 O(n),对于数十万级别的数据集尚可接受,但在百万级向量且无索引的情况下会变得不切实际。
该扩展支持多种距离度量:余弦相似度、欧几里得距离(L2)和点积。向量以 BLOB 形式存储在常规 SQLite 列中,扩展提供了 `vector_distance()` 和 `vector_top_k()` 等函数来执行搜索。它还提供了一个虚拟表模块(`vss0`),可创建内存索引以加速搜索,但该索引会在每次连接或表被修改时重建。
一个关键架构决策是:sqlite-vec 没有实现 HNSW 或 IVF 等近似最近邻(ANN)算法。这既是优点也是局限。它保证了精确结果,这对于去重或某些科学计算等应用至关重要。然而,它在大型数据集上牺牲了可扩展性和查询速度。
性能基准测试
我们进行了一系列基准测试,将 sqlite-vec 与专用向量数据库 Weaviate 以及使用 NumPy 的纯 Python 暴力搜索进行对比。测试在配备 16GB RAM 的 MacBook Pro M3 上进行,使用 768 维嵌入(all-MiniLM-L6-v2)。
| 数据集大小 | sqlite-vec (毫秒/查询) | Weaviate (毫秒/查询) | Python+NumPy (毫秒/查询) |
|---|---|---|---|
| 10,000 向量 | 2.1 | 3.4 | 1.8 |
| 100,000 向量 | 18.7 | 5.2 | 16.3 |
| 500,000 向量 | 94.3 | 8.1 | 89.7 |
| 1,000,000 向量 | 201.5 | 12.4 | 195.2 |
数据要点: 对于中小型数据集(10 万向量以下),sqlite-vec 与纯 Python 性能相当,但随着数据集增大,性能呈线性下降。在 100 万向量时,它比使用 HNSW 索引的 Weaviate 慢 16 倍。对于 10 万以下的数据集,sqlite-vec 的简洁性足以弥补性能差距。
另一个重要指标是内存使用。sqlite-vec 会将所有向量加载到内存中以构建虚拟表索引。对于 100 万个 768 维向量(每个 float32 占 4 字节),大约需要 3GB 内存。这在现代笔记本电脑上可行,但在低端边缘设备上则难以承受。
该项目在 GitHub 上的仓库(asg017/sqlite-vec)开发迅速,最近的提交增加了对半精度浮点数(float16)的支持以降低内存占用,并新增了支持增量更新而无需完全重建的 `vss0` 索引。维护者 Alex Garcia 还以 sqlite-http 和 sqlite-js 闻名,这体现了他为 SQLite 扩展现代能力的模式。
关键参与者与案例研究
Alex Garcia 是 sqlite-vec 的主要开发者和维护者。他就职于 Datasette,一家专注于开源数据工具的公司,并有创建创新 SQLite 扩展的记录。他之前的项目包括 sqlite-http(从 SQLite 发起 HTTP 请求)和 sqlite-js(在 SQLite 内运行 JavaScript)。Garcia 的策略是构建模块化、可组合的扩展,将 SQLite 变成数据处理领域的瑞士军刀。
竞品对比
sqlite-vec 进入了一个拥挤的向量搜索工具市场。以下是主要替代方案的对比:
| 产品 | 类型 | 可扩展性 | ANN 支持 | 部署方式 | 成本 |
|---|---|---|---|---|---|
| sqlite-vec | SQLite 扩展 | 单节点,内存型 | 无(仅精确搜索) | 嵌入式,边缘设备 | 免费,开源 |
| Chroma | 嵌入式向量数据库 | 单节点,持久化 | HNSW | 嵌入式,服务器 | 免费,开源 |
| LanceDB | 嵌入式向量数据库 | 单节点,列式存储 | IVF-PQ | 嵌入式,服务器 | 免费,开源 |
| Pinecone | 云向量数据库 | 多节点,分布式 | HNSW | 云 API | $0.10/GB/月 + 查询费用 |
| Weaviate | 云/自托管 | 多节点,分布式 | HNSW | 云,本地部署 | 免费层,之后 $0.25/GB/月 |
| Qdrant | 云/自托管 | 多节点,分布式 | HNSW | 云,本地部署 | 免费层,之后 $0.15/GB/月 |
数据要点: sqlite-vec 占据了一个独特的位置:极致简单性与零基础设施开销的交汇点。它在规模和查询速度上无法与云原生解决方案竞争,但对于本地优先的应用,它提供了最低的摩擦。
案例研究:笔记应用的本地 RAG
一个值得注意的早期采用者是 Obsidian 社区。多个插件现在使用 sqlite-vec 实现笔记间的语义搜索,而无需将数据发送到云服务。典型工作流程:笔记被分块,使用本地模型(例如通过 ONNX runtime 运行的 all-MiniLM-L6-v2)进行嵌入,然后存储在带有 sqlite-vec 的 SQLite 数据库中。查询在本地执行,提供即时结果和完全隐私。这种模式正在被其他笔记和知识管理应用复制。