加载中

在使用AI模型构建聊天界面时,用户期望立即看到响应出现,而不是等待10-30秒才能获得完整的响应。converse_stream 函数通过在生成文本时进行流式传输来解决这个问题,从而创造更好的用户体验。

流式传输的工作原理

流式传输不是等待整个响应生成完毕,而是在文本片段可用时立即将其发送回来。以下是流程的变化方式:

当您调用 converse_stream 时,您会立即获得一个包含 stream 对象的初始响应。这个流是一个生成器,会在模型生成文本时产生事件。每个事件都包含整体响应的一小块内容。

基本实现

以下是在代码中使用 converse_stream 的方法:

python
messages = []
add_user_message(messages, "Write a 1 sentence description of a fake database")
response = client.converse_stream(messages=messages, modelId=model_id)

for event in response["stream"]:
    print(event)

这将打印出所有到达的不同事件。您会看到响应以块的形式到来,而不是一次性全部到来。

理解流事件

该流会产生多种类型的事件,每种事件都有不同的用途:

对于基本的文本生成,您只需要关注 contentBlockDelta 事件。这些事件包含您想要展示给用户的实际生成文本块。

事件总是以可预测的顺序到达:messageStart,多个包含您文本的 contentBlockDelta 事件,然后是 contentBlockStop、messageStop,最后是 metadata。

提取文本

要从每个块中仅获取生成的文本,请筛选 contentBlockDelta 事件并提取文本:

python
text = ""
for event in response["stream"]:
    if "contentBlockDelta" in event:
        chunk = event["contentBlockDelta"]["delta"]["text"]
        print(chunk, end="")
        text += chunk

print("\n\nTotal Message:\n" + text)

end="" 参数移除了Python的print函数自动添加的换行符,使流式传输的文本显示得更加自然。

实际应用

在实际应用中,您通常不会打印每个块,而是会:

  • 通过WebSockets或Server-Sent Events将每个块发送到您的前端
  • 实时更新UI以显示不断增长的响应
  • 流式传输完成后存储完整的消息
  • 处理流式传输过程中可能发生的任何错误

这种流式传输方法将用户体验从"提交并等待"转变为"提交并观看响应出现",使您的AI驱动应用程序感觉更加响应迅速且引人入胜。