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