Перейти к основному содержанию
Модель, которая проходит собственное обучение безопасности, всё равно может выдать текст, который вы не можете отправить: ненормативная лексика в ответе клиенту, имя конкурента в вашем брендированном ассистенте, безапелляционное юридическое утверждение, которое ваша команда комплаенса никогда бы не одобрила. Промпт выглядел нормально; проблема в ответе. OrcaRouter проверяет ответ модели на шлюзе, на этапе вывода, до того, как он достигнет вашего клиента. Проверка — это правило guardrail, которое запускается после ответа вышестоящей модели и сворачивается в один вердикт — заблокировать ответ, замаскировать нарушающий фрагмент или отметить его на проверку — независимо от того, какая модель обслужила запрос.

1. Зачем проверять небезопасный вывод ИИ на этапе вывода

Проверка ввода ловит плохой промпт. Она не может поймать плохой ответ: модель, которую уговорили выйти за рамки политики, дообученную модель с более слабыми встроенными guardrails или совершенно разумный промпт, давший неразумное завершение. Этап вывода — это место, где вы утверждаете «независимо от причины, этот текст не покидает шлюз». Правило шлюза срабатывает детерминированно и применяется одинаково ко всем моделям за вашим ключом. И каждое сработавшее правило попадает в ленту Matches рабочего пространства — тип правила, действие, этап — так что у вас есть журнал аудита того, что было поймано и что было пропущено.
Защита живёт в шлюзе, а не в вашем приложении. Отредактируйте guardrail, и изменение вступает в силу со следующего вызова для каждого привязанного к нему ключа — без передеплоя, без изменения SDK. Ваше приложение продолжает вызывать /v1/chat/completions ровно как раньше.

2. Два способа поймать это

Сочетайте детерминированный denylist с семантическим судьёй для глубокой защиты.
Правило keyword — это нечувствительное к регистру сопоставление подстроки; правило regex — паттерн RE2 (линейное время, без обратных ссылок). Оба работают на горячем пути без сетевого вызова — идеально для известного списка запрещённых слов, denylist конкурентов или структурного паттерна (утёкший токен chat-template, безапелляционная фраза «вы имеете право на компенсацию»).
Правило llm_judge оценивает ответ относительно рубрики, которую вы пишете, используя модель в вашем рабочем пространстве — токсичность, тон не по бренду, советы вне политики, которые не охватывает ни один буквальный список. Оно несёт judge_timeout_ms, по умолчанию fail-open (ошибка судьи логируется, а ответ продолжается), и его токены тарифицируются как подстрока судьи. См. Справочник LLM-судьи.

3. Один конкретный пример — блокировать токсичное, маскировать не по бренду

Единственный guardrail на этапе вывода, который блокирует токсичный ответ семантически и маскирует запрещённые брендовые термины в том, что осталось:
{
  "name": "safe-output",
  "rules": [
    {
      "type": "llm_judge",
      "stage": "output",
      "action": "block",
      "judge_model": "openai/gpt-4o-mini",
      "judge_format": "yes_no",
      "judge_rubric": "Does this response contain toxic, harassing, hateful, or otherwise unsafe content? Answer yes or no.",
      "judge_fail_open": true
    },
    {
      "type": "keyword",
      "stage": "output",
      "action": "mask",
      "keywords": ["competitor-name", "internal-codename"]
    }
  ]
}
Напишите это в консоли — откройте /console/guardrailsNew guardrail, добавьте два правила и привяжите его к ключу из редактора Token (привязка живёт на ключе как guardrail_id). Конфигурация выполняется в сессии консоли, а не на вашем relay-ключе; только вызов /v1/* ниже использует ключ sk-orca-....
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [{"role": "user", "content": "Draft a reply to this angry customer"}]
  }'
Если модель возвращает токсичный черновик, ответ удерживается с HTTP 400 guardrail_blocked. Если он чист, но упоминает запрещённый термин, этот фрагмент отображается как типизированная редакция, а остальное проходит дальше.
Итерируйте до того, как привяжете. Вкладка Test внутри редактора прогоняет текущую политику над образцом ответа на этапе output — без вышестоящего вызова, без квоты — а вкладка Eval прогоняет её над корпусом, чтобы вы могли доказать частоту поимки и частоту ложных срабатываний до production. См. evaluation-харнесс.

4. Начните с пресета

Библиотека шаблонов New guardrail поставляет готовые отправные точки в категориях Safety, Brand и Compliance. Пресет — это зерно; примените его, затем редактируйте свободно.
КатегорияПресет этапа вывода для старта
SafetySystem-Prompt Leak Detector (output), Strong System Prompt Leak — отметить/заблокировать ответы, повторяющие токены системного промпта или chat-template.
BrandProfanity Filter (mask) — работает на обоих этапах и маскирует слова из denylist в ответе. (Пресеты в стиле блокировки Profanity / Brand Safety и Competitor Mentions — это зёрна этапа входа; перенацельте копию на output, если хотите, чтобы они проверяли ответ.)
ComplianceLegal Disclaimer Enforce — отметить ответы, дающие безапелляционный юридический/финансовый совет, на проверку командой.
Категория Compliance также упаковывает политики, согласованные с фреймворками; для аудируемых выкаток, управляемых фреймворком, установите комплаенс-пакет и сочетайте журнал аудита с Журналом аудита.

5. Стриминг: важная оговорка

Применяется ли правило вывода вживую, зависит от действия и от того, стримите ли вы.
ДействиеНестримингСтриминг
blockОтвет удержан; HTTP 400 guardrail_blockedСканер обрывает поток на лету и выдаёт замещающее сообщение — заблокированный контент никогда не достигает клиента
maskСовпадение отредактировано в возвращённом текстеСегодня только нестриминг; переписывание потока в полосе в дорожной карте
flagЗаписывает совпадение, ничего не меняетЗаписывает совпадение, ничего не меняет
mask на выводе ещё не работает вживую на стриминговых ответах. Если вы стримите и полагаетесь на маскирование для редактирования фрагментов не по бренду, оригинальный чанк проходит немаскированным. Либо запрашивайте нестриминг при маскировании ответа, либо используйте правило block (применяется на стриминге и нестриминге) для контента, который никогда не должен покинуть шлюз. Та же оговорка применяется к пресету PII Shield, живое маскирование которого сегодня на этапе входа.
Заблокированный ответ не стоит квоты — блокировка на этапе вывода возвращает предварительно списанную квоту после отклонения ответа — и помечается skip-retry, поскольку повторный прогон того же промпта просто заблокировался бы снова.

6. Рекомендуемая форма политики

Наслоите три правила в одном guardrail

  1. keyword / regex на output — поимка с нулевой задержкой для известных запрещённых терминов и структурных паттернов.
  2. llm_judge на output — семантическая поимка токсичности / не по бренду / вне политики для того, что пропускает буквальный список.
  3. Выкатывайте сначала через flag, наблюдайте ленту Matches, затем повышайте до block, как только частота ложных срабатываний станет приемлемой. См. Режимы применения.
Чтобы проверять также и запрос — попытки джейлбрейка и инъекции, которые в первую очередь и производят небезопасный вывод — запустите guardrail этапа входа рядом с этим. См. Джейлбрейки и Prompt injection.

Справочник Guardrails

Полный справочник по типам правил, действиям, этапам, LLM-судье, пресетам, evaluation-харнессу и ленте Matches.

Эксфильтрация данных

Остановка ухода чувствительных данных в ответе модели или вызове инструмента.