学静思语
Published on 2025-06-17 / 34 Visits
0
0

Spring Ai

Spring Ai

一、前期准备

1. 准备DeepSeek的api-key

  • 进入官网

image-20250618213819948

  • 然后登录,创建api-key

image-20250618214010197

image-20250618214035798

  • 再进行充值

image-20250618214127943

二、快速开始

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--配置spring boot依赖-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.3.8</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring-ai</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <modules>
            <module>spring_ai_qucik_start</module>
            <module>spring-ai-chat</module>
            <module>springai_function</module>
            <module>springai-ollama</module>
        </modules>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!--设置spring ai 的版本号-->
            <spring-ai.version>1.0.0-M5</spring-ai.version>
        </properties>
    
        <dependencies>
            <!--导入spring boot web场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--导入spring ai依赖-->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
            </dependency>
            <!--导入spring boot test场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <!--配置spring-ai-bom管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.ai</groupId>
                    <artifactId>spring-ai-bom</artifactId>
                    <version>${spring-ai.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    
  • 配置文件

    # 配置端口
    server:
      port: 8080
    # 配置服务名称
    spring:
      application:
        name: spring-ai-application
      # 配置spring ai
      ai:
        # 配置openai
        openai:
          # 配置ai调用的key
          api-key: api-key
          # 配置ai路径
          base-url: https://api.deepseek.com
          chat:
            options:
              # 配置模型
              model: deepseek-chat
              # 用于控制生成文本的多样性
              # 值越高,生成的文本就越多样化,但是可能包含更多的随机性和不可预测的内容
              # 值越低,生成的文本就越接近于确定性的结果,即生成的文本会更加一致和可预测
              temperature: 0.7
    
  • 创建启动类

    package com.springai.study;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/17
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiStartApplication {
    
        public static void main(String[] args){
    
            SpringApplication.run(SpringAiStartApplication.class,args);
    
        }
    }
    
    
  • 创建controller,然后实现SpringAI调用

    package com.springai.study.controller;
    
    import org.springframework.ai.chat.model.ChatModel;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @date 2025/6/17
     * @author: l
     */
    @RestController
    @RequestMapping("/deepseek")
    public class ChatDeepSeekController {
    
        @Autowired
        private ChatModel chatModel;
    
    
        /**
         *  测试接口,测试该接口是否连通deep seek
         * @param message
         * @return String
         */
        @GetMapping("/chat")
        public String chat(@RequestParam(value = "msg",defaultValue = "请问你是谁") String message){
            // 进行对话
            String call = chatModel.call(message);
            // 打印结果
            System.out.println(call);
    
            return call;
    
        }
    
    }
    
    
  • 测试结果

image-20250618214902312

三、Spring AI之chat模型

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--配置spring boot依赖-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.3.8</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring-ai</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <modules>
            <module>spring_ai_qucik_start</module>
            <module>spring-ai-chat</module>
            <module>springai_function</module>
            <module>springai-ollama</module>
        </modules>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!--设置spring ai 的版本号-->
            <spring-ai.version>1.0.0-M5</spring-ai.version>
        </properties>
    
        <dependencies>
            <!--导入spring boot web场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--导入spring ai依赖-->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
            </dependency>
            <!--导入spring boot test场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <!--配置spring-ai-bom管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.ai</groupId>
                    <artifactId>spring-ai-bom</artifactId>
                    <version>${spring-ai.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    
  • 配置配置文件

    # 配置端口
    server:
      port: 8080
    # 配置服务名称
    spring:
      application:
        name: spring-ai-application
      # 配置spring ai
      ai:
        # 配置openai
        openai:
          # 配置ai调用的key
          api-key: api-key
          # 配置ai路径
          base-url: https://api.deepseek.com
          chat:
            options:
              # 配置模型
              model: deepseek-chat
              # 用于控制生成文本的多样性
              # 值越高,生成的文本就越多样化,但是可能包含更多的随机性和不可预测的内容
              # 值越低,生成的文本就越接近于确定性的结果,即生成的文本会更加一致和可预测
              temperature: 0.7
    
  • 创建启动类

    package com.springai;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/17
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiChatApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiChatApplication.class,args);
    
        }
    }
    

1. ChatClient接口的使用

  • 创建controller对象,使用构造器的方式注入依赖

    package com.springai.study.controller;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @date 2025/6/17
     * @author: l
     */
    @RestController
    @RequestMapping("/chatClient")
    public class ChatClientController {
    
        private final ChatClient chatClient;
    
        /**
         *  通过过构造器实现依赖注入
         * @param chatClientBuilder ChatClient的内部Builder接口
         */
        public ChatClientController(ChatClient.Builder  chatClientBuilder) {
            // 通过ChatClient的内部Builder接口创建一个ChatClient对象
            this.chatClient = chatClientBuilder.build();
    
        }
    
        /**
         * 使用ChatClient接口实现简单对话
         * @param message 用户输入的信息
         * @return String
         */
        @GetMapping("/chat")
        public String chat(@RequestParam(value = "msg",defaultValue = "请问你是谁") String message) {
    
           return chatClient.prompt() // 提示词
                   .user(message) // 传入用户输入信息
                   .call() // 使用大模型
                   .content(); // 获取返回的内容
    
        }
    }
    
    
  • 通过配置类的方式将ChatClient注入到容器中,还可以角色预设

    • 注意:其实通过构造器实现依赖注入时,也可以实现角色预设
    package com.springai.study.config;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @date 2025/6/17
     * @author: l
     */
    @Configuration
    public class AiConfig {
    
    
        /**
         *  通过配置类的方式将ChatClient注入到容器中,实现角色预设
         * @param builder ChatClient中的内部接口
         * @return ChatClient
         */
        @Bean
        public ChatClient chatClient(ChatClient.Builder builder) {
    
            // 配置默认角色
            return builder.defaultSystem("你是一名Java高级工程师,你精通Java,你的名字是学思语").build();
    
        }
    
    }
    
    
    • 在controller中直接使用注解方式实现依赖注入

         @Autowired
          private ChatClient chatClient;
      
          /**
           * 使用角色预设,来进行测试
           * @param message 用户输入的信息
           * @return String
           */
          @GetMapping("/chat")
          public String chat(@RequestParam(value = "msg",defaultValue = "你是谁") String message) {
              // 与AI进行对话
              return  chatClient.prompt().user(message).call().content();
      
          }
      
    • 为了提高用户使用效果,可以使用流式输出

      /**
           *  使用流式输出,来进行测试
           * @param message 用户输入的信息
           * @return Flux<String>
           */
          @GetMapping(value = "/stream",produces = "text/html;charset=utf-8")
          public Flux<String> stream(@RequestParam(value = "msg",defaultValue = "请问你是谁") String message){
      
              return chatClient.prompt() // 提示词
                      .user(message) // 用户输入信息
                      .stream() // 使用流式输出
                      .content(); // 获取返回信息
      
          }
      
    • 总结

      • 非流式输出(call):一次性将结果直接返回给用户,用户需要等待一定的时间。
      • 流式输出(stream):逐个字的输出,这种方式体现了大模型的本质,在网路情况不好时也能提升用户体验

2. ChatModel接口的使用

  • 创建controller接口,使用call(String)与模型进行沟通

      @Autowired
       private ChatModel chatModel;
    
       /**
        *  使用ChatModel进行AI对话
        * @param message 用户输入的信息
        * @return String
        */
       @GetMapping("/chat")
       public String chat(@RequestParam(value = "msg",defaultValue = "你是谁") String message) {
          // 使用默认方式进行AI对话
          return chatModel.call(message);
    
       }
    
  • 使用重载方法call(Prompt)方法进于模型进行沟通

    /**
        * 使用重载方法进行AI对话
        * @param message 用户输入的信息
        * @return String
        */
       @GetMapping("/openAI")
       public String openAI(@RequestParam(value = "msg",defaultValue = "你是谁") String message) {
          // 设参数并进行对话
          ChatResponse call = chatModel.call(new Prompt(message, // 用户输入的信息
                  OpenAiChatOptions.builder()
                  .model("deepseek-chat") // 选择Ai大模型
                  .temperature(0.8) //设置文本的多样性
                  .build()));
          // 获取返回结果
          return call.getResult().getOutput().getContent();
       }
    
    
  • 自定义提示词

     /**
        * 自定义提示词
        * @param name 提示词中的名称
        * @param voice 提示词中的饮食习惯
        * @return String
        */
       @GetMapping("/prompt")
       public String prompt(@RequestParam(value = "name",defaultValue = "张三") String name,
                            @RequestParam(value = "voice",defaultValue = "实惠") String voice) {
    
          // 设置用户信息
          String userText = """
                  请给我推荐深圳的美食
                  """;
          // 创建用户信息对象
          UserMessage userMessage = new UserMessage(userText);
          // 设置提示词
          String systemText= """
                  你是一个美食咨询助手,可以帮人们查询需要的美食信息,
                  你的名字是{name},
                  你应该用你的名字和{voice}的饮食习惯回复用户的请求。
                  """;
          // 创建提示词对象
          SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
          // 替换文字
          Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
          // 使用提示词
          Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
          // 进行对话
          ChatResponse chatResponse = chatModel.call(prompt);
    
         return chatResponse.getResults() // 获取返回结果
                 .stream() // 装换成Stream流程
                 .map(g -> g.getOutput().getContent()) // 获取返回的结果
                 .collect(Collectors.joining("")); // 收集
    
    
       }
    
    

四、Spring AI函数调用

1. 函数调用的核心流程

  • 定义函数:声明可供模型调用的函数。(名称、描述、参数结构)
  • 模型交互:将函数信息与用户输入一起发送给模型,由模型决定是否使用函数。
  • 执行函数:解析模型的函数调用请求,执行对应对的业务逻辑
  • 返回结果:将函数计算的结果返回给模型,生成最终的结果

2. 实现Spring AI调用自定义函数

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--配置spring boot依赖-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.3.8</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring-ai</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <modules>
            <module>spring_ai_qucik_start</module>
            <module>spring-ai-chat</module>
            <module>springai_function</module>
            <module>springai-ollama</module>
        </modules>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!--设置spring ai 的版本号-->
            <spring-ai.version>1.0.0-M5</spring-ai.version>
        </properties>
    
        <dependencies>
            <!--导入spring boot web场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--导入spring ai依赖-->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
            </dependency>
            <!--导入spring boot test场景依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <!--配置spring-ai-bom管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.ai</groupId>
                    <artifactId>spring-ai-bom</artifactId>
                    <version>${spring-ai.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    
  • 配置配置文件

    # 配置端口
    server:
      port: 8080
    # 配置服务名称
    spring:
      application:
        name: spring-ai-application
      # 配置spring ai
      ai:
        # 配置openai
        openai:
          # 配置ai调用的key
          api-key: api-key
          # 配置ai路径
          base-url: https://api.deepseek.com
          chat:
            options:
              # 配置模型
              model: deepseek-chat
              # 用于控制生成文本的多样性
              # 值越高,生成的文本就越多样化,但是可能包含更多的随机性和不可预测的内容
              # 值越低,生成的文本就越接近于确定性的结果,即生成的文本会更加一致和可预测
              temperature: 0.7
    
    
  • 创建配置类

    • 配置ChatClient的配置
    package com.springai.function.study.config;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @Configuration
    public class ChatClientConfig {
    
        /**
         * 通过配置方式,注入ChatClient
         * 未进行角色预设
         * @param chatClientBuilder ChatClient的内部接口
         * @return ChatClient
         */
        @Bean
        public ChatClient chatClient(ChatClient.Builder chatClientBuilder) {
    
            // 创建ChatClient对象,未进行角色预设
            return chatClientBuilder.build();
    
        }
    
    }
    
    
    • 配置自定义函数
    package com.springai.function.study.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Description;
    
    import java.util.function.Function;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @Configuration
    public class FunctionConfig {
        /**
         * 创建一个Record的特殊类,用于加法操作
         * @param a
         * @param b
         */
        public record AddOperation(int a,int b){}
    
        /**
         * 创建一个Record的特殊类,用于乘法操作
         * @param m
         * @param n
         */
        public record MulOperation(int m,int n){}
    
    
        /**
         * 进行函数注册,将加法函数实现注册
         * @return Function<AddOperation,Integer>
         */
        @Bean
        @Description("加法运算函数")
        public Function<AddOperation,Integer> addOperation() {
    
            return addOperation -> addOperation.a + addOperation.b;
    
        }
    
        /**
         * 进行函数注册,将乘法函数进行注册
         * @return Function<MulOperation,Integer>
         */
        @Bean
        @Description("乘法运算函数")
        public Function<MulOperation,Integer> mulOperation() {
    
            return (mulOperation) -> mulOperation.m + mulOperation.n;
    
        }
    
    
    
    }
    
    
  • 创建启动类

    package com.springai.function.study;
    
    import org.apache.catalina.core.ApplicationContext;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiFunctionApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiFunctionApplication.class,args);
    
    
    
            System.out.println("Hello World!");
    
        }
    
    }
    
    
  • 创建controller接口,实现Spring AI调用自定义函数

    package com.springai.function.study.controller;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.ai.chat.model.ChatModel;
    import org.springframework.ai.chat.prompt.Prompt;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/function")
    public class FunctionController {
    
        @Autowired
        private ChatClient chatClient;
    
        @Autowired
        private ChatModel chatModel;
    
        /**
         * 进行Spring Ai函数调用
         *
         * @param message 用户传递过来的信息
         * @return String
         */
        @GetMapping(value = "/chat",produces = {"text/html;charset=utf-8"})
        public Flux<String> chat(@RequestParam(value = "msg", defaultValue = "20加30等于多少") String message) {
    
            return ChatClient.builder(chatModel).build().prompt()
                    .system("""
                            您是算术计算器的代理。
                            您能够支持加法运算、乘法运算等操作,其余功能将在后续版本中添加,如果用户问的问题不支持请告知详情。
                            在提供加法运算、乘法运算等操作之前,您必须从用户处获取如下信息:两个数字,运算类型。
                            请调用自定义函数执行加法运算、乘法运算。
                            请讲中文。
                            """)
                    .user(message) // 设置用户消息
                    .functions("addOperation","mulOperation") // 设置函数
                    .stream() // 使用流式输出
                    .content(); // 获取返回的内容
    
        }
    
    
    }
    
    

五、Spring AI调用ollama

1. 下载ollama

image-20250618222028542

image-20250618222107530

2. 配置ollama系统环境变量

  • 说明

    • 配置大模型下载目录

      image-20250618222306745

3. 安装ollama

  • 直接安装即可

4. 拉取大模型

  • 查看大模型网址

    image-20250618222554621

    image-20250618222734934

  • 拉去模型

    • 指令

      ollama pull deepseek-r1:1.5b
      

      image-20250618222853949

  • 运行大模型

    • 指令

      ollama run deepseek-r1:1.5b
      

      image-20250618223018886

5. Spring AI 调用ollama

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.3.8</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <artifactId>springai-ollama</artifactId>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <spring-ai.version>1.0.0-M5</spring-ai.version>
        </properties>
    
    
        <dependencies>
            <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>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.ai</groupId>
                    <artifactId>spring-ai-bom</artifactId>
                    <version>${spring-ai.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <!--下载spring-ai相关包需要用到的仓库地址-->
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    
    
    </project>
    
  • 配置文件

    server:
      # 配置端口号
      port: 8080
    spring:
      application:
        # 服务名称
        name: spring-ai-application
      ai:
        ollama:
          # 配置连接地址
          base-url: http://localhost:11434
          chat:
            options:
              # 配置模型
              model: deepseek-r1:1.5b
              # 配置文本的多样性
              temperature: 0.7
    
  • 创建启动类

    package com.springai.ollama.study;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiOllamaApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiOllamaApplication.class,args);
    
        }
    }
    
  • 创建controller,实现Spring AI调用ollama

    package com.springai.ollama.study.controller;
    
    import org.springframework.ai.ollama.OllamaChatModel;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/ollama")
    public class OllamaController {
    
        @Autowired
        private OllamaChatModel ollamaChatModel;
    
        /**
         * Spring AI连接ollama测试
         * @param message 用户输入的信息
         * @return String
         */
        @GetMapping("/chat")
        public String chat(@RequestParam(value = "msg",defaultValue = "你是谁") String message) {
            // 进行对话并返回结果
            return ollamaChatModel.call(message);
    
        }
    
    }
    
    

六、Spring AI Alibaba

1. 登录阿里云通义千问

2. 实现Spring AI Alibaba 调用大模型

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring_ai_alibaba</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <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>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-starter</artifactId>
                <version>1.0.0-M5.1</version>
            </dependency>
        </dependencies>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>
    
  • 配置配置文件

    server:
      port: 8080
    spring:
      application:
        name: spring-ai-alibaba-application
      ai:
        # 配置api-key 
        dashscope:
          api-key: api-key
    
  • 创建启动类

    package com.springaialibaba.study;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiAlibabaApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiAlibabaApplication.class, args);
    
        }
    }
    
  • 创建controller,实现Spring AI Alibaba调用大模型

    package com.springaialibaba.study.controller;
    
    import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
    import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
    import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
    import org.springframework.ai.chat.memory.InMemoryChatMemory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/springaialibaba")
    public class SpringAiAlibabaController {
    
        private ChatClient dashScopeChatClient;
    
        /**
         * 通过构造器注入依赖
         * @param dashScopeChatClientBuilder
         */
        public SpringAiAlibabaController(ChatClient.Builder dashScopeChatClientBuilder) {
    
            this.dashScopeChatClient = dashScopeChatClientBuilder
                    // 设置默认系统提示词
                    .defaultSystem("你是一个博学的智能聊天助手,请根据用户提问回答!")
                    // 实现Chat Memory的Advisor
                    // 使用Chat Memory时需要使用对话id,以变Spring Ai处理上下文
                    .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
                    // 实现Logger的Advisor
                    .defaultAdvisors(new SimpleLoggerAdvisor())
                    // 设置ChatClient中的ChatModel的Options参数
                    .defaultOptions(DashScopeChatOptions
                            .builder()
                            .withTopP(0.7)
                            .build())
                    .build();
    
        }
    
        /**
         * 使用Spring AI Alibaba 与Ai对话
         * @param message 用户输入信息
         * @return String
         */
        @GetMapping("/chat")
        public String chat(@RequestParam(value = "msg",defaultValue = "你是谁") String message) {
    
            return  dashScopeChatClient.prompt(message).call().content();
    
        }
    
    }
    
    

七、Spring AI其它模型(使用Spring AI Alibaba)

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring_ai_other</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <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>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-starter</artifactId>
                <version>1.0.0-M5.1</version>
            </dependency>
        </dependencies>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>
    
  • 配置配置文件

    server:
      port: 8080
    spring:
      application:
        name: spring-ai-alibaba-application
      ai:
        dashscope:
          api-key: api-key
    
    
    
  • 创建启动类

    package com.springaialibaba.study;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiOtherApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiOtherApplication.class, args);
    
        }
    
    }
    
    

1. 图像处理模型

  • 创建controller层,实现图像处理模型的调用

    package com.springaialibaba.study.controller;
    
    import com.alibaba.cloud.ai.dashscope.api.DashScopeImageApi;
    import com.alibaba.cloud.ai.dashscope.image.DashScopeImageModel;
    import com.alibaba.cloud.ai.dashscope.image.DashScopeImageOptions;
    import jakarta.servlet.http.HttpServletResponse;
    import org.springframework.ai.image.ImagePrompt;
    import org.springframework.ai.image.ImageResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.URL;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/image")
    public class ImagesController {
    
        @Autowired
        private DashScopeImageModel dashScopeImageModel;
    
    
        /**
         * 使用Spring Ai Alibaba与图像模型进行对话
         * @param msg 用户输入的信息
         * @param response 响应对象
         */
        @GetMapping("/chat")
        public void chat(@RequestParam(value = "msg",defaultValue = "请帮我画一只可爱的小猫") String msg, HttpServletResponse response){
    
            ImageResponse imageResponse = dashScopeImageModel.call(new ImagePrompt(msg, // 传入用户输入的信息
                    DashScopeImageOptions.builder() // 设置Option对象
                            .withModel(DashScopeImageApi.DEFAULT_IMAGE_MODEL) // 设置生成图像的模型
                            .withHeight(1024) // 设置图片高度
                            .withWidth(1024) // 设置图片宽度
                            .withN(1) //生成图片的数量
                            .build()));
            // 获取生成的图片
            String imageUrl = imageResponse.getResult().getOutput().getUrl();
    
            InputStream inputStream = null;
    
            try {
                // 转换成图片路径
                URL  url = URI.create(imageUrl).toURL();
                // 将图片转换成流
                inputStream = url.openStream();
                // 设置响应头
                response.setHeader("content-Type", MediaType.IMAGE_PNG_VALUE);
                // 输出图片
                response.getOutputStream().write(inputStream.readAllBytes());
                // 进行刷新
                response.getOutputStream().flush();
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
    
    
        }
    
    }
    
    

2. 音频处理模型

  • 创建controller层,实现音频处理模型的调用

    package com.springaialibaba.study.controller;
    
    import com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisModel;
    import com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisOptions;
    import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisPrompt;
    import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.nio.ByteBuffer;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/audio")
    public class AudioController {
    
        @Autowired
        private DashScopeSpeechSynthesisModel dashScopeSpeechSynthesisModel;
    
    
        /**
         * 使用Spring Ai Alibaba对接语音模型
         */
        @GetMapping("/chat")
        public void chat() {
    
            final String TEXT = "床前明月光, 疑是地上霜。 举头望明月, 低头思故乡。";
            // 进行模型对话
            SpeechSynthesisResponse synthesisResponse = dashScopeSpeechSynthesisModel.call(
                    new SpeechSynthesisPrompt(TEXT, DashScopeSpeechSynthesisOptions.builder()
                            .withSpeed(1.0) // 设置语速
                            .withPitch(1.0) // 设置音调
                            .withVolume(60) // 设置音量
                            .build()));
            // 创建文件对象
            File file = new File("C:\\software\\javacodelibrary\\spring-ai\\spring_ai_other\\src\\main\\resources" + "\\output.mp3");
    
            // 文件保存在本地
            try (FileOutputStream fileOutputStream = new FileOutputStream(file)){
    
                // 获取结果
                ByteBuffer audio = synthesisResponse.getResult().getOutput().getAudio();
                // 保存文件
                fileOutputStream.write(audio.array());
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
    
        }
    
    }
    
    

八、Spring AI 调用RAG

1. RAG执行流程

  • 用户输入问题
  • 问题向量化
  • 向量数据库检索
  • 构建上下文(含系统提示词)
  • 携带检索内容,调用大模型进行回答
  • 返回最终答案给用户

2. Spring AI实现调用RAG

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring_ai_rag</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <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>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-starter</artifactId>
                <version>1.0.0-M5.1</version>
            </dependency>
        </dependencies>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>
    
  • 配置配置文件

    server:
      port: 8080
    spring:
      application:
        name: spring-ai-alibaba-application
      ai:
        dashscope:
          api-key: api-key
    
  • 创建配置类

    • 配置ChatClient和向量化数据
    package com.springaialibaba.rag.study.config;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingModel;
    import org.springframework.ai.vectorstore.SimpleVectorStore;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.List;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @Configuration
    public class RagConfig {
    
        /**
         * 设置角色
         * @param builder ChatClient内部接口
         * @return ChatClient
         */
        @Bean
        public ChatClient chatClient(ChatClient.Builder builder) {
    
            return builder.defaultSystem("你将作为一名Java开发语言的专家,对于用户的使用需求作出解答").build();
    
        }
    
        /**
         * 设置VectorStore对象
         * @param embeddingModel
         * @return  VectorStore
         */
        @Bean
        public VectorStore vectorStore(EmbeddingModel embeddingModel) {
    
            // 创建SimpleVectorStore对象
            SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();
            // 创建document对象集合
            List<Document> documents = List.of(new Document("产品说明:名称:Java开发语言\n" +
                    "产品描述:Java是一种面向对象开发语言。\n" +
                    "特性:\n" +
                    "1. 封装\n" +
                    "2. 继承\n" +
                    "3. 多态\n"));
            // 添加document对象
            simpleVectorStore.add(documents);
    
            return simpleVectorStore;
    
    
        }
    }
    
    
  • 创建启动类

    package com.springaialibaba.rag.study;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiRagApplication {
    
        public static void main(String[] args) {
    
            SpringApplication.run(SpringAiRagApplication.class, args);
    
        }
    
    }
    
    
  • 创建controller实现Spring AI调用RAG

    package com.springaialibaba.rag.study.controller;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/rag")
    public class RagController {
    
        @Autowired
        private ChatClient chatClient;
    
        @Autowired
        private VectorStore vectorStore;
    
    
        /**
         * Spring Ai 调用rag
         * @param message 用户输入的信息
         * @return Flux<String>
         */
        @GetMapping(value = "/chat",produces = "text/html;charset=utf-8")
        public Flux<String> chat(@RequestParam(value = "msg",defaultValue = "请问Java有什么特性") String message) {
            // 进行对话
            return chatClient.prompt().user(message).advisors(new QuestionAnswerAdvisor(vectorStore)).stream().content();
    
    
        }
    
    }
    
    

九、综合案例演示

1. 实现步骤

  • 创建项目,导入依赖
  • 创建RAG知识库
  • 创建工具类
  • 设置应用人设
  • 实现接口进行测试

2. 实现案例

  • 配置依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leon.rabbitmq_study</groupId>
        <artifactId>spring_ai_summary</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <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>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-starter</artifactId>
                <version>1.0.0-M5.1</version>
            </dependency>
        </dependencies>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>
    
  • 配置配置文件

    server:
      port: 8080
    spring:
      application:
        name: spring-ai-alibaba-application
      ai:
        dashscope:
          api-key: api-key
    
    
  • 准备数据

    教育经历
    北京大学 软件工程 本科 2005.09 - 2009.06
    主修课程:Java语言开发、C语言开发、操作系统、编译原理、计算机网络、算法导论、电商商务、电子基础、高等数学、概率论与统计、离散数学。
    工作经验
    阿里巴巴有限公司 算法工程师
    2009-7-1 - 2015-7-10
    拥有五年以上的算法工程师经验,熟悉各种开发语言的使用,比如Java、C++、C#等,熟练使用各种主流深度学习框架,能独立开发出高质量、高性能的算法模型,精通数据结构、算法及机器学习模型的实现与优化,在多个项目中负责算法模型的设计与开发,包括基于深度学习的图像识别、语音识别及自然语言处理等方向。。
    小米科技有限公司 算法工程师
    2015-8-1 - 2020-3-1
    担任小米科技有限公司算法工程师,负责参与开发高性能机器学习算法。在项目中,我使用Python和MATLAB编写了多种算法模型,并且实现了GPU加速计算,使得算法在处理大规模复杂数据时表现优异。
    就职于小米科技有限公司,作为算法工程师,全程参与了一款自动驾驶系统的开发。在项目中,我主要通过深度学习、目标检测等技术,实现了车辆识别、道路分割等多项技术难点,使得系统在真实道路环境下表现出了较高的稳定性和可靠性。
    在小米科技有限公司,我作为算法工程师负责了一项推荐系统的研发。该系统基于用户行为数据,使用协同过滤和深度学习技术,为用户推荐最优质的内容。在项目中,我优化了多种推荐算法,优化推荐精度达到了90%以上。
    
  • 创建RAG知识库

    • 通过配置类的方式
    package com.springai.summary.config;
    
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingModel;
    import org.springframework.ai.reader.TextReader;
    import org.springframework.ai.transformer.splitter.TokenTextSplitter;
    import org.springframework.ai.vectorstore.SimpleVectorStore;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    
    import java.util.List;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @Configuration
    public class RagConfig {
    
        /**
         * 将数据向量化
         * @param embeddingModel
         * @return  VectorStore
         */
        @Bean
        public VectorStore vectorStore(EmbeddingModel embeddingModel) {
            // 创建SimpleVectorStore对象
            SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();
    
            // 创建文件路径
            String filePath = "张三简历.txt";
            // 提取文本内容
            TextReader textReader = new TextReader(filePath);
    
            textReader.getCustomMetadata().put("filePath", filePath);
            // 将document保存在集合中
            List<Document> documents = textReader.get();
    
            // 将文本进行切分段落
            TokenTextSplitter tokenTextSplitter =
                    new TokenTextSplitter(1200, 350, 5, 100, true);
            // 进行切分
            tokenTextSplitter.apply(documents);
            // 将document对象集合添加进VectorStore中
            simpleVectorStore.add(documents);
    
            return simpleVectorStore;
    
    
        }
    
    }
    
    
  • 创建工具类

    • 函数工具类
    package com.springai.summary.utils;
    
    import java.util.function.Function;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    public class RecruitServiceFunction implements Function<RecruitServiceFunction.Request, RecruitServiceFunction.Response> {
    
        /**
         * 此函数用来判断面试者是否符合面试条件
         * @param request 过来面试的人
         * @return Response  是否合适
         */
        @Override
        public Response apply(Request request) {
    
            String result = "不合适";
    
            if(request.name.equals("张三")){
                result = "算法工程师";
            }
    
            return new Response(result);
        }
    
        /**
         * 请求者
         * @param name 名字
         */
        public record Request(String name){};
    
        /**
         * 响应
         * @param result 结果
         */
        public record Response(String result){}
    
    }
    
    
    • 将函数注入到容器中
      • 通过配置类的方式注入
    package com.springai.summary.config;
    
    import com.springai.summary.utils.RecruitServiceFunction;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Description;
    
    import java.util.function.Function;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @Configuration
    public class FunctionConfig {
    
        /**
         * 将函数注入到容器中
         * @return Function<RecruitServiceFunction.Request, RecruitServiceFunction.Response>
         */
        @Bean
        @Description("判断某人是否符合面试要求")
        public Function<RecruitServiceFunction.Request, RecruitServiceFunction.Response> recruitServiceFunction() {
    
            return new RecruitServiceFunction();
    
        }
    
    }
    
    
  • 实现controller层,设置人设并调用大模型

    package com.springai.summary.controller;
    
    import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
    import org.springframework.ai.chat.messages.Message;
    import org.springframework.ai.chat.messages.SystemMessage;
    import org.springframework.ai.chat.model.ChatModel;
    import org.springframework.ai.chat.model.ChatResponse;
    import org.springframework.ai.chat.model.Generation;
    import org.springframework.ai.chat.prompt.Prompt;
    import org.springframework.ai.chat.prompt.PromptTemplate;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @RestController
    @RequestMapping("/summery")
    public class SummeryController {
    
        @Autowired
        private ChatModel chatModel;
    
        @Autowired
        private VectorStore vectorStore;
    
        /**
         * 整合之前的模型,使用RAG加上函数实现一个面试助手
         * @param message 用户输入的信息
         * @return String
         */
        @GetMapping("/ai")
        public String summery(@RequestParam(value = "msg") String message) {
            // 检索数据
            List<Document> documents = vectorStore.similaritySearch(message);
    
            // 提取相关信息
            String info = "";
    
            // 判断是否有数据
            if (documents.size() > 0) {
                info = documents.get(0).getText();
            }
    
            // 构造系统提示词
            String systemPrompt = """
                    角色与目标:你是一个招聘助手,会针对用户的问题,结合候选人经历,岗位匹配度等专业知识,给用户提供指导。
                    指导原则:你需要确保给出的建议合理科学,不会对候选人的表现有言论侮辱。
                    限制:在提供建议时,需要强调在个性建议方面用户仍然需要线下寻求专业咨询。
                    澄清:在与用户交互过程中,你需要明确回答用户关于招聘方面的问题,对于非招聘方面的问题,你的回应是‘我只是一个招聘助手,不能回答这个问题哦’。
                    个性化:在回答时,你需要以专业可靠的预期回答,偶尔可以带点幽默感。调节气氛。
                    给你提供一个数据参考,并且给你调用岗位投递检索公户
                    请你跟进数据参考与工具返回结果回复用户的请求。
                    """;
            // 构造用户提示你词
            String userPrompt = """
                    给你提供一些数据参考:{info},请回答我的问题:{message}。
                    请你跟进数据参考与工具返回结果回复用户的请求。
                    """;
            // 设置系统提示词
            SystemMessage systemMessage = new SystemMessage(systemPrompt);
            // 设置角色提示词
            PromptTemplate promptTemplate = new PromptTemplate(userPrompt);
            // 构建提示词消息对象
            Message templateMessage = promptTemplate.createMessage(Map.of("info", info, "message", message));
            // 生成提示词对象
            Prompt prompt = new Prompt(List.of(templateMessage,systemMessage),
                    DashScopeChatOptions.builder().withFunction("recruitServiceFunction").build());
            // 进行对话,然后获取结果
            return  chatModel.call(prompt).getResults() // 获取结果
                    .stream() // 装换成流
                    .map(g -> g.getOutput().getContent()) // 获取结果
                    .collect(Collectors.joining()); // 进行拼接
    
        }
    
    }
    
    
  • 创建启动类

    package com.springai.summary;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @date 2025/6/18
     * @author: l
     */
    @SpringBootApplication
    public class SpringAiSummaryApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringAiSummaryApplication.class, args);
        }
    
    }
    
    

Comment