开源人也要“恰饭”!一个值得学习和借鉴的实现向量搜索的SQLite开源项目:sqlite-vec

文摘   科技   2024-08-11 22:46   江苏  

开源人也要“恰饭”!一个值得学习和借鉴的实现向量搜索的SQLite开源项目:sqlite-vec

sqlite-vec Logo

仓库: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。

Alex Garcia个人主页及主要项目、演讲一览

📄 许可证

目前很奇怪的挂了两种授权:Apache-2.0MIT,这些都是相对友好的授权。

作者声明:项目当前仍处于 v1(第1个版本)之前的阶段,因此后续可能会有较大的变更。

▒ 背景

“使用最广的”开源数据库引擎是哪家?

先来考考你:在开源数据库引擎中,哪个引擎号称是世界上最流行的?哪个是最高级的?哪个又是使用最广的

😄

好的,时间到,公布答案。如下都是来自官网的最新截屏。你,猜对了吗?😄

MySQL: The world's most popular open source database
PostgreSQL: The World's Most Advanced Open Source Relational Database
SQLite is the most used database engine in the world.

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领域中的一些特定需求,包括且不限于如下这些:

  1. 处理非结构化数据:向量数据库能有效处理非结构化的数据,如文本、图像和声音等,这在传统的关系型数据库中处理起来非常复杂。
  2. 支持高级搜索和相似性查询:机器学习和深度学习等的发展,产生了大量基于向量的数据(如词向量、图片特征向量等)。向量数据库可以存储这些数据,并支持基于向量的相似性搜索,这在传统数据库中很难实现。
  3. 提高效率:向量数据库通过使用专门为向量数据设计的索引结构(如KD-树、LSH、PQ等),可以大大提高查询效率,尤其是对于大规模向量数据的搜索。
  4. 适应AI应用的需求:推荐系统、图像识别、自然语言处理等AI应用在处理数据时常常需要用到向量搜索,向量数据库为这些应用提供了基础的数据存储和查询支持。
  5. 促进数据融合与创新:向量数据库能够整合不同来源和格式的数据,促进数据的融合与创新,为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
  • Datasettedatasette 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, distancefrom vec_exampleswhere sample_embedding match '[0.890, 0.544, 0.825, 0.961, 0.358, 0.0196, 0.521, 0.175]'order by distancelimit 2;
/*┌───────┬──────────────────┐│ rowid │ distance │├───────┼──────────────────┤│ 2 │ 2.38687372207642 ││ 1 │ 2.38978505134583 │└───────┴──────────────────┘*/

在 Python 中使用sqlite-vec

一个简单示例如下:

import sqlite3import 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 sqlite3import sqlite_vec
from typing import Listimport 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 以及多个个人支持者的赞助。

sqlite-vec的赞助商们

开源项目大多是开发者充满激情开始做的项目,但开发者也都是一个个有血有肉、需要“恰饭”的大活人😄,纯纯的 “用爱发电” 难以维系项目持久、更好的发展,因此很多原本很好的开源项目,最后都落得没人维护和更新,甚至存档关张的结局😭。

国内的开源开发者们,完全可以学习、借鉴下这个开源项目的路数。

简单总结下,这个项目对于国内的开源人来说,至少包括如下启示:

  • 与其纯粹跟着兴趣走,不妨 把自己的兴趣跟开源社区的需求结合起来,这样既贡献开源社区,又能获得一定经济收益,保证开源活动可以持续地进行。
  • 不分中外,多搜、多看相关赞助商信息,别不好意思“恰饭”,适时主动出击,积极去拉赞助或申请开源支持计划
  • 在一些应用广泛的开源领域深耕下去。本项目的作者 Alex Garcia 有着很好的“开源前科”😄,他之前做了多个开源项目,其中有不少都集中在 SQLite 领域(插件列表在这儿:https://github.com/asg017/sqlite-ecosystem),这也为他申请到 SQLite 相关的赞助打下了坚实的基础。

简单介绍下 Mozilla Builders 计划

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 日是演示日。

llamafile Logo

第一个这样的 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()函数详解

天马行空的大杂烩
“我不能选择那最好的,是那最好的选择我。”-泰戈尔 💖欢迎来到这里。我天马行空地写,您随心所欲地看。欢迎就我们感兴趣的内容交流学习😀🤝
 最新文章