
sqlite-vec 向量搜索从零到落地5 步在本地 SQLite 里跑通相似性检索【免费下载链接】sqlite-vecA vector search SQLite extension that runs anywhere!项目地址: https://gitcode.com/GitHub_Trending/sq/sqlite-vec想让个人工具、笔记或 RAG 应用做“找相似”又不想为此多部署一个向量数据库、多养一个常驻服务sqlite-vec 把向量相似性搜索做成一个 SQLite 扩展装进你现有的.db文件用一条MATCH语句就能做 KNN 检索数据全程不出本机。本文用 Python 走一遍最短接入路径——装包、建vec0表、写入向量、发出第一次 KNN 查询再给出批量写入、分区键、量化三个调优点和最容易卡住的三个坑。它解决什么问题在任意能跑 SQLite 的平台上做向量存储与 KNN 检索纯 C、零依赖Linux/macOS/Windows、浏览器 WASM、树莓派都能跑数据就是本地一个.db文件。支持float32、int8、bit三种向量类型vec0虚拟表可内联元数据列、辅助列和分区键建表即带索引。适合场景本地/端侧 RAG、笔记与文件相似搜索、离线检索、轻量推荐数据量到几十万~百万级。边界目前仅暴力检索brute-force没有 ANN 图索引亿级规模、GPU 加速、高并发在线服务不是它的定位那种需求去看专门的向量数据库。 最快跑通路径5 步安装、建表、写入与首次 KNN 查询环境一行带过Python 3.8 与 pip 即可建议 SQLite ≥ 3.41用python -c import sqlite3; print(sqlite3.sqlite_version)查看当前版本。装依赖。扩展以 pip 包形式自带预编译二进制装完即用无需自己编译 C 代码。pip install sqlite-vec建立连接并加载扩展。sqlite_vec.load(db)把vec0、vec_f32等函数注入到这条 SQLite 连接上。import sqlite3, sqlite_vec db sqlite3.connect(sample.db) db.enable_load_extension(True) sqlite_vec.load(db) db.enable_load_extension(False) print(db.execute(select vec_version()).fetchone())预期打印出扩展版本号说明加载成功。建表并写入第一条向量。用serialize_float32把浮点列表转成紧凑 BLOB存入vec0表。from sqlite_vec import serialize_float32 db.execute(create virtual table vec_items using vec0(embedding float[4])) db.execute( insert into vec_items(rowid, embedding) values (?, ?), [1, serialize_float32([0.1, 0.1, 0.1, 0.1])], ) db.commit()发出第一次 KNN 查询。MATCH加ORDER BY distance即最邻近搜索。rows db.execute( select rowid, distance from vec_items where embedding match ? order by distance limit 3 , [serialize_float32([0.3, 0.3, 0.3, 0.3])]).fetchall() print(rows)预期按距离从小到大返回最近的几条rowid。让它更快批量写入、分区键与量化调优批量写入事务内一次提交单条 autocommit 写几万条会反复落盘。把插入包进一个事务用executemany批量写rows [(i, serialize_float32(v)) for i, v in enumerate(vectors)] with db: db.executemany( insert into vec_items(rowid, embedding) values (?, ?), rows )分区键把检索限定到子集数据可按用户或日期分片查询时先预过滤只对目标分片做检索create virtual table vec_docs using vec0( doc_id integer primary key, user_id integer partition key, contents_embedding float[1024]); select doc_id, distance from vec_docs where contents_embedding match ? and user_id ? and k 20;经验法则每个唯一分区值最好对应上百条向量否则过度分片反而拖慢 KNN。量化bit/int8 压缩索引再 rescorefloat32每维 4 字节量大时用量化压缩二值化做粗排再用原始向量精排with coarse as ( select rowid, contents_embedding from vec_docs where coarse_embedding match vec_quantize_binary(?) order by distance limit 160 ) select rowid, vec_distance_L2(contents_embedding, ?) from coarse order by 2 limit 20; 最容易踩的坑加载扩展、维度不匹配与 SQLite 版本坑一sqlite3.Connection object has no attribute enable_load_extension现象加载扩展直接抛AttributeError。原因macOS 系统自带 Python 捆绑的 SQLite 未开启扩展支持。处理改用 Homebrew 的 Pythonbrew install python或升级到自带较新 SQLite 的 Python 版本。坑二KNN 无结果或维度报错现象MATCH查询返回空或提示向量长度不符。原因查询向量维度与建表声明的float[N]不一致。处理用select vec_length(?)核对维度确保MATCH的向量与列声明同维。坑三旧版 SQLite 下LIMIT结果异常现象ORDER BY distance LIMIT k在老版本上结果不对。原因vec0的LIMIT优化依赖 SQLite ≥ 3.41。处理改用and k 20形式限定条数或把 SQLite 升级到 3.41。深入用法见 site/using/python.md 与 site/features/knn.md可运行示例见 examples/simple-python/demo.py。【免费下载链接】sqlite-vecA vector search SQLite extension that runs anywhere!项目地址: https://gitcode.com/GitHub_Trending/sq/sqlite-vec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考