开源人也要“恰饭”!一个值得学习和借鉴的实现向量搜索的SQLite开源项目:sqlite-vec
仓库:asg017/sqlite-vec
🌟 简介
sqlite-vec
是一个正在开发中的 极其小巧,且速度 “足够快” 的 SQLite 扩展,它可以用来实现 SQLite 数据库中的向量搜索等功能。
它能在任何支持 SQLite 的环境中运行,包括 Linux、MacOS、Windows、浏览器中的 WASM 甚至树莓派等等。
sqlite-vec
于2024年5月发布,它的前身是2023年2月发布的 sqlite-vss
,新项目在安装和使用等方面都更加友好,并且解决了老项目的许多问题,并有着性能更好的 SQL API,更适合所有需要嵌入矢量搜索解决方案的应用程序(如移动端的各种AI应用)。
为什么说国内的开源人都能从这个项目中学习和借鉴呢?请大家耐心看到最后🙂。
项目的作者是 Alex Garcia,他的个人网址在这儿:https://alexgarcia.xyz。
📄 许可证
目前很奇怪的挂了两种授权:Apache-2.0 和 MIT,这些都是相对友好的授权。
作者声明:项目当前仍处于 v1(第1个版本)之前的阶段,因此后续可能会有较大的变更。
▒ 背景
“使用最广的”开源数据库引擎是哪家?
先来考考你:在开源数据库引擎中,哪个引擎号称是世界上最流行的?哪个是最高级的?哪个又是使用最广的?
给
你
一
分
钟
的
时
间
,
先
思
考
一
下
😄
好的,时间到,公布答案。如下都是来自官网的最新截屏。你,猜对了吗?😄
MySQL所谓的“最流行的” 和SQLite所谓的 “使用最广的” 到底有啥区别,大家可以在留言区聊一聊。
根据 SQLite 官网的说明:
SQLite 的使用量可能比所有其他数据库引擎加起来的总和还要多,这个世界有着数十亿份 SQLite 数据库,包括:
每一台Android设备 每一台iPhone和iOS设备 每台 Mac 电脑 每台 Windows10 电脑 每个 Firefox、Chrome 和 Safari 浏览器 大多数电视机和机顶盒 大多数汽车多媒体系统 数以百万计的各种应用程序
SQLite因其 “小、快、可靠” (Small.Fast.Reliable)而广受欢迎,应用确实极……其广泛。
向量数据库是啥?为啥要引入这种技术?
向量数据库(Vector Database)是一种数据库,专门设计用来存储和查询 向量数据。
向量数据是由多个数字组成的数组,常用于表示文本、图像、声音等数据的特征。
向量数据例子(图像数据的颜色特征向量)
在一个极简的图像处理任务中,我们可以将图像中的某个区域用4维向量来表示其颜色特征,例如使用 RGBA(红、绿、蓝和透明度)颜色空间。其中一个像素的4维向量可能是下面这样:
[0.5, 0.8, 0.2, 1.0]
这个向量表示该像素具有50%的红度、80%的绿度、20%的蓝度,并且是完全不透明的(假设1.0表示不透明)。
向量数据库的优势/必要性
从上面例子可以看出,向量数据都是向量形式,跟传统关系型数据库中结构化的数据明显不同。随着大数据和AI的迅猛发展,向量数据库的引入可以满足数据科学和AI领域中的一些特定需求,包括且不限于如下这些:
处理非结构化数据:向量数据库能有效处理非结构化的数据,如文本、图像和声音等,这在传统的关系型数据库中处理起来非常复杂。 支持高级搜索和相似性查询:机器学习和深度学习等的发展,产生了大量基于向量的数据(如词向量、图片特征向量等)。向量数据库可以存储这些数据,并支持基于向量的相似性搜索,这在传统数据库中很难实现。 提高效率:向量数据库通过使用专门为向量数据设计的索引结构(如KD-树、LSH、PQ等),可以大大提高查询效率,尤其是对于大规模向量数据的搜索。 适应AI应用的需求:推荐系统、图像识别、自然语言处理等AI应用在处理数据时常常需要用到向量搜索,向量数据库为这些应用提供了基础的数据存储和查询支持。 促进数据融合与创新:向量数据库能够整合不同来源和格式的数据,促进数据的融合与创新,为AI应用提供更加丰富的数据支持。
引入向量数据库是技术发展的必然趋势,它能够更好地满足现代数据处理的需求,尤其是在人工智能领域,向量数据库的应用将越来越广泛。
🔧 功能特点
提供 自定义SQL函数 和 虚拟表 vec0
,用于对float、int8 和二进制向量的存储和快速向量搜索。纯 C 语言编写,无任何依赖项,可以在任何支持 SQLite 的地方运行。之前, sqlite-vss
依赖于Faiss
,因此仅适用于 Linux 和 MacOS 。之前的二进制文件大到 3MB-5MB 左右,而现在只有 100KB 左右。使用 rowid IN (...)
子查询来预过滤向量。提供用于向量处理的其它工具和实用程序(量化、JSON/BLOB/numpy 转换、向量算术等)。
⚠️ 注意事项
该项目的最新版为3天前发布的 v0.1.1,目前尚未达到 v1 版本,随时可能会有重大更新和更改,使用时需要注意。
🛠️ 安装方法
sqlite-vec
支持多种编程语言的安装方式,以下是部分语言的安装命令和更多信息链接:
Python: pip install sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/python.html JavaScript / Node.js: npm install sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/js.html Ruby: gem install sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/ruby.html Go: go get -u github.com/asg017/sqlite-vec/bindings/go
说明:https://alexgarcia.xyz/sqlite-vec/go.html Datasette: datasette install datasette-sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/datasette.html sqlite-utils: sqlite-utils install sqlite-utils-sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/sqlite-utils.html Rust: cargo add sqlite-vec
说明:https://alexgarcia.xyz/sqlite-vec/rust.html C/C++: sqlite-vec项目是单个 sqlite-vec.c 和 sqlite-vec.h 文件。它们可以集成到你的 C/C++ 项目中,并正常编译。
示例用法
以下是使用 sqlite-vec
创建虚拟表、插入向量数据以及执行 KNN 查询的示例 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]'),
(3, '[0.716, -0.927, 0.134, 0.052, -0.669, 0.793, -0.634, -0.162]'),
(4, '[-0.710, 0.330, 0.656, 0.041, -0.990, 0.726, 0.385, -0.958]');
-- 类似 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;
/*
┌───────┬──────────────────┐
│ rowid │ distance │
├───────┼──────────────────┤
│ 2 │ 2.38687372207642 │
│ 1 │ 2.38978505134583 │
└───────┴──────────────────┘
*/
在 Python 中使用sqlite-vec
一个简单示例如下:
import sqlite3
import sqlite_vec
db = sqlite3.connect(":memory:")
db.enable_load_extension(True)
sqlite_vec.load(db)
db.enable_load_extension(False)
vec_version, = db.execute("select vec_version()").fetchone()
print(f"vec_version={vec_version}")
一个完整示例如下:
import sqlite3
import sqlite_vec
from typing import List
import struct
def serialize_f32(vector: List[float]) -> bytes:
"""serializes a list of floats into a compact "raw bytes" format"""
return struct.pack("%sf" % len(vector), *vector)
db = sqlite3.connect(":memory:")
db.enable_load_extension(True)
sqlite_vec.load(db)
db.enable_load_extension(False)
sqlite_version, vec_version = db.execute(
"select sqlite_version(), vec_version()"
).fetchone()
print(f"sqlite_version={sqlite_version}, vec_version={vec_version}")
items = [
(1, [0.1, 0.1, 0.1, 0.1]),
(2, [0.2, 0.2, 0.2, 0.2]),
(3, [0.3, 0.3, 0.3, 0.3]),
(4, [0.4, 0.4, 0.4, 0.4]),
(5, [0.5, 0.5, 0.5, 0.5]),
]
query = [0.3, 0.3, 0.3, 0.3]
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])")
with db:
for item in items:
db.execute(
"INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)",
[item[0], serialize_f32(item[1])],
)
rows = db.execute(
"""
SELECT
rowid,
distance
FROM vec_items
WHERE embedding MATCH ?
ORDER BY distance
LIMIT 3
""",
[serialize_f32(query)],
).fetchall()
print(rows)
💰 赞助商
好啦,“Last but not least”,我们来聊一聊开源人“不耻”(不好意思)谈及的钱💰,以及为啥这个项目值得国内的开源人学习和借鉴。
根据作者在主页上所述,sqlite-vec
的开发得到了多个赞助商的慷慨支持,其中 Mozilla 是主要的赞助商(大金主😍)。此外,还有来自 Fly.io、Turso、SQLite Cloud 以及多个个人支持者的赞助。
开源项目大多是开发者充满激情开始做的项目,但开发者也都是一个个有血有肉、需要“恰饭”的大活人😄,纯纯的 “用爱发电” 难以维系项目持久、更好的发展,因此很多原本很好的开源项目,最后都落得没人维护和更新,甚至存档关张的结局😭。
国内的开源开发者们,完全可以学习、借鉴下这个开源项目的路数。
简单总结下,这个项目对于国内的开源人来说,至少包括如下启示:
与其纯粹跟着兴趣走,不妨 把自己的兴趣跟开源社区的需求结合起来,这样既贡献开源社区,又能获得一定经济收益,保证开源活动可以持续地进行。 不分中外,多搜、多看相关赞助商信息,别不好意思“恰饭”,适时主动出击,积极去拉赞助或申请开源支持计划。 在一些应用广泛的开源领域深耕下去。本项目的作者 Alex Garcia 有着很好的“开源前科”😄,他之前做了多个开源项目,其中有不少都集中在 SQLite 领域(插件列表在这儿:https://github.com/asg017/sqlite-ecosystem),这也为他申请到 SQLite 相关的赞助打下了坚实的基础。
简单介绍下 Mozilla Builders 计划
随着人工智能的快速发展,希望在台式机、笔记本电脑、智能手机甚至边缘设备上运行本地AI应用的需求暴涨。但由于目前算法、算力、存储等的诸多限制,现状和理想还差得很远,很多开源大模型动辄需要几十G显存、几百G存储空间才能推理,更不要提微调、训练了。
Mozilla最近宣布的 Builders 计划支持推动开源AI事业的项目,首届主题是 “本地人工智能(Local AI)” 。
Mozilla对本地AI这一领域非常感兴趣,因为它能通过将AI技术直接交到用户手中来促进更好的隐私和控制。它还希望通过降低成本使AI的开发更加自主,让个人开发者和小型社区都可以用到强大的AI工具。
作为 Mozilla Builders 的一部分,他们还推出了一个 加速器计划 (https://future.mozilla.org/builders/blog/announcing-mozilla-builders),开发者可以申请加入。与此同时,他们也一直在积极招募他们认为有潜力推动 AI 发展的特定开源项目,并将从 Mozilla 的投资、专业知识和支持中受益。
2024年的计划是 Mozilla Builders 2024 加速器
,它将资助和支持对开源 AI 生态系统至关重要的、有影响力的项目。选定的项目将获得高达 100,000 美元的非稀释性资金,并参与为期 12 周的重点计划。
可惜的是,今年的申请已经结束,2024 年 9 月 12 日加速器计划将进入启动阶段,然后 2024 年 12 月 5 日是演示日。
第一个这样的 Builders 项目,是由开源开发者 Justine Tunney 领导的 llamafile (https://llamafile.ai)。llamafile 只需要单个文件,就能进行开源AI大模型的分发和运行,它甚至能在没有独立 GPU 的普通消费级硬件上快速运行,这让每一个普通人都能更容易地获得AI和使用AI。
其他资源
sqlite-ecosystem:https://github.com/asg017/sqlite-ecosystem,作者把他开发的十来个 SQLite 扩展都列在这个SQLite生态项目中了。 sqlite-rembed:https://github.com/asg017/sqlite-rembed,从远程 API(如 OpenAI/Nomic/Ollama)生成文本嵌入,主要用于测试和 SQL 脚本。 sqlite-lembed:https://github.com/asg017/sqlite-lembed,从 .gguf
格式的嵌入模型本地生成文本嵌入。
参考链接
项目主页:https://github.com/asg017/sqlite-vec
作者主页:https://alexgarcia.xyz 作者所有的跟SQLite相关的开源项目:https://github.com/asg017/sqlite-ecosystem 作者博客:https://alexgarcia.xyz/blog/2024/building-new-vector-search-sqlite/index.html Mozilla Builders官网:https://future.mozilla.org/builders/ 宣布推出 Mozilla Builders:https://future.mozilla.org/builders/blog/announcing-mozilla-builders Mozilla对sqlite-vec的赞助说明:https://hacks.mozilla.org/2024/06/sponsoring-sqlite-vec-to-enable-more-powerful-local-ai-applications
近期文章:
- 最近又有哪些热门的开源项目?20240804
- 最近又有哪些热门的开源项目?20240802
- 近一周的免费人工智能新闻和福利(网址)
- DiceDB:一个创新的、开源免费的实时数据库系统
- 炎炎夏日,拯救你的最新的免费AI、免费人工智能福利
- 指挥大师:一个Netflix开源的通用工作流编排器 Maestro
- 数字时代,每个人都必须知道的关于数据安全的3-2-1原则
- Python中为什么“四舍五入”函数round(1.5)等于2,而round(2.5)也等于2?!round()函数详解