大模型流式响应链路技术处理
很好,这几个概念其实是一整套链路里的不同层,我给你按“从底到上 + 关系图”讲清楚 👇(你这题本质是系统设计理解题)
🌟 一、先给你一个整体图(先建立直觉)
用户(Web/App)
│
▼
WebSocket / HTTP
│
▼
WebClient(调用大模型API)
│
▼
大模型(流式返回)
│
▼
Flux(流式处理数据)
│
▼
WebSocket / SSE 返回给前端
🌟 二、一个一个拆清楚
🔵 1、Flux 是什么?
👉 Flux 是 Reactor 里的一个“响应式流”
你可以把它理解成:
一个可以不断产生多个数据的异步流
举个最简单例子
Flux.just("A", "B", "C")
👉 表示:
A → B → C(一个一个往外发)
和 Mono 对比
| 类型 | 含义 |
|---|---|
| Mono | 0 或 1 个数据 |
| Flux | 0 ~ N 个数据 |
在大模型里的作用
当大模型“流式返回 token”时:
你 → 好 → , → 我 → 来 → 帮 → 你
👉 这些 token 就可以用:
Flux<String>
来表示。
🔵 2、S3 协议是什么?
👉 S3 是一种 对象存储协议(API规范)
最早是 AWS 提出的。
简单理解
用 HTTP API 操作文件(对象存储)的一套标准
常见操作
PUT 上传文件
GET 下载文件
DELETE 删除文件
LIST 列出文件
举例
PUT /bucket/file.txt
GET /bucket/file.txt
谁在用 S3 协议?
-
AWS S3(原版)
-
MinIO(私有部署)
-
阿里 OSS(兼容)
-
腾讯 COS(兼容)
在你这个系统里的作用
👉 一般用来:
-
存文档
-
存 embedding 文件
-
存知识库原始数据
🔵 3、WebClient 是什么?
👉 WebClient 是 Spring WebFlux 里的 HTTP 客户端
你可以把它理解成:
异步 + 响应式版本的 RestTemplate
最简单例子
WebClient client = WebClient.create();
Mono<String> res = client.get()
.uri("https://api.xxx.com")
.retrieve()
.bodyToMono(String.class);
如果是流式返回(重点🔥)
Flux<String> res = client.post()
.uri("/llm")
.retrieve()
.bodyToFlux(String.class);
👉 这就是:
大模型一边生成 → 你一边接收
🔵 4、WebSocket 是什么?
👉 WebSocket 是:
浏览器和服务器之间的长连接通信协议
和 HTTP 的区别
| HTTP | WebSocket | |
|---|---|---|
| 连接 | 短连接 | 长连接 |
| 方向 | 单向请求 | 双向 |
| 实时性 | 一般 | 强 |
用在什么地方?
-
聊天
-
实时推送
-
大模型流式回答(常见)
🌟 三、这几个东西在大模型调用里的关系(重点🔥)
🔴 场景:用户问问题 → 大模型流式返回
Step 1:前端发请求
方式1(普通):
POST /ask
方式2(流式推荐):
WebSocket
Step 2:后端调用大模型
用:
WebClient
调用 LLM API:
Flux<String> stream = webClient.post()
.uri("/v1/chat/completions")
.retrieve()
.bodyToFlux(String.class);
Step 3:大模型返回流
大模型返回的是:
data: "你"
data: "好"
data: "!"
👉 后端接收到:
Flux<String>
Step 4:Flux 处理数据
比如:
stream.map(token -> process(token))
或者:
stream.doOnNext(token -> sendToClient(token))
Step 5:推给前端
方式1:WebSocket(最常见)
session.send(
stream.map(token -> session.textMessage(token))
);
方式2:SSE(Server-Sent Events)
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream() {
return stream;
}
🌟 四、三者关系总结(你可以这样记)
🔵 Flux
👉 数据流(核心抽象)
🔵 WebClient
👉 用来调用外部服务(比如大模型)
🔵 WebSocket
👉 把流式结果推给前端
🔵 S3
👉 存数据(不参与实时链路)
🌟 五、一句话关系总结(面试直接说🔥)
你可以这样说:
在基于 WebFlux 的系统中,Flux 用来表示大模型的流式输出;WebClient 用于调用大模型接口并接收流式响应;WebSocket 或 SSE 用于将 Flux 中的数据实时推送给前端;而 S3 协议通常用于存储文档或知识库数据,不参与实时推理链路。
🌟 六、再帮你串成一条完整链路(最重要)
用户输入问题
↓
WebSocket / HTTP
↓
后端 Controller
↓
WebClient 调用 LLM
↓
LLM 流式返回(token)
↓
Flux 接收流
↓
Flux 处理(map / filter / retry)
↓
WebSocket / SSE 推送给前端
🌟 七、你可能会被追问的点(提前帮你补)
❓为什么用 Flux?
👉 因为:
-
大模型是“流式输出”
-
Flux 天然支持异步流
❓为什么不用 RestTemplate?
👉 因为:
-
不支持流式
-
阻塞
-
性能差
❓WebSocket vs SSE?
| WebSocket | SSE | |
|---|---|---|
| 方向 | 双向 | 单向 |
| 复杂度 | 高 | 简单 |
| 常见用途 | 聊天/AI | AI流式 |
❓Flux 和 WebSocket 关系?
👉 Flux 是数据流
👉 WebSocket 是传输通道
🌟 八、终极一句话总结
WebClient 用来调用大模型,Flux 表示大模型的流式输出,WebSocket/SSE 把这个流实时推给前端,而 S3 负责存储数据,不参与实时流处理。
如果你愿意,我可以下一步给你画一个 “大模型流式响应 + WebFlux + WebSocket”的真实代码模板(可直接用),这个在面试里很加分。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)