尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
garak Generators 深度解析:LLM 漏洞扫描器的模型接入层架构与配置实战
garak Generators 深度解析LLM 漏洞扫描器的模型接入层架构与配置实战【免费下载链接】garakthe LLM vulnerability scanner项目地址: https://gitcode.com/GitHub_Trending/ga/garakgarak 是面向 LLM 的安全漏洞扫描器the LLM vulnerability scanner而Generators生成器是它连接被测目标系统的统一接入层无论是云端 API、本地权重模型还是非 LLM 的对话系统都可以通过一个 Generator 被包装进扫描流程。本文以 docs/source/index_generators.rst 为入口结合基类源码与各内置生成器实现系统讲解 garak Generator 的架构设计、核心生命周期、25 个内置生成器家族以及 REST 等关键生成器的配置实战。读完本文你将掌握 Generator 的内部运行机制能够为任意对话式系统编写自定义接入器并熟练通过命令行配置各类模型目标。一、Generators 在 garak 中的定位index_generators.rst开篇即点明 Generator 的本质garaks generators each wrap a set of ways for interfacing with a dialogue system or LLM.即每一个 Generator 都是与某类对话系统或 LLM 交互方式的一层封装。这层封装可以指向原始 LLM、聊天机器人端点甚至是完全非 LLM 的对话系统——例如 garak/generators/rasa.py 接入的就是 Rasa 对话框架而 garak/generators/function.py 则用于本地函数级测试。在 garak 的流水线中Probe 负责构造攻击载荷Generator 负责把载荷发送给目标模型并取回响应Detector 再对响应进行判读。因此 Generator 是扫描链路中承上启下的模型代理。该索引页通过 toctree 汇总了全部生成器文档共 25 个模块含基类 baseanthropic、azure、base、bedrock、cohere、function、ggml、groq、guardrails、huggingface、langchain、langchain_serve、litellm、llm、mistral、ollama、openai、nim、nvcf、replicate、rest、rasa、test、watsonx、websocket。它们对应的源码全部位于 garak/generators/ 目录而行为契约统一由基类Generator定义。二、基类架构garak.generators.base.Generatorgarak/generators/base.py 是所有 Generator 必须继承的基类其完整定义为 docs/source/generators/base.rst 所描述。基类继承自Configurablegarak 的通用可配置基类因此每个生成器都天然支持从命令行、配置文件加载参数。2.1 核心属性一览属性含义默认值源码DEFAULT_PARAMSname具体生成器类名也可在构造时传入—description生成器的可选描述缺省取类 docstring 首行—max_tokens生成的最大 token 数150temperature传给底层模型的采样温度Nonetop_k传给底层模型的 top-k 采样参数Nonetop_p传给底层模型的 top-p 采样参数None基类文档列出的属性active类是否激活通常为True个别生成器因特殊原因被禁用时为FalseTruegenerator_family_name生成器所属家族名通常与模块名相关如openai.py中的类其 family 为OpenAINone缺省回退为emptycontext_len模型上下文窗口的 token 数未知则为NoneNonemodality输入输出模态字典含in与out两个键值均为模态集合{in: {text}, out: {text}}supports_multiple_generations能否在一次函数调用中原生返回多条输出Falseskip_seq_start/skip_seq_end两者同时设置时返回结果会剪除两标记之间的内容如用于剥离 chain-of-thoughtNone源码中DEFAULT_PARAMS还明确了_run_params {deprefix, seed}每次运行参数与_system_params {parallel_requests, max_workers}系统级参数的划分后两者正是多代并行生成能力的开关。关于modality基类注释说明它支持主流 any-to-any 大模型modality[in]的合法取值包括text、image、audio、video、3d。例如一个文生图文模型应声明为{in: {text}, out: {text, image}}。2.2 构造函数的行为基类__init__完成以下初始化工作调用_load_config(config_root)从配置体系加载参数若未显式定义description取类 docstring 首行组装fullnamegenerator_family_name:name形式初始化随机数生成器若设置了seed则播种保证可复现启动时向终端打印 loading generator: family: name并写日志调用_load_deps()加载依赖。2.3generate()一次完整生成的编排流程generate(prompt, generations_this_call1, typecheckTrue)是生成器与对话服务交互的中枢方法。由于它包含较多编排逻辑官方建议不要重写generate()而是通过子方法_call_model()及各类钩子定制行为。其内部流程见 base.py与文档一致类型检查prompt必须是Conversation对象若seed已设置则重新播种调用_pre_generate_hook()默认为空操作若generations_this_call 0直接返回空列表若只请求 1 条输出直接以 1 代调用_call_model(prompt, 1)若模型支持多代输出supports_multiple_generationsTrue一次调用_call_model(prompt, generations_this_call)取回全部结果否则需要多次调用凑齐输出此时分两条路径若配置了parallel_requests 1启动大小为min(generations_this_call, parallel_requests, max_workers)的多进程池用pool.imap_unordered并行调用_call_model并以 tqdm 进度条展示进度。若触发OSError(errno24)文件描述符耗尽会给出尝试调低parallel_requests或提高ulimit -n的明确提示否则串行循环调用_call_model(prompt, 1)若最终输出数量与请求不符抛出BadGeneratorException提示supports_multiple_generations可能设置错误调用_post_generate_hook()默认原样返回若skip_seq_start与skip_seq_end均非空调用_prune_skip_sequences()剪除指定区间内容返回响应列表元素为Message或None。这一流程意味着即便底层 API 不支持批量生成garak 也能通过串行或进程池并行补齐所需代次数对上层扫描逻辑完全透明。2.4 子类需要实现的契约方法方法职责_call_model(prompt, generations_this_call1)唯一必须实现的方法基类直接raise NotImplementedError。负责与模型的直接交互返回Message或None的列表底层系统不可恢复失败时可返回None。若supports_multiple_generations为False只需接受generations_this_call 1。可用backoff装饰器处理重试参见openai生成器的用法_pre_generate_hook()生成前的可选钩子适合做初始化/整理_post_generate_hook(outputs)生成后的可选钩子可对输出做修改_prune_skip_sequences(outputs)当skip_seq_start/skip_seq_end均定义时调用用正则剪除两标记之间内容也处理仅有结束标记skip_seq_start为空串的情形_verify_target_result(result)静态校验_call_model必须返回单元素列表且元素为Message或None_conversation_to_list(conversation)静态工具把Conversation转为[{role: ..., content: ...}]字典列表供多数生成器复用其中_verify_target_result通过assert保证了返回类型契约若校验失败说明该生成器与 garak 其余部分的类型预期不符便于调试。三、内置 Generator 家族全景index_generators.rst列出的 24 个具体模块对应了从主流云厂商到本地推理框架的完整覆盖。下表汇总了从源码 garak/generators/ 中提取的家族名与继承关系模块主要类家族名generator_family_name继承/说明openaiOpenAICompatible/OpenAIGeneratorOpenAICompatible/OpenAI兼容类与 OpenAI 原生类OpenAIGenerator继承OpenAICompatibleazureAzureOpenAIGeneratorAzure继承OpenAICompatiblegroqGroqChatGroq继承OpenAICompatiblenimNVOpenAIChat及NVOpenAICompletion、NVMultimodal、VisionNIM继承OpenAICompatible支持多模态guardrailsNeMoGuardrails/NeMoGuardrailsServerGuardrails分别继承Generator与OpenAICompatibleanthropicAnthropicGeneratoranthropic直接继承GeneratorbedrockBedrockGeneratorBedrockAWS BedrockcohereCohereGeneratorCohere直接继承GeneratorhuggingfacePipeline/InferenceAPI/InferenceEndpoint/Model/LLaVAHugging Face pipeline等Pipeline、InferenceAPI、Model均声明supports_multiple_generations TruellmLLMGeneratorllm包装 Simon Willison 的llm库litellmLiteLLMGeneratorLiteLLMsupports_multiple_generations TruemistralMistralGeneratormistral—ollamaOllamaGenerator/OllamaGeneratorChatOllama本地 OllamanvcfNvcfChat/NvcfCompletionNVCFNVIDIA Cloud FunctionsrestRestGeneratorREST通用 REST 连接器见下文专节rasaRasa 对话框架—非 LLM 对话系统接入示例functionSingle/Multiplefunction本地函数测试Multiple声明supports_multiple_generations Truelangchain / langchain_serveLangChainLLMGenerator/LangChainServeLLMGeneratorLangChain/LangChainServe经 LangChain 抽象接入ggmlGgmlGeneratorggml本地 GGML 推理watsonx / replicate / websocket对应类各自家族名IBM watsonx、Replicate、WebSocket 端点从继承结构看OpenAI 兼容协议已成为事实上的公共接口Azure、Groq、NIM、Guardrails 服务端等均复用OpenAICompatible实现只需覆盖generator_family_name与端点/模型名解析逻辑参见 garak/generators/openai.py 中OpenAICompatible对 URI 可达性与模型名缺失的检查。这为扩展新供应商提供了清晰模板。四、实战通用 REST 接入器RestGenerator对于没有专用 SDK 的任意 HTTP 对话端点garak 提供了通用RestGeneratorgarak/generators/rest.py文档见 docs/source/generators/rest.rst。它是配置项最丰富的生成器之一全部参数通过_config.plugins.generators[rest.RestGenerator]读取。4.1 参数清单参数说明默认值uriREST 端点 URI也可通过--target_name传入必填name服务短名缺省为 urikey_env_var存放 API key 的环境变量名REST_API_KEYreq_template请求模板字符串$KEY替换为环境变量中的 key$INPUT替换为提示词直接发送输入文本req_template_json_object以 Python 对象形式给出的请求模板序列化为 JSON 后再做替换NonemethodHTTP 方法传给requests模块postheaders随请求发送的 HTTP 头字典{}proxies传给requests的代理字典Noneresponse_json响应是否为 JSON 格式Falseresponse_json_field从响应 JSON 中取作输出文本的字段若以$开头则按 JSONPath 解析textrequest_timeout超时秒数20ratelimit_codes触发限流重试的响应码列表[429]skip_codes视为无法生成而跳过的响应码优先级高于ratelimit_codes[]verify_ssl是否强制 SSL 证书校验可填bool或 CA bundle 文件路径Trueclient_certmTLS 客户端证书路径PEMNoneclient_keymTLS 客户端私钥路径若client_cert已含密钥则不必设置不得脱离client_cert单独设置Noneclient_key_passphrase_env_var存放加密私钥口令的环境变量名口令绝不允许写进配置文件若设置则启动时该环境变量必须已定义None模板既可以是字符串也可以是可 JSON 序列化的 Python 对象$INPUT/$KEY占位符同样可用于 header 值中。4.2 标准示例JSON 收发 Header 鉴权若端点的 API key 放在X-Authorization头中请求与响应均为 JSON 且目标文本都在text键下可这样配置{ rest: { RestGenerator: { name: example service, uri: https://example.ai/llm, method: post, headers: { X-Authorization: $KEY }, req_template_json_object: { text: $INPUT }, response_json: true, response_json_field: text } } }注意当目标文本不在 JSON 顶层字段时response_json_field可传入 JSONPath 表达式以$开头即按 JSONPath 处理例如$.choices[0].message.content。源码中response_json为True时若未设置response_json_field会直接抛出ValueError以尽早暴露配置错误。4.3 命令行加载方式将上述 JSON 保存为example_service.json后garak --target_type rest -G example_service.json--target_type rest加载默认的RestGenerator类-G/--generator_option_file从 JSON 文件读取生成器配置也可用--generator_options直接在命令行内联传入 JSON 字符串。源码中RestGenerator还定义了_supported_params白名单涵盖上表全部参数含context_len、max_tokens、temperature、top_k、skip_seq_start等继承参数并对_mtls_session等敏感属性做了_unsafe_attributes标记保护。4.4 mTLS 客户端证书认证对要求双向 TLS 的服务端提供客户端证书与可选私钥服务端 CA bundle 通过verify_ssl文件路径指定{ rest: { RestGenerator: { name: mTLS protected service, uri: https://api.example.com/llm, client_cert: /path/to/client.crt, client_key: /path/to/client.key, client_key_passphrase_env_var: MTLS_KEY_PASSPHRASE, verify_ssl: /path/to/ca.crt } } }口令必须通过环境变量提供不会从配置文件读取并随扫描命令执行export MTLS_KEY_PASSPHRASEyour_key_passphrase garak --target_type rest -G mtls_config.json --spec probes.dan若证书与私钥合并于同一 PEM 文件可省略client_key{ rest: { RestGenerator: { uri: https://api.example.com/llm, client_cert: /path/to/combined.pem, verify_ssl: /path/to/ca.crt } } }mTLS 相关逻辑在 tests/generators/test_rest_mtls_integration.py 中有集成测试覆盖可作为配置验证的参考。若 REST 端点过于特殊文档建议直接继承RestGenerator扩展新模块。五、其他代表性生成器的接入方式5.1llm统一多供应商入口garak/generators/llm.py 包装 Simon Willison 的llm库docs/source/generators/llm.rst通过其插件体系以统一接口对接 OpenAI、Claude、Gemini、Ollama 等众多供应商API key 与供应商配置由llm自身管理pip install llm llm-claude-3 garak --target_type llm --target_name gpt-4o-mini--target_name直接传入llm的模型 id。这种方式适合需要快速在多个供应商间切换模型做扫描的场景。5.2 OpenAI 兼容系从云端到自托管OpenAICompatiblegarak/generators/openai.py是扩展面最广的基类OpenAIGenerator、AzureOpenAIGenerator、GroqChat、NVOpenAIChatNIM等都派生自它通过覆盖generator_family_name与模型名/端点解析实现差异化。源码在构造时会校验模型名提示--target_name用法与目标 URI 可达性并对 chat/completions 两种请求形态分别处理Conversation与字典列表的适配。5.3 Hugging Face 系本地与远端兼顾huggingface.py 提供四种形态本地Pipeline、Model自加载权重、InferenceAPIHF 托管推理与InferenceEndpoint私有端点并内置限流/加载失败/5xx 等异常类型。四者中三类均声明supports_multiple_generations True可在单次调用中直接取回多条生成吞吐更高。六、多代输出与并行理解parallel_requests当目标 API 不支持批量生成而扫描又需要多条响应时generate()的兜底逻辑会依据系统参数自动并行化见上文流程第 6 步。可调参数为parallel_requests并发请求数上限 1才启用进程池max_workers进程池最大 worker 数。实际池大小取min(generations_this_call, parallel_requests, max_workers)。在容器或低 ulimit 环境下若命中OSError(24)garak 会给出明确修复建议降低parallel_requests或ulimit -n 4096。基类测试 tests/generators/test_generators_base.py 对generate()的返回数量、类型断言与异常路径均有覆盖。七、编写自定义 Generator 的最小实践依据基类契约接入一个新模型只需三步继承Generator设置generator_family_name实现_call_model(prompt, generations_this_call)返回[Message]或[None]单元素列表若需要覆写_pre_generate_hook()/_post_generate_hook()或设置skip_seq_start/skip_seq_end剥离 chain-of-thought 等中间推理内容。若底层 API 原生支持多输出将类属性supports_multiple_generations置为Truegenerate()便会一次调用取回全部结果否则自动走串行/并行补齐路径。建议参考function.py最简实现与openai.py含backoff重试、URI 校验、多模态modality声明两个范例。所有生成器最终都可通过--target_type family --target_name name或配置文件接入扫描流程配合 tests/generators/ 下的既有测试可作为回归验证。结语从索引页 index_generators.rst 展开garak 的 Generator 子系统呈现出一条清晰的设计主线基类定义编排契约子类只关心模型交互配置体系统一注入参数。无论是接 OpenAI 兼容 API、Hugging Face 权重还是任意 REST 端点含 mTLS 场景都可以在不动扫描主链路的前提下快速接入对于尚未覆盖的协议继承Generator并实现_call_model即可让被测系统进入 garak 的漏洞扫描视野。【免费下载链接】garakthe LLM vulnerability scanner项目地址: https://gitcode.com/GitHub_Trending/ga/garak创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

团体标准制定与参编的核心差异及实操指南

团体标准制定与参编的核心差异及实操指南

1. 团体标准制定与参编的核心差异解析在标准化工作领域,团体标准作为我国新型标准体系的重要组成部分,其制定流程和参与方式一直存在认知模糊区。作为参与过12项团体标准编制的从业者,我发现很多新入行的同行常混淆"制定标准"与&qu…

📅 2026/9/16 12:43:17
HS4095读卡器使用指南:EM4100卡识别与串口通信调试

HS4095读卡器使用指南:EM4100卡识别与串口通信调试

简介:本资源是面向嵌入式开发工程师与RFID技术学习者的HS4095低频RFID读卡器开发套件,聚焦125kHz频段EM4100/EM4469标签的读取与写入实践,适用于门禁系统、智能仓储、实验教学等场景。压缩包共22个文件,含6个备份文件(…

📅 2026/9/16 12:38:14
汽车电子暗裂根因与17个真实易裂点位防控指南

汽车电子暗裂根因与17个真实易裂点位防控指南

1. 暗裂不是故障,是应力在“悄悄签名”你拆开一台刚下线的车载中控屏,表面光洁如新,通电测试也一切正常——可三个月后,客户投诉屏幕边缘出现细微蛛网状裂纹,模组内部焊点陆续失效。返厂拆解发现:PCB上没有…

📅 2026/9/16 12:38:14
MORE NEWS

更多资讯

📰

STC15单片机超声波测距OLED显示实战:从原理到原理图设计

简介:这份面向STC15单片机初学者的超声波测距项目,集成了测距算法、OLED显示与硬件原理图,适用于嵌入式课程设计、竞赛备赛或实际避障模块开发,也可作为毕业设计参考。方案基于IAP15系列8051内核MCU,通过HC-SR04类超声…

📰

C#对象映射实战:反射、特性与表达式树应用

1. 项目背景与核心目标最近在重构一个老旧的.NET项目时,我遇到了一个经典问题:如何在不同的数据模型之间进行高效、安全的属性映射。手动编写每个属性的赋值代码不仅枯燥乏味,还容易出错。这时候很自然地想到了AutoMapper这个业界标杆&#x…

📰

半导体设备技术突破与智能化发展趋势

1. 半导体设备技术突破现状分析最近业内确实出现了一些值得关注的半导体设备技术进展,主要集中在以下几个方向:1.1 光刻技术的新突破在极紫外光刻(EUV)领域,最新的进展包括:光源功率提升至500W以上&#xf…

📰

LTspice元器件库本质:路径、符号与模型三要素协同机制

1. 为什么LTspice导入元器件库是每个仿真老手的“必修课”而不是“选修课”LTspice导入一个元器件库文件——这七个字背后,藏着无数电子工程师、硬件爱好者、学生党在深夜调试电路时摔键盘的真实瞬间。我第一次被逼着搞懂这个操作,是在帮客户复现一个开关…

📰

EITtext_EIT:Python实现行内实体标签解析与转换实战

简介:面向电阻抗成像(EIT)逆问题研究者的完整求解代码包,聚焦吉洪诺夫正则化、Landweber迭代、L1稀疏重构与共轭梯度(CGLS)等经典与前沿算法,适合医学成像、地质探测及无损检测领域的硕博生与工…

📰

Qt+OpenCV+C++实战:从零构建行车辅助系统核心功能

简介:这份完整的行车辅助系统源码基于Qt、OpenCV与C构建,主要面向毕业设计、课程设计及实际项目开发场景,适合具备一定C基础、希望在图形界面与计算机视觉方向深入实践的开发者。整个资源包共279个文件,约48.7MB,其中包…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬