字
字节笔记本
2026年2月20日
sqlite-vec:SQLite 向量搜索扩展
本文介绍 sqlite-vec,一个可以在任何地方运行的 SQLite 向量搜索扩展,支持存储和查询 float、int8、binary 向量,无需依赖,纯 C 编写。
sqlite-vec 简介
sqlite-vec 是由 Alex Garcia (asg017) 开发的开源 SQLite 扩展,为 SQLite 数据库提供向量搜索功能。该项目在 GitHub 上已获得 7k stars 和 282 forks,采用 Apache-2.0 和 MIT 双许可证。
核心定位:A vector search SQLite extension that runs anywhere!
项目状态:pre-v1(可能存在破坏性变更)
核心特性
- 纯 C 编写:无依赖,可在任何 SQLite 运行的地方运行
- 多平台支持:Linux/MacOS/Windows、WASM 浏览器环境、Raspberry Pi 等
- 多种向量类型:支持 float、int8、binary 向量
- 虚拟表设计:使用
vec0虚拟表存储向量数据 - 元数据支持:支持元数据列、辅助列和分区键列
- 多语言绑定:Python、Node.js、Ruby、Go、Rust 等
技术栈
| 语言 | 占比 | 用途 |
|---|---|---|
| C | 59.9% | 核心扩展实现 |
| Python | 31.1% | Python 绑定和工具 |
| Makefile | 2.1% | 构建系统 |
| Rust | 1.8% | Rust 绑定 |
| TypeScript | 1.7% | TypeScript 支持 |
| Vue | 1.1% | 文档网站 |
安装方法
Python
bash
pip install sqlite-vecNode.js
bash
npm install sqlite-vecRuby
bash
gem install sqlite-vecGo
bash
go get -u github.com/asg017/sqlite-vec/bindings/goRust
bash
cargo add sqlite-vecDatasette
bash
datasette install datasette-sqlite-vecsqlite-utils
bash
sqlite-utils install sqlite-utils-sqlite-vec快速开始
SQL 方式使用
sql
-- 加载扩展
.load ./vec0
-- 创建向量虚拟表
create virtual table vec_examples using vec0(
sample_embedding float[8]
);
-- 插入向量数据(JSON 格式)
insert into vec_examples(rowid, sample_embedding)
values
(1, '[-0.200, 0.250, 0.341, -0.211, 0.645, 0.935, -0.316, -0.924]'),
(2, '[0.443, -0.501, 0.355, -0.771, 0.707, -0.708, -0.185, 0.362]');
-- KNN 相似度搜索
select rowid, distance from vec_examples
where sample_embedding match '[0.890, 0.544, 0.825, 0.961, 0.358, 0.0196, 0.521, 0.175]'
order by distance
limit 2;Python 示例
python
import sqlite_vec
import sqlite3
# 连接数据库
db = sqlite3.connect(":memory:")
db.enable_load_extension(True)
sqlite_vec.load(db)
db.enable_load_extension(False)
# 创建向量表
db.execute("""
CREATE VIRTUAL TABLE vec_items USING vec0(
embedding float[4]
)
""")
# 插入向量
db.execute("""
INSERT INTO vec_items(rowid, embedding)
VALUES
(1, '[0.1, 0.2, 0.3, 0.4]'),
(2, '[0.5, 0.6, 0.7, 0.8]')
""")
# 搜索相似向量
results = db.execute("""
SELECT rowid, distance
FROM vec_items
WHERE embedding MATCH '[0.1, 0.2, 0.3, 0.4]'
ORDER BY distance
LIMIT 3
""").fetchall()
for rowid, distance in results:
print(f"rowid={rowid}, distance={distance}")支持的向量类型
| 类型 | 说明 | 示例 |
|---|---|---|
float[n] | 浮点向量 | float[768] |
int8[n] | 8位整数向量 | int8[128] |
binary[n] | 二进制向量 | binary[64] |
核心概念
虚拟表 vec0
vec0 是 sqlite-vec 的核心虚拟表,用于存储向量数据:
sql
CREATE VIRTUAL TABLE my_vectors USING vec0(
-- 向量列(必需)
embedding float[768],
-- 元数据列(可选)
+text_content TEXT,
+created_at INTEGER,
-- 分区键(可选,用于优化)
partition_key TEXT
);查询语法
使用 MATCH 操作符进行相似度搜索:
sql
SELECT rowid, distance
FROM my_vectors
WHERE embedding MATCH ?
ORDER BY distance
LIMIT 10;输入格式
- JSON 数组:
'[0.1, 0.2, 0.3, 0.4]' - 紧凑二进制:更高效的二进制格式(大向量推荐)
高级用法
元数据过滤
sql
-- 结合元数据进行过滤
SELECT rowid, distance, text_content
FROM vec_items
WHERE embedding MATCH '[0.1, 0.2, 0.3, 0.4]'
AND created_at > 1700000000
ORDER BY distance
LIMIT 10;分区键优化
对于大规模数据,使用分区键可以提高查询性能:
sql
CREATE VIRTUAL TABLE partitioned_vectors USING vec0(
embedding float[768],
partition_key TEXT
);
-- 查询特定分区
SELECT * FROM partitioned_vectors
WHERE embedding MATCH '[...]'
AND partition_key = 'category_a'
ORDER BY distance;适用场景
- 本地 RAG 应用:无需外部向量数据库
- 边缘设备:Raspberry Pi 等资源受限环境
- 浏览器应用:WASM 支持,纯前端向量搜索
- 嵌入式系统:零依赖,轻量级部署
- 快速原型:SQLite 的便利性 + 向量搜索能力
相关项目
- sqlite-vss:sqlite-vec 的前身项目
- sqlite-ecosystem:更多 SQLite 扩展集合
- sqlite-rembed:远程 API 嵌入生成
- sqlite-lembed:本地 .gguf 模型嵌入
赞助商
- Mozilla Builders:主要赞助商
- Fly.io:云服务支持
- Turso:SQLite 云服务
- SQLite Cloud:数据库云服务
- Shinkai:AI 基础设施
项目链接
- GitHub 仓库:https://github.com/asg017/sqlite-vec
- 官方文档:https://alexgarcia.xyz/sqlite-vec/
- Python 包:https://pypi.org/project/sqlite-vec/
- Node.js 包:https://www.npmjs.com/package/sqlite-vec
总结
sqlite-vec 为 SQLite 带来了强大的向量搜索能力,其纯 C 实现确保了极致的可移植性和性能。无论是构建本地 RAG 应用、边缘设备部署,还是浏览器端向量搜索,sqlite-vec 都是一个轻量级且功能完善的选择。
分享: