豆包大模型流式输出需开启stream: true并正确处理SSE格式:按行解析data:前缀、用WebClient而非RestTemplate、设置MediaType.TEXT_EVENT_STREAM、绑定WebSocket生命周期、缓冲delta.content避免重复。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

stream: true 是豆包大模型流式输出的开关,开就流,关就等全部生成完再返回。它确实支持,而且是 OpenAI 兼容接口风格,不是噱头,生产环境已跑稳数月。
豆包流式接口返回的是 SSE 格式,不是纯 JSON
你调用时传了 stream: true,但后端收到的响应体不是一整块 JSON,而是一行行以 data: 开头的文本片段,结尾还有 [DONE]。如果直接用 ObjectMapper.readValue() 去解析整段响应,会报 JsonParseException —— 因为它根本不是合法 JSON。
正确做法是按行读取、剥离前缀、再逐段 JSON 解析:
String line = reader.readLine();
if (line != null && line.startsWith("data: ")) {
String jsonStr = line.substring(6).trim();
if (!"[DONE]".equals(jsonStr)) {
ChatCompletionChunk chunk = objectMapper.readValue(jsonStr, ChatCompletionChunk.class);
// 处理 content 字段,推给 WebSocket 客户端
}
}漏掉这一步,你会看到前端“卡住”或只显示第一段,后续数据全丢。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
Spring Boot 后端必须用 WebClient 而非 RestTemplate
RestTemplate 是阻塞式 HTTP 客户端,不支持异步流式响应处理;它会一直等到整个响应体收完才交给你,彻底废掉流式意义。
使用豆包(火山引擎 Ark)生成图片或视频并保存本地。用户提及“豆包生图/图片/生视频/视频”、“Doubao”、“Seedance”、“火山引擎图片/视频”时触发。
必须换 WebClient,并配合 Flux<ClientResponse> 或 bodyToFlux() 订阅字节流:
- 用
WebClient.builder().codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)).build()防止大 token 流触发内存限制 - 响应类型要设为
MediaType.TEXT_EVENT_STREAM - 别在
flatMap里做耗时操作(如数据库写入),否则会拖慢流速甚至背压溢出
前端 WebSocket 连接断开后,豆包请求不能继续挂着
WebSocket 连接断开 ≠ HTTP 请求自动取消。如果你用 WebClient 发起豆包流式请求后,用户刷新页面或网络中断,WebSocketSession 关闭了,但后端那个 WebClient 的 HTTP 连接可能还在傻等豆包返回——既浪费线程,又占着连接池,还可能导致超时堆积。
必须显式绑定生命周期:
- 在
WebSocketSession的afterConnectionClosed回调里,触发WebClient请求的cancel() - 或者更稳妥:把
WebClient请求包装进Mono,用onTerminateDetach()+doFinally()确保清理 - 加个
timeout(Duration.ofSeconds(60))双保险,避免豆包侧偶发 hang 住
流式内容拼接时,别直接拼 chunk.delta.content
豆包流式返回的每个 ChatCompletionChunk 中,delta.content 是增量片段,不是完整句子。比如:
第一次: "今天"
第二次:"天气"
第三次:"真好"
如果你不做缓冲、直接往页面 innerText 上追加,用户会看到“今天今天天气今天天气真好”,因为没清空旧状态。
正确做法是维护一个 StringBuilder 或前端用 textContent 替换而非 append,且注意处理 null 或空字符串的 delta.content(豆包在思考间隙可能发空 chunk)。
流式不是加个 stream: true 就完事,真正难的是让每一段字都“准时、不重、不丢、不卡”地穿过 WebSocket 推到用户屏幕上。中间任何一个环节缓冲错位、取消遗漏、解析越界,都会导致文字乱跳、重复、截断——而这些故障往往只在高并发或弱网下才暴露。


















