概述LLM输出通常较长,流式传输可提升交互体验。结合分片标记与游标状态可在网络中断后实现续传与幂等重试,提升鲁棒性与用户体验。关键实践与参数传输协议: SSE用于单向文本流,WebSocket用于双向控制分片标记: 为每段输出标记 `seq` 与 `cursor`断点续传: 客户端携带 `cursor` 请求续传重试安全: 基于请求ID去重,幂等生成并缓存片段观测: 记录流会话时长、片段数量与重试次数示例/配置/实现// Node.js SSE 服务端 import express from 'express' const app = express() app.get('/stream', (req, res) => { res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') const cursor = Number(req.query.cursor || 0) const chunks = ['Hello', ' ', 'world', '!'] for (let i = cursor; i < chunks.length; i++) { res.write(`event: chunk\n`) res.write(`data: ${JSON.stringify({ seq: i, text: chunks[i] })}\n\n`) } res.end() }) app.listen(8080) // 浏览器 SSE 客户端 let cursor = 0 function start() { const es = new EventSource(`/stream?cursor=${cursor}`) es.addEventListener('chunk', (e) => { const { seq, text } = JSON.parse(e.data) cursor = seq + 1 document.body.innerText += text }) es.onerror = () => { es.close(); setTimeout(start, 1000) } } start() // WebSocket 双向控制(续传请求) const ws = new WebSocket('wss://example.com/llm') ws.onopen = () => { ws.send(JSON.stringify({ type: 'resume', cursor: 2 })) } ws.onmessage = (e) => { const m = JSON.parse(e.data); /* append m.text */ } 验证中断恢复: 断网后重连携带 `cursor`,从下一片段继续幂等与去重: 重试同一请求ID不重复生成与返回片段延迟与体验: 记录首片段延迟与整体拼接耗时兼容性: SSE与WebSocket在不同网络环境下均可工作注意事项流式接口需限速与断路保护存储与缓存片段需设置生命周期对超长输出进行分页与终止控制结合鉴权与账单策略管理会话

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
1.911191s