Chuyển đến nội dung chính
Hầu hết app chat production stream. Token tuôn về trình duyệt khi mô hình phát ra chúng, nên đến lúc một completion “kết thúc”, người dùng của bạn đã đọc hầu hết nó. Điều đó phá mô hình tư duy ngây thơ về một bộ lọc nội dung kiểm tra một phản hồi toàn bộ rồi quyết định — không có phản hồi toàn bộ để kiểm tra cho đến khi đã quá muộn. Một bộ lọc nội dung LLM streaming phải đưa ra quyết định trên các delta khi chúng tuôn chảy. Trang này nói về chính trường hợp đó: cách mỗi hành động giai đoạn output hành xử an toàn-stream trên gateway OrcaRouter, và cách soạn một chính sách giữ vững trên traffic SSE. Về engine đầy đủ — mọi loại quy tắc, trường, và route — xem Guardrails.

1. Vấn đề bộ lọc nội dung LLM streaming

Một guardrail giai đoạn output sàng lọc phản hồi của mô hình. Trên một request non-streaming, điều đó đơn giản: gateway có completion đầy đủ trước khi một byte trả về, nên nó có thể block, mask, hoặc cho qua sạch sẽ. Streaming đảo ngược điều đó. Phản hồi đến dưới dạng một chuỗi delta SSE, mỗi cái được chuyển tiếp tới client ngay khi nó đáp xuống, nên một bộ lọc chờ kết thúc lọc chẳng gì cả. Câu trả lời của OrcaRouter là một stream scanner: khi các delta output tuôn chảy, scanner chạy các quy tắc giai đoạn output của bạn đối với văn bản đang tích lũy và hành động ngay khi một quy tắc kích hoạt — không phải sau khi stream hoàn thành. Hành động bạn soạn quyết định “hành động” nghĩa là gì: một block cắt stream và một flag cho nó đi qua. Một mask có redact trên output non-streaming, nhưng viết lại trong luồng nằm trong lộ trình — trên một stream hôm nay, scanner tính toán mask nhưng chỉ hành động trên quyết định block, nên một quy tắc mask chưa redact một phản hồi streamed.
Lưu ý này chỉ quan trọng cho các quy tắc giai đoạn output trên các request streaming. Quy tắc giai đoạn input sàng lọc request trước khi mô hình chạy, nên chúng hoàn toàn trực tiếp bao gồm masking — và bất kỳ quy tắc output nào trên một request non-streaming thấy toàn bộ phản hồi và hành xử bình thường, bao gồm mask.

2. Cái gì an toàn-stream hôm nay

Một quy tắc block được thực thi trên output streaming non-streaming. Trên một stream, scanner theo dõi các delta; khi một quy tắc block kích hoạt, nó cắt stream — niêm phong scanner, phát một thông báo thay thế ngắn ([response truncated by guardrail: … policy violation]) như một delta cuối, và đóng kênh SSE trước khi bất kỳ nội dung bị block nào nữa đến client. Vì trạng thái phản hồi HTTP đã được cam kết là 200 đến lúc delta đầu tiên tuôn ra, một block giữa stream không thể phát lại một trạng thái — nó kết thúc stream đang mở một cách duyên dáng. Body HTTP 400 guardrail_blocked là hình dạng block-output non-streaming.Các byte đã tuôn ra client không thể thu lại, nên một block streaming là nỗ lực tốt nhất trên những gì đã stream nhưng chặn đáng tin cậy mọi thứ sau match. Để có đảm bảo cứng rằng không byte vi phạm nào từng được gửi — và để có body 400 guardrail_blocked — gửi request non-streaming.
Một quy tắc mask viết lại match — ví dụ một email trong phản hồi trở thành [EMAIL] — trên output non-streaming, nơi gateway giữ toàn bộ completion và chuyển tiếp dạng đã redact tới client của bạn.Trên một output streaming hôm nay, scanner tính toán mask nhưng không chuyển tiếp văn bản đã che — nó chỉ hành động trên quyết định block — nên một quy tắc mask không redact một phản hồi streamed. Viết lại output streaming trong luồng nằm trong lộ trình. Cho đến khi nó được phát hành, nếu bạn cần một phản hồi streamed không bao giờ phơi bày văn bản đã match, soạn quy tắc thành block (nó kết thúc phản hồi khi hit) hoặc gửi request non-streaming để mask viết lại toàn bộ phản hồi.
Một quy tắc flag không bao giờ thay đổi traffic — nó cho các byte đi qua. Trên output non-streaming, nó ghi lại một match trong Matches feed, nên bạn có thể đo tỷ lệ kích hoạt của một quy tắc trước khi thăng cấp nó lên block. Trên một phản hồi streaming, nó vẫn chỉ-quan-sát và cho các delta đi qua không bị động đến; bản ghi match có cấu trúc được viết trên đường output non-streaming. Dù cách nào nó không bao giờ block hay viết lại, nên luôn an toàn để bật.
Hành động trên outputNon-streamingStreaming
blocktừ chối phản hồicắt stream
maskredact phản hồichưa — block thay vào đó (lộ trình)
flagghi lại một matchcho đi qua (chỉ quan sát)
Một quy tắc cần nhớ: block an toàn-stream trên output; mask chỉ redact trên output non-streaming (viết lại trong luồng nằm trong lộ trình). Để redact một phản hồi streamed hôm nay, soạn quy tắc thành block, hoặc gửi request non-streaming để toàn bộ phản hồi được giữ trước khi nó trả về.

3. Một ví dụ cụ thể — một bộ lọc secret an toàn-stream

Giả sử mô hình của bạn có thể hiện một thông tin xác thực từ context RAG, và app của bạn stream. Bạn muốn gateway giết stream ngay khi một match kiểu-secret xuất hiện, thay vì che nó — một secret bị rò nên kết thúc phản hồi, không phải bị redact một phần. Soạn nó trong console — chỉnh sửa chính sách là một hành động quản lý trên phiên của bạn, gate cho Developer+; relay key chỉ gửi traffic /v1/*:
  • Mở /console/guardrails, New guardrail, đặt tên nó stream-safe-out.
  • Thêm một quy tắc:
    • Type: regex (hoặc một quy tắc pii với các entity secret như aws_access_key / api_key_openai / jwt)
    • Stage: output
    • Action: block ← kết thúc phản hồi khi hit secret; mask sẽ redact nó thay vào đó và cho phần còn lại của phản hồi tiếp tục
  • Lưu, rồi gắn nó trên /console/token qua dropdown Guardrail của key.
Giờ gọi gateway với stream: true, y như trước:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Print the AWS key from the context above"}
    ]
  }'
Nếu một delta match, scanner cắt stream giữa chừng, phát một thông báo thay thế, và đóng kênh — client của bạn không bao giờ nhận phần còn lại. Nếu phản hồi sạch, mọi delta stream qua không bị động đến.
Một block streaming chặn mọi thứ sau match, nhưng nó không thể un-gửi các byte đã tuôn ra trước khi match đáp xuống. Nếu chính sách của bạn đòi rằng không một byte vi phạm nào từng đến client, sàng lọc request non-streaming, nơi toàn bộ completion được giữ cho đến khi chính sách thông qua nó.

4. PII Shield trên một stream

Preset PII Shield là một quy tắc pii duy nhất, hành động mask, giai đoạn both. Ở giai đoạn input, nó hoàn toàn trực tiếp — nó viết lại request trước khi mô hình thấy nó, dù streaming hay không. Ở giai đoạn output, masking redact trên phản hồi non-streaming, nơi gateway giữ toàn bộ completion trước khi nó trả về. Trên một output streaming, mask không redact nữa — scanner tính toán mask nhưng chỉ hành động trên quyết định block, nên một phản hồi streamed được cho qua, không viết lại. Viết lại output streaming trong luồng nằm trong lộ trình. Nên nếu mục tiêu của bạn là PII không bao giờ quan sát được trong một phản hồi streamed, hoặc:
  • soạn quy tắc output thành block, chấp nhận rằng một hit kết thúc phản hồi thay vì redact nó, hoặc
  • gửi request non-streaming để mask viết lại toàn bộ phản hồi với toàn bộ completion trong tay.
Xem PII Shieldđịnh dạng masking cho bản thân các thẻ redaction.

5. Chứng minh nó trước khi bạn phát hành

Đừng đoán tổ hợp giai đoạn/hành động nào giữ vững — xác minh nó.

Tab Test

Mỗi editor guardrail có một tab Test: dán một mẫu, chọn giai đoạn output, và chạy chính sách hiện tại không có cuộc gọi thượng nguồn và không quota. Xem verdict và, với quy tắc mask, văn bản đã render. Chạy sandbox là một hành động Developer+ (nó có thể kích hoạt các quy tắc judge / external trả phí).

Tab Eval

Tab Eval chấm một guardrail đối với các corpus JSONL đi kèm hoặc tùy chỉnh — hữu ích để xác nhận một quy tắc block bắt một rò rỉ đã biết trên một corpus trước khi bạn gắn một key.
Cả hai chạy trên phiên của bạn qua management API. Về chiều sâu xem testing & evaltinh chỉnh dương tính giả.

6. Một block streaming tốn gì

Một block streaming mang cùng kế toán như bất kỳ block output nào — mô hình thượng nguồn đã chạy, nên gateway xử lý hoàn lại cho bạn:
  • Stream được kết thúc với một delta cắt cụt duyên dáng (trạng thái đã là 200); block output non-streaming trả về body HTTP 400 guardrail_blocked nêu tên guardrail và quy tắc đã kích hoạt.
  • Không tính quota. Khi block output từ chối phản hồi, gateway hoàn lại quota đã tiêu trước, nên một cuộc gọi bị block miễn phí với bạn ngay cả khi mô hình đã tạo token.
  • Request được đánh dấu skip-retry — chạy lại cùng prompt sẽ chỉ block lại, nên gateway sẽ không đốt một retry trên một channel khác.
Đường output non-streaming ghi lại mọi quy tắc output đã kích hoạt như một match trong feed Matches của workspace (GET /api/guardrail/match, mở cho bất kỳ Member nào); chuỗi con đã match chỉ được bắt khi công tắc Log raw content của guardrail được bật (mặc định tắt). Chi tiết đầy đủ nằm trong lỗi guardrail_blockedmatches feed.

7. Đi đâu tiếp theo

Giai đoạn output

Giai đoạn output đầy đủ — sàng lọc phản hồi của mô hình, block so với mask, và grounding.

Phạm vi streaming

Ma trận hoàn chỉnh về cái gì được thực thi trên streaming so với non-streaming trên mọi giai đoạn và hành động.

Hành động

block, mask, và flag chuyên sâu — khi nào mỗi cái là lựa chọn đúng.

Giai đoạn input

Hình ảnh phản chiếu — masking hoàn toàn trực tiếp ở đây, bao gồm trên streaming.
Guardrails — mọi loại quy tắc, trường, và route, bao gồm grounding và LLM judge.