OpenCompass 提示词攻击(Prompt Attack)实战指南:基于 PromptBench 评测提示指令鲁棒性
发布时间:2026/9/28 3:03:26来源:尧图网络
模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载本文是 OpenCompass 提示词攻击Prompt Attack模块的完整实战指南。该模块借鉴 Microsoft PromptBench 的思路通过向提示指令注入文本扰动如替换单词、插入字符等系统性评测 LLM 对提示指令的鲁棒性。读完本文你将掌握如何配置一个可被攻击的提示模板、如何使用AttackInferencer与OpenICLAttackTask串联攻击实验、如何控制攻击类型与查询预算以及如何从源码层面理解攻击搜索与评估的完整链路从而在自己的数据集与模型上复现攻击评测。背景为什么要做提示词攻击在常规评测中我们关心模型在给定提示下能否完成任务而提示词攻击关心的是另一个问题当提示指令本身被攻击/修改后任务表现相比原始提示下降了多少。这反映的是模型对提示指令的敏感度与鲁棒性——一个鲁棒的模型应当在指令措辞发生微小扰动时依然保持稳定表现。OpenCompass 的攻击能力借鉴了 PromptBench 的设计维护一份原始提示列表original prompt list针对其中表现最好的若干条提示执行攻击搜索用攻击前后准确率的差值dropped accuracy量化鲁棒性损失。整套流程涉及三个核心部件AttackInferencer负责用指定提示文本对数据集进行推理并返回评估分数OpenICLAttackTask负责调度攻击搜索选出待攻击提示并调用 promptbench 的Attack完成扰动生成attack配置块定义攻击算法、查询预算与待攻击提示数量。环境准备提示词攻击依赖 PromptBench 及其下游依赖textattack 等需要额外安装pip install promptbench0.0.4 textattack0.3.8 lru-dict安装完成后OpenCompass 任务侧会动态导入promptbench.prompt_attack中的LABEL_SET、Attack、attack_config等组件见 openicl_attack.py因此版本需与 0.0.4 保持一致。如何发起攻击三步走攻击实验的整体流程为① 准备一个带攻击占位符的数据集配置 → ② 配置OpenICLAttackTask与攻击参数 → ③ 以--mode infer运行实验并解读结果。第一步配置数据集infer_cfg以 GLUE-WNLI 数据集为例完整配置见 promptbench_wnli_gen_50662f.py。多数配置项与常规评测一致可参考 config.md如数据集尚未支持可按 new_dataset.md 自行注册。关键点在于infer_cfg中的提示模板与推理器adv_prompt是本次实验中要被攻击的提示占位符攻击只会修改该字段sentence1、sentence2是该数据集的输入列保持不动通过AttackInferencer的original_prompt_list提供候选提示集合用adv_keyadv_prompt告诉推理器要攻击模板中的哪个字段。original_prompt_list [ Are the following two sentences entailment or not_entailment? Answer me with A. entailment or B. not_entailment, just one word. , Does the relationship between the given sentences represent entailment or not_entailment? Respond with A. entailment or B. not_entailment., # ... 可继续扩充候选提示 ] wnli_infer_cfg dict( prompt_templatedict( typePromptTemplate, templatedict(round[ dict( roleHUMAN, prompt{adv_prompt} Sentence 1: {sentence1} Sentence 2: {sentence2} Answer:), ]), ), retrieverdict(typeZeroRetriever), inferencerdict( typeAttackInferencer, original_prompt_listoriginal_prompt_list, adv_keyadv_prompt))配套的reader_cfg与eval_cfg与普通评测一致例如 WNLI 使用first_option_postprocess抽取 A/B 选项并用AccEvaluator计算准确率wnli_reader_cfg dict( input_columns[sentence1, sentence2], output_columnlabel_option, train_splitvalidation, test_splitvalidation) wnli_eval_cfg dict( evaluatordict(typeAccEvaluator), pred_roleBOT, pred_postprocessordict(typefirst_option_postprocess, optionsAB), )仓库中还内置了其他几个攻击数据集配置可作为模板参考数学推理 promptbench_math_gen_abf776.py{adv_prompt} {problem}:单列输入、MATHEvaluator评估、机器翻译 promptbench_iwslt2017_gen_cbb8c8.py、抽取式问答 promptbench_squad20_gen_b15d1c.py。第二步配置攻击任务与参数攻击实验必须使用OpenICLAttackTask而不是常规的OpenICLInferencer任务并且分区器只能使用NaivePartitioner。原因在于攻击搜索会把整个数据集重复运行数十上百次来寻找最优攻击若拆分成多个子任务既不方便也不合理因此必须整份数据集一次跑完。# Please run whole dataset at a time, aka use NaivePartitioner only # Please use OpenICLAttackTask if want to perform attack experiment infer dict( partitionerdict(typeNaivePartitioner), runnerdict( typeSlurmRunner, max_num_workers8, taskdict(typeOpenICLAttackTask), retry0), ) attack dict( attacktextfooler, query_budget100, prompt_topk2, )attack配置块中的三个关键参数参数含义取值说明attack攻击算法类型textfooler、textbugger、deepwordbug、bertattack、checklist、stresstest等由 promptbench 提供query_budget查询次数上界即攻击过程中运行整个数据集的次数上限控制搜索开销prompt_topk待攻击的提示数量取原始提示列表中准确率最高的前 k 条执行攻击原始提示列表通常大于 10 条全量攻击耗时极高注意由于上述重复搜索机制请选择样本量小于 1000 的小型数据集进行攻击否则时间成本会急剧膨胀。参考入口示例 eval_attack.py 展示了在本地环境LocalRunner组合 WNLI 数据集与 Qwen2-1.5B 模型发起攻击的完整写法其中attack配置为textfooler、query_budget100、prompt_topk1。第三步运行攻击实验攻击任务属于推理阶段运行时必须指定--mode inferpython run.py examples/eval_attack.py --mode infer结果解读攻击日志与精度下降所有结果保存在工作目录下的attack文件夹中OpenICLAttackTask的output_subdir即attack日志位于logs/attack见 openicl_attack.py。攻击过程会输出两类信息第一类每个候选原始提示在数据集上的准确率排序用于选出 topk 待攻击提示Prompt: Assess the connection between the following sentences and classify it as A. entailment or B. not_entailment., acc: 59.15% Prompt: Does the relationship between the given sentences represent entailment or not_entailment? Respond with A. entailment or B. not_entailment., acc: 57.75% Prompt: Analyze the two provided sentences and decide if their relationship is A. entailment or B. not_entailment., acc: 56.34% Prompt: Identify whether the given pair of sentences demonstrates entailment or not_entailment. Answer with A. entailment or B. not_entailment., acc: 54.93% ...第二类对每条被攻击提示给出原始提示、攻击后提示及准确率对比dropped acc即为鲁棒性损失Original prompt: Assess the connection between the following sentences and classify it as A. entailment or B. not_entailment. Attacked prompt: bAssess the attach between the following sentences and sorted it as A. entailment or B. not_entailment. Original acc: 59.15%, attacked acc: 40.85%, dropped acc: 18.31%可以看到攻击仅替换了两个单词connection→attach、classify→sorted准确率即从 59.15% 跌至 40.85%直观体现了提示措辞对任务表现的显著影响。结果还会同步写入attack目录下的attacklog.txt文件便于后续批量分析。源码级实现攻击如何被调度与评估要深入理解这套机制可分别阅读推理侧与任务侧的两个核心实现。AttackInferencer一次预测对应一次完整评测AttackInferencer定义于 icl_attack_inferencer.py注册为ICL_INFERENCERS。它的构造参数除常规的model、max_out_len、batch_size外核心新增了两个adv_key提示模板中被攻击的字段名对应上面的adv_promptmetric_key用于比较的评估指标默认accuracy。其核心方法是predict(adv_prompt)第 85 行它把传入的攻击后提示文本注入模板中的adv_key位置{self.adv_key: adv_prompt}走完常规的取回retrieval→ 组装 prompt → 生成 → 后处理 → 评估 全流程最终返回归一化到 0~1 的分数。也就是说每次攻击尝试 在完整数据集上做一次端到端评测这正是攻击实验耗时数倍于普通评测的原因。源码中还内置了中间结果落盘与断点续跑逻辑tmp_前缀 json 文件攻击中途中断可部分恢复。OpenICLAttackTask提示筛选 → 攻击搜索 → 结果落盘OpenICLAttackTask定义于 openicl_attack.py注册为TASKS负责整个攻击实验的编排筛选阶段prompt_selection第 58 行遍历original_prompt_list中的每条提示调用inferencer.predict(prompt)得到准确率按从高到低排序攻击阶段第 154 行取排序后前prompt_topk条且初始准确率大于 0 的提示构造 promptbench 的Attack对象其中eval_funclambda prompt, _, __: inferencer.predict(prompt)将攻击候选项好坏的评估完全复用了第一步的预测管线attack_name与query_budget直接来自attack配置落盘阶段原始/攻击后提示及 acc、attacked acc、dropped acc 同时写入日志与attacklog.txt若初始准确率为 0 则跳过攻击并记录原因。值得注意的细节attack配置中的dataset字段若不在 promptbench 的LABEL_SET中会自动回退为mmlu第 137-139 行任务还支持多 GPU 场景下通过torch.distributed.run拉起分布式推理第 47-52 行。实践建议与边界数据集选择务必使用样本数 1000 的小型数据集如 WNLI 的 validation 集因为query_budget次攻击 × 多候选提示的组合开销十分可观参数权衡prompt_topk建议从 1~2 起步验证流程再按算力放宽query_budget控制攻击搜索深度值越大越可能找到更优攻击、耗时也越长结果口径dropped acc越大代表模型对该提示越脆弱可用于对比不同提示模板或不同模型的指令鲁棒性模型适配攻击实验沿用 OpenCompass 常规的模型配置体系如示例中的hf_qwen2_1_5b本地模型与 API 模型均可接入API 模型会自动开启逐次保存以应对中断。通过 examples/eval_attack.py 与 promptbench 目录下的多个数据集配置你可以快速把提示词攻击扩展到数学、翻译、抽取式问答等更多任务建立自己的提示指令鲁棒性评测基线。赞分享模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载相关推荐GLM-4提示词攻击防范指南增强模型鲁棒性的终极方法在人工智能快速发展的今天GLM 4作为开源多语言多模态对话模型其安全性和鲁棒性备受关注。随着恶意提示词攻击手段的日益复杂如何有效防范提示词攻击、增强模型鲁大模型人工智能微调多模态模型推理服务AI AgentMinIO V3 监控快速搭建:Prometheus 采集与 Grafana 可视化的最小配置路径MinIO V3 监控快速搭建:Prometheus 采集与 Grafana 可视化的最小配置路径 MinIO V3 监控把集群健康、容量、API 请求等指标按后端存储对象存储分布式存储云原生Tabby 提示词重写Prompt Rewriting评估工具实战指南Tabby 提示词重写Prompt Rewriting评估工具实战指南 导读 本文聚焦 Tabby 仓库中 experimental/prompt rewr人工智能大模型本地部署模型推理服务后端RAG交互助手上一篇5分钟快速上手SLAM技术从零到实战的完整指南下一篇在 Apache Arrow 中使用 Acero 引擎消费 Substrait 执行计划兼容性全解析与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网