NeMo Guardrails: практическое руководство по безопасности LLM-ассистента

NeMo Guardrails — это фреймворк NVIDIA для контроля поведения больших языковых моделей. Вместо простого фильтра промптов он позволяет выстроить многослойную защиту: от детерминированной проверки персональных данных до политик, ограничивающих выполнение операций. Разберём, как это работает, на примере финансового ассистента, который отвечает на вопросы о балансе, переводах и комиссиях.

Что такое NeMo Guardrails и как он устроен

NeMo Guardrails работает на основе конфигурации YAML и сценариев Colang. В YAML-конфигурации описываются модели, общие инструкции и списки рельсов (rails) для каждого этапа: ввода, поиска по базе знаний и вывода. Colang — это язык сценариев, на котором описываются диалоговые потоки и действия.

В примере настроен ассистент FinBot на базе модели gpt-4o-mini. Инструкции запрещают выдумывать балансы, комиссии и номера счетов. Рельсы ввода включают редактирование PII и самопроверку, рельсы поиска — фильтрацию внутренних документов, рельсы вывода — маскирование номеров счетов и самопроверку ответов.

Рельсы ввода: защита от PII и джейлбрейков

Первый уровень защиты — детерминированный. Python-действие has_hard_pii блокирует сообщения с полными номерами карт и SSN, не пропуская их к модели. Второе действие redact_pii маскирует цифровые последовательности, похожие на номера счетов, но позволяет продолжить диалог.

Рельс self_check_input — это LLM-проверка. Промпт просит модель заблокировать сообщение, если оно пытается заставить бота игнорировать инструкции, раскрыть системный промпт, содержит оскорбления или пытается получить доступ к чужому аккаунту. При этом обычные жалобы и разговоры не по теме разрешены.

Фильтрация поиска и контроль вывода

Рельс поиска filter internal chunks удаляет фрагменты базы знаний с пометкой [INTERNAL] до того, как они попадут в промпт. В примере это документы о стратегии удержания клиентов и порогах мошенничества — модель не может их раскрыть, потому что никогда их не видит.

На выходе рельс mask_accounts заменяет номера счетов на маску с последними четырьмя цифрами. Рельс self_check_output блокирует ответы, которые раскрывают системные инструкции, обещают гарантированную доходность или содержат оскорбления.

Ограничение операций: политика переводов

Для операций с деньгами используется отдельный поток. Действие check_transfer_policy извлекает сумму из сообщения и сравнивает её с дневным лимитом в $2000. Если сумма превышает лимит или не распознана, поток блокирует перевод и объясняет причину. Результат передаётся через ActionResult с обновлением контекста — это позволяет рендерить шаблоны ответов без инъекции лишних данных в промпт.

Важная деталь: действие retrieve_relevant_chunks возвращает пустую строку, а найденные фрагменты передаёт только через context_updates. Если вернуть фрагменты как результат действия, они будут добавлены в промпт как строка # The result was ... — и нефильтрованный текст минует рельс поиска.

Многоходовые диалоги и оценка покрытия

Гардрейлы выполняются на каждом ходе диалога. В примере история из вопроса о балансе и последующего перевода обрабатывается повторно. Трассировка рельсов показывает, какой контроль сработал и сколько времени занял.

Для оценки покрытия используется набор проб: попытка джейлбрейка, вставка номера карты, перевод сверх лимита, вопрос о политике и инвестициях. Отчёт показывает, какой рельс обработал каждый запрос, был ли жёсткий стоп и сколько токенов потрачено на защиту.

Итог: слоистая защита вместо одного фильтра

NeMo Guardrails позволяет разделить дешёвые детерминированные проверки и дорогие LLM-проверки, фильтровать чувствительные данные до модели, переписывать небезопасные ответы и применять явные политики перед операциями записи. Трассировка и подсчёт токенов дают понимание эффективности и стоимости защиты в продакшене.

Частые вопросы

Какие модели поддерживает NeMo Guardrails?

Фреймворк работает с OpenAI-совместимыми API. В примере используется gpt-4o-mini, но можно указать любой эндпоинт и модель через параметры конфигурации.

Что такое Colang и зачем он нужен?

Colang — это язык сценариев NeMo Guardrails для описания диалоговых потоков. Он определяет, как бот реагирует на определённые типы запросов и какие действия выполняет.

Чем детерминированные проверки лучше LLM-проверок?

Детерминированные проверки быстрые, дёшевые и предсказуемые — они не потребляют токены и не могут ошибиться. LLM-проверки гибче, но стоят дороже и могут давать ложные срабатывания.

Как не пропустить внутренние документы в промпт?

Нужно фильтровать фрагменты на этапе поиска и возвращать результат через context_updates, а не как возвращаемое значение действия. Иначе нефильтрованный текст попадёт в промпт.

Что такое жёсткий стоп в трассировке?

Жёсткий стоп — это рельс, который полностью останавливает обработку запроса. Диалоговые рельсы перенаправляют разговор, но не прерывают его.

Как оценить стоимость защиты?

NeMo Guardrails подсчитывает токены и количество LLM-вызовов для каждого запроса. Сводный отчёт по пробным запросам показывает, сколько защиты стоит в терминах потребления.

Нужен ли векторный сторадж для базы знаний?

В примере используется упрощённый ретривер на основе ключевых слов, чтобы обойтись без векторной базы. В продакшене можно заменить его на любой другой механизм поиска.

Как добавить свои политики?

Политики описываются в Colang-сценариях и реализуются через Python-действия с декоратором @action. Результат передаётся через ActionResult с context_updates.

Похожие материалы: CUDA Agent от ByteDance, Needle 2: компактная модель для вызова инструментов, GLM-5.3: скачок в коде и кибербезопасности.

Источник: marktechpost.com