“我们有两种方式获取 AI 回答:一种是等全部生成完再返回(普通 HTTP),一种是流式输出(SSE)。”


✅ 正确术语是:

1. 普通 HTTP(Non-Streaming)

  • 一问一答
  • 必须等 AI 完全生成完结果,才返回给前端
  • 用户体验:卡住几秒,突然弹出全部内容

2. Streamable HTTP(流式 HTTP) → 实际上就是 SSE(Server-Sent Events)

  • 服务器一边生成,一边返回
  • 前端可以“逐字”或“逐句”看到输出
  • 用户体验:像 ChatGPT 一样,文字一行行打出来

✅ 对比:普通 HTTP vs SSE(流式)

对比项 普通 HTTP SSE(流式)
请求方式 GET /chat?msg=你好 GET /stream?msg=你好
返回类型 String Flux<String>(响应式流)
内容类型 text/plain text/event-stream
是否等待 ✅ 等待全部生成完 ❌ 不等,边生成边返回
用户体验 卡顿,突然显示全部 流畅,逐行输出
适用场景 简单问答 AI 聊天、代码生成

✅ Spring AI 中的代码对比

1. 普通 HTTP(非流式)

@GetMapping("/chat")
public String chat(String msg) {
    return client.prompt()
                 .user(msg)
                 .call()        // 等待完整响应
                 .content();    // 返回完整字符串
}

👉 用户必须等 AI 写完才看到结果。


2. SSE 流式(Streamable HTTP)

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(String msg) {
    return client.prompt()
                 .user(msg)
                 .stream()      // 流式调用
                 .map(response -> response.content()); // 一条条返回
}

👉 服务器每生成一段,就推送给前端一次。


✅ 前端如何接收 SSE?

<script>
const eventSource = new EventSource("/stream?msg=你好");

eventSource.onmessage = function(event) {
    const content = event.data; // 每次收到一段
    document.body.innerHTML += content + "<br>";
};
</script>

效果:文字像打字机一样一行行出现 ✅


✅ 为什么叫 “Streamable HTTP”?

因为:

  • 它还是基于 HTTP 协议
  • 但服务器不关闭连接,而是持续发送数据
  • 所以叫“可流化的 HTTP 请求”

SSE 是它的标准实现方式

🔗 关系:

Streamable HTTP = 使用 SSE 实现的流式 HTTP 通信

✅ 总结

术语 说明
Streamable HTTP 可流式传输的 HTTP 请求(描述性说法)
SSE Server-Sent Events,是实现流式传输的标准技术
text/event-stream SSE 使用的内容类型
Flux Spring WebFlux 中表示数据流的类型
EventSource 前端 JS 用来接收 SSE 的 API

🎯 你现在要记住:

“Streamable HTTP” 就是用 SSE 实现的 AI 流式输出。

在 Spring AI 中:

  • 用 .call() → 普通 HTTP(等结果)
  • 用 .stream() → SSE 流式(实时输出)

这样就搞懂了!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐