Spring AI與DeepSeek實戰(zhàn)一之快速打造智能對話應用
一、概述
在 AI 技術蓬勃發(fā)展的今天,國產大模型 DeepSeek 憑借其 低成本、高性能 的特點,成為企業(yè)智能化轉型的熱門選擇。而 Spring AI 作為 Java 生態(tài)的 AI 集成框架,通過統(tǒng)一API、簡化配置等特性,讓開發(fā)者無需深入底層即可快速調用各類 AI 服務。本文將手把手教你通過 spring-ai 集成 DeepSeek 接口實現(xiàn)普通對話與流式對話功能,助力你的 Java 應用輕松接入 AI 能力!
二、申請DeepSeek的API-KEY
相較于直接調用 DeepSeek 官方的 API,阿里云百煉基于阿里云強大的云計算基礎設施,提供了高可用性和穩(wěn)定性的服務,并且支持程序運行時動態(tài)切換 模型廣場 中的任意大模型。

登錄阿里云,進入 阿里云百煉 的頁面:
https://bailian.console.aliyun.com/?apiKey=1#/api-key
創(chuàng)建自己的 API-KEY

三、項目搭建
3.1. 開發(fā)環(huán)境要求
- JDK 17+
- Spring Boot 3.2.x及以上
3.2. maven配置
在 Spring Boot 項目的 pom.xml 中添加 spring-ai 依賴
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>增加倉庫的配置
<repositories>
<repository>
<id>alimaven</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>3.3. 配置 API-KEY
在 application.yml 中添加以下配置:
spring:
ai:
dashscope:
api-key: sk-xxxxxxapi-key 配置在阿里云百煉里申請的api-key 3.4. 創(chuàng)建ChatClient對象
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
String sysPrompt = """
你是一個博學的智能聊天助手,請根據(jù)用戶提問回答。
請講中文。
今天的日期是 {current_date}。
""";
this.chatClient = builder
.defaultSystem(sysPrompt)
.defaultOptions(
DashScopeChatOptions.builder()
/**
* 值范圍:[0, 2),系統(tǒng)默認值0.85。不建議取值為0,無意義
*/
.withTemperature(1.3)
.withModel("deepseek-v3")
.build()
)
.build();
}
- defaultSystem 指定系統(tǒng) prompt 來約束大模型的行為或者提供一些上下文信息,如這里告訴大模型今天的日期是多少,支持占位符;
- defaultOptions 配置模型的參數(shù)
- withTemperature 用于控制隨機性和多樣性的程度,值越高大模型回復的內容越豐富越天馬行空
- withModel 配置模型廣場中的模型名稱,這里填寫 deepseek-v3
模型廣場的模型名稱清單:https://help.aliyun.com/zh/model-studio/getting-started/models
3.5. 創(chuàng)建對話接口
@GetMapping(value = "/chat")
public String chat(@RequestParam String input, HttpServletResponse response) {
// 設置字符編碼,避免亂碼
response.setCharacterEncoding("UTF-8");
return chatClient.prompt().user(input)
.system(s -> s.param("current_date", LocalDate.now().toString()))
.call()
.content();
}每次調用接口時,通過 system 來給 current_date 占位符動態(tài)賦值。
調用示例:
問身份

問日期

3.6. 切換模型
@GetMapping(value = "/chat")
public String chat(@RequestParam String input, @RequestParam(required = false) String model, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
if (StrUtil.isEmpty(model)) {
model = "deepseek-v3";
}
return chatClient.prompt().user(input)
.system(s -> s.param("current_date", LocalDate.now().toString()))
.options(DashScopeChatOptions.builder().withModel(model).build())
.call()
.content();
}使用 withModel 來配置模型名稱
調用示例:
切換deepseek-r1模型

切換通義千問模型

3.7. 使用prompt模板
通過 PromptTemplate 可以編輯復雜的提示詞,并且也支持占位符
@GetMapping(value = "/chatTemp")
public String chatTemp(@RequestParam String input, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
// 使用PromptTemplate定義提示詞模板
PromptTemplate promptTemplate = new PromptTemplate("請逐步解釋你的思考過程: {input}");
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt)
.system(s -> s.param("current_date", LocalDate.now().toString()))
.call()
.content();
}這里提出讓 deepseek-v3 進行逐步拆分思考,并把思考過程返回。
調用示例:

可以看到大模型會拆分多步來進行推論結果。
3.8. 使用流式對話
當前接口需等待大模型完全生成回復內容才能返回,這用戶體驗并不好。為實現(xiàn)類似 ChatGPT 的逐句實時輸出效果,可采用流式傳輸技術(Streaming Response)。
@GetMapping(value = "/streamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String input, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
// 使用PromptTemplate定義提示詞模板
PromptTemplate promptTemplate = new PromptTemplate("請逐步解釋你的思考過程: {input}");
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt)
.system(s -> s.param("current_date", LocalDate.now().toString()))
.stream()
.content()
.concatWith(Flux.just("[DONE]"))
.onErrorResume(e -> Flux.just("ERROR: " + e.getMessage(), "[DONE]"));
}- 調用時把 call() 改成 stream()
- 并且遵循SSE協(xié)議最后發(fā)送
[DONE]終止標識
調用示例:

- data: xxx 這種是
Server-Sent Events的格式要求; - 需要前端搭配 EventSource 或 WebSocket 等方式來接收流式數(shù)據(jù),并結合 marked.js 來正確顯示 markdown 語法。
四、總結
雖然通過 Spring AI 能夠快速完成 DeepSeek 大模型與 Spring Boot 項目的對接,實現(xiàn)基礎的對話接口開發(fā),但這僅是智能化轉型的初級階段。要將大模型能力真正落地為生產級應用,還是需實現(xiàn)以下技術:
- 能力擴展層:通過
智能體實現(xiàn)意圖理解與任務調度,結合FunctionCall實現(xiàn)結構化數(shù)據(jù)交互,實現(xiàn)AI與業(yè)務系統(tǒng)的無縫對接; - 知識增強層:應用
RAG(檢索增強生成)技術構建領域知識庫,解決大模型幻覺問題,支撐專業(yè)場景的精準問答; - 流程編排層:設計
Agent工作流實現(xiàn)復雜業(yè)務邏輯拆解,支持多步驟推理與自動化決策; - 模型優(yōu)化層:基于業(yè)務數(shù)據(jù)實施模型微調
Fine-tuning提升垂直場景的響應質量和可控性。
五、完整代碼
Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
到此這篇關于Spring AI與DeepSeek實戰(zhàn)一:快速打造智能對話應用的文章就介紹到這了,更多相關Spring AI DeepSeek智能對話內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java 添加數(shù)字簽名到excel及檢測,刪除簽名
這篇文章主要介紹了Java 添加數(shù)字簽名到excel及檢測,刪除簽名的方法,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下2021-04-04
Spring Boot整合elasticsearch的詳細步驟
這篇文章主要介紹了Spring Boot整合elasticsearch的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
基于Java中對域和靜態(tài)方法的訪問不具有多態(tài)性(實例講解)
下面小編就為大家?guī)硪黄贘ava中對域和靜態(tài)方法的訪問不具有多態(tài)性(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Java中StringUtils與CollectionUtils和ObjectUtil概念講解
這篇文章主要介紹了Java中StringUtils與CollectionUtils和ObjectUtil概念,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-12-12

