介绍
sqlite-vec 是轻量级、零依赖、跨平台的 SQLite 向量搜索扩展,由 Alex Garcia 开发,作为 sqlite-vss 的继任者,可直接在 SQLite 中存储、索引、检索高维向量,适配嵌入式/边缘/浏览器等全场景,核心优势是单文件、纯C、无依赖、SQL原生接口。
定位
- 嵌入式向量引擎:给 SQLite 加向量能力,替代独立向量库(如 FAISS、Pinecone)做轻量检索
- 混合搜索底座:支持“结构化过滤 + 向量相似度”联合查询
- 全场景适配:服务器/桌面/移动端/浏览器(WASM)/树莓派等,无外部依赖
设计哲学
- 单文件极简:核心仅
sqlite-vec.c/.h,编译后 ~100KB - SQL 原生:用标准 SQL 做向量 CRUD,无新查询语言
- 虚拟表(Virtual Table):vec0 虚拟表封装索引逻辑,对用户透明
- 零依赖:纯 C 编写,静态链接,适配资源受限环境
应用场景
- 轻量 RAG:本地知识库、文档问答(替代 Chroma)
- 嵌入式 AI:手机/平板/物联网设备的图像/文本检索
- 混合搜索:电商商品(标题+图片向量)、内容平台(文本+语义)
- 多租户系统:分区键隔离不同用户向量数据
缺点
- 大规模瓶颈:>100 万向量时,性能低于 FAISS
- ANN 功能有限:仅支持 PQ,无 HNSW(计划中)
- WASM 性能:浏览器中比原生慢 2–3 倍
特性
v0.1.x 最新
1. 向量类型支持
- float32:默认,768/1536 维常见(如 OpenAI Embedding)
- int8:量化压缩,节省50%空间,适合大规模数据
- bit:二进制向量(如 256/512 位),汉明距离检索
2. 距离 metric(相似度计算)
- L2 距离(欧氏距离):默认,数值越小越相似
- 余弦相似度:归一化后,值越大越相似(文本/图像常用)
- 汉明距离:二进制向量专用,差异位计数
3. 索引与性能
- 默认暴力检索(Brute-force):精确、无训练成本,10万维内足够快
- ANN 近似索引(可选):v0.1+ 支持 PQ(Product Quantization),百万级向量提速 5–10 倍
- 分区键(Partition Key):支持多租户,按 tenant_id 分区隔离数据
- 预过滤优化:结构化 WHERE 先过滤,再算向量距离,大幅提速
4. 平台与集成
- 全平台编译:Linux/macOS/Windows(x86/ARM)、WASM、iOS/Android
- 多语言绑定:Python/Node.js/Rust/Go/Java
- 许可证:MIT/Apache-2.0 双许可,商业友好
架构原理
1. 虚拟表模型
CREATE VIRTUAL TABLE vec_movies
USING vec0(
embedding float[768], -- 768维float32向量
title TEXT, -- 结构化字段
partition_id INTEGER -- 分区键(可选)
);
- vec0:核心虚拟表模块,管理向量存储、索引、检索
- 存储层:向量以紧凑 BLOB 存,元数据存在 SQLite 系统表
- 索引层:暴力检索直接扫描 BLOB;ANN 索引用 PQ 压缩+聚类
2. 数据流向
- 写入:INSERT 时,向量转 BLOB 存,同时建索引(暴力/ANN)
- 查询:MATCH 子句触发向量检索,先过滤分区/结构化条件,再算距离排序
- 结果:返回 rowid、distance、关联字段,支持 LIMIT/KNN
python安装
pip安装
pip install sqlite-vec # 含预编译扩展,自动适配系统
uv安装
uv add sqlite-vec # 含预编译扩展,自动适配系统
目前稳定版
uv add sqlite-vec==0.1.9
基础用法(Python)
import sqlite3
import sqlite_vec
# 1. 连接并加载扩展
conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
sqlite_vec.load(conn) # 加载 vec0 扩展
conn.enable_load_extension(False)
# 2. 创建向量虚拟表
conn.execute("""
CREATE VIRTUAL TABLE vec_docs
USING vec0(embedding float[768], content TEXT);
""")
# 3. 插入向量(JSON 或 BLOB)
# 示例:生成随机 768 维向量
import numpy as np
vec = np.random.rand(768).astype(np.float32).tobytes()
conn.execute(
"INSERT INTO vec_docs (embedding, content) VALUES (?, ?)",
(vec, "示例文本")
)
# 4. KNN 相似度查询(余弦距离,Top5)
query_vec = np.random.rand(768).astype(np.float32).tobytes()
rows = conn.execute("""
SELECT rowid, distance, content
FROM vec_docs
WHERE embedding MATCH ?
ORDER BY distance
LIMIT 5;
""", (query_vec,)).fetchall()
print(rows)
关键 SQL 语法
1. 创建虚拟表
-- 基础:768维float32向量
CREATE VIRTUAL TABLE vec1 USING vec0(embedding float[768]);
-- 带分区+结构化字段
CREATE VIRTUAL TABLE vec2 USING vec0(
emb float[512],
user_id INTEGER,
partition_id INTEGER
);
2. 插入向量
-- 方式1:JSON 数组(方便调试)
INSERT INTO vec1 (embedding) VALUES ('[0.1, 0.2, ...]');
-- 方式2:BLOB(高性能,推荐)
INSERT INTO vec1 (embedding) VALUES (X'010203...');
3. 相似度查询(MATCH 子句)
-- L2 距离(默认),Top10
SELECT rowid, distance FROM vec1 WHERE embedding MATCH ? ORDER BY distance LIMIT 10;
-- 余弦相似度(需指定)
SELECT rowid, distance FROM vec1
WHERE embedding MATCH ?
DISTANCE_METRIC = 'cosine'
ORDER BY distance LIMIT 10;
-- 混合查询:结构化过滤 + 向量
SELECT rowid, distance FROM vec2
WHERE user_id = 123 AND embedding MATCH ?
ORDER BY distance LIMIT 5;
性能与选型建议
1. 暴力检索(默认)
- 适用:向量数 < 10 万,维度 < 1536
- 优势:精确、无训练、无内存开销
- 性能:10 万 768 维向量,单查询 ~10ms(普通 CPU)
2. ANN 索引(PQ,v0.1+)
- 适用:向量数 > 10 万,需低延迟
- 优势:提速 5–10 倍,内存占用降 70%
- 代价:训练成本(一次性),召回率略降(95%+)
3. 选型对比
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| sqlite-vec | 零依赖、SQL原生、全平台 | 大规模(>100万)略慢 | 嵌入式、边缘、轻量RAG |
| FAISS | 极致性能、ANN优化 | 依赖重、C++、难集成 | 服务器大规模检索 |
| Pinecone | 托管、弹性 | 成本高、网络依赖 | 云原生大规模RAG |
总结
sqlite-vec 是嵌入式向量搜索的最优解,以零依赖、跨平台、SQL 原生为核心,完美适配轻量 RAG、边缘 AI、混合搜索场景。若需大规模检索,可作为 FAISS/Pinecone 的补充;若追求极简部署,直接替代独立向量库。