java中rag使用mysql作为向量数据库,存储读写如何优化

如今大模型崛起,当涉及到复杂业务检索时候离不开rag,有很多老铁在研究rag的时候发现都会使用各种向量数据库,和普通数据有什么区别的,其实没区别就是存储,就是对向量专门优化过的存储,实际用mysql也是能实现

mysql存储向量的问题

假设向量是768维度,他是一个数组, 直接存到mysql是没法存的,需要转为字符串,但rag应用是需要做向量的相似度比对,需要在查询的时候还原数组,将输入的向量和每个存储好的文档向量做比对。那问题关键在于数据的读写效率,转成字符串,有多种方法,请看下面案例

java 复制代码
	public static void main(String[] args) {

		//构建模拟向量
		float[] data = new float[768];
		for (int i = 0; i < data.length; i++) {
			data[i] = i;
		}
		
		//第一种join split
		long first = System.currentTimeMillis();
		String join = CollUtil.join(CollUtil.newArrayList(data), ",");
		String[] split = join.split(",");
		List<String> newArrayList = CollUtil.newArrayList(split);
		
		long second = System.currentTimeMillis();
		System.out.println("通过join split: " + (second - first));
		
		//第二种json序列化
		String jsonStr = JSONUtil.toJsonStr(data);
		List<Float> newArrayList2 = JSONUtil.toList(jsonStr, Float.class);
		
		long third = System.currentTimeMillis();
		System.out.println("通过json序列化: " + (third - second));
		
		//第三种toString+substring
		String string = Arrays.toString(data);
		string = string.substring(1);
		string = string.substring(0, string.length()-1);
		
		String[] split2 = string.split(",");
		float[] newArrayList3 = new float[split2.length];
        for (int i = 0; i < split2.length; i++) {
        	newArrayList3[i] = Float.parseFloat(split2[i]);
        }
		
        long four = System.currentTimeMillis();
        
		System.out.println("toString+截取: " + (four - third));
		
		
	}
java 复制代码
通过join split: 197
通过json序列化: 63
toString+截取: 2

分别使用三种方法评测,假设有1000个文档(向量),使用前面两种方法,检索长则几分钟,对面很明显了,如果采用第三种,那也就是2秒左右。

结论

toString和截取效率是最高的,大家就知道怎么优化了吧

当然如果你大规模还是建议使用文档类数据库或向量数据库

相关推荐
面对疾风叭!哈撒给10 小时前
Windows 系统安装 Mysql 8.0+
数据库·windows·mysql
he___H10 小时前
Redis高级特性
数据库·redis·缓存
crossaspeed10 小时前
Redis的持久化(八股)
数据库·redis·缓存
焦糖玛奇朵婷10 小时前
盲盒小程序开发科普:核心玩法与功能解析
大数据·数据库·程序人生·小程序·软件需求
市场部需要一个软件开发岗位10 小时前
数据仓库相关内容分享
数据库·数据仓库·oracle
zhougl99610 小时前
Java 枚举类(enum)详解
java·开发语言·python
AlenTech10 小时前
SQL 中的 WITH ... AS ...
数据库·sql
想七想八不如1140810 小时前
2019机试真题
java·华为od·华为
恋爱绝缘体110 小时前
Java语言提供了八种基本类型。六种数字类型【函数基数噶】
java·python·算法
l1t10 小时前
利用多种方法实现SQL行列转换
数据库·sql·postgresql·kingbase·duckdb