前言
在 AI 兴起的时候,面向的是 Python 开发者,而现在有了 Spring AI,作为Java 开发这也能将 AI 集成进我们的企业级项目中,广泛运用于实际业务,比如智能客服、健康饮食推荐、自动退订订单等等。本文将详细的讲解 SpringBoot 如何集成 DeepSeek 大模型服务,来完成聊天功能。
项目集成
截至发稿时间,Spring AI 的最新版本 1.1.2,要求 Spring Boot 3.4.x 和 3.5.x。
环境准备
- JDK:17+
- SpringBoot:3.4+
添加依赖
引入 deepseek模型和 webflux来进行流式响应
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
配置 DeepSeek 模型
可以自己去官网申请,我这里使用的是硅基流动免费的模型。
yaml
spring:
ai:
deepseek:
api-key: sk-xxxxx
base-url: https://api.siliconflow.cn
chat:
options:
model: xxx
temperature: 0.7
如果想和笔者使用同样的,可以跳转:cloud.siliconflow.cn/i/5I4ebAG9,...

实现第一个 AI 对话
新建控制器,创建/chat/simple接口,这里的ChatClient就是通用的聊天客户端,也可以使用 DeepSeek 的 ChatModel,这里不进行赘述。在这个简单示例中,message决定了用户消息的内容。该call()方法向 AI 模型发送请求,然后content()方法将AI模型的响应作为String。
kotlin
@RestController
@RequestMapping("/chat")
public class ChatBotController {
private final ChatClient chatClient;
public ChatBotController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping(value = "/simple")
public String simple(String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
调用接口后会一次性响应 AI 的内容。
如果内容比较大,体验感就不是很好,接下来我们可以采用流的方式来逐字进行输出。
流式输出
跟前面的相比较,将call()改成了stream(),告诉 AI 生成字符串的Flux。并且设置响应的类型为text/event-stream,前端可以通过EventSourceAPI轻松监听这个接口。每当收到一个新的数据块,就会触发onmessage事件,从而实现内容的实时追加显示,创造出类似打字机的效果。
typescript
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
这里调用后可以明显看得到不是一次性输出的结果。

大型语言模型(LLM)是无状态的,这意味着它们不会保留之前交互的相关信息。即使告诉了AI你叫什么,它依然在下次对话也会忘记。
聊天记忆
Spring AI 会自动配置一个ChatMemory 的 bean,您可直接在应用程序中使用。默认情况下,它使用内存存储库来存储消息(InMemoryChatMemoryRepository)以及MessageWindowChatMemory来管理对话历史。如果已配置了其他存储库(例如,Cassandra、JDBC 或 Neo4j),Spring AI 将改用该存储库。
less
@Autowired
ChatMemory chatMemory;
这里我们就直接使用内存来完成聊天的记忆功能。只需要使用advisors来配置即可:
scss
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(String message) {
return chatClient.prompt()
.user(message)
.advisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
.stream()
.content();
}
这样我们的 AI 就有了记忆了

思考
- 我们怎么给 AI 预置一个角色?比如让它作为一个智能客服或者作为一个营养师。
- 如果用户 A 和用户 B 同时对 AI 进行对话,怎么让对话进行隔离?
完整代码
后续我会整理后将代码放在Gitee:lanjii: 开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建, 集成了 JWT 认证、Spring Security 6、MyBatis-Plus
这是一款 MIT 协议可商用的SpringBoot脚手架,拥有完整的权限控制和常用的基础功能。希望大家给个 Star,后面有新的功能和一些 BUG 的修复也会提交到 Gitee。


小结
这样一个简单的带有记忆的 AI 聊天功能就开发好了。在实际场景中,我们如何将这个AI 结合到我们的业务中呢?比如如何让用户对话让 AI 检索我们自己的知识库,然后针对客户的问题在我们的知识库来进行回答。又或者让 AI 自动帮退订订单。