概念定义

流式输出是LLM逐步生成并实时传输响应内容的技术,让用户能够立即看到部分结果而无需等待完整响应。

详细解释

流式输出彻底改变了用户与AI的交互体验。传统的请求-响应模式需要等待模型生成完整内容后才返回,而流式输出则像人类打字一样,逐字逐句地展现生成过程。 2025年,流式输出已成为LLM API的标配功能。主流技术栈包括:
  • SSE(Server-Sent Events):已成为行业标准,简单可靠
  • WebSocket:适用于需要双向通信的复杂场景
  • HTTP/2 Server Push:新兴选择,原生多路复用
  • WebTransport:基于QUIC,超低延迟
相比传统模式,流式输出将首字节时间(TTFB)从数秒降至毫秒级,显著提升用户体验。

工作原理

核心流程

1. Token生成 → 2. 批量组装 → 3. 流式传输 → 4. 客户端渲染

SSE实现示例

服务端推送格式:
HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache

data: {"id":"msg-001","type":"content_block_delta","delta":{"text":"Hello"}}
data: {"id":"msg-001","type":"content_block_delta","delta":{"text":" world"}}
data: {"id":"msg-001","type":"content_block_stop"}
data: [DONE]
客户端接收代码:
const eventSource = new EventSource('/api/stream');
eventSource.onmessage = (event) => {
  if (event.data === '[DONE]') {
    eventSource.close();
    return;
  }
  const chunk = JSON.parse(event.data);
  displayContent(chunk.delta.text);
};

缓冲区管理

class StreamBuffer:
    def __init__(self, size=5):  # 2025标准:5-10 tokens
        self.buffer = []
        self.size = size
    
    def add(self, token):
        self.buffer.append(token)
        if len(self.buffer) >= self.size:
            return self.flush()
        return None
    
    def flush(self):
        content = self.buffer
        self.buffer = []
        return content

性能优化

1. 连续批处理(Continuous Batching)

  • vLLM框架:提升23倍吞吐量
  • 动态批次调整,充分利用GPU
  • 预填充与解码分离

2. 投机解码(Speculative Decoding)

  • 小模型预测 + 大模型验证
  • 平均加速2-3倍
  • Medusa、EAGLE等最新算法

3. Token压缩

  • 相似token合并传输
  • 压缩率20-40%
  • 减少网络开销

4. 硬件加速

  • NVIDIA H100:300+ tokens/秒
  • AMD MI300X:竞争性能
  • 专用推理芯片崛起

错误处理

常见错误类型

  1. 连接中断:网络不稳定导致
  2. 超时错误:生成时间过长
  3. 限流错误:超出速率限制
  4. 内容截断:达到最大长度

处理策略

async def stream_with_retry(prompt, max_retries=3):
    for attempt in range(max_retries):
        try:
            async for chunk in generate_stream(prompt):
                yield chunk
            break
        except StreamError as e:
            if attempt == max_retries - 1:
                yield {"error": str(e)}
            await asyncio.sleep(2 ** attempt)

实际应用

  1. 对话助手:ChatGPT、Claude等实时响应
  2. 代码生成:GitHub Copilot逐行建议
  3. 内容创作:实时预览生成效果
  4. 数据分析:渐进式呈现分析结果
  5. 翻译系统:同步显示翻译进度

最佳实践

  • 设置合理超时:通常30-60秒
  • 实现断点续传:保存已接收内容
  • UI反馈设计:打字动画、进度指示
  • 优雅降级:流式失败时回退到普通模式
  • 监控流指标:延迟、吞吐量、成功率

相关概念

延伸阅读