前端收到一半内容后连接被断开,服务端日志显示客户端断开,用户看到半句话,刷新后又从头开始生成,既浪费 token 又体验很差。

排查方向其实有限,先把可能性排一排。反向代理的读超时短于模型生成时长;客户端断开后后端仍在生成,白白消耗 token;没有记录已发送的片段,无法从中断处继续;中间层开了压缩,流被攒成整包才发出去。

上来先在 Nginx 里放开读超时并关闭缓冲

proxy_read_timeout 300s; proxy_buffering off;

服务端检测断开后立即停止生成

if await request.is_disconnected(): break

接着把已生成片段按请求 id 缓存,支持续写

python -c "import redis;print(redis.Redis().get('gen:1024'))"

给前端加一次自动重连续写请求

python -c "print('resume from', len(text))")

改完先别撤,确认这几项。长回答能完整输出到结束,客户端主动断开后日志里能看到生成被及时取消,显卡占用随即回落。

这里还有个坑。关掉缓冲后一定要同时确认没有开启响应压缩,否则中间层仍会把流攒成整包再发,用户依旧要等很久才看到第一段文字。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189