ai-055Đọc toàn bộ đề miễn phí

Định Dạng Luồng Dữ Liệu SSE (Server-Sent Events) Chuẩn OpenAI

data: {"id": "chatcmpl-123", "object": "chat.completion.chunk", "created": 1700000000, "model": "ai-empire-llm", "choices": [{"index": 0, "delta": {"content": "text_chunk"}, "finis…

AITrung bình35 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

llmfastapistreamingssemodel-servingdeployment

Kiến thức tiên quyết: python-generator-iterator.

Nội dung đề bài

Mục tiêu kiến thức

  • Trong các ứng dụng LLM Web hiện đại (ChatGPT, Next.js Streaming), trải nghiệm người dùng phụ thuộc vào cơ chế Time-To-First-Token (TTFT). Thay vì chờ 10 giây để nhận toàn bộ câu trả lời, máy chủ sẽ stream từng token về trình duyệt ngay khi vừa sinh xong qua giao thức SSE (Server-Sent Events).
  • Quy chuẩn định dạng gói tin SSE của OpenAI Chat Completions:
  • Mỗi chunk là một dòng bắt đầu bằng data: theo sau là chuỗi JSON mã hóa và kết thúc bằng HAI ký tự xuống dòng \n\n:
    data: {"id": "chatcmpl-123", "object": "chat.completion.chunk", "created": 1700000000, "model": "ai-empire-llm", "choices": [{"index": 0, "delta": {"content": "text_chunk"}, "finish_reason": null}]}\n\n
  • Khi token cuối cùng được sinh ra:

delta có thể rỗng {} và finish_reason là "stop".

  • Kết thúc toàn bộ luồng stream: Gửi dòng tín hiệu đặc biệt:
    data: [DONE]\n\n

Yêu cầu

Viết hàm generator:

def format_sse_stream(
    chunks: list[str],
    model: str = "ai-empire-llm",
    request_id: str = "chatcmpl-001"
) -> list[str]:
    pass
  • chunks: Danh sách các đoạn text token được sinh ra lần lượt (ví dụ ["Xin ", "chào ", "bạn!"]).
  • Trả về: Danh sách các chuỗi SSE (mỗi chuỗi kết thúc bằng \n\n).
  • Thứ tự các message:
  • Với mỗi chuỗi c trong chunks, sinh một gói tin data: <json>\n\n với finish_reason: null.
  • Gói tin báo kết thúc: delta: {} với finish_reason: "stop".
  • Gói tin đóng stream: data: [DONE]\n\n.

Input

  • Hàm format_sse_stream(chunks, model, request_id): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.

Output

  • Hàm format_sse_stream: Trả về kết quả kiểu list[str] theo đúng đặc tả kỹ thuật và kích thước quy định.

Ràng buộc

  • Thời gian chạy tối đa: 2000ms.
  • Giới hạn bộ nhớ: 256MB.
  • Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.

Ví dụ 1

Input

chunks = ['Xin ', 'chào!']
events = format_sse_stream(chunks, model='test-model', request_id='req-123')
for ev in events:
first_payload = json.loads(events[0][len('data: '):-2])

Output

{
  'id': 'req-123',
  'object': 'chat.completion.chunk',
  'model': 'test-model',
  'choices': [{'index': 0, 'delta': {'content': 'Xin '}, 'finish_reason': None}]
}

Giải thích

Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.

Ví dụ 2

Input

events = format_sse_stream(['Done'], model='m', request_id='r')
stop_payload = json.loads(events[-2][len('data: '):-2])

Output

{
  'id': 'r',
  'object': 'chat.completion.chunk',
  'model': 'm',
  'choices': [{'index': 0, 'delta': {}, 'finish_reason': 'stop'}]
}

Giải thích

Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.