第 15 页 / 共 100 页 / 飞书修订版 7

9.Response streaming

此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)

邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org

==================================================

在使用Claude构建聊天应用时,存在一个显著的用户体验挑战:响应生成可能需要10-30秒,让用户只能盯着加载动画等待。解决方案是响应流式传输,它让用户能够看到文本在Claude生成时逐块出现,创造出更加响应迅速的体验感。

image1.png

标准响应的问题

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

image2.png

How Streaming Works

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

image3.png

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

image3.png

理解流事件

当您启用流式传输时,Claude会发送回几种类型的事件:

  • MessageStart - 正在发送新消息
  • ContentBlockStart - 包含文本、工具使用或其他内容的新块开始
  • ContentBlockDelta - 实际生成文本的块
  • ContentBlockStop - 当前内容块已完成
  • MessageDelta - 当前消息已完成
  • MessageStop - 当前消息信息结束
image4.png

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)

image5.png

简化文本流式传输

与手动解析事件不同,你可以使用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