spring-AI集成向量数据库pinecone使用实现RAG

1.Pinecone简介

官方网站: The vector database to build knowledgeable AI | Pinecone

访问官方网站、注册、登录、获取apiKey且配置在环境变量中。默认有2GB的免费存储空间

2.Pinecone的使用

得分的含义

  • 在向量检索场景中,当我们把查询文本转换为向量后,会在嵌入存储( EmbeddingStore )里查找与之最相似的向量(这些向量对应着文档片段等内容)。

  • 为了衡量查询向量和存储向量之间的相似程度,会使用某种相似度计算方法(例如余弦相似度等)来得出一个数值,这个数值就是得分。得分越高,表明查询向量和存储向量越相似,对应的文档片段与查询文本的相关性也就越高。

登录官方网站,完成注册
在这里插入图片描述

创建api-key,然后可以在环境变量中配置
在这里插入图片描述
右键点击电脑属性,点击高级系统设置
点击环境变量
在这里插入图片描述
将api-key配置到环境变量中
在这里插入图片描述

3.集成springAI使用Pinecone

3.1创建向量索引库:

输入相关配置,后面其他的配置用默认配置即可
在这里插入图片描述
然后点击database,记住host,后面需要用到
在这里插入图片描述

3.2导入依赖:

<!--piecone的相关依赖-->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-pinecone</artifactId>
    <version>1.0.0-M7</version>
</dependency>

3.3配置文件:

注意host里面的内容,将其拆分为index-name,project-id,environment

spring:
  application:
    name: ChatAiApplication
  ai:
    openai:
      #base-url: https://api.deepseek.com
      base-url: https://dashscope.aliyuncs.com/compatible-mode
      api-key: ${DASHSCOPE_API_KEY}
      chat:
        options:
          model: qwen-max-latest
          temperature: 0.7
      embedding:
        options:
          model: text-embedding-v3
          dimensions: 1024  # 可以不用 设置,默认为 1024
    vectorstore:
      pinecone: #   host: https://springai-uw1t8sh.svc.aped-4627-b74a.pinecone.io 项目地址
        api-key: ${PINECONE_API_KEY}
        index-name: springai
        project-id: uw1t8sh
        environment: aped-4627-b74a

其他配置可参考springAI官方文档

3.4测试:

 // 自动注入向量库
    @Autowired
    private VectorStore vectorStore;
	@Test
    public void testVectorStore(){
        Resource resource = new FileSystemResource("E:\\aa\\中二知识笔记.pdf");
        // 1.创建PDF的读取器
        PagePdfDocumentReader reader = new PagePdfDocumentReader(
                resource, // 文件源
                PdfDocumentReaderConfig.builder()
                        .withPageExtractedTextFormatter(ExtractedTextFormatter.defaults())
                        .withPagesPerDocument(1) // 每1页PDF作为一个Document
                        .build()
        );
        // 2.读取PDF文档,拆分为Document
        List<Document> documents = reader.read();
        // 3.写入向量库
        vectorStore.add(documents);
       
    }
 	@Test
    public void testRedisVectorStore(){
        //List<Document> docs = vectorStore.similaritySearch("论语中教育的目的是什么");
        SearchRequest request = SearchRequest.builder()
                .query("论语中教育的目的是什么") // 查询
                .topK(5)  // 返回的相似文档数量
                .similarityThreshold(0.6) // 相似度阈值
                //.filterExpression("file_name == '中二知识笔记.pdf'")  // 过滤条件
                .build();
        List<Document> docs = vectorStore.similaritySearch(request);
        if (docs == null) {
            System.out.println("没有搜索到任何内容");
            return;
        }
        for (Document doc : docs) {
            System.out.println(doc.getId());
            System.out.println(doc.getScore());
            System.out.println(doc.getText());
        }
    }

然后再次登录官网,发现发现已经成功把文件上传到pinecone了
在这里插入图片描述
后续就可以在项目中集成使用了

4.集成配置ChatClient

这里演示一个可以读取pdf的chatClient

 	@Bean
    public ChatClient pdfChatClient(OpenAiChatModel model, ChatMemory chatMemory, VectorStore vectorStore) {
        return ChatClient.builder(model)
                .defaultSystem("请根据提供的上下文回答问题,遇到上下文没有的问题,不要自己随意编造。")
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory), // 聊天记忆
                        new SimpleLoggerAdvisor(), //日志
                        new QuestionAnswerAdvisor(
                                vectorStore, // 向量库(这里注入的就是redisvectorStore)
                                SearchRequest.builder() // 向量检索的请求参数
                                        .similarityThreshold(0.5d) // 相似度阈值
                                        .topK(2) // 返回的文档片段数量
                                        .build()
                        )
                )
                .build();
    }

然后测试一下

 @Autowired
    private ChatClient pdfChatClient;
    public String chatpdf(String prompt, String chatId) {
        //3. 请求模型
        return pdfChatClient.prompt()
                .user(prompt)
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)) //聊天记忆
                .call() //阻塞式调用
                .content();
    }
    @Test
    public void testPdfChat() {
        String prompt="论语中教育的目的是什么";
        String  chatId = "15";
        System.out.println(chatpdf(prompt, chatId));
    }

结果发现和pdf中的内容一致
在这里插入图片描述

在这里插入图片描述
基于此,就实现了pinecone向量数据库来实现RAG

### 关于Spring Framework与AI向量数据库集成 #### 背景介绍 Spring Framework 是一个广泛使用Java 开发框架,提供了多种模块来简化应用程序的开发过程。随着 AI 技术的发展,特别是自然语言处理(NLP)、图像识别等领域的需求增加,向量数据库逐渐成为一种重要的技术工具。向量数据库能够高效存储和检索高维数据,例如嵌入式表示(embeddings),这些数据通常由机器学习模型生成。 尽管 Spring Framework 并未直接提供针对向量数据库的支持[^1],但可以通过扩展其生态系统中的组件与其他库或服务协同工作,从而实现向量数据库集成--- #### 集成方法概述 以下是几种可能的方式,可以将 Spring 应用程序与向量数据库结合起来: 1. **通过 HTTP 客户端调用外部向量数据库 API** 如果使用的是云托管的向量数据库(如 Pinecone、Milvus 或 Weaviate),可以直接利用 `Spring Web` 提供的功能发送 HTTP 请求到目标服务。这允许开发者轻松地执行 CRUD 操作以及复杂的相似度搜索。 示例代码如下: ```java import org.springframework.web.client.RestTemplate; public class VectorDatabaseClient { private final RestTemplate restTemplate = new RestTemplate(); public String searchSimilarVectors(String queryVector) { String url = "https://vector-database-service.com/api/search"; return restTemplate.postForObject(url, queryVector, String.class); } } ``` 2. **引入第三方客户端 SDK** 许多流行的向量数据库都提供了官方或者社区支持的 Java SDK。例如 Milvus 的 Java Client 可以被无缝集成Spring Boot 项目中。这样做的好处是可以避免手动解析 JSON 响应并提高编码效率。 下面是一个简单的例子展示如何配置此类依赖项: ```xml <!-- Maven Dependency --> <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> <version>2.x.x</version> </dependency> ``` 3. **定制 Repository 层封装业务逻辑** 对于更复杂的应用场景,建议定义专门的数据访问层(Repository)。此模式下可隐藏底层细节并将具体操作抽象化以便后续维护升级更加便捷。假设我们正在设计这样一个类,则大致结构可能是这样的: ```java @Service public class VectorRepository { private final RSocketRequester requester; // Or any other client type. public VectorRepository(RSocketRequester.Builder builder){ this.requester = builder.tcp("localhost",7000).rsocketStrategies(...).build(); } public List<VectorEntity> findNearestNeighbors(VectorQuery query){ ... } } ``` 4. **结合消息队列异步处理任务** 当面对大规模并发请求时,考虑采用 Kafka/Zookeeper/RabbitMQ 等中间件分摊压力不失为明智之举。借助 `Spring Integration` 和 `Spring Cloud Stream`,能轻易达成上述目的同时保持系统的灵活性与伸缩性。 --- #### 注意事项 - 向量索引构建耗时较长,在线环境下需谨慎评估是否适合即时更新策略; - 数据一致性问题不容忽视,尤其是在分布式环境中跨多个节点同步状态期间可能出现短暂不一致现象; - 性能优化至关重要,务必关注内存占用率及磁盘 I/O 效率等方面的表现; --- ### 结论 虽然当前版本的 Spring Framework 尚无内置对 AI 向量数据库的支持[^2],然而凭借强大的插件体系及其高度灵活的设计理念完全可以满足实际需求。只要合理规划架构布局再辅以恰当的技术选型就能成功搭建起融合现代人工智能特性的企业级解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值