等模型講完才審查,不一定太晚。回覆如果還留在伺服器端,檢查通過後才交付,就仍然來得及阻擋;反過來,即使護欄在生成途中持續檢查,只要文字先送到了使用者端,後面的阻擋也無法收回那次揭露。
Day 2 已經提過這條防護界線。到了元件選型,串流護欄(Streaming Guardrails)要再分開看兩件事:內容何時放行,以及每次檢查的範圍。
串流讓使用者提早看見部分回覆,但模型產生文字、護欄完成判斷,以及應用交付文字,仍是三個不同的時間。放行策略決定了護欄能介入到哪裡。
| 放行方式 | 控制流程 | 保護範圍與取捨 |
|---|---|---|
| 全文檢查後放行 | 保留整份回應,通過後交付 | 可以要求全文通過;使用者必須等待全文完成 |
| 分段檢查後放行 | 累積片段,檢查通過後逐段交付 | 攔住尚未交付的片段;片段通過不代表全文通過 |
| 先放行、背景檢查 | 立即交付,發現問題後停止後續串流 | 限制後續揭露;已交付內容無法收回 |
| 旁路或事後檢查 | 正常交付,另行檢查與記錄 | 用於觀察、稽核與評估;沒有直接介入交付 |
前兩種可以控制尚未送出的內容。全文檢查後才開始以串流格式傳送,雖然仍有串流事件,使用者也必須等到整份答案生成;分段檢查後放行則多了累積與審查的等待。
假設客服回覆帶入另一位報修者的私人電話。若政策要求遮罩後才能交付,就必須在送出前處理;前端事後隱藏文字,無法消除資料已送達客戶端的事實。
Amazon Bedrock 的串流護欄就區分同步與非同步模式:同步先緩衝、檢查再交付;非同步先送出,在背景審查,偵測到問題後阻擋後續片段。
但 Bedrock Guardrails 非同步模式也不支援敏感資訊遮罩(Masking),因此不能用它完成「電話遮罩後才能回傳」的需求。
放行順序確定後,還要看偵測器取得的內容。網路傳輸片段、 Token 、句子與檢查視窗,是不同的單位。 一個電話或業務敘述可能跨過兩個片段,每個串流事件不一定具有完整語意。
這些方法可以組合;例如,按句子形成片段,再帶入前一段尾部檢查;「分段檢查後放行」並沒有指定一定要用固定大小。
像 NeMo Guardrails 用 chunk_size 設定累積的 Token 數,context_size 設定帶入的前文,stream_first 決定先送出還是先檢查。三個設定分開,也反映片段大小、上下文範圍與放行順序是不同的選擇。
以上方法都只看到已取得的內容。若需要後文才能辨認前面的風險,重疊視窗或增量模型也無法預先知道;分類結果也不一定提供敏感資訊的精確位置。若要求完整 JSON 結構、跨段一致性或來源支持等檢查在交付前通過,就需要保留相關內容,必要時等待全文。
即使最後要等全文審查,生成中的檢查仍可以提前停止不適合繼續的候選答案。至於禁止送給外部模型的資料,應在呼叫前處理;輸出端的串流檢查處理不到已發生的輸入外送。
要求先審後送時,檢查失敗或逾時不能當成通過,結束時也要處理尚未檢查的尾部。評估串流方案,應一起看第一段通過檢查的內容何時可見,以及偵測到問題時已有多少內容交付,才能看出等待時間與揭露範圍的取捨。
筆者認為未來應該要用 Rust / Go 來重寫對於長文本內容 / 複雜的 JSON 解析功能,才可以滿足低延遲的需求;另外參數更少、更快、更便宜的 Decision Model ,像當紅炸子雞 TypeSafeAI 的 JEV、OpenAI 的 Decisions(GPT6-Luna)、Microsfot-Decision-1 或是 Qwen 的 SLM (0.6B / 3B)都是這賽道上有力的選手,當安全事故橫生,越來越依賴在事中或是前就是把輸出 / 執行內容攔截的趨勢下,安全的使用 AI 絕對是一條馬拉松式的商業賽道。