Spring AI中如何同时使用Redis与Pinecone多向量存储?
如何在Spring AI中同时使用Redis和Pinecone向量存储并通过@Qualifier区分?
问题背景
需要实现两个Advisor:一个基于Pinecone做常规RAG向量存储,另一个基于Redis实现嵌入问题缓存。原有Pinecone配置运行正常,但添加Redis后出现以下问题:
- 启动报错找不到
RedisVectorStoreBean,排查发现缺少JedisConnectionFactory - 添加
JedisConnectionFactoryBean后,又出现vectorStoreBean重名冲突,无法通过@Qualifier区分两个向量存储
解决方案
可以通过禁用自动配置+手动注册命名Bean的方式实现多向量存储的区分注入,具体步骤如下:
1. 调整依赖与自动配置
首先确保项目引入必要依赖:
- Spring Boot Starter Data Redis(用于自动配置Redis连接)
- Spring AI Pinecone、Spring AI Redis向量存储依赖
然后在启动类中排除Spring AI自带的向量存储自动配置类,避免自动注册重名的vectorStore Bean:
@SpringBootApplication(exclude = { RedisVectorStoreAutoConfiguration.class, PineconeVectorStoreAutoConfiguration.class }) public class MySpringAiApplication { public static void main(String[] args) { SpringApplication.run(MySpringAiApplication.class, args); } }
2. 手动注册命名向量存储Bean
创建配置类,分别注册Redis和Pinecone向量存储,并指定唯一的Bean名称,后续可通过@Qualifier精准注入:
@Configuration public class VectorStoreConfig { // 注册Redis向量存储,指定Bean名称为redisVectorStore @Bean("redisVectorStore") public RedisVectorStore redisVectorStore( EmbeddingModel embeddingModel, RedisConnectionFactory redisConnectionFactory, @Value("${spring.ai.vectorstore.redis.index}") String redisIndex ) { // 利用Spring Boot自动配置的RedisConnectionFactory,无需手动创建JedisConnectionFactory return new RedisVectorStore(redisConnectionFactory, embeddingModel, redisIndex); } // 注册Pinecone向量存储,指定Bean名称为pineconeVectorStore @Bean("pineconeVectorStore") public PineconeVectorStore pineconeVectorStore( EmbeddingModel embeddingModel, @Value("${spring.ai.vectorstore.pinecone.apiKey}") String apiKey, @Value("${spring.ai.vectorstore.pinecone.index-name}") String indexName ) { PineconeClient pineconeClient = new PineconeClient.Builder() .withApiKey(apiKey) .build(); return new PineconeVectorStore(pineconeClient, embeddingModel, indexName); } }
3. 通过@Qualifier注入指定向量存储
在需要使用两个向量存储的地方,用@Qualifier标注要注入的Bean名称:
@Bean(name = "openAiBuildClient") public ChatClient buildClient( @Qualifier("openAiChatClientBuilder") ChatClient.Builder openAiBuilder, MessageChatMemoryAdvisor messageChatMemoryAdvisor, @Qualifier("redisVectorStore") RedisVectorStore redisVectorStore, @Qualifier("pineconeVectorStore") PineconeVectorStore pineconeVectorStore ) { // 分别用两个向量存储初始化对应的Advisor // 示例:将pinecone传入QuestionAnswerAdvisor,redis传入缓存Advisor return openAiBuilder // 配置Advisor逻辑 .build(); }
4. 保持原有配置文件不变
application.yml中的向量存储配置无需修改:
spring: application: name: "my-spring-ai" ai: vectorstore: redis: index: spring-ai-example uri: redis://localhost:6379 pinecone: apiKey: ${PINECONE_API_KEY} index-name: spring-ai-example
关键说明
- 禁用自动配置是核心:Spring AI的自动配置会将每个向量存储都注册为名为
vectorStore的Bean,导致重名冲突,必须手动注册并指定唯一名称。 - Redis连接无需手动创建
JedisConnectionFactory:引入spring-boot-starter-data-redis后,Spring Boot会根据配置自动创建JedisConnectionFactory,直接注入使用即可。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

