主题
多模型流式问答出现断流、乱码、重复输出或重试失败时怎么排查?
题型:问题排查 · 从模型 Provider、适配层、Reactor、网关到浏览器逐段验证。
排查顺序
先用同一个 requestId 对比模型原始流、适配后事件、服务端 SSE 和浏览器接收内容,确定问题在哪一段。断流重点检查 Provider 超时、代理空闲超时、心跳、客户端取消和异常是否被吞掉;乱码检查 UTF-8 增量解码,不能假设每个网络 chunk 都是完整字符;重复输出检查模型重试、Flux 重订阅、网关重放和客户端按 eventId 去重逻辑。
处理方案
- 每次模型生成分配 generationId,事件带单调 sequence 和 eventId。
- 适配器维护增量解码状态,将不同厂商结束标记归一化。
- Flux 避免对冷流无意多次订阅,必要时明确共享与重放边界。
- 已输出部分内容后不静默切换模型,发送 retrying 或 failed 事件。
- 客户端断开后取消上游,并记录取消原因和已产生费用。
复盘闭环
补充 Provider 维度的 TTFT、断流率、正常完成率、重试成功率和重复事件监控,并把网关超时、缓冲与压缩配置纳入部署检查。
易错点
- 连接关闭不一定代表任务成功完成。
- 只在前端去重会掩盖服务端重复执行和重复计费。