admin管理员组

文章数量:1438520

面向大模型的生成

文章首发在:奇安信攻防社区

目前做安全大模型或者说做大模型安全,基本都会有必要的两步,分别是对齐以及红队。 因为随着大模型在各种应用场景中的广泛使用,越来越多的人开始担忧这些模型可能被滥用,尤其是在传播有害或不道德内容方面。由于这些模型的开放性和广泛的使用群体,它们的潜在风险也变得更加显著。开放源码的语言模型尤其令人担忧,因为其代码和训练数据是公开的,任何人都可以访问、修改甚至恶意利用

对齐与红队

目前做安全大模型或者说做大模型安全,基本都会有必要的两步,分别是对齐以及红队。

因为随着大模型在各种应用场景中的广泛使用,越来越多的人开始担忧这些模型可能被滥用,尤其是在传播有害或不道德内容方面。由于这些模型的开放性和广泛的使用群体,它们的潜在风险也变得更加显著。开放源码的语言模型尤其令人担忧,因为其代码和训练数据是公开的,任何人都可以访问、修改甚至恶意利用。为了应对这些问题,许多大型语言模型的提供商和开发者开始着手实施一系列训练技术,旨在将这些模型的行为与人类的道德价值观对齐。这些对齐技术通常包括对模型的训练过程进行精细的设计,通过加强对模型输出的监控和限制,防止其生成不适当或有害的内容。

image-20241130141441533.png

这些对齐措施的实施通常需要通过大量的人工审查和反馈机制来进行修正。例如,模型的输出可能会经过一层过滤,检查是否包含恶意、歧视性或暴力的语言。此外,一些开发者还会采用强化学习等先进的训练方法,让模型在生成内容时考虑社会道德规范和法律约束。这些技术不仅关注模型对特定问题的直接回答,还会试图让模型理解并避免产生潜在的危害,诸如误导性信息、仇恨言论或侵犯隐私的内容。

然而,这些对齐技术虽然在一定程度上能够减少有害内容的生成,但它们并非完美无缺,且存在诸多挑战。首先,模型的训练数据本身可能包含偏见和歧视,如果没有进行充分的修正,模型在生成内容时仍可能无意间体现出这些偏见。其次,由于语言和文化的多样性,不同地区和群体对什么是“道德”的定义可能有所不同,如何在全球范围内达成一种普适的道德对齐标准仍然是一个开放性问题。此外,技术本身也可能面临滥用的问题,某些用户可能会利用对齐技术的漏洞,或者通过反向工程绕过这些限制。因此,尽管这些对齐措施在一定程度上帮助减轻了模型可能带来的负面影响,但它们并未完全消除风险。为了进一步提高模型的安全性和可靠性,研究者和开发者需要不断探索新的方法,其中的一类典型方案就是红队攻击。

image-20241130141657749.png

红队是一群专门的评估者,他们的任务是主动识别和防止大型语言模型在对齐过程中可能出现的失败。红队的角色类似于传统安全领域中的渗透测试团队,他们通过模拟恶意攻击、利用系统漏洞或者挑战模型的边界,来发现可能被忽视的风险和弱点。在大型语言模型的开发和对齐过程中,红队的工作尤其重要,因为模型在复杂和动态的应用环境中可能面临各种无法预见的挑战。

越狱技术

即使有了这些对齐技术,开源的大型语言模型仍然容易受到对抗性输入的影响。比如近期最后的攻击技术,也就是越狱,使用特别设计的输入成功绕过对齐方法。而且大家的研究表明,可以做到自动发现这样的输入,即对抗性提示。比如Zou等人找到了可以跨多个大型语言模型转移的对抗性提示,包括专有的、黑箱模型。然而,优化对抗性输入的自动越狱非常复杂且计算成本高昂。

所以大家就在研究是否可以采取一种非常简单的方法来越狱大模型的对齐,我们想要做的就是专注于在发布前经过安全调整的开源模型,看看是否对它们进行红队测试。近期发在人工智能顶级会议ICLR 2024上的一个工作就提出了相关的方案,见参考4,这也是我们本文要分析与复现的基础。

在这种方案中,只操纵文本生成配置就可以。如下图所示。

image-20241202150029789.png

通过移除系统提示(这是一个故意添加以引导模型生成的话),并改变解码超参数或采样方法就行。我们的关键假设是现有的对齐程序和评估可能基于默认的解码设置,当配置略有变化时可能会表现出脆弱性。

我们把这种方法称之为生成-利用攻击,这是一种不需要任何复杂方法就能破坏大型语言模型对齐的方案。

背景

语言建模

语言建模的任务是在给定之前上下文的情况下预测序列中的下一个词,并构成了最先进的大型语言模型的基础。

正式地说,给定一个输入序列n个标记x = x1, x2, ..., xn,语言模型计算下一个标记的条件概率分布:

image-20241202150236295.png

其中τ是一个控制下一个标记分布锐度的温度参数。对于文本生成,模型递归地从条件分布IPθ(xi|x1:i−1)中采样以生成下一个标记xi,继续这个过程直到产生一个序列结束标记。

生成配置

在引导大型语言模型生成朝向人类对齐的输出方面,添加系统提示是一个广泛使用的技术。比如下图总结了一些常见的模型及其系统提示。

image-20241202150328061.png

系统提示也通常用于上下文蒸馏的微调:首先使用系统提示生成更安全的模型响应,然后不对系统提示进行微调,这本质上是将系统提示(即上下文)蒸馏到模型中。

然后我们再了解什么是解码方法。在每一步i,给定预测的下一个标记分布IPθ(xi|x1:i−1),可以应用多种解码策略来选择下一个标记xi。最常见的策略是基于采样的解码,其中xi是从分布中随机采样的。贪婪解码,简单地选择在IPθ(xi|x1:i−1)下最可能的标记,是当温度τ=0时采样的一个特例。基于采样的解码的变体包括top-p采样和top-k采样,它们将采样限制在最可能的标记中。

我们注意到,开源的大型语言模型通常仅使用默认的生成方法进行对齐评估,这可能使它们在使用替代策略时容易出错。例如,很多人会使用单一的解码方法对LLAMA2进行了广泛的对齐评估:top-p采样,p=0.9和τ=0.1,并且总是添加系统提示。虽然这种方法实用,但它有遗漏模型对齐在其他生成策略下大幅恶化的情况的风险。

攻击策略

那么根据前文的分析,我们这种越狱方法的核心策略就是探索各种生成策略,主要围绕系统提示和解码策略。

关于系统提示,我们考虑要么1) 在用户指令之前添加它,要么2) 不包含它。

在解码策略方面,我们尝试了以下三种变体:

• 温度采样,使用不同的温度τ。温度控制下一个词分布的锐度(如下方程所示),我们将其从0.05变化到1,步长为0.05,这给我们提供了20种配置。

image-20241202150724443.png

Top-K采样过滤掉K个最可能的下一个词,然后下一个预测词将仅在这K个词中进行采样。我们在{1, 2, 5, 10, 20, 50, 100, 200, 500}中变化K,这给我们提供了9种配置。

• Top-p采样(或核心采样从累积概率超过概率p的最小可能词集选择。我们将其从0.05变化到1,步长为0.05,这给我们提供了20种配置。

对于每个提示,攻击者生成49个响应(即,为上述每种解码配置采样一次)。在所有生成的响应中,攻击者使用评分器选择得分最高的单个响应,并将其作为最终响应。

复现

其实可以看到想法是很简单的,接下来就是具体的实现。

首先导入必要的依赖

image-20241202175158864.png

这段代码主要完成以下功能:

  1. 指定 GPU 环境:通过设置 CUDA_VISIBLE_DEVICES 环境变量,指定代码运行时使用的 GPU(这里是编号为 "1" 的 GPU)。如果没有 GPU,此设置可以忽略。
  2. 导入模块:包括数据处理模块(pandas 和 numpy)、命令行参数解析模块(argparse)、深度学习框架(torch)、用于加载预训练模型的 transformers 库,以及日志管理模块(logging)和进度条模块(tqdm)。
  3. 自定义配置:从外部配置文件(configs)中导入模型路径映射表 modeltype2path,以便根据模型类型动态加载模型路径。
  4. 日志和警告设置:使用 logging 设置日志级别为 INFO,便于输出信息;通过 warnings 屏蔽警告信息,保持输出清晰。
  5. 定义默认系统提示语DEFAULT_SYSTEM_PROMPT 是一个用于定义模型行为的系统提示语,设定了助手的行为准则,包括帮助性、礼貌性、诚实性、社会公正性等。这提示语会影响生成式语言模型的响应风格和内容。

这段代码的整体作用是为加载和使用生成式语言模型(如 GPT 类模型)提供基本的环境和配置。

image-20241202175259591.png

这段代码定义了两个函数,分别用于处理系统提示语和获取句子嵌入。

1. prepend_sys_prompt 函数

功能:根据用户设置,将系统提示语 DEFAULT_SYSTEM_PROMPT 添加到输入句子的前面。

  • 参数:
    • args.use_system_prompt 是一个布尔值,用于指示是否需要添加系统提示语。
    • sentence:输入的句子(字符串)。
    • args :包含程序运行参数的对象(可能由 argparse 生成)。
  • 工作流程:
    1. 检查 args.use_system_prompt 是否为真。
    2. 如果为真,将 DEFAULT_SYSTEM_PROMPT(一个设定好的多行字符串)拼接在句子前。
    3. 返回拼接后的句子。

2. get_sentence_embedding 函数

功能:计算给定句子的嵌入(embedding),用于表示句子的语义信息。

  • 参数:
    • model:加载的深度学习模型(例如通过 transformers 加载的语言模型)。
    • tokenizer:与模型匹配的分词器,用于将句子转化为模型的输入格式。
    • sentence:需要计算嵌入的句子(字符串)。
  • 工作流程:
    • 调用模型的嵌入层 word_embeddings,将输入 ID 映射为嵌入向量。
    • 使用 tokenizer 对句子进行分词,将其转化为 PyTorch 张量(return_tensors="pt")。
    • add_special_tokens=False 表示不添加额外的特殊标记(如 [CLS] 和 [SEP])。
    • 使用 to(model.device) 将张量移动到模型所在设备(CPU 或 GPU)。
    • 调用 model.get_input_embeddings() 获取模型的输入嵌入矩阵,这是一个将分词后的 token 转化为向量的层。
    • 调用 sentence.strip() 去除首尾空白。
    • 替换句子中的双引号(")为空字符串,避免特殊字符影响分词。
    1. 预处理句子 :
    2. 获取模型的输入嵌入层 :
    3. 分词和转化为张量 :
    4. 获取嵌入 :
    5. 返回计算的嵌入向量(张量)。

代码整体用途

  • prepend_sys_prompt 函数通过将系统提示语添加到句子前,为语言模型生成的回答提供上下文信息。
  • get_sentence_embedding 函数通过分词和嵌入计算,获取输入句子的语义向量,方便用于下游任务(如相似性计算或分类)。
image-20241202175347951.png

这段代码的功能是对一组输入文本进行处理,使用一个预训练模型生成响应,并将结果存储到文件中:

  1. 初始化分词器: tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH) 使用指定路径 TOKENIZER_PATH 加载分词器,用于对输入文本进行编码和解码操作。
  2. 日志记录
    • logging.info(f"Model size: {model.get_memory_footprint()/1e9}") 记录模型的内存占用大小(以GB为单位)。get_memory_footprint() 方法返回模型占用的字节数。
    • logging.info(f"Model name: {fname}") 记录当前模型的名称。
  3. 加载文本数据
    • 如果参数 args.use_advbench 为 True,从 advbench.txt 文件中读取前100行数据。
    • 否则,从 MaliciousInstruct.txt 文件中读取所有行。
  4. 预处理文本: lines = [prepend_sys_prompt(l, args) for l in lines] 调用 prepend_sys_prompt 函数对每一行文本添加系统提示信息,具体行为取决于 args 参数的配置。
  5. 基于贪婪搜索生成响应
    • 判断模型类型:
    • 参数说明:
    • 解码生成的结果:ground_truth_generation = tokenizer.batch_decode(ground_truth_generation)
    • 将生成的结果添加到 outputs 列表,并将对应的输入句子复制到 prompts 中,按样本数(args.n_sample)重复。
    • 如果模型名称中包含 "falcon" 或 "mpt",则直接将输入文本编码为张量并传入生成函数 model.generate
    • 否则,计算输入文本的嵌入向量 ground_truth_embeds,并将其传入 model.generate 生成结果。
    • max_new_tokens=100:限制生成的最大新词数为100。
    • do_sample=False:不使用采样,采用贪婪搜索。
    • num_return_sequences=1:每次仅返回一个序列。
    • 检查 args.use_greedy,如果为 True,则运行贪婪搜索。
    • 初始化 prompts 和 outputs 列表用于存储输入和输出。
    • 设置模型为评估模式:model.eval()
    • 遍历 lines 中的每个句子:
  6. 错误处理
    • 使用 try...except 块跳过生成过程中可能出现的错误。
  7. 保存结果
    • prompt:预处理后的输入文本。
    • output:对应的生成结果。
    • 使用 pandas 创建一个数据框 results ,包含两列:
    • 将数据框保存为 CSV 文件,路径为 outputs/{fname}/output_greedy.csv

这段代码实现了基于贪婪搜索的文本生成任务,读取输入文本、经过模型处理后生成响应,并保存为结果文件。代码通过灵活的参数控制模型使用和数据处理方式,以适应不同的实验配置。

image-20241202175551910.png

这段代码主要实现了使用模型默认生成策略,基于随机采样的生成方法来处理输入文本,并将生成的结果保存为 CSV 文件。

1. 判断条件

  • if args.use_default: 检查参数 args.use_default 是否为 True,决定是否使用默认生成模式。

2. 日志记录

  • logging.info(f"Running default, top_p=0.9, temp=0.1") 记录默认生成的超参数设置:
    • top_p=0.9:使用核采样(Top-p Sampling),限制生成结果的累积概率在 90% 以内。
    • temperature=0.1:降低生成时的随机性,越小的温度值意味着模型生成的内容更加集中于高概率的选项。

3. 初始化

  • 初始化两个空列表:
    • prompts:存储输入的句子。
    • outputs:存储模型生成的结果。
  • 设置模型为评估模式:model.eval(),关闭 dropout 等训练时的随机行为。

4. 逐句生成响应

  • 遍历 lines 中的每个句子:
    • 使用 tokenizer.batch_decode 将生成的张量解码为可读文本。
    • 将生成结果扩展到 outputs 列表中。
    • 将当前句子按样本数(args.n_sample)重复后存入 prompts
    • max_new_tokens=100:限制生成的最大新词数为 100。
    • do_sample=True:启用随机采样。
    • top_p=0.9:核采样,限制生成的累积概率。
    • temperature=0.1:控制生成的随机性。
    • num_return_sequences=1:每次仅返回一个序列。
    • 如果 args.model 包含 "falcon" 或 "mpt" :
    • 否则:
    • 使用分词器将句子编码为张量(PyTorch 格式),并传入生成函数 model.generate
    • do_sample=True 启用随机采样。
    • 通过 get_sentence_embedding 函数计算输入句子的嵌入向量。
    • 将嵌入向量传入生成函数 model.generate
    • 检查模型类型
    • 生成参数说明
    • 解码生成的结果

5. 错误处理

  • 使用 try...except 块捕获可能发生的异常并跳过错误的输入,保证生成过程不中断。

6. 保存生成结果

  • 使用 pandas 创建数据框 results ,包含两列:
    • prompt:去除多余空格后的输入句子。
    • output:对应的生成结果。
  • 将数据框保存为 CSV 文件,路径为 outputs/{fname}/output_default.csv

这段代码使用了随机采样策略,通过控制 top_p 和 temperature 参数实现生成多样化的响应。

  • top_p=0.9:限制生成结果的范围,避免概率过低的选项。
  • temperature=0.1:生成结果更加集中,减少随机性。

最终,代码会将每个输入句子与对应生成的输出结果存储在一个 CSV 文件中,便于后续分析或评估。

image-20241202175613281.png

这段代码的主要功能是根据args.tune_temp参数的设置,对一个模型进行不同温度(temperature)值下的文本生成实验。温度是控制生成文本随机性的一个参数:温度越低,生成结果更倾向于选择概率较高的词;温度越高,则生成结果更加多样化。该过程通过遍历从0.05到1.05之间以0.05为步长的一系列温度值来实现,并针对每个温度值执行以下步骤:

  1. 初始化与日志记录
    • 对于每个温度值,首先使用np.round(temp, 2)将温度四舍五入至两位小数。
    • 使用logging.info记录当前运行的温度值。
  2. 准备数据结构
    • 初始化两个列表promptsoutputs用于存储输入提示句及对应的生成输出。
  3. 模型评估模式切换
    • model.eval()将模型设置为评估模式,这通常意味着禁用dropout等正则化技术,确保在生成过程中不会引入额外的随机性。
  4. 处理每条句子
    • 通过tqdm(lines)循环遍历一系列句子(lines),并使用进度条显示处理进度。
    • 根据args.model中是否包含falconmpt字符串判断采用哪种方式生成文本。如果匹配,则直接使用输入句子的token ID进行生成;否则,先获取句子的嵌入表示再进行生成。
    • 使用model.generate方法基于给定的句子产生新的文本序列,其中temperature=temp控制了生成文本的多样性,do_sample=True开启采样而非贪婪解码,num_return_sequences=args.n_sample指定了每次生成的样本数量。
    • 生成的结果通过tokenizer.batch_decode转换回可读的文字形式,并被添加到outputs列表中。同时,原始句子也被重复添加到prompts列表中,次数等于生成的样本数。
  5. 异常处理
    • 如果在生成过程中发生任何错误,except块会捕获异常,使得程序能够继续处理下一个句子而不中断。
  6. 保存结果
    • 将所有生成的提示-响应对整理成一个DataFrame对象。
    • 最后,将这些数据保存为CSV文件,文件名包含了当前使用的温度值,以便于后续分析不同温度设置下模型表现的差异。
image-20241202175812702.png

这段代码的主要目的是通过调整top_p参数(也称为核采样或概率阈值)来探索不同设置下语言模型生成文本的行为。top_p是一种控制生成文本多样性和质量的方法,它基于累积概率分布选择词汇。具体来说,top_p定义了从当前词的概率分布中选择下一个词时考虑的最高概率词汇的累积比例。例如,如果top_p=0.9,那么系统将只从累积概率达到90%之前的词汇中进行抽样。

代码解释

  1. 条件检查与循环
    • if args.tune_topp: 检查是否启用了top_p参数调优。
    • for top_p in np.arange(0, 1.05, 0.05): 遍历从0到1.05之间以0.05为步长的top_p值。
    • top_p = np.round(top_p, 2) 将top_p四舍五入至两位小数,确保数值精度。
    • logging.info(f"Running topp = {top_p}") 记录当前运行的top_p值。
  2. 初始化与模型设置
    • 初始化两个空列表outputsprompts,用于存储生成的结果和对应的输入提示。
    • model.eval() 将模型切换到评估模式,通常意味着关闭dropout等训练特定的功能,以保证结果的一致性。
  3. 处理每条句子
    • 如果模型名称包含falconmpt,则直接使用句子的token ID作为输入调用model.generate函数。
    • 否则,先获取句子的嵌入表示(ground_truth_embeds),然后基于这些嵌入进行生成。
    • 使用tqdm(lines)遍历一系列句子,并显示进度条。
    • 对于每个句子,尝试执行以下步骤:
    • 在调用model.generate时,指定了max_new_tokens=100限制输出长度,top_p=top_p设定当前的top_p值,do_sample=True启用随机采样,以及num_return_sequences=args.n_sample指定每次生成的样本数量。
    • 生成的结果通过tokenizer.batch_decode转换成人类可读的字符串,并添加到outputs列表中;同时,原始句子被复制args.n_sample次并添加到prompts列表中。
  4. 异常处理
    • 通过try...except结构捕获可能发生的任何异常,确保即使某个句子生成失败,程序也能继续处理后续句子。
  5. 保存结果
    • 创建一个DataFrame对象results,其中包含两列:prompt(输入提示)和output(生成的文本)。
    • 最后,将结果保存为CSV文件,文件名中包含了使用的top_p值,便于识别不同的实验配置。

这种方法允许研究者分析不同top_p值如何影响生成文本的质量、多样性和相关性,从而帮助优化模型在特定应用场景下的表现。

image-20241202175858664.png

这段代码的主要目的是通过调整top_k参数来探索不同设置下语言模型生成文本的行为。top_k采样是一种控制生成文本多样性和质量的方法,它限制了在生成下一个词时考虑的词汇数量。具体来说,top_k定义了从当前词的概率分布中选取概率最高的前k个词作为候选词集,然后从中随机选择一个词进行生成。这种方法有助于减少低概率词被选中的机会,同时保持一定的多样性。

代码解释

  1. 条件检查
    • if args.tune_topk: 检查是否启用了top_k参数调优。
  2. 遍历不同的top_k
    • for top_k in [1, 2, 5, 10, 20, 50, 100, 200, 500]: 遍历一系列预设的top_k值列表。这些值代表了每次生成时考虑的最高概率词汇的数量。
    • logging.info(f"Running topk = {top_k}") 记录当前运行的top_k值,以便于跟踪实验过程。
  3. 初始化与模型设置
    • 初始化两个空列表outputsprompts,用于存储生成的结果和对应的输入提示。
    • model.eval() 将模型切换到评估模式,通常意味着关闭dropout等训练特定的功能,以保证结果的一致性。
  4. 处理每条句子
    • 如果模型名称包含falconmpt,则直接使用句子的token ID作为输入调用model.generate函数。
    • 否则,先获取句子的嵌入表示(ground_truth_embeds),然后基于这些嵌入进行生成。
    • 使用tqdm(lines)遍历一系列句子,并显示进度条。
    • 对于每个句子,尝试执行以下步骤:
    • 在调用model.generate时,指定了max_new_tokens=100限制输出长度,top_k=top_k设定当前的top_k值,do_sample=True启用随机采样,以及num_return_sequences=args.n_sample指定每次生成的样本数量。
    • 生成的结果通过tokenizer.batch_decode转换成人类可读的字符串,并添加到outputs列表中;同时,原始句子被复制args.n_sample次并添加到prompts列表中。
  5. 异常处理
    • 通过try...except结构捕获可能发生的任何异常,确保即使某个句子生成失败,程序也能继续处理后续句子。
  6. 保存结果
    • 创建一个DataFrame对象results,其中包含两列:prompt(输入提示)和output(生成的文本)。
    • 最后,将结果保存为CSV文件,文件名中包含了使用的top_k值,便于识别不同的实验配置。

这种实验方法允许研究者分析不同top_k值如何影响生成文本的质量、多样性和相关性,从而帮助优化模型在特定应用场景下的表现。通过改变top_k值,可以找到最佳平衡点,在保持一定多样性的同时提高生成文本的相关性和流畅度。

实验

然后我们就可以通过控制命令行参数来进行不同的实验分析

比如下图使用的是默认解码设置default decoding (temperature=0.1, top_p=0.9)

执行如下

image-20241124201837265.png
image-20241124202011932.png
image-20241124202211081.png

或者可以指定使用贪婪解码

image-20241124202026596.png
image-20241124202155871.png
image-20241124202421015.png

也可以自动调整不同参数从而方便对比分析

image-20241124202257450.png
image-20241124202439789.png
image-20241124202859792.png
image-20241124203515546.png
image-20241124221219826.png

执行完毕后就可以分析统计数据

image-20241202180218025.png
image-20241202180226988.png

这里展示的都是一些统计结果

image-20241202180252985.png
image-20241202180300530.png

结论

当我们用以上代码进行系统性分析与评估时,我们发现,通过简单地移除系统提示,攻击成功率显著增加,通常超过10%。

系统提示的存在在维持对齐输出中起着关键作用,特别是对于那些没有经过安全调整的模型。在这种情况下,移除系统提示可能导致ASR增加超过50%。然而,即使是对于具有明确安全对齐的模型,即LLAMA2模型,移除系统提示后ASR仍然会增加。

另外我们发现利用不同的解码策略可以进一步提升ASR。接下来,我们探讨了通过使用不同的解码策略来增强ASR的可能性。下表是在系统提示下展示了不同解码策略的结果。

image-20241202180642886.png

可以看到使用不同的解码策略确实可以提升性能。

image-20241202180721779.png

另外,在上表当中总结出了每个模型最脆弱的解码策略,这表明不同的模型对不同的解码策略最脆弱,不同的恶意指令通过模型在不同的解码策略下产生不对齐的输出。此外需要注意,尽管使用固定的解码配置通常会导致LLAMA-CHAT模型的ASR低于30%,但使用多样化的配置可以将ASR显著提高到超过80%。这说明之前的研究工作采用的固定生成策略来评估模型对齐显著低估了实际风险。

这些都对后续的越狱攻击研究都很有价值。

参考

1./

2./@sasirekharameshkumar/red-teaming-to-make-llms-robust-and-safer-1c3bc1d0f6fa

3..07689

4..06987

本文标签: 面向大模型的生成