转写说明
本文基于已校验的公开原文进行结构化转写与事实梳理,非原文转载。 转写保留可核验的技术事实,并将工程建议与来源观点明确分开。
- 原作者: 默_笙
- 原始来源: https://juejin.cn/post/7684108802115174450
- 原文发布时间: Fri, 11 Sep 2026 08:51:23 GMT
核心结论
流式输出通过 HTTP 长连接实现服务器向客户端持续推送数据,解决了传统同步调用中用户长时间等待白屏的问题。SSE(Server Sent Events)是实现 LLM 流式输出的核心协议,其本质是服务器单向、持续地向客户端推送 chunk 数据块。LangChain 提供了 stream 方法替代传统的 invoke 方法,实现 LLM 输出的流式消费。
能力机制
同步与流式的本质区别在于连接模式。同步 HTTP 采用请求-响应-断开的一次性模式,整包数据返回后连接关闭;SSE 保持长连接不断开,数据一块一块推送。
SSE 协议通过三个响应头建立流式通道:Content-Type: text/event-stream 声明数据类型,Cache-Control: no-cache 禁止缓存,Connection: keep-alive 保持连接活跃。数据格式为 data: 消息内容\n\n,客户端收到空行(\n\n)时触发一次消息事件。
Node.js 服务端通过 res.write() 方法逐块发送数据,res.end() 关闭连接。浏览器端通过 EventSource API 建立连接,onmessage 回调接收每条消息,innerText += 实现内容追加显示。LangChain 的 model.stream() 返回异步可迭代对象,需用 for await...of 循环逐块消费 chunk。
快速开始
服务端实现:使用 Node.js 原生 http 模块创建服务器,SSE 路由设置正确的响应头,通过 res.write() 发送格式化的数据块。
客户端接收:浏览器端创建 EventSource 实例传入服务端 URL,绑定 onmessage 回调处理到来的数据。
LangChain 流式调用:初始化 ChatOpenAI 模型后,用 model.stream(prompt) 发起流式请求,在 for await 循环中处理每个 chunk,将内容拼接或直接输出。
环境变量需配置 MODEL_NAME、OPENAI_API_KEY、OPENAI_BASE_URL。
适用边界
SSE 适用于服务器单向持续推送数据的场景,典型用例包括 LLM 回答流式输出、股票行情推送、实时日志流等。对于需要双向通信的应用如聊天室、游戏等,WebSocket 是更合适的选择,尽管实现复杂度更高。
LLM 流式输出属于典型的一问多答模式,用户只需发送一次请求,服务器持续返回回答内容。这种场景下 SSE 的单向推送特性完全满足需求,且具备 WebSocket 没有的自动重连能力,网络中断后 EventSource 会自动尝试重新建立连接。
核验清单
- SSE 响应头必须包含
Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive三项 res.write()的数据格式必须符合data: 内容\n\n规范,以双换行结尾- 流结束时必须调用
res.end()关闭连接 - 客户端
EventSource实例在不再需要时应调用close()方法 - LangChain 的
model.stream()返回异步可迭代对象,不可直接 await 取结果 process.stdout.write()用于流式输出时避免自动换行,保持文字连续涌现效果
来源与核验
- 原始文章
- 页面事实以原始来源及其引用的官方资料为准;版本、星标和模型能力会随时间变化。
- AI Stack 不公开抓取到的全文快照,只发布独立转写与来源入口。