1. 串流防護欄覆蓋問題
一條防護欄規則攜帶一個階段(input、output 或 both)與一個動作——五者之一:block、mask、flag、annotate 或 spotlight。階段決定閘道何時執行它;動作決定它做什麼。串流改變答案形狀的唯一地方是輸出階段——因為那是閘道在位元組抵達時就轉送給你客戶端、沒有機會先持有整個酬載的唯一階段。
所以矩陣有兩格串流有影響,而它們行為不同:輸出 block 在一個串流上完全強制執行(掃描器切斷它),但輸出 mask 僅在非串流回覆上強制執行。在一個串流回覆上,掃描器仍會偵測到匹配並能對一個封鎖決策採取行動,但它今天不會把遮罩後的文字改寫進串流——帶內串流輸出遮罩仍在規劃中。
輸入從來不是問題。 輸入階段規則在模型之前執行——閘道審查(且對
mask 而言改寫)你的請求,然後把淨化後的版本向上游轉送。回應是否會串流無關緊要;請求是閘道完整持有的一個完整酬載。輸入掃描在每個請求上都完全上線,包括遮罩。2. 覆蓋矩陣
由上往下讀。每個 block 格都已上線,包括串流——但 輸出 + 遮罩 + 串流 是那一個尚未在串流中強制執行的格:一條遮罩規則遮罩一個非串流回覆,而在一個串流回覆上它偵測到匹配但不改寫 delta(帶內輸出遮罩仍在規劃中)。| 階段 · 動作 | 非串流 | 串流 |
|---|---|---|
input · block | 拒絕請求 | 拒絕請求 |
input · mask | 改寫請求 | 改寫請求 |
output · block | 拒絕回覆 | 切斷串流 |
output · mask | 遮罩回覆 | 偵測匹配;不帶內遮罩(規劃中) |
| any · flag | 僅記錄 | 僅記錄 |
annotate 與 spotlight 在不拒絕流量的情況下附上一則註記(或包裹匹配文字),且在實務上是輸入階段動作,所以它們不改變上方的輸出/串流格;它們像任何其他規則一樣記錄一個匹配。
input——完全上線,兩種情況皆是(block + mask)
input——完全上線,兩種情況皆是(block + mask)
輸入階段規則在上游模型執行之前審查請求。一個
block 會短路呼叫(HTTP 400 guardrail_blocked,在計量之前,所以不消耗配額)。一個 mask 會把提示中匹配到的欄位就地改寫——淨化後的文字就是向上游送出的東西,而模型永遠看不到原始內容。這些都不取決於回應是否串流。output · block——在串流與非串流上都強制執行
output · block——在串流與非串流上都強制執行
在一個非串流回覆上,完成內容會在回傳前被完整審查——一個封鎖呈現為 HTTP 400
guardrail_blocked。在一個串流回覆上,一個串流掃描器會在 delta 流動時監看它們;當一條封鎖規則觸發時,它會切斷串流——封閉掃描器、發出一則簡短的替代通知以取代其餘部分,並在進一步被封鎖的內容抵達客戶端之前關閉 SSE 通道。由於 200 SSE 標頭到那時已經送出,一個串流封鎖無法傳回一個 400:它把封鎖作為一個最後的帶內 delta 而非一個 HTTP 錯誤來傳遞。output · mask——僅非串流(串流仍在規劃中)
output · mask——僅非串流(串流仍在規劃中)
在一個非串流回覆上,一條
mask 規則會改寫完成內容——例如一個電子郵件變成 [EMAIL]——而淨化後的文字就是你客戶端得到的東西。在一個串流回覆上,串流掃描器仍會偵測到匹配並計算遮罩,但它不會把遮罩後的文字轉送進 delta——遮罩後的輸出被丟棄,且只對一個封鎖決策採取行動。所以一條遮罩規則今天不會遮罩一個串流回覆;帶內串流輸出遮罩仍在規劃中。如果你現在需要 PII 不進入一個串流回覆,把規則撰寫為 block(掃描器在匹配時切斷串流)或以非串流方式審查。flag——僅觀察,處處相同
flag——僅觀察,處處相同
一條
flag 規則永不更改流量——它記錄一個匹配並放行位元組。階段與串流不改變它的行為。用它來在把一條規則晉升為 block 之前衡量它的命中率。3. 一個具體範例——讓 PII 不進入一個串流回覆
假設模型可以從 RAG 情境中浮現一個客戶電子郵件,而你的應用程式會串流。輸出mask 今天不會在串流中遮罩(帶內輸出遮罩仍在規劃中)——所以若要讓 PII 不進入一個串流回覆,把輸出規則撰寫為 block:掃描器會在一個匹配出現的那一刻終止串流。(輸出 mask 確實會在一個非串流回覆上遮罩。)
政策編輯是你主控台工作階段上的一個管理動作(把關到 Developer+);sk-orca-... 中繼金鑰只發送 /v1/* 流量,絕不編輯政策。
- 開啟
/console/guardrails,New guardrail,把它命名為stream-pii-out。 - 新增一條規則:
- 類型: PII detection
- 階段:
output - 動作:
block← 在匹配時切斷串流;在一個串流上mask只偵測(它遮罩非串流回覆)
- 儲存,然後在
/console/token透過金鑰的 Guardrail 下拉選單綁定它。
stream: true 像以前一樣呼叫閘道:
4. 跨矩陣的 PII Shield
PII Shield 預設是一條單一的pii 規則,動作 mask,階段 both。把它對應到矩陣,覆蓋範圍正是你會從 §2 預期的:
- 輸入階段——完全上線,無論串流與否。請求在模型看到之前被遮罩(輸入遮罩的頭條價值)。
- 輸出階段,非串流——完成內容在回傳前被遮罩。
- 輸出階段,串流——串流掃描器偵測到匹配但今天不改寫 delta,所以遮罩後的形式不會抵達一個串流客戶端(帶內輸出遮罩仍在規劃中)。
block(或以非串流方式呼叫),這樣串流就會在匹配時被切斷。參見 PII Shield 和 遮罩格式。
5. 一個串流封鎖花費什麼
一個串流封鎖攜帶與任何輸出封鎖相同的記帳——模型已經執行,所以閘道會為你處理退還:- 在一個非串流回覆上,呼叫會傳回 HTTP 400
guardrail_blocked,並指名觸發的防護欄與規則。在一個串流回覆上,200SSE 標頭已經在線上,所以封鎖會作為一個最後的帶內替代 delta 與一次乾淨的通道關閉抵達,而非一個400。 - 不消耗任何配額。 輸入封鎖在計量之前觸發;輸出封鎖(無論串流與否)會在回覆被拒絕後退還已預先扣除的配額。無論哪種情況,呼叫方都不付費。
- 請求被標記為 skip-retry——重跑同一個提示只會再次封鎖,所以閘道不會在另一個通道上燒掉一次重試。
GET /api/guardrail/match,對任何 Member 開放)中記錄一個 match;匹配到的子字串只在防護欄的 Log raw content 切換開啟時才會擷取(預設為關閉)。完整詳情請見 guardrail_blocked 錯誤 和 匹配動態。
6. 出貨前先證明你的階段/動作組合
別猜測矩陣的哪一格套用於你的政策——驗證它。兩個工具都透過管理 API 在你的主控台工作階段上執行:Test 分頁
每個防護欄編輯器都有一個 Test 分頁:貼上一個樣本,選擇階段,並在無上游呼叫、不消耗配額的情況下執行目前政策。查看裁決,以及(對於遮罩規則)渲染後的文字。Test 沙盒被把關到 Developer+(它可以發出付費的評審/接地呼叫與外向整合請求)。
Eval 分頁
Eval 分頁針對隨附或自訂的 JSONL 語料庫為一個防護欄評分——在你綁定金鑰之前用以確認一條封鎖規則捕捉到一個已知洩漏很有用。執行一次評測只需要讀取存取(viewer+)。
7. 下一步去哪裡
串流安全規則
掃描器如何於飛行途中切斷一個 SSE 串流,以及如何撰寫一個能在串流流量上成立的政策。
輸出階段
審查模型的回覆——block 對 mask、配額退還,以及接地。
輸入階段
在模型之前審查請求——包括遮罩,無論串流與否。
動作
深入 block、mask、flag、annotate 與 spotlight——每一個何時是正確的選擇。
