Bỏ qua đến nội dung chính

Response streaming

📖 Nội dung bài học

Tóm tắt

Khi xây dựng ứng dụng chat với Claude, có một thách thức lớn về trải nghiệm người dùng: phản hồi có thể mất 10-30 giây để tạo ra, khiến người dùng phải nhìn chằm chằm vào vòng xoay tải. Giải pháp là response streaming (tính năng truyền phát phản hồi), cho phép người dùng xem văn bản xuất hiện từng đoạn nhỏ khi Claude tạo ra, tạo cảm giác phản hồi nhanh hơn nhiều.

Vấn đề với phản hồi tiêu chuẩn

Trong thiết lập chat thông thường, server của bạn gửi tin nhắn của người dùng đến Claude và đợi phản hồi đầy đủ trước khi gửi bất cứ thứ gì trở lại client. Điều này tạo ra sự chậm trễ khó chịu, nơi người dùng không có phản hồi nào cho thấy bất cứ điều gì đang xảy ra.

Cách hoạt động của Streaming

Với streaming được bật, Claude ngay lập tức gửi lại phản hồi ban đầu cho biết nó đã nhận được yêu cầu của bạn và đang bắt đầu tạo văn bản. Sau đó, bạn nhận được một loạt các sự kiện, mỗi sự kiện chứa một phần nhỏ của phản hồi tổng thể.

Server của bạn có thể chuyển tiếp các đoạn văn bản này đến ứng dụng client của bạn khi chúng đến, cho phép người dùng xem phản hồi được xây dựng từng chữ một. Tất cả các sự kiện này là một phần của một yêu cầu duy nhất đến Claude.

Hiểu các sự kiện Stream

Khi bạn bật streaming, Claude gửi lại một số loại sự kiện:

  • MessageStart - Một tin nhắn mới đang được gửi
  • ContentBlockStart - Bắt đầu một block mới chứa văn bản, tool use, hoặc nội dung khác
  • ContentBlockDelta - Các đoạn của văn bản được tạo thực tế
  • ContentBlockStop - Block nội dung hiện tại đã hoàn thành
  • MessageDelta - Tin nhắn hiện tại đã hoàn thành
  • MessageStop - Kết thúc thông tin về tin nhắn hiện tại

Các sự kiện ContentBlockDelta chứa văn bản được tạo thực tế mà bạn sẽ muốn hiển thị cho người dùng.

Triển khai Streaming cơ bản

Để bật streaming, hãy thêm stream=True vào lệnh messages.create:

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)

Streaming văn bản đơn giản hóa

Thay vì tự phân tích cú pháp các sự kiện, bạn có thể dùng giao diện streaming đơn giản hóa của SDK, chỉ trích xuất nội dung văn bản:

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

Cách tiếp cận này tự động lọc ra mọi thứ ngoại trừ nội dung văn bản thực tế, đây thường là những gì bạn cần để hiển thị phản hồi cho người dùng.

Lấy tin nhắn đầy đủ

Mặc dù streaming từng đoạn là tuyệt vời cho trải nghiệm người dùng, bạn thường cần tin nhắn đầy đủ để lưu trữ hoặc xử lý thêm. Sau khi streaming hoàn tất, bạn có thể lấy tin nhắn cuối cùng đã được tổng hợp:

with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        # Send each chunk to your client
        pass
    
    # Get the complete message for database storage
    final_message = stream.get_final_message()

Điều này mang lại cho bạn những điều tốt nhất của cả hai thế giới: streaming theo thời gian thực cho người dùng và một đối tượng tin nhắn hoàn chỉnh cho logic ứng dụng của bạn.

🔁 Bài học liên quan

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?