sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用
最近要用SQLite3,之前放出来了SQLiteUtile工具,方便操作。今天发现AIGC方面,RAG知识库需要使用向量数据库,来存储知识信息。一般呢都是用mysql,但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件,索性直接搞下来。用了一下。还可以。
SQLite3的向量库扩展extension,是个开源项目,名字叫sqlite-vec。目前我用到最新版本是0.1.5,配套使用的JDBC是SQLite3.47.0
使用需要注意的是,根据操作系统的不同,下载不同的Release版本库,一般linux要so的,windows要dll的。另外还要注意,下载64位版本的话,JDK、操作系统都得是配套的64位,否则会出现找不到模块的问题。
windows开发环境中,下载sqlite-vec-0.1.5-loadable-windows-x86_64.tar.gz。解压缩后得到vec0.dll。
在工程路径下创建一个extension文件夹,将vec0.dll放进去,便于程序运行时指定相对路径,访问到dll或者so。
demo代码如下:
package org.superx.demo.sqltools;import org.sqlite.SQLiteConfig;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/****@title DemoSQLiteVec*@description JDBC环境下SQLite扩展sqlite-vec的使用,向量数据库支持。这个示例工程,只能运行一次。二次运行请把./data/sqlite_vec.db删掉*@author superX*@version 1.0.0*@create 2024/11/20 下午3:51**/
public class DemoSQLiteVec {public static void main(String[] args) {// SQLite 连接字符串,建立一个向量数据库String url = "jdbc:sqlite:.\\data\\sqlite_vec.db";// 创建向量表的SQL语句String createTableSQL = "create virtual table IF NOT EXISTS vec_examples using vec0(sample_embedding float[8])";String insertDataSQL1 = "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]')";String selectSQL = "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来进行关联String createTableSQL2 = "CREATE TABLE IF NOT EXISTS vec_metadata (rowid INTEGER PRIMARY KEY, describe TEXT, label TEXT)";String insertDataSQL2 = "insert into vec_metadata(rowid, describe, label) " +"values" +"(1,'数据描述1','数据标签1')," +"(2,'数据描述2','数据标签2')," +"(3,'数据描述3','数据标签3')," +"(4,'数据描述4','数据标签4')";//数据内容表,只能通过rowid来进行关联查询。而且要注意,vec_examples的查询必须是独立的子查询,否则总是会报错//[SQLITE_ERROR] SQL error or missing database (A LIMIT or 'k = ?' constraint is required on vec0 knn queries.)String selectSQL2 = "SELECT ve.rowid, ve.sample_embedding, vm.describe, vm.label " +"FROM (SELECT rowid, sample_embedding, 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) ve " +"JOIN vec_metadata vm ON ve.rowid = vm.rowid ";// 创建sqlite配置对象,启用加载扩展功能SQLiteConfig config = new SQLiteConfig();config.enableLoadExtension(true);// 使用配置初始化数据库连接try (Connection conn = DriverManager.getConnection(url, config.toProperties());Statement stmt = conn.createStatement()) {// 加载sqlite-vec扩展库,注意这里dll只能在windows下使用,如果是linux应该是sostmt.execute("SELECT load_extension('./extension/vec0.dll')");// 建表stmt.execute(createTableSQL);// 插入数据stmt.execute(insertDataSQL1);// 查询数据ResultSet rs = stmt.executeQuery(selectSQL);// 打印结果while (rs.next()) {int id = rs.getInt("rowid");float a = rs.getFloat("distance");System.out.println("Row ID: " + id + " distance: " + a);}//创建关联信息表、插入数据并查询stmt.execute(createTableSQL2);stmt.execute(insertDataSQL2);ResultSet rs2 = stmt.executeQuery(selectSQL2);while (rs2.next()) {int id = rs2.getInt("rowid");String describe = rs2.getString("describe");String label = rs2.getString("label");System.out.println("Row ID: " + id + " describe: " + describe + " label: " + label);}/* CMD打印信息结果:代表成功
Row ID: 2 distance: 2.3868737
Row ID: 1 distance: 2.389785
Row ID: 2 describe: 数据描述2 label: 数据标签2
Row ID: 1 describe: 数据描述1 label: 数据标签1*/} catch (Exception e) {e.printStackTrace();}}
}
sqlite-vec创建的向量表限制还是比较多的,virtual table ,using vec0,里面不能随便增加字段。增加字段会报错。所以虚拟向量表是依靠rowid与其他表关联的。这一点要注意!!!
即一般我们做RAG应用时,会embeding文本成向量,然后把向量、文本成对儿存储,再用向量检索机制来寻找最相似的向量对应的文本。使用sqlite-vec的话,需要最少创建2张表。
1张虚拟向量表,只存储rowid和向量信息。另一张表,存储rowid和文本信息,或其它标签信息。检索时,需要进行双表关联检索才能得到想要的信息。如demo
另外需要注意的是,双表关联的语法也有要求。因为sqlite-vec实现是用KNN进行相似搜索,所以查询虚拟向量表时,必须是单表查询,且必须指定limit记录数。所以,关联操作必须以子查询方式进行关联。其它方式都会报错:
[SQLITE_ERROR] SQL error or missing database (A LIMIT or 'k = ?' constraint is required on vec0 knn queries.)
上面的坑为各位踩过了。demo只能运行一遍,因为第二遍运行insert时会报主键冲突,所以多次运行的话,运行前最好把./data/sqlite_vec.db删掉。
SQLite向量扩展开源项目链接,需要其它系统的链接库,自己下载即可:
GitHub - asg017/sqlite-vec: A vector search SQLite extension that runs anywhere!
相关文章:
sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用
最近要用SQLite3,之前放出来了SQLiteUtile工具,方便操作。今天发现AIGC方面,RAG知识库需要使用向量数据库,来存储知识信息。一般呢都是用mysql,但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件…...
10 基于深度学习的目标检测
首次完成时间:2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1)程序代码: import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …...
leetcode top100中的30道递归和贪心
21到30题,递归和贪心...
非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2
七、创建前端项目 你下载了nodejs吗?从cn官网下载:http://nodejs.cn/download/,或者从一个国外org网站下载,选择自己想要的版本https://nodejs.org/download/release/,双击下载好的安装文件,选择安装路径安…...
shell脚本(完)—脚本互调重定向的学习
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 脚本互调 在Shell脚本中&a…...
ant-design-vue中table某一列进行合并
ant-design-vue中table某一列进行合并 1、在colums中配置自定义渲染 {title: 区域,dataIndex: cityName,key: cityName,align: center,width: 120,customCell: (record, rowIndex, column) > {return {rowSpan: record.rowSpan}} },2、处理请求来的数据 tableData.dataSo…...
基于Springboot+Vue社区养老服务管理系统(源码+lw+讲解部署+PPT)
前言 详细视频演示 论文参考 系统介绍 系统概述 核心功能 用户角色与功能 具体实现截图 1. 服务信息查看功能 主要代码实现 截图: 2. 服务申请功能 主要代码实现 截图: 3. 公告信息查看功能 主要代码实现 截图: 4. 服务信息…...
大数据调度组件之Apache DolphinScheduler
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…...
介绍一下strlwr(arr);(c基础)
hi , I am 36 适合对象c语言初学者 strlwr(arr);函数是把arr数组变为小写字母 格式 #include<string.h> strlwr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…...
meterpreter常用命令 上
Meterpreter 是 Metasploit 框架中的一个高级 Payload,广泛用于渗透测试和攻击模拟。以下是一些常用的 Meterpreter 命令: 1. 基本命令 sysinfo 显示目标系统的基本信息(操作系统、架构等)。 getuid 获取当前用户的身份信息。…...
【kubernetes】kubernetes各组件的调用关系
目录 1. 说明2. Kubernetes组件概述2.1 控制平面组件2.2 节点组件 3. Kubernetes组件调用关系4. 示例说明 1. 说明 1.Kubernetes是一个开源的容器编排工具,其各个组件之间存在着复杂的调用关系,共同构建起一个完整的容器编排系统。2.Kubernetes集群主要…...
Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
Vue.js修饰符
Vue.js 是一个渐进式JavaScript框架,用于构建用户界面。在Vue.js中,修饰符(Modifiers)是一种增强指令行为的工具,它们可以改变指令的默认行为。本文将详细讲解Vue.js中的修饰符,并提供实际示例,…...
【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)
宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…...
【含文档】基于.NET的医院医保管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 主要技术:mysql,vue 2.视频演示地址 3.功能 系统定义了两个角色:管理员和用户。 管理员进入主界面&…...
c++源码阅读__smart_ptr__正文阅读
文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…...
图形化界面MySQL(MySQL)(超级详细)
1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables;要先选中 圆圈处支持自己输入 点击这个就执…...
【2024 Optimal Control 16-745】Julia语法
Lecture 2 θ和它的导数符号是通过 Julia 中的变量命名方式实现的 变量 θ 的输入: 在 Julia 中,θ 是一个合法的变量名,就像普通的字母 x 或 y 一样。要输入 θ,可以使用以下方法: 在 Jupyter Notebook 或 Julia REP…...
Opencv+ROS实现摄像头读取处理画面信息
一、工具 ubuntu18.04 ROSopencv2 编译器:Visual Studio Code 二、原理 图像信息 ROS数据形式:sensor_msgs::Image OpenCV数据形式:cv:Mat 通过cv_bridge()函数进行ROS向opencv转换 cv_bridge是在ROS图像消息和OpenCV图像之间进行转…...
网络安全,文明上网(2)加强网络安全意识
前言 在当今这个数据驱动的时代,对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识:信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分,信息技术的快速进步使得我们对网络的依赖性日益增强。然而,网络安全…...
AI时代公众号生存指南(ChatGPT自动化运营全链路拆解)
更多请点击: https://codechina.net 第一章:AI时代公众号的生存逻辑与定位重构 在生成式AI深度渗透内容生态的当下,公众号已从“流量分发管道”蜕变为“人机协同的认知接口”。其生存逻辑不再依赖单一的推送频次或标题党技巧,而取…...
DeepL Chrome翻译插件:让高质量翻译触手可及
DeepL Chrome翻译插件:让高质量翻译触手可及 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 在信息爆炸的今天,我们每天都会接触到大量外文…...
揭秘Gemini ESG引擎底层逻辑:3大AI模型协同如何将人工撰写耗时压缩90%?
更多请点击: https://codechina.net 第一章:Gemini ESG报告生成的演进与价值定位 传统ESG(环境、社会与治理)报告编制长期依赖人工数据收集、跨部门协调与静态模板套用,平均耗时长达3–6个月,且易出现口径…...
混合智能优化:数据驱动与约束求解在护士排班中的实践
1. 项目概述与核心挑战护士排班问题(Nurse Scheduling Problem, NSP)是医疗运营管理中的一块硬骨头。表面上看,它只是把一群护士分配到每天的各个班次上,但实际操作起来,你会发现这背后是一个由无数条规则、偏好和限制…...
利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量 当你手头同时运行着多个 AI 应用或实验项目时,管理分散的 API …...
电信数智版Wireshark 3.7.1:深度支持TLCP与国密算法的协议分析利器
1. 为什么国密协议分析不能只靠“标准Wireshark”——从一次TLCP握手失败说起去年底帮某政务云平台做等保三级复测时,客户网络里跑着一套自研的国密SSL网关,所有前端HTTPS流量都经它转换为TLCP协议(Transport Layer Cryptography Protocol&am…...
Appium 2.10.1环境搭建实战:JDK21+Android SDK34全链路排障指南
1. 这不是“装个软件”——Appium最新版环境搭建的真实水深 很多人点开“Appium环境搭建”教程,以为就是下载几个安装包、点几下下一步,顶多配个PATH变量就完事了。我去年带三个新人做自动化测试时,也这么想。结果光是让一台干净的Windows 1…...
20+专业图标库免费获取:Inkscape Open Symbols让你的设计效率提升300%
20专业图标库免费获取:Inkscape Open Symbols让你的设计效率提升300% 【免费下载链接】inkscape-open-symbols Open source SVG symbol sets that can be used as Inkscape symbols 项目地址: https://gitcode.com/gh_mirrors/in/inkscape-open-symbols 还在…...
书匠策AI毕业论文功能到底有多离谱?科普博主亲测后整个人都愣住了
各位被毕业论文折磨到怀疑人生的同学,我是你们的论文科普老朋友。 今天不讲文献怎么读、不讲选题怎么选,咱们换个画风——我花了整整一周,把书匠策AI(h 官网直达:www.shujiangce.com微信搜一搜"书匠策AI"&a…...
Go并发读写竞争漏洞:结构体赋值引发的密钥泄露
1. 这不是段子,是真实发生的“裸奔”现场CVE-2026-27944——这个编号刚在NVD(美国国家漏洞库)公开时,我正盯着一台生产环境的API网关日志发呆。它没报错,没超时,但每分钟有3700次请求在返回200的同时&#…...
