流式输出要处理什么
流式把生成过程分段返回,首 token 一到用户就能看到反馈,交互体感明显好于等整段返回。代价是客户端要处理增量拼接、事件边界、断流与取消:必须按事件边界分帧而不是按字节切割,遇到半截数据要留在缓冲区等下一次,断流时要保留已产出内容并明确标注不完整。
基本信息
| 常见协议 | SSE 以 data: 行加空行分帧;也有按行分隔的 JSON |
|---|---|
| 拼接方式 | 维护缓冲区,凑齐完整事件再解析 |
| 断流 | 保留已输出内容,标注不完整并记录原因 |
| 取消 | 关闭连接并同步停止统计与上游请求 |
| 存档 | 流结束后保存完整文本与终态,作为后续审计依据 |
典型使用场景
- 长文生成:用户边看边判断方向对不对,可及时打断省下费用
- 对话机器人:逐段渲染并节流刷新,避免高频重排卡顿
- 代码补全:按行或按块输出,配合语法高亮逐段上色
- 语音播报:分段转语音,前端与后端并行流水
- 导出场景:流式收集后在服务端落库,避免丢半段
流式处理要点(伪代码)
流式处理要点(伪代码)
buffer = 空
for chunk in stream:
buffer += chunk
while 缓冲区存在完整事件(buffer):
取出一个事件并输出给前端
buffer = 剩余部分 # 半截数据留在缓冲区
# 正常结束: 标记完成并保存完整文本
# 断流: 已输出内容标注不完整,记录断开原因与已输出长度
# 取消: 关闭连接、中止上游、停止计费统计异常情形与处理
| 情形 | 处理 | 用户侧 |
|---|---|---|
| 收到半截事件 | 留在缓冲区等下一批 | 无感,继续输出 |
| 连接中断 | 保留已输出并标记不完整 | 显示内容不完整提示 |
| 用户取消 | 关闭连接并中止上游 | 立即停止,费用相应减少 |
| 上游返回错误帧 | 解析错误并终止该次流 | 给出可重试提示 |
前端逐段渲染要节流:每个 token 都触发一次重排会让长回答越写越卡,按时间片批量刷新更稳。