求助 SpringAI 中的 similaritySearch 用法

我自己用Redis数据库实现了向量的存储,但是在进行相似度检索的时候,一旦加入了过滤条件,如eq,ne等等之类的,就获取不到任何文档。

首先maven导入相关的依赖如下:

`

text
复制代码
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-deepseek</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter-dashscope</artifactId> <version>1.0.0.2</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-redis-store</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-autoconfigure-vector-store-redis</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-vector-store-redis</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-advisors-vector-store</artifactId> <version>1.0.0</version> </dependency> <!-- 强制所有模块使用 tika-parser-pdf-module 3.1.0 ,兼容SpringAI的TIKA--> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parser-pdf-module</artifactId> <version>3.1.0</version> </dependency> <!-- 也强制使用 tika-core 配合 --> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parser-ocr-module</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.29</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-pdf-document-reader</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-tika-document-reader</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>org.apache.tika</groupId> <artifactId>tika-parser-pdf-module</artifactId> </exclusion> <exclusion> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-markdown-document-reader</artifactId> <version>1.0.0</version> </dependency>

`

相关的配置类如下

text
复制代码
@Configuration public class AICourseAppVectorStoreConfig { @Resource private AICourseDocumentLoader aiCourseDocumentLoader; @Resource(name = "dashscopeEmbeddingModel") private EmbeddingModel dashscopeEmbeddingModel; @Resource private MyTokenTextSplitter myTokenTextSplitter; @Bean public SimpleVectorStore simpleVectorStore() { //这里的AI嵌入模型使用的是springAI官方的模型 SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel).build(); return simpleVectorStore; } @Bean public RedisVectorStoreProperties redisVectorStoreProperties() { RedisVectorStoreProperties properties = new RedisVectorStoreProperties(); properties.setIndexName("Intelli-Edu-index"); properties.setPrefix("Intelli-Edu-prefix"); properties.setInitializeSchema(true); return properties; } @Bean public RedisVectorStore redisVectorStore( @Value("${spring.data.redis.host}") String redisHost, @Value("${spring.data.redis.port}") int redisPort, @Value("${spring.data.redis.password}") String redisPassword, @Value("${spring.data.redis.database}") int redisDatabase, RedisVectorStoreProperties properties ) { JedisClientConfig clientConfig = DefaultJedisClientConfig.builder() .password(redisPassword) .database(redisDatabase) .build(); JedisPooled jedisPooled = new JedisPooled(new HostAndPort(redisHost, redisPort), clientConfig); RedisVectorStore redisVectorStore = RedisVectorStore.builder(jedisPooled, dashscopeEmbeddingModel) .metadataFields(Arrays.asList(RedisVectorStore.MetadataField.tag("tag"), RedisVectorStore.MetadataField.tag("accessPermission"), RedisVectorStore.MetadataField.tag("filename") )) .indexName(properties.getIndexName()) .prefix(properties.getPrefix()) .initializeSchema(properties.isInitializeSchema()) .build(); return redisVectorStore; } } `

扩展了CustomTikaDocumentReader(原生的TikaDocumentReader不支持自定义元数据)如下

text
复制代码
public class CustomTikaDocumentReader extends TikaDocumentReader { private final Map<String,Object> customMetadata; public CustomTikaDocumentReader(Resource resource, Map<String, Object> customMetadata) { super(resource); this.customMetadata = customMetadata; } @Override public List<Document> get() { List<Document> documents = super.get(); for (Document document : documents) { // 将自定义元数据添加到每个文档中 if (Objects.nonNull(document.getMetadata()) ) { customMetadata.forEach(document.getMetadata()::put); } } return documents; } }

插入向量数据的数据如图所示

text
复制代码
{ "filename": "智慧的疆界.md", "accessPermission": "public", "embedding": [ -0.45072716, -2.7041578, -5.0076756, -0.6626291, . . . ], "tag": "AI通识历史;深度学习;人工智能", "category": "header_1", "title": "7.5.3 深度学习时代", "content": "2006年被认为深度学习时代的元年,省略多个字~", "status": "AI通识历史" }

官方的检索示例如图所示

微信图片_20250723105406.png

自己的查询代码如下:

text
复制代码
Filter.Expression expression = new FilterExpressionBuilder() .in("accessPermission", "public") .build(); log.info("搜索条件: {}", expression.toString()); List<Document> results = redisVectorStore.similaritySearch(SearchRequest.builder() .query("介绍下香农") .topK(5) .similarityThreshold(0.7) .filterExpression(expression) .build()); log.info("搜索结果: {}", results);

检索结果为空。去掉Filter.Expression 的过滤条件则能够正常返回结果如下图所示。

image.png

请各位解答

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP