精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91在线看www| 色偷偷噜噜噜亚洲男人| 国产h视频在线播放| 麻豆app在线观看| 激情久久五月天| 久久免费少妇高潮久久精品99| 醉酒壮男gay强迫野外xx| avav成人| 亚洲国产精品综合小说图片区| 欧美日韩一区二区三区在线观看免| 亚洲天堂免费av| 在线日韩欧美| 久久精品国产欧美亚洲人人爽| 国产 xxxx| 亚洲青青久久| 91国产免费观看| 岛国大片在线播放| yjizz视频网站在线播放| 国产精品18久久久久久久久| 国产精品wwwwww| 日韩久久久久久久久| 亚洲中无吗在线| 亚洲人成在线观看| 人妻激情偷乱频一区二区三区| 久久国内精品| 一本久道中文字幕精品亚洲嫩 | 国产a久久精品一区二区三区| 欧美一区二区精美| 最新中文字幕2018| 在线观看特色大片免费视频| 亚洲国产日韩a在线播放性色| 亚洲最新免费视频| 成人18在线| 久久综合色婷婷| 91嫩草免费看| 国产麻豆精品一区| 久久99久久精品| 国产精品视频免费观看www| 青青青国产在线| 9色国产精品| 性金发美女69hd大尺寸| 免费无码毛片一区二区app| 久久一区91| 中文字幕精品久久久久| 娇妻被老王脔到高潮失禁视频| 精品欧美午夜寂寞影院| 亚洲福利视频网站| 国模私拍在线观看| 国产精品毛片视频| 欧美精品一区二区久久婷婷 | 中文字幕一二三四| 日欧美一区二区| 国产91九色视频| 日韩免费av网站| 日韩综合一区二区| 国产精品视频网| 国产一区二区自拍视频| 国产一区二区三区免费播放| 91视频8mav| www.av黄色| 成人免费av网站| 精品国产免费一区二区三区| 日批免费在线观看| 91麻豆精品在线观看| 欧美在线视频二区| 日日夜夜精品一区| 亚洲欧美日韩在线| 成年在线观看视频| www在线观看黄色| 欧美性猛交xxxx免费看久久久| 精品国产成人av在线免| 成人黄色毛片| 日韩欧美成人一区二区| 亚洲国产精品狼友在线观看| 久久99国产精品久久99大师| 亚洲欧美日韩国产中文专区| 日日操免费视频| 欧美精品福利| 欧美亚洲视频在线观看| 中文无码精品一区二区三区| 韩国精品一区二区| 国产伦精品一区二区三| 国产区视频在线播放| 中文字幕一区二区三区在线观看| 精品人妻人人做人人爽| xxx欧美xxx| 91麻豆精品国产91久久久更新时间| 国产老头和老头xxxx×| 亚洲国产最新| 欧美久久精品一级黑人c片 | 黄色网在线免费看| 亚洲成人激情自拍| 91日韩视频在线观看| 视频一区国产| 一本色道久久综合狠狠躁篇怎么玩| 精品国产大片大片大片| 亚洲三级色网| 成人黄色免费看| 香蕉视频成人在线| 中文字幕亚洲欧美在线不卡| 麻豆tv在线播放| 九九九精品视频| 亚洲精品自在久久| 欧美成人精品欧美一级| 日韩高清不卡在线| 国产欧美一区二区三区不卡高清| av电影在线观看| 精品成人乱色一区二区| 香蕉视频xxxx| 欧美亚洲国产精品久久| 韩国视频理论视频久久| 国产精品视频一区二区三区,| 91网址在线看| 分分操这里只有精品| 一区在线不卡| 亚洲视频999| 永久免费看片在线播放| 国产在线不卡视频| www国产成人免费观看视频 深夜成人网| 精品视频在线观看免费| 欧美电影在线观看完整版| 中文一区二区视频| 尤物视频在线观看国产| 国产精品一二三区在线| 日韩性感在线| 欧美日韩国产观看视频| 欧美va亚洲va| 成人免费毛片xxx| 日韩av不卡在线观看| 精品久久久久久中文字幕动漫| 成人在线网址| 欧美色涩在线第一页| 国产熟妇久久777777| 亚洲国产黄色| 国产精品一区在线播放| 色呦呦网站在线观看| 91精品国产丝袜白色高跟鞋| 内射毛片内射国产夫妻| 日韩电影免费一区| 欧美一区少妇| 日韩欧美一区二区三区免费观看 | 国产剧情在线观看一区| 992tv在线成人免费观看| 亚洲精品综合网| 亚洲精品视频免费观看| 免费欧美一级片| 亚洲色图88| 91免费欧美精品| 国产原创在线观看| 日韩一二在线观看| 久久久久久久久久网站| 高清视频一区二区| 久草免费福利在线| 噜噜噜天天躁狠狠躁夜夜精品| 久久久久久久久久久久av| 亚洲第一精品网站| 午夜精品成人在线视频| 毛茸茸多毛bbb毛多视频| 午夜影院日韩| 欧洲视频一区二区三区| 国产一区二区三区四区五区3d| 少妇高潮久久久久久潘金莲| 91午夜交换视频| 亚洲男人的天堂网| 黑人玩弄人妻一区二区三区| 亚洲狼人精品一区二区三区| 免费看成人午夜电影| 国产精品字幕| 久久久国产精品视频| 超碰在线播放97| 精品国产91久久久久久| 国产一区二区三区四区五区六区| 免费观看日韩电影| 久久免费一级片| 卡一精品卡二卡三网站乱码| 日本一区二区三区四区视频| 1769在线观看| 欧美成人a视频| 久久一区二区三区视频| 欧美激情一区二区| 亚洲精品一二三四| 国产精品美女| 中国一区二区三区| 国产ts一区| 国产精品美女在线观看| 天堂av最新在线| 亚洲欧美一区二区三区久久| 一区二区视频免费| 亚洲成人动漫在线观看| 91成人精品一区二区| 国产成人av电影在线| 99免费视频观看| 欧美久久久久| 日韩欧美视频一区二区三区四区 | 91麻豆精品国产| 亚洲欧美在线视频免费| 中国色在线观看另类| 男男一级淫片免费播放| 美女一区二区视频| 自拍日韩亚洲一区在线| 91中文字幕精品永久在线| 国产在线视频欧美一区二区三区| 成人免费在线观看视频| 午夜免费日韩视频| 成人毛片av在线| 亚洲最新在线视频| 日本国产在线观看| 91精品在线一区二区| 一级成人黄色片| 樱桃视频在线观看一区| 精品人妻中文无码av在线| 成人91在线观看| 亚洲第一色av| 日韩国产在线一| 日韩五码在线观看| 欧美影院一区| 亚洲欧洲国产精品久久| 国产va免费精品观看精品视频| 国产午夜精品一区| 亚洲一区二区三区在线免费| 国产免费一区视频观看免费 | 色成年激情久久综合| 亚洲国产精品成人无久久精品| 亚洲欧美在线视频观看| 精品人妻无码一区| 久久久午夜精品理论片中文字幕| 在线观看免费视频黄| 国产成人在线视频网址| 在线免费看污网站| 久久成人免费日本黄色| 午夜视频你懂的| 丝袜国产日韩另类美女| 亚洲欧洲日产国码无码久久99| 欧美日韩精品一本二本三本| 天堂v在线视频| 欧美成人精品一区二区三区在线看| 欧美日韩一区二区三| 久久99精品久久久久久园产越南| 国产伦一区二区三区色一情| 超碰在线亚洲| 国产精品一国产精品最新章节| 亚洲国产高清在线观看| 91手机在线视频| 亚洲国产中文在线| 99精品国产一区二区| 国产在线不卡一区二区三区| 91精品免费视频| 精品一区二区三区亚洲| 99久久久久国产精品免费| 欧美日韩黄色| 国产91免费视频| 亚洲网址在线观看| 激情视频在线观看一区二区三区| 国内精品国产成人国产三级粉色| 国产伦精品一区二区三区照片| 成人香蕉社区| 久久综合一区| 精品理论电影| 一区二区三区四区不卡| 永久亚洲成a人片777777| 影音先锋成人资源网站| 亚洲无线一线二线三线区别av| 青青草国产精品视频| 久久久久久穴| 亚洲午夜激情影院| 丁香亚洲综合激情啪啪综合| 97人妻天天摸天天爽天天| 久久久久久免费网| 啪啪一区二区三区| 亚洲一区视频在线| 99热只有这里有精品| 欧美视频在线播放| www.桃色av嫩草.com| 日韩av中文字幕在线免费观看| 黄色av免费在线观看| 日韩资源在线观看| 欧美卡一卡二| 国产97免费视| 99久久久国产| 国内视频一区二区| 久久国产亚洲精品| 国产中文字幕乱人伦在线观看| 玖玖国产精品视频| 中文字幕剧情在线观看| 99视频一区二区三区| 蜜桃av免费在线观看| 亚洲国产一区二区视频| 免费黄色一级大片| 亚洲大胆人体av| 在线免费观看的av网站| 久久久亚洲影院你懂的| 成人18视频在线观看| 国产chinese精品一区二区| 精品国产一区二区三区香蕉沈先生| 亚洲精品偷拍视频| 久久综合伊人| 欧美做受高潮中文字幕| 欧美国产精品一区二区| 日韩av男人天堂| 91 com成人网| 精品视频二区| 久久久久久午夜| 亚洲精品一区av| 日本一区二区在线| 在线观看日韩av电影| 污污动漫在线观看| 91视频xxxx| 久久久无码精品亚洲国产| 欧美日韩一区二区三区四区五区| 天天操天天干天天舔| 久久天天躁狠狠躁夜夜躁2014| 欧美电影h版| 官网99热精品| 伊人久久大香线蕉综合四虎小说| 十八禁视频网站在线观看| 99久免费精品视频在线观看 | 欧美成人69| 污片在线免费看| 久久久久久久综合日本| 国产在线观看你懂的| 91麻豆精品国产无毒不卡在线观看| 九色在线播放| 欧美在线视频免费| 久久成人福利| 日本免费a视频| 久久国产精品72免费观看| 国产毛片欧美毛片久久久| 欧美性猛交xxxx富婆弯腰| 欧美自拍偷拍第一页| 欧美肥老妇视频| 日韩一二三区在线观看| 亚洲最大免费| 经典三级在线一区| 国产精品1区2区3区4区| 欧美亚洲图片小说| 北岛玲一区二区三区| 国产成人精品综合| 激情婷婷综合| 天天操天天摸天天爽| 国产欧美日韩在线视频| 亚洲图片欧美日韩| 国产亚洲精品91在线| 影音成人av| 亚洲精美视频| 久久精品二区亚洲w码| 超碰人人人人人人人| 欧美日韩久久久| 快射av在线播放一区| 91精品视频在线| 综合天堂av久久久久久久| 熟妇女人妻丰满少妇中文字幕| 亚洲靠逼com| 亚洲精品久久久久久无码色欲四季 | 狠狠久久婷婷| 欧类av怡春院| 一本大道久久精品懂色aⅴ| 九九热视频在线观看| 国产精品99导航| 欧美电影免费观看高清| 欧美一级免费在线| 亚洲国产一区在线观看| 欧美日韩伦理片| 国产精品情侣自拍| 亚欧美无遮挡hd高清在线视频 | 26uuu国产一区二区三区| 亚洲婷婷综合网| 中文字幕亚洲欧美在线| 精品一区二区三区中文字幕| 97碰在线视频| 久久久久久久久久电影| 亚洲视频一区在线播放| 欧美精品做受xxx性少妇| 同性恋视频一区| 亚洲黄色av片| 亚洲成人在线观看视频| 大地资源中文在线观看免费版| 国产日韩在线观看av| 亚洲视频精品| japanese中文字幕| 91精品国产品国语在线不卡| 国产乱码精品一区二三赶尸艳谈| 日本在线一区| 国产a级毛片一区| 亚洲无码精品一区二区三区| 九九精品在线视频| 九九热爱视频精品视频| 日韩a一级欧美一级| 狠狠色狠色综合曰曰| 久操视频在线免费播放| 精品欧美一区二区三区久久久| 日本欧美加勒比视频| 久久亚洲av午夜福利精品一区| 亚洲欧洲在线观看| 午夜电影一区| 国内自拍视频一区| 亚洲一区二区欧美激情| 91精彩在线视频| 国产一区福利视频| 久久91精品国产91久久小草| 在线观看精品国产|