package com.ruoyi.ai.config; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; import dev.langchain4j.store.embedding.pinecone.PineconeEmbeddingStore; import dev.langchain4j.store.embedding.pinecone.PineconeServerlessIndexConfig; import io.pinecone.clients.Index; import io.pinecone.clients.Pinecone; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 向量存储配置 */ @Configuration public class EmbeddingStoreConfig { @Value("${pinecone.api-key:pcsk_4SJLnh_tNB3wSLJU8tc4E5P28PcXX8eCLdURqZpVhg1FMV8CRYxjneWdzqRdB5Ftqooi9}") private String pineconeApiKey; @Value("${pinecone.index:xiaozhi-index}") private String indexName; @Value("${pinecone.namespace:knowledge-base}") private String namespace; @Value("${pinecone.enabled:false}") private boolean pineconeEnabled; @Bean public Pinecone pinecone() { return new Pinecone.Builder(pineconeApiKey).build(); } @Bean public Index pineconeIndex(Pinecone pinecone) { return pinecone.getIndexConnection(indexName); } @Bean public EmbeddingStore embeddingStore(EmbeddingModel embeddingModel) { // 项目管理等核心业务不应因外部向量库不可用而无法启动。 // 生产环境明确配置 pinecone.enabled=true 时仍使用原 Pinecone 存储。 if (!pineconeEnabled) { return new InMemoryEmbeddingStore<>(); } return PineconeEmbeddingStore.builder() .apiKey(pineconeApiKey) .index(indexName) .nameSpace(namespace) .createIndex(PineconeServerlessIndexConfig.builder() .cloud("AWS") .region("us-east-1") .dimension(embeddingModel.dimension()) .build()) .build(); } }