Spring AI

月伴飞鱼 2025-04-27 12:26:58
源码相关
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!

流式输出

在 Spring AI 中,流式输出(Streaming Output)是一种逐步返回 AI 模型生成结果的技术。

  • 允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回。

这种机制能显著提升用户体验,尤其适用于大模型响应较慢的场景(如生成长文本或复杂推理结果)。

在 Spring AI 中流式输出的实现有以下两种方式:

通过 ChatModel 实现流式输出。

通过 ChatClient 实现流式输出。

ChatModel 流式输出:

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

ChatClient 流式输出:

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

流式输出的实现技术基本有两种:

Spring MVC(Servlet)+ SSE 实现流式输出。

Spring WebFlux Reactor 模型实现流式输出。

Spring MVC(Spring Web)底层是基于 Servlet 实现的,它是使用 SseEmitter 技术实现 SSE 协议实现流式输出的。

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() {
        // 设置超时时间(单位:毫秒)
        SseEmitter emitter = new SseEmitter(30_000L); // 30秒超时

        // 异步任务模拟流式输出
        new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    String message = "第 " + i + " 条消息";
                    emitter.send(message);
                    Thread.sleep(1000); // 每秒发送一次
                }
                emitter.complete(); // 完成推送
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e); // 异常处理
            }
        }).start();

        return emitter;
    }
}

Spring WebFlux 是 Spring Framework 5 引入的响应式 Web 框架。

  • 旨在解决高并发场景下传统同步阻塞模型(如 Spring MVC)的性能瓶颈。

其核心目标是通过非阻塞异步编程模型提升系统吞吐量,适用于 I/O 密集型任务(如微服务通信、实时数据流处理)。

Spring WebFlux 与 Spring MVC 不同,它基于 Reactive Streams 规范实现的。

  • 支持背压机制(Backpressure),防止数据生产者压垮消费者。

Spring AI 中的流式输出是通过 Reactor Streams 模型实现的,和 Spring WebFlux 的底层实现是一样的技术。

具体执行流程

Reactor Streams 会订阅数据源,当有数据时,Reactor Streams 以分块流的方式发送给客户端(用户)。

生产级别使用的 Reactor 基本都是主从 Reactor 模型,它的执行流程如下:

img
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!