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

SpringAI流式輸出的底層實(shí)現(xiàn)原理解析

 更新時(shí)間:2025年04月24日 08:48:19   作者:磊哥  
在 Spring AI 中,流式輸出(Streaming Output)是一種逐步返回 AI 模型生成結(jié)果的技術(shù),允許服務(wù)器將響應(yīng)內(nèi)容分批次實(shí)時(shí)傳輸給客戶端,而不是等待全部內(nèi)容生成完畢后再一次性返回,這篇文章主要介紹了SpringAI流式輸出的底層實(shí)現(xiàn),需要的朋友可以參考下

在 Spring AI 中,流式輸出(Streaming Output)是一種逐步返回 AI 模型生成結(jié)果的技術(shù),允許服務(wù)器將響應(yīng)內(nèi)容分批次實(shí)時(shí)傳輸給客戶端,而不是等待全部內(nèi)容生成完畢后再一次性返回。

這種機(jī)制能顯著提升用戶體驗(yàn),尤其適用于大模型響應(yīng)較慢的場景(如生成長文本或復(fù)雜推理結(jié)果)。

技術(shù)實(shí)現(xiàn)

在 Spring AI 中流式輸出的實(shí)現(xiàn)有以下兩種方式:

  • 通過 ChatModel 實(shí)現(xiàn)流式輸出。
  • 通過 ChatClient 實(shí)現(xiàn)流式輸出。

ChatModel 流式輸出

Spring AI 中的流式輸出實(shí)現(xiàn)非常簡單,使用 ChatModel 中的 stream 即可實(shí)現(xiàn):

@RequestMapping(value = "/streamChat", produces = "text/event-stream")
public Flux<String> streamChat(@RequestParam(value = "msg") String msg) {
    return chatModel.stream(msg);
}

ChatClient 流式輸出

ChatClient 流式輸出實(shí)現(xiàn)也很簡單,也是調(diào)用 stream().content() 返回 Flux 對(duì)象即可:

@RequestMapping("/stream")
public Flux<String> stream(String question) {
    return chatClient.prompt(question)
            .stream()
            .content();
}

底層實(shí)現(xiàn)

那么問題來了流式輸出的底層實(shí)現(xiàn)究竟是啥呢?

根據(jù)以往的經(jīng)驗(yàn)我們知道,流式輸出的實(shí)現(xiàn)技術(shù)基本有兩種:

  • Spring MVC(Servlet)+ SSE 實(shí)現(xiàn)流式輸出。
  • Spring WebFlux Reactor 模型實(shí)現(xiàn)流式輸出。

SSE 介紹

SSE(Server-Sent Events)是一種允許服務(wù)器向?yàn)g覽器或其他客戶端推送實(shí)時(shí)更新的技術(shù)。它是一種單向通信機(jī)制,服務(wù)器可以主動(dòng)向客戶端發(fā)送數(shù)據(jù),而客戶端無需頻繁輪詢服務(wù)器請(qǐng)求數(shù)據(jù)。SSE 是基于 HTTP 協(xié)議的,使用標(biāo)準(zhǔn)的 text/event-stream MIME 類型來傳輸數(shù)據(jù)。

SSE 主要特點(diǎn)

  • 單向通信:SSE 僅支持服務(wù)器到客戶端的單向通信,客戶端不能向服務(wù)器發(fā)送消息。如果需要雙向通信,可以結(jié)合 WebSocket 或其他技術(shù)。
  • 基于 HTTP:SSE 使用標(biāo)準(zhǔn)的 HTTP 協(xié)議,不需要額外的協(xié)議支持,因此兼容性較好。
  • 自動(dòng)重連:客戶端在連接中斷后會(huì)自動(dòng)嘗試重新連接。
  • 數(shù)據(jù)格式:SSE 數(shù)據(jù)以特定的格式發(fā)送,每條消息以 data: 開頭,以兩個(gè)換行符 \n\n 結(jié)尾。
  • 事件類型:可以為每條消息指定事件類型,客戶端可以通過監(jiān)聽特定事件類型來處理不同的消息。

Spring MVC(Spring Web)底層是基于 Servlet 實(shí)現(xiàn)的,它是使用 SseEmitter 技術(shù)實(shí)現(xiàn) SSE 協(xié)議實(shí)現(xiàn)流式輸出的。

SseEmitter 基本用法

這里提供一個(gè) SseEmitter 的簡單使用案例,實(shí)現(xiàn)流式輸出,讓大家更好的理解這個(gè)技術(shù)點(diǎn):

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
@RestController
public class SseDemoController {
    @GetMapping(value = "/sse-demo", produces = "text/event-stream")
    public SseEmitter streamData() {
        // 設(shè)置超時(shí)時(shí)間(單位:毫秒)
        SseEmitter emitter = new SseEmitter(30_000L); // 30秒超時(shí)
        // 異步任務(wù)模擬流式輸出
        new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    String message = "第 " + i + " 條消息";
                    emitter.send(message);
                    Thread.sleep(1000); // 每秒發(fā)送一次
                }
                emitter.complete(); // 完成推送
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e); // 異常處理
            }
        }).start();
        return emitter;
    }
}

Spring WebFlux 介紹

Spring WebFlux 是 Spring Framework 5 引入的響應(yīng)式 Web 框架,旨在解決高并發(fā)場景下傳統(tǒng)同步阻塞模型(如 Spring MVC)的性能瓶頸。其核心目標(biāo)是通過非阻塞異步編程模型提升系統(tǒng)吞吐量,適用于 I/O 密集型任務(wù)(如微服務(wù)通信、實(shí)時(shí)數(shù)據(jù)流處理)。

Spring WebFlux 與 Spring MVC 不同,它基于 Reactive Streams 規(guī)范實(shí)現(xiàn)的,支持背壓機(jī)制(Backpressure),防止數(shù)據(jù)生產(chǎn)者壓垮消費(fèi)者。

背壓機(jī)制:通過訂閱者主動(dòng)控制數(shù)據(jù)流速,避免內(nèi)存溢出。例如,消費(fèi)者可動(dòng)態(tài)調(diào)整請(qǐng)求量,生產(chǎn)者根據(jù)反饋調(diào)整數(shù)據(jù)生成速度.

Spring AI 流式輸出

說完了前置知識(shí),咱們回到主題:Spring AI 是如何實(shí)現(xiàn)流式輸出的?

要搞清楚這個(gè)問題,我們需要看流式輸出對(duì)象 Flux 的實(shí)現(xiàn)源碼:

查看 Flux 源碼我們發(fā)現(xiàn)它是屬于 reactor.core.publisher 包下的抽象類:

并且看類注釋和類所在的 jar 包我們就明白了:

Spring AI 中的流式輸出是通過 Reactor Streams 模型實(shí)現(xiàn)的,和 Spring WebFlux 的底層實(shí)現(xiàn)是一樣的技術(shù)。

具體執(zhí)行流程:Reactor Streams 會(huì)訂閱數(shù)據(jù)源,當(dāng)有數(shù)據(jù)時(shí),Reactor Streams 以分塊流的方式發(fā)送給客戶端(用戶)。

Reactor 介紹

Reactor 是一種事件驅(qū)動(dòng)的高性能網(wǎng)絡(luò)編程模型,主要用于處理高并發(fā)的網(wǎng)絡(luò) I/O 請(qǐng)求。其核心思想是通過一個(gè)或多個(gè)線程監(jiān)聽事件,并將事件分發(fā)給相應(yīng)的處理程序,從而實(shí)現(xiàn)高效的并發(fā)處理。

Reactor 模型的主要特征如下:

  • 事件驅(qū)動(dòng):所有 I/O 操作都由事件觸發(fā)并處理。
  • 非阻塞:操作不會(huì)因?yàn)?I/O 而掛起,避免了線程等待的開銷。
  • 高效資源利用:通過少量線程處理大量并發(fā)連接,提升性能。
  • 組件分離:將事件監(jiān)聽(Reactor)、事件分發(fā)(Dispatcher)和事件處理(Handler)解耦,使代碼結(jié)構(gòu)更清晰。

Reactor 實(shí)現(xiàn)方式有三種:

  • 單線程 Reactor 模型:所有操作在一個(gè)線程完成,適用于低并發(fā)場景。
  • 多線程 Reactor 模型:主線程處理連接,子線程池處理 I/O 和業(yè)務(wù)。
  • 主從 Reactor 模型:主線程池處理連接,子線程池處理 I/O(進(jìn)一步優(yōu)化資源分配)。

生產(chǎn)級(jí)別使用的 Reactor 基本都是主從 Reactor 模型,它的執(zhí)行流程如下:

小結(jié)

Spring AI 中的流式輸出有兩種實(shí)現(xiàn),而通過查看這兩種流式輸出的實(shí)現(xiàn)源碼可知,Spring AI 中的流式輸出是通過 Reactor Streams 技術(shù)實(shí)現(xiàn)的,當(dāng)客戶端發(fā)送請(qǐng)求時(shí),會(huì)建立連接并訂閱數(shù)據(jù)源,當(dāng)有數(shù)據(jù)時(shí),Reactor Streams 以分塊流的方式發(fā)送給客戶端(用戶)。

到此這篇關(guān)于SpringAI流式輸出的底層實(shí)現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)SpringAI流式輸出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程文件分片下載實(shí)現(xiàn)的示例代碼

    Java多線程文件分片下載實(shí)現(xiàn)的示例代碼

    這篇文章主要介紹了Java多線程文件分片下載實(shí)現(xiàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java面試題沖刺第九天--MyBatis

    Java面試題沖刺第九天--MyBatis

    這篇文章主要為大家分享了最有價(jià)值的三道MyBatis框架面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot如何監(jiān)聽接口調(diào)用情況

    SpringBoot如何監(jiān)聽接口調(diào)用情況

    本文檔介紹在SpringBoot項(xiàng)目中監(jiān)聽每個(gè)接口的調(diào)用次數(shù)、傳入?yún)?shù)、返回參數(shù)、響應(yīng)耗時(shí)的多種實(shí)現(xiàn)方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2026-05-05
  • 深度解析SpringBoot循環(huán)依賴問題與解決

    深度解析SpringBoot循環(huán)依賴問題與解決

    在Spring Boot開發(fā)過程中,循環(huán)依賴(Circular Dependency)是一個(gè)常見但棘手的問題,本文將通過兩個(gè)典型案例,深入分析循環(huán)依賴問題的根源,并提供多種解決方案,希望對(duì)大家有所幫助
    2025-06-06
  • java事務(wù)的概念淺析

    java事務(wù)的概念淺析

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java事務(wù)的概念淺析,有興趣的朋友們可以參考學(xué)習(xí)下。
    2020-12-12
  • spring boot集成rabbitmq的實(shí)例教程

    spring boot集成rabbitmq的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于spring boot集成rabbitmq的相關(guān)資料,springboot集成RabbitMQ非常簡單,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Mybatis使用MySQL模糊查詢時(shí)輸入中文檢索不到結(jié)果怎么辦

    Mybatis使用MySQL模糊查詢時(shí)輸入中文檢索不到結(jié)果怎么辦

    這篇文章主要介紹了Mybatis使用MySQL模糊查詢時(shí)輸入中文檢索不到結(jié)果的解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程入口參數(shù)研究及創(chuàng)建對(duì)象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Google Kaptcha 框架實(shí)現(xiàn)登錄驗(yàn)證碼功能(SSM 和 SpringBoot)

    Google Kaptcha 框架實(shí)現(xiàn)登錄驗(yàn)證碼功能(SSM 和 SpringBoot)

    這篇文章主要介紹了Google Kaptcha 實(shí)現(xiàn)登錄驗(yàn)證碼(SSM 和 SpringBoot)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • 詳解spring cloud分布式整合zipkin的鏈路跟蹤

    詳解spring cloud分布式整合zipkin的鏈路跟蹤

    這篇文章主要介紹了詳解spring cloud分布式整合zipkin的鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07

最新評(píng)論

和政县| 昭平县| 沙雅县| 油尖旺区| 泸水县| 大厂| 通道| 吉林省| 咸丰县| 澜沧| 班玛县| 石屏县| 江陵县| 博湖县| 卢湾区| 重庆市| 贵阳市| 运城市| 大石桥市| 台江县| 莒南县| 宁蒗| 六安市| 南丹县| 游戏| 临湘市| 忻州市| 枣庄市| 兰州市| 汽车| 南康市| 古田县| 巧家县| 富源县| 凉城县| 开封市| 平昌县| 丹巴县| 武汉市| 龙井市| 望都县|