记录一次bug排除
bug信息
报错日志信息
redis.clients.jedis.exceptions.JedisDataException: Error parsing vector similarity query: query vector blob size (4096) does not match index's expected size (12).
at redis.clients.jedis.Protocol.processError(Protocol.java:105)
at redis.clients.jedis.Protocol.process(Protocol.java:162)
at redis.clients.jedis.Protocol.read(Protocol.java:221)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:350)
at redis.clients.jedis.Connection.getOne(Connection.java:332)
at redis.clients.jedis.Connection.executeCommand(Connection.java:137)
at redis.clients.jedis.executors.DefaultCommandExecutor.executeCommand(DefaultCommandExecutor.java:24)
at redis.clients.jedis.UnifiedJedis.executeCommand(UnifiedJedis.java:250)
at redis.clients.jedis.UnifiedJedis.ftSearch(UnifiedJedis.java:3702)
at org.springframework.ai.vectorstore.RedisVectorStore.similaritySearch(RedisVectorStore.java:374)
出现场景
使用spring-ai 查询redis中的向量时出现以上报错信息。
解决办法
重新删除redis中的索引之后,重新加载数据即可。
bug分析
- 查看报错信息
中文解释是向量相似度查询解析失败:查询向量字节大小是4096,不匹配索引预期的大小12.
- 拿着错误信息到网络搜索答案
要善于利用网络的力量,每个人的精力都是有限的。节约出时间可以做其他你想做的事情。经过一番搜索没有找到有用的信息。
- 深入分析错误信息,规划排查策略
通过错误提示可以知道,是索引问题与查询问题的大小不匹配。现在就需要查看索引大小和查询向量分别是什么
** 通过redis客户端查看到dim是3。*黑人问号 提示信息上说是12,这边为什么是3呢?先不管。继续看查询向量字节是是怎么算出来的
**查看Java源码,发现原来是数组长度X4计算出来的。搜嘎这样看来,索引大小应该也是这种方式计算出来的了。
附上代码:
private static float[] toFloatArray(List<Double> embeddingDouble) {
float[] embeddingFloat = new float[embeddingDouble.size()];
int i = 0;
for (Double d : embeddingDouble) {
embeddingFloat[i++] = d.floatValue();
}
return embeddingFloat;
}
** 现在已经确定是由于dime不匹配的原因导致的。那么是在哪里设置的dime呢?这个有兴趣的同学可以自己探索一下。这边我们只要把索引删除掉,重新载入数据即可。
总结
遇到问题不要慌。仔细分析。如果实在搞不定可以请其他同事帮忙,毕竟人多力量大嘛。如果你觉得文章帮助到了你,请点赞收藏关注。谢谢。
附录
- keys * 查看所有的key
- TYPE key 查看key的类型
- FT._LIST 查看现有索引
- JSON.GET key 查看json类型的字段数据
- flushdb 清空数据库