Spring AI整合聊天模型DeepSeek

参考资料:

参考视频

视频对应的资料,包括MD文件

SpringBoot搭建教程

参考demo及学习笔记

SpringAI官方


说明:

1. JDK及SpringBoot版本要求

搭建的时候记得选用JDK17+,不用系统安装,用IDEA下载的也可以

SpringBoot版本要求3.2.x或者3.3.x

2. DeepSeek的key

关于申请DeepSeek这里就不赘述了,网上一搜一大堆,申请地址


搭建流程:

提示:下面只讲述怎么配置,具体含义请自行进行查阅

依赖和配置

结合自己申请的DeepSeek的Key添加如下配置

bash 复制代码
server.port=8899
spring.application.name=SpringAiChatDemo

spring.ai.openai.api-key=sk-139298b9e929496290******
spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.chat.options.model=deepseek-chat
spring.ai.openai.chat.options.temperature=0.7

添加如下依赖及版本管理

XML 复制代码
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <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.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>

简单的请求接口(不推荐)

java 复制代码
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SimpleController {

    @Autowired
    private OpenAiChatModel chatModel;

    @GetMapping("/ai/generate")
    public String generate(@RequestParam(value = "message", defaultValue = "hello")String message) {
        String response = this.chatModel.call(message);
        System.out.println("response : "+response);
        return response;
    }
}

postman测试

构造注入式(不推荐)

构造注入式是直接从SpringBeanFactory里面拿,不推荐这种方式

java 复制代码
/**
 * 构造注入示例 (不推荐)
 */
@RestController
public class ConstructController {
    private final ChatClient chatClient;

    public ConstructController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }
    @GetMapping("/construct/chat")
    public String chat(@RequestParam(value = "msg",defaultValue = "给我讲个笑话")String message) {
        //prompt:提示词
        return this.chatClient.prompt()
                //用户输入的信息
                .user(message)
                //请求大模型
                .call()
                //返回文本
                .content();
    }
}

Spring自定义注入(推荐)

  • 先进行ChatClient注入和预设置

下面这个设置了默认角色,也可以不设置默认角色

java 复制代码
@Configuration
public class AIConfig {

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("你将作为一名Java开发语言的专家,对于用户的使用需求作出解答").build();
    }


}
  • 然后使用初始化好的ChatClient对象
java 复制代码
/**
 * Spring 自定义注入示例
 */
@RestController
public class SpringConfigController {

    @Autowired
    private ChatClient chatClient;

    @GetMapping("/springChat")
    public String chat(@RequestParam(value = "msg") String message) {
        return chatClient.prompt().user(message).call().content();
    }

}
  • 访问查看结果

流式响应

上述使用的是非流式,流式响应就是每生成一个字段就返回,此处不再赘述。

java 复制代码
/**
 * Spring 流式响应
 */
@RestController
public class StreamController {

    @Autowired
    private ChatClient chatClient;
    @GetMapping(value = "/chat/stream",produces="text/html;charset=UTF-8")
    public Flux<String> chatStream(@RequestParam(value = "msg") String message) {
        return chatClient.prompt().user(message).stream().content();
    }

}

基于chatModel的简单对话(不推荐)

java 复制代码
@RestController
public class ChatModelController {
    @Autowired
    private ChatModel chatModel;
    @GetMapping("/simpleChat")
    public String chat(@RequestParam("msg")String msg) {
        return chatModel.call(msg);
    }

    @GetMapping("/openai")
    public String openai(@RequestParam("msg")String msg) {
        ChatResponse call = chatModel.call(
                new Prompt(
                        msg,
                        OpenAiChatOptions.builder()
                                //可以更换成其他大模型,如Anthropic3ChatOptions亚马逊
                                .model("deepseek-chat")
                                .temperature(0.8)
                                .build()
                )
        );
        return call.getResult().getOutput().getContent();
    }
}

基于ChatModel使用提示语模板

java 复制代码
@RestController
public class ChatModelTemplateController {

    @Autowired
    private ChatModel chatModel;

    @GetMapping("/prompt")
    public String prompt(@RequestParam("name")String name,
                         @RequestParam("voice")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));
        List<Generation> results = chatModel.call(prompt).getResults();
        return results.stream().map(x->x.getOutput().getContent()).collect(Collectors.joining(""));
    }


}

SpringAI自动调用自定义方法---对AI结果进行处理(函数调用):

例如,用SpringAI自动对算术运算的语句进行解析,并且输出结果

  • 首先进行自定义方法的编写和注入
java 复制代码
@Configuration
public class CalculatorService {

    public record AddOperation(int a, int b) {

    }

    public record MulOperation(int m, int n) {

    }

    @Bean
    @Description("加法运算")
    public Function<AddOperation, Integer> addOperation() {
        return request -> {
            System.out.println("调用执行加法运算");
            return request.a + request.b;
        };
    }

    @Bean
    @Description("乘法运算")
    public Function<MulOperation, Integer> mulOperation() {
        return request -> {
            System.out.println("调用执行乘法运算");
            return request.m * request.n;
        };
    }
}
  • 然后调用使用
java 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CalculatorController {

    @Autowired
    private ChatModel chatModel;

    @GetMapping(value = "/calculator", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public String ragJsonText(@RequestParam(value = "userMessage") String userMessage) {
        return ChatClient.builder(chatModel)
                .build()
                .prompt()
                .system("""
                        您是算术计算器的代理。
                        您能够支持加法运算、乘法运算等操作,其余功能将在后续版本中添加,如果用户问的问题不支持请告知详情。
                        在提供加法运算、乘法运算等操作之前,您必须从用户处获取如下信息:两个数字,运算类型。
                        请调用自定义函数执行加法运算、乘法运算。
                        请讲中文。
                        """)
                .user(userMessage)
                .functions("addOperation", "mulOperation")
                .call()
                .content();
    }
}
  • 测试
  • 说明

程序自动调用,自定义的方法,并返回,关键在于提示语的设计,需要反复进行测试才行


SpringAI调用本地RAG数据进行问答:

SpringAI的Rag功能见Spring Ai Alibaba的文章。


SpringAI的其它功能

SpringAI的其他功能(如:图像、音视频)见Spring Ai Alibaba的文章

相关推荐
珹洺2 小时前
Java-Spring入门指南(十三)SpringMVC基本概念与核心流程详解
java·开发语言·spring
计算机毕业设计小帅2 小时前
【2026计算机毕业设计】基于Springboot的医院信息管理系统
spring boot·后端·课程设计
ccccczy_2 小时前
SpringCloudGateway:像城市交通指挥系统一样的微服务网关
java·springcloud·微服务网关·api网关·springcloudgateway
hello 早上好3 小时前
深入理解 SPI:从定义到 Spring Boot 实践
java·spring boot·python
【上下求索】3 小时前
学习笔记092——Windows如何将 jar 包启动设置成系统服务
java·windows·笔记·学习·jar
木子_lishk3 小时前
SpringBoot 不更改 pom.xml 引入各种 JDBC 驱动 jar 包
数据库·spring boot
vistaup3 小时前
android studio 无法运行java main()
android·java·android studio
liuyao_xianhui3 小时前
四数之和_优选算法(C++)双指针法总结
java·开发语言·c++·算法·leetcode·职场和发展
IT_陈寒4 小时前
React Hooks 实战:这5个自定义Hook让我开发效率提升了40%
前端·人工智能·后端