載入中

在使用 AI 模型建構聊天介面時,使用者期望立即看到回應出現,而不是等待 10 到 30 秒才能看到完整的回應。converse_stream 函式透過在文字生成時即時串流傳送來解決這個問題,從而創造出更好的使用者體驗。

串流如何運作

串流不會等待整個回應生成完畢,而是在文字片段可用時立即傳回。以下是流程的變化方式:

當您呼叫 converse_stream 時,您會立即取得一個包含 stream 物件的初始回應。這個 stream 是一個生成器(generator),會在模型生成文字時產生事件(events)。每個事件都包含整體回應的一小部分內容。

基本實作

以下是在您的程式碼中使用 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)

這會印出所有到達的不同事件。您會看到回應以區塊(chunks)的形式傳入,而不是一次性全部傳入。

了解串流事件

stream 會產生多種類型的事件,每種事件都有不同的用途:

對於基本的文字生成,您只需要關注 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 驅動應用程式感覺更具回應性且更吸引人。