43.流式输出SSE是什么聊天应用为什么要实时返回
流式输出 SSE 是什么聊天应用为什么要实时返回码海寻道 · 大模型、智能体与 RAG 工程组件系列第 43 篇大模型生成长答案需要时间。如果接口等到完整文本生成后才一次性返回用户会看到长时间空白。SSEServer-Sent Events允许服务端通过一个长连接持续向浏览器发送事件让答案逐步显示。一、SSE 的基本特点SSE 是基于 HTTP 的单向事件流浏览器建立连接服务端持续推送客户端通过EventSource接收。浏览器 ──请求──→ API 浏览器 ←─事件流─ API它适合模型 Token、任务进度和日志通知等“服务端持续推送、客户端主要接收”的场景。需要客户端频繁向服务端发送消息时应评估 WebSocket 或普通 API。二、事件格式event: token id: 17 data: {text:你好} event: done id: 18 data: {run_id:run-001}事件之间用空行分隔响应类型是text/event-stream。事件可以包含event、data、id和retry等字段。三、FastAPI 最小示例importasyncioimportjsonfromfastapiimportAPIRouterfromfastapi.responsesimportStreamingResponse routerAPIRouter()defsse(event:str,data:dict,event_id:int|NoneNone)-str:lines[fevent:{event}]ifevent_idisnotNone:lines.append(fid:{event_id})lines.append(fdata:{json.dumps(data,ensure_asciiFalse)})return\n.join(lines)\n\nrouter.get(/chat/stream)asyncdefchat_stream():asyncdefgenerate():yieldsse(message_start,{run_id:run-001},1)forindex,tokeninenumerate([你好,,这是,流式回答],start2):yieldsse(token,{text:token},index)awaitasyncio.sleep(0.05)yieldsse(done,{run_id:run-001},6)returnStreamingResponse(generate(),media_typetext/event-stream,headers{Cache-Control:no-cache,Connection:keep-alive},)真实实现还需要接入模型流、鉴权、取消、错误事件和最终结果持久化。四、浏览器端接收constsourcenewEventSource(/api/v1/chat/stream?run_idrun-001)source.addEventListener(token,(event){constpayloadJSON.parse(event.data)appendAssistantText(payload.text)})source.addEventListener(done,(){source.close()markCompleted()})source.onerror(){source.close()loadFinalRunState()}如果需要携带复杂请求体、Authorization Header 或 POST 提交的问题可以先用普通 API 创建run_id再用 SSE GET 订阅这个运行。五、为什么要有 run_id 和 event_idrun_id标识一次问答执行关联用户、会话、模型调用、检索结果和最终答案。event_id标识流中的事件序号。断线重连时可以用Last-Event-ID或自定义游标请求缺失事件避免重复或丢失。不要把“连接存在”当作任务状态。连接可能断开但服务端任务仍在运行。如果需要可靠重连服务端应保存短期事件记录或最终结果并支持Last-Event-ID、since_event_id或run_id查询。事件日志可以过期但最终答案、引用和运行状态应进入持久化存储不能只存在 SSE 连接内存中。六、心跳和断线重连长时间没有 Token 时代理和负载均衡器可能认为连接空闲。服务端可以发送注释心跳: heartbeat前端断线后应关闭旧连接查询 run_id 当前状态根据最后事件 ID 继续订阅或加载最终结果避免重复触发一次模型调用。重连要设置退避和最大次数避免网络故障时所有客户端同时打满接口。心跳只能证明连接仍在不代表模型或任务仍在运行前端恢复后还应查询服务端状态。服务端要限制单个用户、租户和 IP 的长连接数量。七、错误事件和取消event: error data: {code:MODEL_TIMEOUT,retryable:true} event: cancelled data: {run_id:run-001}用户点击停止时前端调用取消接口服务端应取消模型流、工具调用和下游任务并发送最终状态。只关闭浏览器连接不能停止后台成本。八、SSE 与反向代理生产环境要检查代理是否缓存响应是否关闭响应缓冲是否正确传递text/event-stream读取超时是否覆盖模型最长生成时间是否支持负载均衡、连接数限制和客户端断开通知。这些配置必须通过真实代理链路测试不能只在本地直连 FastAPI 时判断 SSE 正常。空闲超时是否足够是否支持 HTTP/2是否正确透传text/event-stream多实例时事件是否能路由到正确任务。多实例服务通常需要 Redis Pub/Sub、消息队列或持久化事件表把后台 Worker 的事件转给持有 SSE 连接的 API 实例。九、不要只返回 Token建议定义事件协议message_start retrieval_started retrieval_completed tool_call token citation usage done error这样前端可以展示“正在检索”“正在调用工具”和引用来源而不是只能显示一段逐字出现的文本。结语SSE 适合把服务端生成过程持续推送到浏览器能够改善大模型应用的等待体验。但可靠的流式系统还必须设计 run_id、事件序号、心跳、重连、取消、最终状态和代理配置。下一篇将把文件上传、任务队列和知识库管理整合起来设计一套完整 API。参考资料MDNUsing server-sent eventsWHATWGServer-sent eventsFastAPI 官方文档Custom Response本文为“码海寻道”原创技术文章。SSE 的代理、浏览器连接和重连行为需要结合实际网络环境测试。

相关新闻

用Python爬虫抓取酷狗音乐热歌榜:从接口分析到CSV保存

用Python爬虫抓取酷狗音乐热歌榜:从接口分析到CSV保存

用Python爬虫去抓酷狗音乐热歌榜的歌曲名,这件事在刚接触爬虫的朋友看来可能有点玄乎。最直观的想法是写个requests请求,拿到页面HTML,再用正则把歌名抠出来,结果实际动手才发现网页源代码里根本没有歌名数据,唯一能看…

2026/10/1 11:59:31 阅读更多 →
AirSim settings.json配置完全指南:从传感器到PX4连接实战

AirSim settings.json配置完全指南:从传感器到PX4连接实战

AirSim 这个东西,做无人机和自动驾驶算法的人基本都绕不开。它本质上是微软开源的一套高保真仿真平台,底层基于虚幻引擎,把物理模型、传感器模型、自动驾驶接口全给包了一层。而当你真正把 AirSim 装好、编译好、第一次启动的时候&#xff0c…

2026/10/1 11:59:31 阅读更多 →
gitee(工具)2-使用与功能介绍

gitee(工具)2-使用与功能介绍

上篇 创作中心-CSDNhttps://mp.csdn.net/mp_blog/creation/editor/166554612 1.恢复提交版本(本地库文件丢失) 本地库文件丢失,从网站上克隆一个本地库 开始恢复 在看本地库中已经恢复了

2026/10/1 11:59:31 阅读更多 →

最新新闻

Matlab支持向量回归(SVR)实战:fitrsvm参数调优与避坑指南

Matlab支持向量回归(SVR)实战:fitrsvm参数调优与避坑指南

简介:这是一份面向机器学习与MATLAB应用学习者的技术资料,聚焦支持向量回归(SVR)的完整实现与对比分析。文档系统梳理多元线性回归、BP神经网络与决策向量机的原理差异,并重点演示SVR在MATLAB中的建模流程,…

2026/10/1 12:47:57 阅读更多 →
欧盟AI法案简化与深度伪造禁令:AI产品合规落地指南

欧盟AI法案简化与深度伪造禁令:AI产品合规落地指南

上周欧盟那边传出一个讨论了很久的消息:AI法案的简化修订方向基本定了,一边给低风险AI应用松绑,另一边把“脱衣换脸”这类深度伪造工具明确列入禁止范畴。我朋友圈里做AI产品的人分成两派,一派觉得终于不用被繁琐流程卡脖子&#…

2026/10/1 12:47:57 阅读更多 →
底特律街景6分类数据集:YOLO目标检测训练与调参实战

底特律街景6分类数据集:YOLO目标检测训练与调参实战

简介:这份资源面向计算机视觉目标检测的学习者与开发者,提供底特律街景场景的六分类数据集,可直接用于YOLO系列模型的训练与验证,省去自行标注与格式转换的环节。类别涵盖汽车、交通标志、车道线、行人、摩托车手与骑行者&#xf…

2026/10/1 12:47:57 阅读更多 →
Composer2:AI编程工作流的范式迁移

Composer2:AI编程工作流的范式迁移

1. 这不是“低价替代”,而是AI编程工作流的范式迁移最近在几个技术群和开源项目组里,频繁看到开发者发截图:同一段复杂业务逻辑的实现需求,用Cursor Composer2生成的代码结构清晰、注释完整、单元测试覆盖率高,而同期用…

2026/10/1 12:47:57 阅读更多 →
MySQL插入数据避坑指南:从基础语法到批量性能优化

MySQL插入数据避坑指南:从基础语法到批量性能优化

一条 INSERT 语句能有什么技术含量?如果你写了好几年 SQL 还这么想,那可能只是还没在生产环境里踩过坑。字符集不对导致中文乱码、字段长度不够直接报错、批量插入把数据库锁住、误用 REPLACE 把外键数据搞没了——这些问题我都在真实项目里见过。MySQL …

2026/10/1 12:47:57 阅读更多 →
Java后端服务在Linux服务器上的生存指南

Java后端服务在Linux服务器上的生存指南

1. 这不是“部署教程”,而是后端服务在真实服务器上活下来的生存手册你写完 Spring Boot 项目,打了个 jar 包,兴冲冲java -jar app.jar一跑——本地 localhost:8080 能访问,日志刷得飞起,心里美滋滋。结果一上服务器&a…

2026/10/1 12:46:56 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →