spring AI 功能初体验

上一篇文章,我们介绍了如何在本地部署deepseek,这一篇我们继续学以致用,探索一下如何通过springAI 框架快速继承我们的deepseek服务,实现对外服务的功能。

1. 创建一个springboot ai项目

springboot提供了一个ai框架,可以快速创建一个ai项目,并可以通过配置的方式,快速集成:

  • openai
  • 智谱ai
  • 千帆ai
  • google vertexAI
  • Azure openAI
  • deepseek
  • 月之暗面kimi
  • 英伟达chat
  • IBM的watsonX ai
  • ollma大模型
  • 各种常见的向量数据库

可以看到,deepseek很快就集成进去了,正好满足我们的诉求。

构建项目

打开springboot的快速构建页面,添加Open AISpring Reactive Web两个依赖,然后开始。
spring AI项目

  • Open AI 是一个chat框架,除了接入openai外,还可以接入我们的deepseek r1模型。
  • Spring Reactive Web 是交互式web框架,deepseek的流式交互需要用的此框架,而我们部署的deepseek r1 1.5b模型似乎只支持流式交互,所以需要用到此框架。
    • 神奇的时,如果我连deepseek官方的满血r1模型,及时不是流式交互,也是可以的,这里尚未找到原因,有知道的朋友可以解答一下。

这就是我们创建好的springboot AI项目的pom配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
	<dependencies>
<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-web</artifactId>-->
<!-- </dependency>-->

<!--r1 必须是流模式-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

api接口

chat controller 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@RestController
@RequestMapping("/ai/chat")
public class ChatController {

private final OpenAiChatModel chatModel;

@Autowired
public ChatController(OpenAiChatModel chatModel) {
this.chatModel = chatModel;
}

/**
* 阻塞式接口,可以使用普通的web框架,会等deepseek回答完成后一次性返回
* @param message 问题
* @return
*/
@GetMapping("/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
String uuid = UUID.randomUUID().toString();
System.out.printf("uid=%s, message: %s%n", uuid, message);
String res = this.chatModel.call(message);
System.out.printf("uid=%s, message: %s%n", uuid, res);
return Map.of("generation", res);
}
/**
* 流式交互接口,会一个字一个字的返回数据,需要使用响应式web框架
* @param message 问题
* @return
*/
@GetMapping("/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return this.chatModel.stream(prompt);
}
}

  • generate: 阻塞式接口,如果我们介入的deepseekV3模型,R1满血模型,可以用这个接口请求,会一次性把回答全部返回。需要添加依赖spring-boot-starter-web
  • generateStream:流式接口,如果deepseekV3模型,R1模型,可以用这个接口请求,会一个字一个字返回数据。 经验证,R1的1.5B模型仅支持流式交互。

配置deepseek

最后,我们就可以介入自己搭建的deepseek了

1
2
3
4
5
6
# r1 模型需要使用流模式
spring.ai.openai.base-url=http://192.168.2.68:8000
spring.ai.openai.api-key=test-key # 自己搭建的模型不用key
spring.ai.openai.chat.options.model=model/DeepSeek-R1-Distill-Qwen-1.5B
spring.ai.openai.embedding.enabled=false

启动项目

然后在浏览器里访问http://localhost:8080/ai/chat/generateStream?message=你是谁 ,就可以看到deepseek的回答了,会看到一长串的流式数据,类似下面:
deepseek r1流式返回demo

参考

spring AI 官方文档

github demo代码


spring AI 功能初体验
https://www.hancher.top/2025/03/24/spring-springboot-ai-demo/
作者
寒澈
发布于
2025年3月24日
许可协议