最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?AI集成DeepSeek實(shí)現(xiàn)流式輸出的操作方法

 更新時(shí)間:2025年03月06日 14:37:32   作者:小天努力學(xué)java  
本文介紹了如何在SpringBoot中使用Sse(Server-SentEvents)技術(shù)實(shí)現(xiàn)流式輸出,后端使用SpringMVC中的SseEmitter對(duì)象,前端使用EventSource對(duì)象監(jiān)聽SSE接口并展示數(shù)據(jù)流,通過這種方式可以提升用戶體驗(yàn),避免大模型響應(yīng)速度慢的問題,感興趣的朋友一起看看吧

前面一篇文章我們實(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中@AutoConfiguration和@Configuration區(qū)別

    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
  • Java中while循環(huán)的使用方法舉例詳解

    Java中while循環(huán)的使用方法舉例詳解

    在Java編程語(yǔ)言中,while循環(huán)是基礎(chǔ)控制結(jié)構(gòu)之一,用于重復(fù)執(zhí)行代碼塊直至滿足特定條件,掌握其使用是編程的基礎(chǔ),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類

    IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類

    本文主要介紹了IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java編程簡(jiǎn)單獲取圖片像素的方法

    java編程簡(jiǎn)單獲取圖片像素的方法

    這篇文章主要介紹了java編程簡(jiǎn)單獲取圖片像素的方法,涉及Java針對(duì)圖片的讀取與屬性獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法

    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ì)模式

    程序員必會(huì)的7種最常用高頻設(shè)計(jì)模式

    Java設(shè)計(jì)模式是提升代碼質(zhì)量的核心技能,這篇文章主要介紹了程序員必會(huì)的7種最常用高頻設(shè)計(jì)模式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • 淺談java面向?qū)ο笾兴姆N權(quán)限

    淺談java面向?qū)ο笾兴姆N權(quán)限

    這篇文章主要介紹了淺談java面向?qū)ο笾兴姆N權(quán)限,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能(兩種驗(yàn)證碼方式)

    基于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 BeanName生成器,你了解嗎

    三種Spring BeanName生成器,你了解嗎

    無(wú)論我們是通過 XML 文件,還是 Java 代碼,亦或是包掃描的方式去注冊(cè) Bean,都可以不設(shè)置BeanName,而Spring均會(huì)為之提供默認(rèn)的 beanName,本文我們就來(lái)看看 Spring 中三種處理不同情況的 beanName生成器吧
    2023-09-09
  • Spring Boot WebSocket 兩種集成方式詳解

    Spring Boot WebSocket 兩種集成方式詳解

    WebSocket 是實(shí)現(xiàn)服務(wù)器主動(dòng)推送、實(shí)時(shí)通信的利器,常見于聊天室、消息通知、實(shí)時(shí)監(jiān)控大屏等場(chǎng)景,本文詳細(xì)介紹了SpringBoot集成WebSocket的兩種方式,感興趣的朋友跟隨小編一起看看吧
    2026-05-05

最新評(píng)論

九江县| 大连市| 紫阳县| 灵石县| 神池县| 孝昌县| 肃北| 榆林市| 任丘市| 榆林市| 长宁区| 项城市| 大港区| 吉林市| 辽阳市| 民丰县| 府谷县| 宜君县| 新巴尔虎右旗| 晋江市| 蒲城县| 彭水| 巴里| 岢岚县| 巴里| 余干县| 栾川县| 扬中市| 旬邑县| 昌邑市| 乐亭县| 东乡| 县级市| 华坪县| 清新县| 芜湖县| 蒙自县| 朝阳县| 曲阜市| 南郑县| 海宁市|