精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

DeepSeek+SpringAI實現流式對話!

人工智能
想要實現流式結果輸出,后端和前端要如何配合?后端要使用什么技術實現流式輸出呢?接下來本文給出具體的實現代碼,

前一篇文章我們實現了《SpringAI集成滿血版DeepSeek》,但是大模型的響應速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結果,我們通常會使用流式輸出一點點將結果輸出給用戶。

那么問題來了,想要實現流式結果輸出,后端和前端要如何配合?后端要使用什么技術實現流式輸出呢?接下來本文給出具體的實現代碼,先看最終實現效果:

圖片

解決方案

在 Spring Boot 中實現流式輸出可以使用 Sse(Server-Sent Events,服務器發送事件)技術來實現,它是一種服務器推送技術,適合單向實時數據流,我們使用 Spring MVC(基于 Servlet)中的 SseEmitter 對象來實現流式輸出。

具體實現如下。

1.后端代碼

Spring Boot 程序使用 SseEmitter 對象提供的 send 方法發送數據,具體實現代碼如下:

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@RestController
public class StreamController {

    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter streamData() {
        // 創建 SSE 發射器,設置超時時間(例如 1 分鐘)
        SseEmitter emitter = new SseEmitter(60_000L);
        // 創建新線程,防止主程序阻塞
        new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    Thread.sleep(1000); // 模擬延遲
                    // 發送數據
                    emitter.send("time=" + System.currentTimeMillis());
                }
                // 發送完畢
                emitter.complete();
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        }).start();
        return emitter;
    }
}

2.前端代碼

前端接受數據流也比較簡單,不需要在使用傳統 Ajax 技術了,只需要創建一個 EventSource 對象,監聽后端 SSE 接口,然后將接收到的數據流展示出來即可,如下代碼所示:

<!DOCTYPE html>
<html>
  <head>
    <title>流式輸出示例</title>
  </head>
  <body>
    <h2>流式數據接收演示</h2>
    <button onclick="startStream()">開始接收數據</button>
    <div id="output" style="margin-top: 20px; border: 1px solid #ccc; padding: 10px;"></div>

    <script>
      function startStream() {
        const output = document.getElementById('output');
        output.innerHTML = ''; // 清空之前的內容

        const eventSource = new EventSource('/stream');

        eventSource.onmessage = function(e) {
          const newElement = document.createElement('div');
          newElement.textContent = "print -> " + e.data;
          output.appendChild(newElement);
        };

        eventSource.onerror = function(e) {
          console.error('EventSource 錯誤:', e);
          eventSource.close();
          const newElement = document.createElement('div');
          newElement.textContent = "連接關閉";
          output.appendChild(newElement);
        };
      }
    </script>
  </body>
</html>

3.運行項目

運行項目測試結果:

  • 啟動 Spring Boot 項目。
  • 在瀏覽器中訪問地址 http://localhost:8080/index.html,即可看到流式輸出的內容逐漸顯示在頁面上。

4.最終版:流式輸出

后端代碼如下:

import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.Map;

@RestController
public class ChatController {
    private final OpenAiChatModel chatModel;

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

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "你是誰?") String message) {
        return Map.of("generation", this.chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
    public SseEmitter streamChat(@RequestParam String message) {
        // 創建 SSE 發射器,設置超時時間(例如 1 分鐘)
        SseEmitter emitter = new SseEmitter(60_000L);
        // 創建 Prompt 對象
        Prompt prompt = new Prompt(new UserMessage(message));
        // 訂閱流式響應
        chatModel.stream(prompt).subscribe(response -> {
            try {
                String content = response.getResult().getOutput().getContent();
                System.out.print(content);
                // 發送 SSE 事件
                emitter.send(SseEmitter.event()
                             .data(content)
                             .id(String.valueOf(System.currentTimeMillis()))
                             .build());
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        },
                                           error -> { // 異常處理
                                               emitter.completeWithError(error);
                                           },
                                           () -> { // 完成處理
                                               emitter.complete();
                                           }
                                          );
        // 處理客戶端斷開連接
        emitter.onCompletion(() -> {
            // 可在此處釋放資源
            System.out.println("SSE connection completed");
        });
        emitter.onTimeout(() -> {
            emitter.complete();
            System.out.println("SSE connection timed out");
        });
        return emitter;
    }
}

前端核心 JS 代碼如下:

$('#send-button').click(function () {
  const message = $('#chat-input').val();
  const eventSource = new EventSource(`/ai/generateStream?message=` + message);
  // 構建動態結果
  var chatMessages = $('#chat-messages');
  var newMessage = $('<div class="message user"></div>');
  newMessage.append('<img class="avatar" src="/imgs/user.png" alt="用戶頭像">');
  newMessage.append(`<span class="nickname">${message}</span>`);
  chatMessages.prepend(newMessage);
  var botMessage = $('<div class="message bot"></div>');
  botMessage.append('<img class="avatar" src="/imgs/robot.png" alt="助手頭像">');
  // 流式輸出
  eventSource.onmessage = function (event) {
    botMessage.append(`${event.data}`);
  };
  chatMessages.prepend(botMessage);
  $('#chat-input').val('');
  eventSource.onerror = function (err) {
    console.error("EventSource failed:", err);
    eventSource.close();
  };
});

以上代碼中的“$”代表的是 jQuery。

責任編輯:姜華 來源: 磊哥和Java
相關推薦

2025-03-26 00:00:00

Spring服務器推送技術

2025-04-24 00:00:00

Spring AI流式輸出AI 模型

2025-02-12 09:04:20

2025-05-15 03:00:00

2025-05-08 02:10:00

SpringAIAPI

2025-03-19 07:37:54

2025-03-06 07:48:02

2025-07-21 07:19:00

大模型Java AISpring AI

2025-01-20 13:00:00

GPTSpringJava

2025-03-07 10:36:21

DeepSeekAI對話應用AI

2025-11-03 07:47:12

2025-04-21 08:13:58

ChatGPTAINLP

2025-04-07 00:00:00

DeepSeekAI輔助編程

2025-02-05 08:13:48

Go語言范式

2025-09-12 00:00:01

HTTP服務器Spring AI

2024-06-13 08:01:19

2009-12-28 13:47:35

WPF對話框

2025-02-17 08:00:00

DeepSeek模型AI

2025-10-15 14:08:14

SpringMCP服務器
點贊
收藏

51CTO技術棧公眾號

日韩亚洲国产欧美| 欧美电影免费网站| 亚洲精品国产精品乱码不99| 99视频在线播放| 国产精品va无码一区二区三区| 大色综合视频网站在线播放| 日韩欧美三级在线| 成人免费无码av| www视频在线免费观看| av在线这里只有精品| 国产精品久久在线观看| 国产精品9191| 999视频精品| 日韩精品电影网| 国产精品久久久久久久av福利| 天堂√中文最新版在线| 中文字幕亚洲一区二区va在线| 国产日产精品一区二区三区四区 | 蜜桃av在线免费观看| zzijzzij亚洲日本少妇熟睡| 国产精品久久久久久久久影视| 久操免费在线视频| 91麻豆精品国产91久久久平台 | 国产精品无码永久免费不卡| 日韩成人综合网站| 色综合久久中文字幕| 麻豆映画在线观看| 99青草视频在线播放视| 久久天堂av综合合色蜜桃网| 国产二区一区| 国产三级自拍视频| 美女视频免费一区| 日本精品久久久久影院| 国产精选第一页| 欧美激情91| 久久午夜a级毛片| 成人无码av片在线观看| 网曝91综合精品门事件在线| 精品国产乱码久久久久久牛牛 | 久久天堂电影网| 亚欧精品视频一区二区三区| 亚洲图区在线| 日韩av资源在线播放| 制服丝袜在线第一页| 不卡精品视频| 91精品久久久久久久99蜜桃| 亚洲36d大奶网| 搜成人激情视频| 日本道色综合久久| 北条麻妃av高潮尖叫在线观看| 是的av在线| 精品久久久免费| 国产成人精品视频免费看| 丁香高清在线观看完整电影视频| 亚洲精品国产高清久久伦理二区| 777久久精品一区二区三区无码| 日本天堂在线观看| 综合久久久久综合| 无码毛片aaa在线| 性国产高清在线观看| 一区二区三区在线看| 欧美另类videosbestsex日本| 2020国产在线视频| 亚洲伊人伊色伊影伊综合网| 污污污污污污www网站免费| 羞羞视频在线免费国产| 亚洲国产aⅴ成人精品无吗| 国产欧美日韩小视频| 瑟瑟视频在线看| 色婷婷综合中文久久一本| 欧美黄色性生活| 伊人亚洲精品| 亚洲精品在线电影| aa片在线观看视频在线播放| 国产精品欧美日韩一区| 日日骚久久av| 久久老司机精品视频| 一区二区三区精品视频在线观看| 国产91精品在线播放| 中日韩在线观看视频| 国产麻豆成人精品| 国产伦一区二区三区色一情| 欧美精品少妇| 17c精品麻豆一区二区免费| 男女裸体影院高潮| 第84页国产精品| 欧美剧在线免费观看网站| 无码国产精品一区二区高潮| 69精品国产久热在线观看| 日韩精品视频在线观看网址| 少妇愉情理伦三级| 欧美三级网页| 国产99久久精品一区二区永久免费 | 美女高潮在线观看| 欧美日韩在线综合| 女性生殖扒开酷刑vk| 国产一区二区电影在线观看| 欧美xxxx18性欧美| 一级做a爰片久久毛片| 韩国精品在线观看| 看高清中日韩色视频| 麻豆av免费在线观看| 五月激情丁香一区二区三区| 国内国产精品天干天干| 欧美三级自拍| 久久亚洲精品一区| 黄色av网站免费观看| 国产黄人亚洲片| 日韩福利在线| 日本不卡网站| 日韩三级在线观看| 亚洲天堂最新地址| 亚洲美女一区| 97久久精品午夜一区二区| 成年在线观看免费人视频| 亚洲第一主播视频| 手机在线观看日韩av| 欧美影院三区| 欧美一区二区影院| 高潮毛片7777777毛片| 日本一区二区成人| 国产a级一级片| 成人av综合网| 欧美猛少妇色xxxxx| 伊人网综合在线| 久久久久久电影| 91成人在线观看喷潮教学| 中文字幕久久精品一区二区| 日韩在线国产精品| 国产精品第六页| 26uuu久久天堂性欧美| 97免费视频观看| 亚洲精品黑牛一区二区三区| 久久久成人精品视频| 曰批又黄又爽免费视频| 中文字幕乱码亚洲精品一区| 成人小视频在线看| 日韩福利视频一区| 97视频免费看| 少妇喷水在线观看| 亚洲二区在线观看| 免费看三级黄色片| 欧美日韩专区| 国产精品日韩一区二区免费视频| 伊人影院在线视频| 日韩欧美一卡二卡| 日本a级片视频| 国产成人在线视频网址| 99精品一区二区三区的区别| 亚洲国产精选| 久久天天躁狠狠躁老女人| 国产理论视频在线观看| 亚洲男人的天堂在线观看| 97人人模人人爽人人澡| 91精品一区国产高清在线gif| 国产剧情久久久久久| 日本亚洲精品| 日韩一区二区电影| 久久精品性爱视频| aaa亚洲精品一二三区| 国产原创中文在线观看| 精品自拍偷拍| 国产精品扒开腿爽爽爽视频| yourporn在线观看中文站| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产又粗又猛又爽视频| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品夜夜夜爽张柏芝| 日本综合精品一区| 久久久久国产视频| 日本黄在线观看| 欧美视频你懂的| 麻豆视频在线免费看| 国产99精品视频| 北条麻妃在线视频观看| 日韩av片子| 电影午夜精品一区二区三区| 色一区二区三区| 日韩中文字幕在线看| wwwxxxx国产| 色综合中文综合网| 黄色激情小视频| 成人美女视频在线观看| 免费日韩中文字幕| 久久久久免费av| 久久久水蜜桃| www 久久久| 日韩av电影在线免费播放| 免费网站成人| 日韩精品免费在线视频| 国产乱人乱偷精品视频| 精品日韩视频在线观看| 97精品在线播放| 972aa.com艺术欧美| 色婷婷成人在线| 在线亚洲精品| 91精品国产吴梦梦| 在线视频亚洲专区| 亚洲aⅴ日韩av电影在线观看| 人狥杂交一区欧美二区| 欧美不卡视频一区发布| 九色在线播放| 精品国产网站在线观看| 亚洲综合精品视频| 狠狠综合久久av一区二区小说 | 国产一区二区色| 制服丝袜专区在线| 欧美精品一区二区免费| аⅴ资源新版在线天堂| 亚洲成人av片在线观看| 91无套直看片红桃| 一本久久a久久精品亚洲| 久久久久久激情| 亚洲丝袜自拍清纯另类| 亚洲精品国产一区黑色丝袜| 粉嫩一区二区三区在线看| 色哟哟精品视频| 午夜亚洲伦理| 性欧美大战久久久久久久| 五月天久久久| 亚洲精品在线视频观看| 妖精视频一区二区三区| 高清国产一区| 麻豆精品一区| 成人黄色免费看| 久久麻豆视频| 国产精品久久久久久久久久尿 | 黑人另类精品××××性爽| 久久精品免费电影| 亚洲麻豆精品| 中文字幕亚洲国产| av在线免费观看网站| 亚洲欧美国产视频| 四虎精品在线| 亚洲国产精彩中文乱码av在线播放| av中文字幕观看| 欧美一区二区视频在线观看2022| 亚洲自拍偷拍另类| 欧美日韩在线一区二区| 成人毛片一区二区三区| 色婷婷久久久久swag精品| 可以免费在线观看的av| 婷婷夜色潮精品综合在线| 国产在线视频你懂的| 亚洲一区二区在线播放相泽| 久久久久久久久久久久久久久久久| 亚洲免费在线观看视频| 欧美人禽zoz0强交| 亚洲精品国产精品乱码不99 | 色综合久久66| 无码无套少妇毛多18pxxxx| 欧美性jizz18性欧美| 国产精品黄色大片| 色综合天天综合在线视频| 六月丁香婷婷综合| 91久久精品一区二区| 日批视频免费观看| 欧美另类z0zxhd电影| 国产黄色小视频在线观看| 日韩女优av电影| 殴美一级特黄aaaaaa| 亚洲精品国产精品乱码不99按摩| 亚州精品国产精品乱码不99按摩| 亚洲精品乱码久久久久久按摩观| 香蕉视频黄在线观看| 国产一区av在线| 四虎久久免费| 欧美精品激情在线| 午夜激情在线播放| 国产精品美乳在线观看| 婷婷久久免费视频| 国产精品乱码一区二区三区| 欧美在线关看| 正义之心1992免费观看全集完整版| 91成人看片| 久久精品国产sm调教网站演员| 蜜桃久久av| av在线免费看片| 白白色 亚洲乱淫| 五月婷六月丁香| 一区二区理论电影在线观看| 国产欧美一区二区三区在线看蜜臂| 欧美三级电影网| 国产成人自拍一区| 国产午夜精品美女视频明星a级| 麻豆电影在线播放| 久久人人爽人人| 国产精品久久亚洲不卡| 97se国产在线视频| 国产一区二区三区探花| 麻豆传媒网站在线观看| 美女精品网站| 韩国一区二区三区四区| 久久久精品免费网站| 国产a免费视频| 欧美性感一类影片在线播放| 丰满熟女一区二区三区| 最近2019中文字幕mv免费看 | 欧美日韩免费网站| 97超碰资源站| 亚洲网站在线播放| 狂野欧美性猛交xxxxx视频| 国产精品视频xxxx| 牛牛视频精品一区二区不卡| 超碰97免费观看| 美女视频一区免费观看| 欧美熟妇精品一区二区| 国产精品水嫩水嫩| 日韩精品在线观看免费| 欧美一区二区三区视频免费| 国产一二三在线观看| 国产综合在线看| 欧美日韩午夜电影网| 五月天亚洲综合| 午夜在线a亚洲v天堂网2018| 一级全黄裸体片| 亚洲丝袜美腿综合| 亚洲一区 中文字幕| 亚洲欧美中文字幕在线一区| 91福利区在线观看| 成人av免费在线看| 91中文字幕精品永久在线| 国产视频在线视频| 99精品视频一区二区| 久久久久久久久久久久久久免费看 | 中文字幕 欧美 日韩| 国产精品欧美久久久久无广告| 黄色av一级片| 日韩精品免费在线视频| 国产ktv在线视频| 国产精品一码二码三码在线| 欧美视频导航| 中文字幕乱妇无码av在线| 亚洲欧洲av另类| 在线观看日批视频| 一本色道久久88综合日韩精品| 中文字幕在线视频久| 久久青青草原| 中文在线一区| 亚洲国产欧美视频| 疯狂蹂躏欧美一区二区精品| 午夜影院在线视频| 97人人模人人爽人人喊中文字| 美女视频免费精品| 日本中文字幕网址| 91老司机福利 在线| 毛片基地在线观看| 亚洲欧美日韩中文在线| 午夜欧美巨大性欧美巨大| 日韩高清专区| 久久国产精品免费| 中文字幕无码日韩专区免费| 先锋影音一区二区三区| 美州a亚洲一视本频v色道| 97精品国产97久久久久久春色| 中文字幕一区二区三区中文字幕| 日本道在线视频| 国产制服丝袜一区| 麻豆天美蜜桃91| 日韩一区二区视频| 免费在线观看av电影| 国产精品一 二 三| 性xx色xx综合久久久xx| 国产又大又粗又爽的毛片| 欧美午夜片在线观看| 黄色免费在线网站| 99re在线观看| 99综合精品| аⅴ天堂中文在线网| 欧美精品丝袜中出| 国产深夜视频在线观看| 精品在线一区| 日韩电影在线免费| 国产一二三四区| 亚洲第一二三四五区| 欧美最新精品| 五月天激情图片| 99久久99久久精品国产片果冻| 亚洲高清在线看| 欧美久久久精品| 婷婷精品在线| 日本中文字幕观看| 亚洲成人激情综合网| 国产女主播在线写真| 91偷拍精品一区二区三区| 亚洲一区二区伦理| 992在线观看| 亚洲成人免费在线视频| 日韩pacopacomama| 黄色一级片av| 久久久久久免费毛片精品| 国产理论视频在线观看| 欧美一级免费看| 亚洲色图网站| www.色多多| 日韩一区二区三区免费看| 国产精品伦理| 久久av高潮av| 国产精品欧美久久久久一区二区| 蜜臀久久精品久久久久|