9.Response streaming
此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org
==================================================
在使用Claude构建聊天应用时,存在一个显著的用户体验挑战:响应生成可能需要10-30秒,让用户只能盯着加载动画等待。解决方案是响应流式传输,它让用户能够看到文本在Claude生成时逐块出现,创造出更加响应迅速的体验感。

标准响应的问题
在典型的聊天设置中,您的服务器向Claude发送用户消息,然后等待完整响应生成后才向客户端发送任何内容。这会造成尴尬的延迟,用户无法获得任何正在处理的反馈。

How Streaming Works
启用流式传输后,Claude会立即发送回一个初始响应,表明它已收到您的请求并开始生成文本。然后您会收到一系列事件,每个事件包含整体响应的一小部分。

您的服务器可以在这些文本块到达时立即转发给客户端应用,让用户能够看到响应逐字逐句地构建起来。所有这些事件都是对Claude单次请求的一部分。

理解流事件
当您启用流式传输时,Claude会发送回几种类型的事件:
- MessageStart - 正在发送新消息
- ContentBlockStart - 包含文本、工具使用或其他内容的新块开始
- ContentBlockDelta - 实际生成文本的块
- ContentBlockStop - 当前内容块已完成
- MessageDelta - 当前消息已完成
- MessageStop - 当前消息信息结束

ContentBlockDelta 事件包含您希望向用户显示的实际生成文本。
基础流式实现
要启用流式传输,请在您的 messages.create 调用中添加 stream=True:
messages = []
add_user_message(messages, "Write a 1 sentence description of a fake database")
stream = client.messages.create(
model=model,
max_tokens=1000,
messages=messages,
stream=True
)
for event in stream:
print(event)

简化文本流式传输
与手动解析事件不同,你可以使用SDK的简化流式传输接口,它只提取文本内容:
with client.messages.stream(
model=model,
max_tokens=1000,
messages=messages
) as stream:
for text in stream.text_stream:
print(text, end="")
这种方法会自动过滤掉除实际文本内容之外的所有内容,这通常是向用户显示响应时所需要的。
获取完整消息
虽然流式传输单个块对用户体验很有帮助,但你通常需要完整的消息用于存储或进一步处理。流式传输完成后,你可以获取组装好的最终消息:
with client.messages.stream(
model=model,
max_tokens=1000,
messages=messages
) as stream:
for text in stream.text_stream:
# 将每个数据块发送给你的客户端
pass
# 获取完整消息用于数据库存储
final_message = stream.get_final_message()
这为你提供了两全其美的解决方案:为用户提供实时流式传输,同时为你的应用程序逻辑提供完整的消息对象。
==================================================
此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org