SpringAI系列---【SpringA集成阿里百炼后I如何先调用向量库,再把查到的结果一起传给大模型?】

SpringAI如何先调用向量库,再把查到的结果一起传给大模型?

1.引入pom

xml 复制代码
<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-vector-store</artifactId>
        </dependency>

        <!--向量模型接入chatClient时引入-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-advisors-vector-store</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0</version>
                <type>pom</type>
                <scope>import</scope><!-- import 是一个特殊的作用域,它只能与 <type>pom</type> 结合使用,并且只能在 <dependencyManagement> 部分中使用。当使用 <scope>import</scope> 时,它会导入指定 POM 的 <dependencyManagement> 部分的所有依赖声明到当前项目中,实现依赖版本的集中管理。 -->
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-bom</artifactId>
                <version>1.0.0.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.配置yml

yml 复制代码
spring:
  ai:
    dashscope:
# base-url:不注释报404
#      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
      api-key: sk-xxxx
      embedding:
        options:
          model: text-embedding-v4
          # 向量维度:text-embedding-v4默认1024
#          dimensions: 2048
      chat:
        options:
          model: qwen3-coder-flash
          temperature: 0.7
logging:
  level:
    #查看Rag查到的内容以及给大模型传递的内容
    org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug

3.Vector的使用测试类

java 复制代码
package com.ai.fast.vectorStore;

import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel;
import org.junit.jupiter.api.Test;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import java.util.List;

@SpringBootTest
public class VectorStoreTest {
    /**
     * 向量数据库
     * 1.SimpleVectorStore:适用于简单的向量数据库场景,例如:本地向量数据库、学习使用。
     * 2.MilvusVectorStore:比较流行的向量数据库,支持分布式、高可用、海量数据存储。
     * 3.ElasticsearchVectorStore: 如果项目中有es可以考虑使用。
     */

    @TestConfiguration
    static class TestConfig {
        @Bean
        public VectorStore vectorStore(DashScopeEmbeddingModel embeddingModel) {
            return SimpleVectorStore.builder(embeddingModel).build();
        }
    }

    @Test
    public void testEmbedding(@Autowired DashScopeEmbeddingModel embeddingModel) {
        float[] embedding = embeddingModel.embed("我是李四");
        System.out.println("默认维度为:"+embedding.length);
    }

    @Test
    public void testVectorStore(@Autowired VectorStore vectorStore) {
        Document document1 = Document.builder()
                .text("""
                        预订航班:
                        - 通过我们的网站或移动应用程序预订。
                        - 预订时需要全额付款。
                        - 确保个人信息(姓名、ID等)的准确性,因为更正可能会产生25的费用。
                        """)
                .build();

        Document document2 = Document.builder()
                .text("""
                        取消预订:
                        - 最晚在航班起飞前48小时取消。
                        - 取消费用:经济舱75美元,豪华经济舱50美元,商务舱25美元。
                        - 退款将在7个工作日内处理。
                        """)
                .build();

        //存储向量(内部会自动向量化)
        vectorStore.add(List.of(document1, document2));

        //简单查询
//        List<Document> similaritySearch = vectorStore.similaritySearch("退票");
//        for (Document search : similaritySearch) {
//            System.out.println(search.getText());
//            System.out.println(search.getScore());
//        }

        //高级查询
        SearchRequest searchRequest = SearchRequest.builder()
                .query("退票")
                .topK(5)
                .similarityThreshold(0.5)
                .build();
        List<Document> documents = vectorStore.similaritySearch(searchRequest);
        for (Document document : documents) {
            System.out.println(document.getText());
            System.out.println(document.getScore());
        }
    }
}

4.Vector接入ChatClient测试类

java 复制代码
package com.ai.fast.vectorStore;

import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import java.util.List;

@SpringBootTest
public class PlusChatClient {
    @BeforeEach
    public void init(@Autowired VectorStore vectorStore) {
        Document document1 = Document.builder()
                .text("""
                        预订航班:
                        - 通过我们的网站或移动应用程序预订。
                        - 预订时需要全额付款。
                        - 确保个人信息(姓名、ID等)的准确性,因为更正可能会产生25的费用。
                        """)
                .build();

        Document document2 = Document.builder()
                .text("""
                        取消预订:
                        - 最晚在航班起飞前48小时取消。
                        - 取消费用:经济舱75美元,豪华经济舱50美元,商务舱25美元。
                        - 退款将在7个工作日内处理。
                        """)
                .build();

        //存储向量(内部会自动向量化)
        vectorStore.add(List.of(document1, document2));
    }

    @TestConfiguration
    static class TestConfig {
        @Bean
        public VectorStore vectorStore(DashScopeEmbeddingModel embeddingModel) {
            return SimpleVectorStore.builder(embeddingModel).build();
        }
    }

    /**
     * RAG:SpringAI先调用存储向量,再调用模型进行问答
     *
     * @param vectorStore
     * @param chatModel
     */
    @Test
    public void testRag(@Autowired VectorStore vectorStore,
                        @Autowired DashScopeChatModel chatModel) {
        ChatClient chatClient = ChatClient.builder(chatModel).build();
        String content = chatClient.prompt()
                .system("你是一个智能助手")
                .user("退票多少钱")
                .advisors(SimpleLoggerAdvisor.builder().build(),
                        QuestionAnswerAdvisor.builder(vectorStore)
                                .searchRequest(SearchRequest.builder()
                                        .query("退票多少钱")
                                        .topK(5)
                                        .similarityThreshold(0.5)
                                        .build()
                                ).build()
                ).call()
                .content();
        System.out.println(content);
    }
}