Spring?AI集成DeepSeek實(shí)現(xiàn)流式輸出的操作方法
前面一篇文章我們實(shí)現(xiàn)了《Spring AI集成DeepSeek:三步搞定Java智能應(yīng)用》,大模型的響應(yīng)速度是很慢的,為了提升用戶體驗(yàn),我們通常會(huì)使用流式輸出一點(diǎn)點(diǎn)將結(jié)果輸出給用戶。先看下效果:

在 SpringBoot 中實(shí)現(xiàn)流式輸出可以使用 Sse(Server-SentEvents,服務(wù)器發(fā)送事件)技術(shù)來(lái)實(shí)現(xiàn),它是一種服務(wù)器推送技術(shù),適合單向?qū)崟r(shí)數(shù)據(jù)流,我們使用 SpringMVC(基于Servlet)中的SseEmitter對(duì)象來(lái)實(shí)現(xiàn)流式輸出。
一、后端代碼
/**
* 流式調(diào)用
*/
@GetMapping("/generateStream")
public SseEmitter streamChat(@RequestParam String message) {
// 創(chuàng)建 SSE 發(fā)射器,設(shè)置超時(shí)時(shí)間(例如 1 分鐘)
SseEmitter emitter = new SseEmitter(60_000L);
// 創(chuàng)建 Prompt 對(duì)象
Prompt prompt = new Prompt(new UserMessage(message));
// 訂閱流式響應(yīng)
// 完成處理
// 異常處理
openAiChatModel.stream(prompt).subscribe(response -> {
try {
String content = response.getResult().getOutput().getContent();
System.out.print(content);
// 發(fā)送 SSE 事件
emitter.send(SseEmitter.event()
.data(content)
.id(String.valueOf(System.currentTimeMillis()))
.build());
} catch (Exception e) {
emitter.completeWithError(e);
}
},
emitter::completeWithError,
emitter::complete
);
// 處理客戶端斷開連接
emitter.onCompletion(() -> {
// 可在此處釋放資源
System.out.println("SSE connection completed");
});
emitter.onTimeout(() -> {
emitter.complete();
System.out.println("SSE connection timed out");
});
return emitter;
}二、前端代碼
前端接受數(shù)據(jù)流也比較簡(jiǎn)單,不需要在使用傳統(tǒng) Ajax 技術(shù)了,只需要?jiǎng)?chuàng)建一個(gè) EventSource 對(duì)象,監(jiān)聽后端 SSE 接口,然后將接收到的數(shù)據(jù)流展示出來(lái)即可,如下代碼所示:
$('#send-button').click(function () {
const message = $('#chat-input').val();
// 立即清空輸入框
$('#chat-input').val('');
// 用戶消息(保持原有樣式)
var userMessage = $('<div class="message user"></div>');
userMessage.append('<img class="avatar" src="/images/user.png" alt="用戶頭像">');
userMessage.append(`<div class="content"><span class="nickname">你</span><div class="text">${message}</div></div>`);
// 機(jī)器人消息容器(先創(chuàng)建空容器)
var botMessage = $('<div class="message bot"></div>');
botMessage.append('<img class="avatar" src="/images/robot.png" alt="助手頭像">');
botMessage.append('<div class="content"><span class="nickname">助手</span><div class="text"></div></div>');
// 按順序添加消息
$('#chat-messages').append(userMessage, botMessage);
// 流式處理
const eventSource = new EventSource(`/ai/generateStream?message=` + message);
eventSource.onmessage = function (event) {
botMessage.find('.text').append(event.data); // 追加到機(jī)器人消息內(nèi)容區(qū)
};
// 錯(cuò)誤處理
eventSource.onerror = function (err) {
$('#chat-input').val(''); // 確保網(wǎng)絡(luò)異常時(shí)也清空
console.error("連接錯(cuò)誤:", err);
eventSource.close();
};
});完整代碼可查看:
Gitee:https://gitee.com/tyronchen/spring-boot-learn/tree/master/Spring-AI
GitHub:https://github.com/tyronczt/spring-boot-learning/tree/master/Spring-AI
三、運(yùn)行項(xiàng)目
運(yùn)行項(xiàng)目測(cè)試結(jié)果:
- 啟動(dòng) Spring Boot 項(xiàng)目。
- 在瀏覽器中訪問地址 http://localhost:8888/index.html,即可看到流式輸出的內(nèi)容逐漸顯示在頁(yè)面上。
小天有話說(shuō)
此文參考居多,html頁(yè)面是使用idea中的通義插件所寫,Demo之作,樣式相對(duì)粗糙,如頁(yè)面的markdown樣式顯示支持不完善,顯示屏幕較小等。樣式并非重點(diǎn),后續(xù)將繼續(xù)學(xué)習(xí)Spring Ai相關(guān)技術(shù);
題外話
AI技術(shù)的應(yīng)用早已突破簡(jiǎn)單的API調(diào)用階段,唯有深耕深度學(xué)習(xí)領(lǐng)域,方能在技術(shù)迭代的浪潮中保持競(jìng)爭(zhēng)力。這一規(guī)律不僅適用于個(gè)人發(fā)展,更是企業(yè)生存的必然選擇。DeepSeek的崛起猶如一劑強(qiáng)心針,徹底激活了開源大模型領(lǐng)域的競(jìng)爭(zhēng)格局——據(jù)不完全統(tǒng)計(jì),已有超過200家頭部企業(yè)完成DeepSeek技術(shù)接口的集成部署,涵蓋華為、騰訊、百度、阿里、京東、字節(jié)等科技巨頭,以及微軟、英偉達(dá)、AWS等國(guó)際廠商。
對(duì)于開發(fā)者而言,**Spring AI Alibaba **作為阿里云推出的AI應(yīng)用開發(fā)框架,提供了從模型部署到智能體開發(fā)的完整解決方案。該框架支持40+插件集成,可實(shí)現(xiàn)RAG增強(qiáng)生成與工具調(diào)用等核心功能,顯著降低AI應(yīng)用開發(fā)門檻。接下來(lái)也會(huì)更新一些學(xué)習(xí)文章:如DeepSeek接入Spring Cloud Alibaba AI完成智能化實(shí)戰(zhàn)等,盡情期待!
參考資料
磊哥聊編程:https://segmentfault.com/a/1190000046109605
Spring AI Alibaba:https://java2ai.com/
到此這篇關(guān)于Spring AI集成DeepSeek實(shí)現(xiàn)流式輸出的操作方法的文章就介紹到這了,更多相關(guān)Spring AI DeepSeek流式輸出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring AI集成DeepSeek三步搞定Java智能應(yīng)用的詳細(xì)過程
- Spring AI集成DeepSeek的詳細(xì)步驟
- Spring AI與DeepSeek實(shí)戰(zhàn)一之快速打造智能對(duì)話應(yīng)用
- Deepseek整合SpringAI詳細(xì)流程
- 基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能
- SpringBoot或SpringAI對(duì)接DeepSeek大模型的詳細(xì)步驟
- Spring AI內(nèi)置DeepSeek的詳細(xì)步驟
- SpringBoot整合DeepSeek實(shí)現(xiàn)AI對(duì)話功能
相關(guān)文章
SpringBoot中@AutoConfiguration和@Configuration區(qū)別
@AutoConfiguration是Spring Boot2.4引入的一個(gè)新注解,用于標(biāo)記自動(dòng)配置類,它是對(duì)傳統(tǒng)@Configuration 注解的增強(qiáng),下面就來(lái)詳細(xì)的介紹一下這兩者的區(qū)別,感興趣的可以了解一下2025-09-09
IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類
本文主要介紹了IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法
這篇文章主要介紹了JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法,涉及java使用FTP實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2015-06-06
程序員必會(huì)的7種最常用高頻設(shè)計(jì)模式
Java設(shè)計(jì)模式是提升代碼質(zhì)量的核心技能,這篇文章主要介紹了程序員必會(huì)的7種最常用高頻設(shè)計(jì)模式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-05-05
基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能(兩種驗(yàn)證碼方式)
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能,今天我們介紹的是兩種主流的驗(yàn)證碼,一種就是進(jìn)行計(jì)算的驗(yàn)證碼,另外一種就是不需要計(jì)算,直接輸入的驗(yàn)證碼,需要的朋友可以參考下2024-08-08
Spring Boot WebSocket 兩種集成方式詳解
WebSocket 是實(shí)現(xiàn)服務(wù)器主動(dòng)推送、實(shí)時(shí)通信的利器,常見于聊天室、消息通知、實(shí)時(shí)監(jiān)控大屏等場(chǎng)景,本文詳細(xì)介紹了SpringBoot集成WebSocket的兩種方式,感興趣的朋友跟隨小編一起看看吧2026-05-05

