Response streaming
Khi xây dựng ứng dụng chat với Claude, có một thách thức quan trọng về trải nghiệm người dùng: các 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 biểu tượng loading. Giải pháp là streaming response, cho phép người dùng thấy văn bản xuất hiện từng đoạn 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 một thiết lập chat thông thường, server của bạn gửi tin nhắn người dùng cho Claude và chờ phản hồi hoàn chỉnh trước khi gửi bất cứ thứ gì trở lại client. Điều này tạo ra độ trễ khó chịu khi người dùng không có phản hồi nào rằng có gì đó đang xảy ra.
Streaming Hoạt động như thế nào
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à bắt đầu tạo văn bản. Sau đó bạn nhận được một loạt events, mỗi cái 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 khi chúng đến, cho phép người dùng thấy phản hồi được xây dựng từng từ một. Tất cả các events này là một phần của một yêu cầu duy nhất đến Claude.
Hiểu về Stream Events
Khi bạn bật streaming, Claude gửi lại nhiều loại events:
Triển khai Streaming Cơ bản
Để bật streaming, thêm stream=True vào lời gọi messages.create của bạn:
python
messages = []
add_user_message(messages, "Viết mô tả 1 câu về một cơ sở dữ liệu giả")
stream = client.messages.create(
model=model,
max_tokens=1000,
messages=messages,
stream=True
)
for event in stream:
print(event)
Text Streaming Đơn giản
Thay vì phân tích events thủ công, bạn có thể sử dụng giao diện streaming đơn giản của SDK để trích xuất chỉ nội dung văn bản:
python
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ứ trừ nội dung văn bản thực tế, 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 Hoàn chỉnh
Trong khi streaming các đoạn riêng lẻ rất tốt cho trải nghiệm người dùng, bạn thường cần tin nhắn hoàn chỉnh để lưu trữ hoặc xử lý thêm. Sau khi streaming hoàn thành, bạn có thể lấy tin nhắn cuối cùng đã được tập hợp:
python
with client.messages.stream(
model=model,
max_tokens=1000,
messages=messages
) as stream:
for text in stream.text_stream:
# Gửi từng đoạn đến client của bạn
pass
# Lấy tin nhắn hoàn chỉnh để lưu trữ database
final_message = stream.get_final_message()
Điều này mang lại lợi ích của cả hai thế giới: streaming thời gian thực cho người dùng và một message object hoàn chỉnh cho logic ứng dụng của bạn.
Khi xây dựng ứng dụng chat với Claude, có một thách thức quan trọng về trải nghiệm người dùng: các 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 biểu tượng loading. Giải pháp là streaming response, cho phép người dùng thấy văn bản xuất hiện từng đoạn 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 một thiết lập chat thông thường, server của bạn gửi tin nhắn người dùng cho Claude và chờ phản hồi hoàn chỉnh trước khi gửi bất cứ thứ gì trở lại client. Điều này tạo ra độ trễ khó chịu khi người dùng không có phản hồi nào rằng có gì đó đang xảy ra.
Streaming Hoạt động như thế nào
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à bắt đầu tạo văn bản. Sau đó bạn nhận được một loạt events, mỗi cái 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 khi chúng đến, cho phép người dùng thấy phản hồi được xây dựng từng từ một. Tất cả các events này là một phần của một yêu cầu duy nhất đến Claude.
Hiểu về Stream Events
Khi bạn bật streaming, Claude gửi lại nhiều loại events:
- 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 thực tế được tạo ra
- ContentBlockStop - Block nội dung hiện tại đã được 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
Triển khai Streaming Cơ bản
Để bật streaming, thêm stream=True vào lời gọi messages.create của bạn:
python
messages = []
add_user_message(messages, "Viết mô tả 1 câu về một cơ sở dữ liệu giả")
stream = client.messages.create(
model=model,
max_tokens=1000,
messages=messages,
stream=True
)
for event in stream:
print(event)
Text Streaming Đơn giản
Thay vì phân tích events thủ công, bạn có thể sử dụng giao diện streaming đơn giản của SDK để trích xuất chỉ nội dung văn bản:
python
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ứ trừ nội dung văn bản thực tế, 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 Hoàn chỉnh
Trong khi streaming các đoạn riêng lẻ rất tốt cho trải nghiệm người dùng, bạn thường cần tin nhắn hoàn chỉnh để lưu trữ hoặc xử lý thêm. Sau khi streaming hoàn thành, bạn có thể lấy tin nhắn cuối cùng đã được tập hợp:
python
with client.messages.stream(
model=model,
max_tokens=1000,
messages=messages
) as stream:
for text in stream.text_stream:
# Gửi từng đoạn đến client của bạn
pass
# Lấy tin nhắn hoàn chỉnh để lưu trữ database
final_message = stream.get_final_message()
Điều này mang lại lợi ích của cả hai thế giới: streaming thời gian thực cho người dùng và một message object hoàn chỉnh cho logic ứng dụng của bạn.