Spring AI调用similaritySearch方法从Neo4j向量库检索结果失败求助
Spring AI调用similaritySearch方法从Neo4j向量库检索结果失败求助
兄弟,我先捋下你的情况:你用JDK21 + Spring Boot 3.3.11 + Spring AI 1.0.0M6搭了个应用,选了Ollama做嵌入和聊天模型,用Neo4j存向量,现在聊天、生成嵌入后存Neo4j都没问题,唯独调用vectorStore.similaritySearch检索的时候出状况,对吧?我之前踩过不少向量检索的坑,给你几个实用的排查方向:
- 先盯紧嵌入向量的维度匹配度:Ollama不同模型的嵌入维度差得挺多,比如Llama 3是4096维,Qwen-7B是1536维,你存向量到Neo4j时用的嵌入维度,和检索时生成查询向量的维度必须完全一致。可以在代码里加两行打印,对比下存入的向量长度和查询时生成的向量长度,比如
System.out.println("存入向量维度:" + savedEmbedding.length());和System.out.println("查询向量维度:" + queryEmbedding.length());。 - 核对Neo4j向量存储的配置细节:Spring AI的Neo4j向量存储得指定正确的节点标签、向量属性名、文本属性名,比如你配置的是
spring.ai.neo4j.vector-store.node-label=Document、vector-property=embedding,那检索时这些参数得和存入时完全对应,连大小写都不能错。嫌麻烦的话直接去Neo4j浏览器跑个Cypher查:MATCH (d:Document) RETURN d.embedding, d.text LIMIT 5,看看向量确实存进去了,属性名也没写错。 - 检查
similaritySearch的调用参数:你调用的时候传的查询文本、返回数量这些参数有没有问题?比如是不是不小心传了空字符串,或者返回数量设成0了?另外,Spring AI 1.0.0M6的Neo4jVectorStore默认用余弦相似度,如果你存向量时改了距离算法(比如欧氏距离),那检索逻辑也得对应调整,这个可以核对下配置项spring.ai.neo4j.vector-store.similarity-measure。 - 确保Ollama嵌入模型完全一致:存向量时用的Ollama模型,和检索时生成查询向量用的必须是同一个,绝对不能存的时候用
llama3:8b,检索时换成qwen:7b,不同模型生成的向量完全不兼容,肯定搜不到相关结果。 - 排查Spring AI版本的兼容性:你用的1.0.0M6是里程碑版本,可能藏着一些Neo4j向量检索的小bug,比如我之前遇到过这个版本里Neo4jVectorStore的
similaritySearch没正确绑定查询参数的问题。你可以试试升级到Spring AI的最新稳定版(比如1.0.0正式版),或者翻下官方的更新日志看看有没有相关修复。 - 用Cypher直接测试检索逻辑:去Neo4j浏览器手动写个Cypher做向量检索,比如:
MATCH (d:Document) WITH d, gds.similarity.cosine(d.embedding, $queryEmbedding) AS score ORDER BY score DESC LIMIT 3 RETURN d.text, score
把$queryEmbedding换成你用Ollama生成的查询向量,看看能不能查到结果。如果Cypher能查到,那问题大概率在Spring AI的代码调用上;如果Cypher也查不到,那就是向量存储或者嵌入模型的问题。
备注:内容来源于stack exchange,提问作者xiong
相关产品推荐
相关产品推荐

