sqlite-vss
[!警告]
sqlite-vss
已停止积极开发。我现在的精力转向了sqlite-vec
,这是一个类似的向量搜索SQLite扩展,但比sqlite-vss
更易安装和使用。更多信息请参见这篇博文。
sqlite-vss
(SQLite 向量相似度搜索)是一个基于Faiss的SQLite扩展,为SQLite带来了向量搜索功能。它可用于构建语义搜索引擎、推荐系统或问答工具。
查看介绍sqlite-vss:用于向量搜索的SQLite扩展(2023年2月)了解更多详情和在线示例!
如果您的公司或组织发现这个库有用,请考虑支持我的工作!
使用方法
.load ./vector0
.load ./vss0
select vss_version(); -- 'v0.0.1'
sqlite-vss
的API与fts5
全文搜索扩展类似。使用vss0
模块创建虚拟表,以高效存储和查询您的向量。
-- 384是本例中的维度数
create virtual table vss_articles using vss0(
headline_embedding(384),
description_embedding(384)
);
sqlite-vss
是一个自带向量的数据库,兼容您拥有的任何嵌入或向量数据。考虑使用OpenAI的嵌入API、HuggingFace的推理API、sentence-transformers
或这些开源模型中的任何一个。在本例中,我们使用sentence-transformers/all-MiniLM-L6-v2从文本生成384维的嵌入。
您可以以JSON或原始字节的形式将向量插入vss0
表中。
insert into vss_articles(rowid, headline_embedding)
select rowid, headline_embedding from articles;
要查询相似向量("k个最近邻"),请在WHERE
子句中使用vss_search
函数。这里我们搜索articles
表中第123行嵌入的100个最近邻。
select rowid, distance
from vss_articles
where vss_search(
headline_embedding,
(select headline_embedding from articles where rowid = 123)
)
limit 100;
您可以根据需要对这些表执行INSERT
和DELETE
操作,但UPDATE
操作尚不支持。这可以与触发器一起使用,以自动更新索引。另外请注意,只插入几行的"小型"INSERT
/DELETE
操作可能会很慢,因此请在必要时进行批处理。
begin;
delete from vss_articles
where rowid between 100 and 200;
insert into vss_articles(rowid, headline_embedding, description_embedding)
values (:rowid, :headline_embedding, :description_embedding)
commit;
您可以为特定列传入自定义Faiss工厂字符串,以控制Faiss索引的存储和查询方式。默认的工厂字符串是"Flat,IDMap2"
,随着数据库增长,查询可能会变慢。这里,我们添加了一个具有4096个质心的倒排文件索引,这是一个非穷举选项,可以大大加快大型数据库查询。
create virtual table vss_ivf_articles using vss0(
headline_embedding(384) factory="IVF4096,Flat,IDMap2",
description_embedding(384) factory="IVF4096,Flat,IDMap2"
);
这个IVF需要训练!您可以在单个事务中使用INSERT
命令定义训练数据,并使用特殊的operation="training"
约束。
insert into vss_ivf_articles(operation, headline_embedding, description_embedding)
select
'training',
headline_embedding,
description_embedding
from articles;
注意!需要训练的索引可能需要很长时间。以本例基于的新闻类别数据集(386维超过21万个向量)为例,默认索引需要8秒钟构建。但使用自定义的"IVF4096,Flat,IDMap2"
工厂,训练需要45分钟,插入数据需要4.5分钟!这可能可以通过使用更小的训练集来减少,但更快的查询可能会有帮助。
文档
有关自行编译sqlite-vss
的说明以及完整的SQL API参考,请参阅docs.md
。
安装
Releases页面包含适用于Linux x86_64和MacOS x86_64(MacOS Big Sur 11或更高版本)的预构建二进制文件。未来将提供更多预编译目标。此外,sqlite-vss
还在常见的包管理器上分发,如Python的pip
和Node.js的npm
,详情请见下文。
请注意,在Linux机器上,您需要安装一些包才能使这些选项正常工作:
sudo apt-get update
sudo apt-get install -y libgomp1 libatlas-base-dev liblapack-dev
注意: 文件名中的
0
(vss0.dylib
/vss0.so
)表示sqlite-vss
的主版本号。目前sqlite-vss
处于1.0版本之前,因此在未来版本中可能会有重大变化。 | 语言 | 安装 | 更多信息 | | | ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Python |pip install sqlite-vss
| Python 中的sqlite-vss
| | | Datasette |datasette install datasette-sqlite-vss
| Datasette 中的sqlite-vss
| | | Node.js |npm install sqlite-vss
| Node.js 中的sqlite-vss
| | | Deno |deno.land/x/sqlite_vss
| Deno 中的sqlite-vss
| | | Ruby |gem install sqlite-vss
| Ruby 中的sqlite-vss
| | | Elixir |hex.pm/packages/sqlite_vss
| Elixir 中的sqlite-vss
| | | Go |go get -u github.com/asg017/sqlite-vss/bindings/go
| Go 中的sqlite-vss
| | | Rust |cargo add sqlite-vss
| Rust 中的sqlite-vss
| | | Github 发布 | | | |
在 sqlite3
命令行界面中使用
要在官方 SQLite 命令行 shell中使用 sqlite-vss
,请从发布版本中下载 vector0.dylib
/vss0.dylib
(适用于 MacOS Big Sur 11 或更高版本)或 vector0.so
/vss0.so
(适用于 Linux)文件,并将其加载到您的 SQLite 环境中。
vector0
扩展是必需的依赖项,因此请确保在加载 vss0
之前先加载它。
.load ./vector0
.load ./vss0
select vss_version();
-- v0.0.1
Python
对于 Python 开发者,使用以下命令安装 sqlite-vss
包:
pip install sqlite-vss
import sqlite3
import sqlite_vss
db = sqlite3.connect(':memory:')
db.enable_load_extension(True)
sqlite_vss.load(db)
version, = db.execute('select vss_version()').fetchone()
print(version)
更多详情请参阅 bindings/python
。
Node.js
对于 Node.js 开发者,使用以下命令安装 sqlite-vss
npm 包:
npm install sqlite-vss
import Database from "better-sqlite3"; // 也兼容 node-sqlite3
import * as sqlite_vss from "sqlite-vss";
const db = new Database(":memory:");
sqlite_vss.load(db);
const version = db.prepare("select vss_version()").pluck().get();
console.log(version);
更多详情请参阅 npm/sqlite-vss/README.md
。
Deno
对于 Deno 开发者,使用 deno.land/x/sqlite_vss 模块:
// 需要所有权限 (-A) 和 --unstable 标志
import { Database } from "https://deno.land/x/sqlite3@0.8.0/mod.ts";
import * as sqlite_vss from "https://deno.land/x/sqlite_vss/mod.ts";
const db = new Database(":memory:");
db.enableLoadExtension = true;
sqlite_vss.load(db);
const [version] = db.prepare("select vss_version()").value<[string]>()!;
console.log(version);
更多详情请参阅 deno/sqlite-vss/README.md
。
Datasette
对于 Datasette,使用以下命令安装 datasette-sqlite-vss
插件:
datasette install datasette-sqlite-vss
更多详情请参阅 bindings/datasette
。
缺点
- 底层 Faiss 索引的大小上限为 1GB。请关注 #1 以获取更新。
- 暂不支持在 KNN 搜索之上进行额外过滤。请关注 #2 以获取更新。
- 目前仅支持 CPU Faiss 索引,尚不支持 GPU。请关注 #3 以获取更新。
- 尚不支持内存映射索引,因此索引必须适合 RAM。请关注 #4 以获取更新。
- 该扩展使用 C++ 编写,尚未进行模糊测试。请关注 #5 以获取更新。
- 不支持对 vss0 虚拟表执行
UPDATE
语句,但支持INSERT
和DELETE
语句。请关注 #7 以获取更新。
支持
我(Alex 👋🏼)在这个项目和许多其他开源项目上投入了大量时间和精力。如果您的公司或组织使用这个库(或您想表示慷慨),请考虑赞助我的工作,与朋友分享这个项目,或雇用我进行合同/咨询工作!
另请参阅
sqlite-http
,用于发送 HTTP 请求的 SQLite 扩展sqlite-xsv
,用于快速查询 CSV 的 SQLite 扩展sqlite-loadable-rs
,用于使用 Rust 构建 SQLite 扩展的框架