拓冰建站拓冰建站
首页 / 资讯中心 / 正文

garak 集成 NeMo Guardrails:用 LLM 漏洞扫描器对防护配置做安全测试

garak 集成 NeMo Guardrails用 LLM 漏洞扫描器对防护配置做安全测试【免费下载链接】garakthe LLM vulnerability scanner项目地址: https://gitcode.com/GitHub_Trending/ga/garak导读本篇文章围绕 garakthe LLM vulnerability scanner中的guardrails生成器插件展开讲解如何把一个 NeMo Guardrails 配置包装成 garak 可以调用的目标模型从而对该防护配置本身进行安全测试。读完本文你将掌握guardrails生成器的安装前提、命令行与配置用法、其底层调用原理rails.generate串行调用、以及针对 Guardrails Server 的NeMoGuardrailsServer子类及其config_ids多 Rails 选择机制。背景为什么需要给 Guardrails 配置做安全测试NeMo Guardrails 是一套对话式 AI 工具包通过在 LLM 外层叠加可编程的 Rails例如话题约束、拒绝不安全内容、检索增强等来约束模型的输入与输出行为。但任何防护配置本身都可能存在绕过路径——例如提示注入prompt injection穿透了 Rails 的检测逻辑或者 Rails 之间的组合产生了漏洞。garak 提供了一种把防护配置当作被测对象来攻击的思路将 Guardrails 配置包成一个生成器让 garak 的 probes探针直接向配置中的 Rails 发送攻击载荷观察 Rails 是否成功拦截或是否放行了危险输出。这正是 guardrails.rst 的核心定位This is a generator for wrapping a NeMo Guardrails configuration. Using this garak generator enables security testing of a Guardrails config.核心实现NeMoGuardrails 类类的定义与关键属性garak/generators/guardrails.py 中定义了NeMoGuardrails类继承自 garak.generators.base.Generatorclass NeMoGuardrails(Generator): Generator wrapper for NeMo Guardrails. supports_multiple_generations False generator_family_name Guardrails extra_dependency_names [nemoguardrails]三个类属性各有含义supports_multiple_generations False该生成器不支持单次请求产出多个生成结果这决定了 garak 不会对它做并行生成优化generator_family_name Guardrails插件族名称在 garak 启动时会打印loading generator: Guardrails: nameextra_dependency_names [nemoguardrails]声明本生成器需要额外的 Python 包nemoguardrailsgarak 的依赖检查机制会在未安装时给出提示。模块末尾通过DEFAULT_CLASS NeMoGuardrailsguardrails.py指明该模块的默认插件类这也是 garak 插件体系自动识别入口类的方式。初始化把模型名当配置路径用NeMoGuardrails的初始化guardrails.py有一个非常特殊的约定def __init__(self, name, config_root_config): self.name name self._load_config(config_root) self.fullname fGuardrails {self.name} super().__init__(self.name, config_rootconfig_root) set_verbose self.nemoguardrails.logging.verbose.set_verbose # Currently, we use the model_name as the path to the config with redirect_stderr(io.StringIO()) as f: # quieten the tqdm config self.nemoguardrails.RailsConfig.from_path(self.name) self.rails self.nemoguardrails.LLMRails(configconfig)代码注释明确写着Currently, we use the model_name as the path to the config——即生成器的 name 参数直接被当作 Guardrails 配置目录/文件的路径。初始化流程是用nemoguardrails.logging.verbose.set_verbose静默日志用redirect_stderr(io.StringIO())包住加载过程屏蔽底层 tqdm 进度条输出RailsConfig.from_path(self.name)从路径加载 Rails 配置LLMRails(configconfig)构建运行时 Rails 对象并保存到self.rails。调用模型串行发送 prompts 给 Rails_call_modelguardrails.py实现了向 Guardrails 发送请求的核心逻辑def _call_model( self, prompt: Conversation, generations_this_call: int 1 ) - List[Union[Message, None]]: with redirect_stderr(io.StringIO()) as f: # quieten the tqdm # should this be expanded to process all Conversation messages? result self.rails.generate(messagesself._conversation_to_list(prompt)) if isinstance(result, str): return [Message(result)] elif isinstance(result, dict): content result.get(content, None) if content is not None: content Message(content) return [content] else: return [None]关键点garak 把探测 prompt 构造成Conversation通过self._conversation_to_list(prompt)转成消息列表后调用rails.generate(messages...)走完整的 Guardrails 处理流水线输入检查 → 对话流程 → 输出检查返回值做了三种兼容处理字符串直接包装成Message字典则取content键其他情况返回[None]表示本次无响应整个调用是串行的每次调用rails.generate都要完整跑一遍 Rails 流水线因此文档明确建议run smaller probes, or set generations to a low value。命令行用法guardrails.rst 给出了标准调用示例garak -t guardrails -n sample_abc/config参数解析-t guardrails指定要运行的插件类型为guardrails即生成器家族名-n sample_abc/config指定目标名称也就是NeMo Guardrails 配置的路径例如sample_abc/config目录下存放config.yml、rails.co等配置文件的 Guardrails 项目。garak 会加载guardrails生成器插件默认类NeMoGuardrails用-n传入的路径作为self.name并在初始化时通过RailsConfig.from_path加载该配置。降低运行时间generations 与并行度控制由于supports_multiple_generations False且调用是串行的文档建议控制运行规模。相关的运行参数定义在 garak/_config.pyrun_params seed deprefix eval_threshold generations interactive system_prompt spec.split()其中generations表示每个 prompt 的生成次数cli.py 中--generations选项的 help 原文为 number of generations per prompt。对guardrails生成器而言把generations调低例如--generations 1可以显著缩短整体运行时间。同时garak 的系统级参数parallel_requestscli.pyhelp 为 How many generator requests to launch in parallel for a given prompt对不支持多生成的模型也会被忽略或降级所以串行开销需要靠缩小 probe 规模来抵消。依赖安装该生成器依赖第三方包nemoguardrails。仓库通过extra_dependency_names [nemoguardrails]声明此依赖安装方式为pip install nemoguardrails注意这是 garak 的可选生成器依赖不是 garak 核心依赖因此必须在使用guardrails生成器前单独安装。若未安装garak 的依赖检查会给出提示可参考 garak/generators/base.py 中的_load_deps调用。进阶NeMoGuardrailsServer —— 面向 Guardrails Server 的生成器除直接包装本地配置外guardrails.py 还提供了NeMoGuardrailsServer类用于对接 NeMo Guardrails 的 FastAPI ServerOpenAI 兼容接口class NeMoGuardrailsServer(OpenAICompatible): Generator for NeMo Guardrails Server ENV_VAR None supports_multiple_generations False generator_family_name Guardrails DEFAULT_PARAMS OpenAICompatible.DEFAULT_PARAMS | { uri: http://localhost:8000/v1/, config_ids: set(), }关键设计继承自 OpenAICompatible因此复用 OpenAI 兼容 REST API 的整套调用栈extra_params、retry_json、transient_retry_codes等参数ENV_VAR None不需要 API Key——__init__中显式设置self.api_key not-usedguardrails.py避免向不需要密钥的 Server 发送多余请求头uri默认http://localhost:8000/v1/指向本机 Guardrails Serverconfig_ids默认空集合用于多 Rails 部署时选择具体生效的 Rails——即类文档中所说的 To select specific rails in a multi rail deployment setconfig_idsto match the rail configuration names。config_ids 与 guardrails 请求体的合并逻辑当config_ids非空时构造器会把{guardrails: {config_ids: ...}}注入到请求的extra_body中guardrails.pyguardrails None if self.config_ids: guardrails {config_ids: self.config_ids} if guardrails: if hasattr(self, extra_body) and self.extra_body and self.config_ids: self.extra_body[guardrails] guardrails else: self.extra_body {guardrails: guardrails}此外代码对extra_params中嵌套的extra_body做了专门的弹出并合并处理guardrails.py如果用户通过通用透传参数extra_params[extra_body]传入自定义请求体构造器会将其弹出并合并进self.extra_body避免与guardrails配置互相覆盖若该值不是 dict 类型则抛出带明确信息的ValueErrormust be a dict。测试验证仓库的 tests/generators/test_guardrails.py 对这一逻辑做了完整覆盖可作为行为契约参考test_guardrail_selection参数化测试空列表、单个 Rails、多个 Rails 三种情况用respxmock 掉chat/completions请求断言请求体中确实携带guardrails与config_ids字段test_guardrails.pytest_user_extra_body_is_merged_not_shadowed_by_guardrails_config验证用户自定义extra_body与guardrails配置合并而非覆盖test_guardrails.pytest_non_dict_user_extra_body_raises_value_error验证非 dict 的extra_body在构造阶段即抛出ValueErrortest_guardrails.py。配置示例YAML参照测试中的配置结构test_guardrails.py用 garak 的 YAML 配置方式选择特定 Railsgenerators: guardrails: NeMoGuardrailsServer: name: UnknownModel config_ids: - rail1 - rail2插件加载与发现机制guardrails之所以能通过-t guardrails被识别依赖于 garak 的插件枚举机制。garak 的插件按probes / detectors / generators / harnesses四个包组织每个包内base模块定义根类其他模块定义继承自根类的插件类garak/_plugins.py 中enumerate_plugins的 docstring 说明了这一组织方式。生成器类的加载最终通过load_plugingarak/_plugins.py按 模块路径.类名例如generators.guardrails.NeMoGuardrails完成实例化。DEFAULT_CLASS常量则用于在未显式指定类时选择模块默认插件。使用限制与注意事项综合文档与源码使用guardrails生成器时有几点限制需要了解串行调用、不可并行supports_multiple_generations False且_call_model每次都完整执行rails.generate耗时较长建议使用小规模 probes或通过--generations降低每个 prompt 的生成次数name 即配置路径-n参数传入的不是模型名而是 Guardrails 配置目录/文件路径传入无效路径会导致RailsConfig.from_path失败需要单独安装依赖必须pip install nemoguardrails否则生成器无法加载服务端场景需要先启动 Guardrails Server使用NeMoGuardrailsServer时默认uri是http://localhost:8000/v1/需要先启动 NeMo Guardrails 的 FastAPI Server并可通过config_ids指定多 Rails 部署中要测试的 Rails。小结garak 的guardrails生成器为测试防护配置本身提供了标准入口NeMoGuardrails把本地 Guardrails 配置包装成被测对象串行调用rails.generateNeMoGuardrailsServer则面向 OpenAI 兼容的 Guardrails Server支持config_ids多 Rails 选择与自定义extra_body合并。配合 tests/generators/test_guardrails.py 中的行为契约开发者可以快速理解并扩展这一安全测试通道把 Guardrails 的防护效果纳入 garak 的自动化漏洞扫描流程。如需深入了解 garak 生成器基类的通用参数max_tokens、temperature、top_k等可继续阅读 garak/generators/base.py 中的DEFAULT_PARAMS若要查阅其他生成器插件可浏览 docs/source/generators 下的各模块文档。【免费下载链接】garakthe LLM vulnerability scanner项目地址: https://gitcode.com/GitHub_Trending/ga/garak创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门