載入中

在使用 Claude 建構聊天應用程式時,存在一個重大的使用者體驗挑戰:回應可能需要 10 到 30 秒才能生成,讓使用者只能盯著載入中的轉圈圖示。解決方案就是回應串流,它讓使用者能夠看到文字隨著 Claude 生成而逐塊出現,從而創造出更具回應性的感覺。

標準回應的問題

在典型的聊天設置中,您的伺服器會將使用者訊息傳送給 Claude,並等待完整的回應後才將任何內容傳回給客戶端。這會造成一個尷尬的延遲,使用者完全沒有任何反饋來知道正在發生什麼事。

串流如何運作

啟用串流後,Claude 會立即傳回一個初始回應,表示它已收到您的請求並開始生成文字。接著您會收到一系列事件,每個事件都包含整體回應的一小部分。

您的伺服器可以在這些文字區塊到達時,將它們轉發給您的客戶端應用程式,讓使用者能夠逐字看到回應逐步建立起來。所有這些事件都屬於對 Claude 的單一請求的一部分。

了解串流事件

啟用串流後,Claude 會傳回幾種類型的事件:

  • MessageStart - 正在傳送一則新訊息
  • ContentBlockStart - 包含文字、工具使用或其他內容的新區塊的開始
  • ContentBlockDelta - 實際生成文字的區塊
  • ContentBlockStop - 目前的內容區塊已完成
  • MessageDelta - 目前的訊息已完成
  • MessageStop - 目前訊息資訊的結束

ContentBlockDelta 事件包含您想要顯示給使用者的實際生成文字。

基本串流實作

要啟用串流,請在您的 messages.create 呼叫中加入 stream=True:

python
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 的簡化串流介面來提取純文字內容,而不必手動解析事件:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        print(text, end="")

這種方法會自動過濾掉除實際文字內容以外的所有內容,這通常正是您在向使用者顯示回應時所需要的。

取得最終訊息

雖然串流對使用者體驗非常有利,但您通常需要完整的訊息以進行儲存或進一步處理。串流完成後,您可以取得組裝完成的最終訊息:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        pass  # Send to client in real application
    
    final_message = stream.get_final_message()

這讓您同時擁有用於使用者體驗的串流能力,以及用於資料庫儲存或對話歷史記錄的完整訊息物件。

實務考量

串流中的每個文字區塊可以包含多個單字,甚至是完整的句子——您無法保證每個事件恰好收到一個單字。區塊大小取決於 Claude 生成每個文字部分的速度。

在生產應用程式中,您通常會透過 WebSockets 或 Server-Sent Events 立即將這些文字區塊轉發給您的客戶端應用程式,讓使用者能夠即時看到回應出現,同時在您的伺服器上維護完整的對話歷史記錄。