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

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值