You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring AI中如何同时使用Redis与Pinecone多向量存储?

如何在Spring AI中同时使用Redis和Pinecone向量存储并通过@Qualifier区分?

问题背景

需要实现两个Advisor:一个基于Pinecone做常规RAG向量存储,另一个基于Redis实现嵌入问题缓存。原有Pinecone配置运行正常,但添加Redis后出现以下问题:

  1. 启动报错找不到RedisVectorStore Bean,排查发现缺少JedisConnectionFactory
  2. 添加JedisConnectionFactory Bean后,又出现vectorStore Bean重名冲突,无法通过@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:03:15