SSE与流式响应
流式响应是大模型应用常见交互方式。模型逐步生成 Token,服务端边接收边推送给前端,用户可以更早看到结果。
# 1. 为什么需要流式响应
大模型完整生成可能需要数秒甚至更久。如果等全部生成后再返回,用户会感觉卡顿。
非流式:请求 -> 等待完整生成 -> 一次性返回
流式:请求 -> 持续生成 -> 持续返回
# 2. SSE 基本模型
SSE(Server-Sent Events)适合服务端向浏览器单向推送事件。
浏览器 EventSource / fetch stream
-> 服务端 SSE 接口
-> 模型流式输出
-> data: token
-> data: token
-> event: done
SSE 比 WebSocket 简单,适合聊天输出这类单向流。
# 3. 事件设计
| 事件 | 作用 |
|---|---|
| start | 开始生成 |
| delta | 增量文本 |
| tool_call | 工具调用状态 |
| citation | 引用信息 |
| error | 错误 |
| done | 生成结束 |
不要只传纯文本,结构化事件更容易扩展。
# 4. 后端注意点
- 设置合理超时。
- 客户端断开时停止模型调用。
- 异常时发送 error 和 done。
- 控制并发长连接数量。
- 记录完整输出用于审计和历史展示。
- 对输出内容做安全过滤。
# 5. 前端注意点
| 功能 | 说明 |
|---|---|
| 打字机效果 | 展示增量文本 |
| 停止生成 | 用户中断请求 |
| 重试 | 失败后重新生成 |
| 状态提示 | 显示检索、思考、工具调用等阶段 |
| 自动滚动 | 保持阅读位置 |
| 部分结果保存 | 中断时保留已生成内容 |
# 6. 常见问题
| 问题 | 原因 | 处理 |
|---|---|---|
| 连接中断 | 网络或代理超时 | 心跳、重连、合理超时 |
| 输出乱码 | 编码处理错误 | 使用 UTF-8 |
| 服务线程耗尽 | 长连接占用资源 | 异步处理、限流 |
| 停止无效 | 后端未取消模型请求 | 传递取消信号 |
# 7. Tips 快问快答
Q:SSE 和 WebSocket 怎么选?
A:只需要服务端向客户端推送生成内容时,SSE 更简单;需要双向实时通信时用 WebSocket。
Q:流式输出能降低模型总耗时吗?
A:不一定降低总耗时,但能显著缩短首屏等待时间。
Q:流式内容要不要落库?
A:建议生成完成后保存完整消息,同时记录中断和错误状态。
上次更新: 2026/06/25, 17:53:09