流式输出(Streaming):为什么回答是逐字逐句出现的
Claude Code、ChatGPT等工具通常是一点点显示回答,而不是一次性全部呈现——流式输出并不会改变回答的质量或成本。
什么是流式输出
没有流式输出时,你需要等模型把完整回答全部生成完,然后才能一次性看到全部内容。有了流式输出,API会在每个词元(Token)生成完成后立刻单独发送——你能实时看到回答逐渐“长出来”,就像看着有人在打字一样。
为什么工具要这样做
流式输出并不会改变模型整体完成所需的时间——但主观等待感会明显下降,因为你能立刻看到最初的几个词,而不是盯着一片空白。此外,如果回答一开始就明显走偏,还可以提前中止,而不必等整个生成过程结束。
背后的技术
实现这一点的常见机制叫服务器发送事件(Server-Sent Events,SSE)——一种简单成熟的Web技术,服务器利用一个保持打开的连接,持续不断地向客户端发送小块数据。Claude和OpenAI的API都通过SSE提供流式输出,只需在请求中开启一个简单的参数(stream: true)即可。
流式输出不会改变什么
流式输出既不影响回答的质量,也不影响总成本——计费依然按Token数量计算,无论这些Token是逐个到达还是一次性到达。它纯粹是一种呈现技术,用来改善主观体验,并不涉及内容上的任何变化。
示例
curl -N https://api.anthropic.com/v1/messages \ -H "anthropic-version: 2023-06-01" \ -d '{"model":"claude-sonnet-5","stream":true,"max_tokens":100,"messages":[{"role":"user","content":"数到5"}]}' # 输出以一连串SSE事件(event: content_block_delta, ...)的形式到达,而不是一次性完整的单条回答。
🛠️ 练习——自己动手试试
分别以开启和关闭流式输出的方式调用Claude API,在终端中直接观察差异。
- 发送一个stream: false的请求,等待完整回答返回。
- 用stream: true发送同样的请求(例如通过curl -N),观察回答是如何分块到达的。
- 比较两种方式从发送请求到收到最后一个字符所用的总时长。
✅ 自查清单
- ☐ 尽管总耗时相近,流式输出的主观等待感是否更短?
- ☐ 你能否在流式输出的原始数据中识别出一个个SSE事件(event: ...)?
小测验
流式输出会对API的回答产生什么改变?
来源
- Claude官方文档:流式消息(Streaming Messages) ↗ platform.claude.com
- OpenAI官方文档:流式API响应(Streaming API Responses) ↗ developers.openai.com