1. Problem filtra treści streamingowego llm
Guardrail na etapie wyjścia sprawdza odpowiedź modelu. Na żądaniu nie-streamingowym to proste: brama ma pełną odpowiedź, zanim jeden bajt wróci, więc może ją zablokować, zamaskować lub przepuścić czysto. Streaming to odwraca. Odpowiedź przybywa jako sekwencja delt SSE, każda przesyłana do twojego klienta, gdy tylko wyląduje, więc filtr, który czeka na koniec, niczego nie filtruje. Odpowiedzią OrcaRouter jest skaner strumienia: gdy delty wyjścia płyną, skaner uruchamia twoje reguły na etapie wyjścia wobec akumulującego się tekstu i działa w chwili, gdy reguła zadziała — nie po zakończeniu strumienia. Akcja, którą autorzysz, decyduje, co “działa” znaczy:block przecina strumień, a
flag go przepuszcza. mask redaguje na wyjściu nie-streamingowym, ale
przepisywanie strumienia w paśmie jest w planach — na strumieniu dziś skaner
oblicza maskę, ale działa tylko na decyzji block, więc reguła mask nie
redaguje jeszcze strumieniowanej odpowiedzi.
To zastrzeżenie ma znaczenie tylko dla reguł na etapie wyjścia na żądaniach
streamingowych. Reguły na etapie wejścia sprawdzają żądanie przed
uruchomieniem modelu, więc są w pełni żywe, w tym maskowanie — a dowolna
reguła wyjścia na żądaniu nie-streamingowym widzi całą odpowiedź i zachowuje
się normalnie, w tym
mask.2. Co jest bezpieczne dla streamingu dziś
block — bezpieczne dla streamingu (przecina strumień w locie)
block — bezpieczne dla streamingu (przecina strumień w locie)
Reguła
block jest egzekwowana na wyjściu streamingowym i
nie-streamingowym. Na strumieniu skaner obserwuje delty; gdy reguła block
zadziała, przecina strumień — pieczętuje skaner, emituje krótkie
powiadomienie zastępcze ([response truncated by guardrail: … policy violation]) jako finalną deltę i zamyka kanał SSE, zanim jakakolwiek
dalsza zablokowana treść dotrze do klienta. Ponieważ status odpowiedzi
HTTP jest już zatwierdzony na 200 w chwili, gdy pierwsza delta się
wypchnęła, blokada w środku strumienia nie może ponownie wystawić statusu —
łagodnie kończy otwarty strumień. Ciało HTTP 400 guardrail_blocked to
kształt blokady wyjścia nie-streamingowej.Bajty już wypchnięte do klienta nie mogą być cofnięte, więc blokada
streamingowa jest best-effort wobec tego, co już się przesłało, ale
niezawodnie zatrzymuje wszystko po dopasowaniu. Po twardą gwarancję, że
żaden obraźliwy bajt nigdy nie zostanie wysłany — i po ciało 400
guardrail_blocked — wysyłaj żądanie nie-streamingowe.mask — tylko wyjście nie-streamingowe (przepisywanie strumienia w paśmie w planach)
mask — tylko wyjście nie-streamingowe (przepisywanie strumienia w paśmie w planach)
Reguła
mask przepisuje dopasowanie — np. email w odpowiedzi staje się
[EMAIL] — na wyjściu nie-streamingowym, gdzie brama trzyma całą
odpowiedź i przesyła zredagowaną formę do twojego klienta.Na wyjściu streamingowym dziś skaner oblicza maskę, ale nie
przesyła zamaskowanego tekstu — działa tylko na decyzji block — więc
reguła mask nie redaguje strumieniowanej odpowiedzi. Przepisywanie
wyjścia streamingowego w paśmie jest w planach. Dopóki nie wyjdzie, jeśli
potrzebujesz, by strumieniowana odpowiedź nigdy nie ujawniła dopasowanego
tekstu, autorzuj regułę jako block (kończy odpowiedź na trafieniu) lub
wysyłaj żądanie nie-streamingowe, by maska przepisała pełną odpowiedź.flag — tylko obserwacja, nigdy nie zmienia ruchu
flag — tylko obserwacja, nigdy nie zmienia ruchu
Reguła
flag nigdy nie zmienia ruchu — przepuszcza bajty. Na wyjściu
nie-streamingowym rejestruje dopasowanie w strumieniu Matches, więc
możesz zmierzyć wskaźnik trafień reguły, zanim promujesz ją do block. Na
odpowiedzi streamingowej pozostaje tylko-obserwacja i przepuszcza
delty nietknięte; ustrukturyzowany zapis dopasowania jest zapisywany na
ścieżce wyjścia nie-streamingowej. Tak czy inaczej nigdy nie blokuje ani
nie przepisuje, więc zawsze bezpiecznie zostawić ją włączoną.Akcja na output | Nie-streaming | Streaming |
|---|---|---|
block | odrzuca odpowiedź | przecina strumień |
mask | redaguje odpowiedź | jeszcze nie — zamiast tego block (plany) |
flag | rejestruje dopasowanie | przepuszcza (tylko obserwacja) |
3. Jeden konkretny przykład — bezpieczny dla streamingu filtr sekretów
Powiedzmy, że twój model może wydobyć poświadczenie z kontekstu RAG, a twoja aplikacja strumieniuje. Chcesz, by brama zabiła strumień w chwili, gdy pojawi się dopasowanie w kształcie sekretu, zamiast go maskować — wyciekły sekret powinien zakończyć odpowiedź, nie być częściowo zredagowany. Autorzuj to w konsoli — edycja polityki to akcja zarządzania w twojej sesji, bramkowana do Developer+; klucz relay tylko wysyła ruch/v1/*:
- Otwórz
/console/guardrails, New guardrail, nazwij gostream-safe-out. - Dodaj jedną regułę:
- Typ:
regex(lub regułapiiz encjami sekretów jakaws_access_key/api_key_openai/jwt) - Etap:
output - Akcja:
block← kończy odpowiedź na trafieniu sekretu;maskzamiast tego by go zredagował i pozwolił reszcie odpowiedzi kontynuować
- Typ:
- Zapisz, potem powiąż go na
/console/tokenprzez rozwijaną listę Guardrail klucza.
stream: true, dokładnie jak wcześniej:
4. PII Shield na strumieniu
Preset PII Shield to pojedyncza regułapii, akcja mask, etap both. Na
etapie wejścia jest w pełni żywy — przepisuje żądanie, zanim model je
zobaczy, streaming lub nie. Na etapie wyjścia maskowanie redaguje na
odpowiedziach nie-streamingowych, gdzie brama trzyma całą odpowiedź, zanim
wróci.
Na wyjściu streamingowym maska nie redaguje jeszcze — skaner oblicza
maskę, ale działa tylko na decyzji block, więc strumieniowana odpowiedź jest
przepuszczana, nie przepisywana. Przepisywanie wyjścia streamingowego w paśmie
jest w planach. Więc jeśli twoim celem jest, by PII nigdy nie było
obserwowalne w strumieniowanej odpowiedzi, albo:
- autorzuj regułę wyjścia jako block, akceptując, że trafienie kończy odpowiedź, a nie redaguje ją, albo
- wysyłaj żądanie nie-streamingowe, by maska przepisała pełną odpowiedź z całą odpowiedzią w ręku.
5. Udowodnij to, zanim wyślesz
Nie zgaduj, która kombinacja etap/akcja trzyma — zweryfikuj ją.Zakładka Test
Każdy edytor guardrail ma zakładkę Test: wklej próbkę, wybierz etap
output i uruchom bieżącą politykę bez wywołania w górę i bez kwoty.
Zobacz werdykt i, dla reguł mask, wyrenderowany tekst. Uruchamianie
piaskownicy to akcja Developer+ (może odpalać płatne reguły judge /
external).Zakładka Eval
Zakładka Eval ocenia guardrail wobec dołączonych lub niestandardowych
korpusów JSONL — przydatne, by potwierdzić, że reguła block wychwytuje
znany wyciek w korpusie, zanim powiążesz klucz.
6. Co kosztuje blokada streamingowa
Blokada streamingowa niesie tę samą księgowość co każda blokada wyjścia — model nadrzędny już przebiegł, więc brama obsługuje zwrot za ciebie:- Strumień jest kończony łagodną deltą obcięcia (status jest już 200);
blokada wyjścia nie-streamingowa zwraca ciało HTTP 400
guardrail_blockednazywające guardrail i regułę, która zadziałała. - Żadna kwota nie jest naliczana. Gdy blokada wyjścia odrzuca odpowiedź, brama zwraca wstępnie pobraną kwotę, więc zablokowane wywołanie jest dla ciebie darmowe, mimo że model wyprodukował tokeny.
- Żądanie jest oznaczone jako skip-retry — ponowne uruchomienie tego samego promptu po prostu znów by zablokowało, więc brama nie spali ponowienia na innym kanale.
GET /api/guardrail/match, otwarty dla każdego Member); dopasowany
podłańcuch jest przechwytywany tylko, gdy przełącznik Log raw content
guardrail jest włączony (domyślnie wyłączony). Pełny szczegół żyje w
błędzie guardrail_blocked
i strumieniu dopasowań.
7. Dokąd dalej
Etap wyjścia
Pełny etap wyjścia — sprawdzanie odpowiedzi modelu, block vs. mask i grounding.
Pokrycie streamingu
Kompletna macierz tego, co jest egzekwowane na streamingu vs.
nie-streamingu we wszystkich etapach i akcjach.
Akcje
block, mask i flag w głąb — kiedy każda jest właściwym wyborem.
Etap wejścia
Lustrzane odbicie — maskowanie jest tu w pełni żywe, w tym na streamingu.
Powiązane pojęcia
Powiązane pojęcia
Zagrożenia, które to adresuje
Zagrożenia, które to adresuje
Pełna referencja silnika
Pełna referencja silnika
Guardrails — każdy typ reguły, pole i trasa, w
tym grounding i sędzia LLM.
