前言
原始论文:https://ai.meta.com/research/publications/llama-guard-llm-based-input-output-safeguard-for-human-ai-conversations/
论文github: https://github.com/facebookresearch/PurpleLlama/tree/main/Llama-Guard
最近meta出了一篇内容风控相关的论文,这里精读这篇论文,希望能借鉴其思路应用于个人项目中。
摘要
适用场景:针对人工和AI的对话场景, 判断对话是否包含违规内容及判断违规类别。这里也能将这种思路迁移到其他的内容风控场景。
主要贡献:
- 提出一个针对交互式AI安全风险的分类模型,命名为Llama Guard。
- 开源了Llama Guard模型的权重,(这里没有开源数据)。
- 针对提出的安全风险分类法进行了数据集标注和模型微调。这使得用户可以根据特定使用场景自定义模型输入,以适应其他适用的分类法。
- 对LLM的输入和输出(即人工输入和模型回复)提供了不同的prompt。因此,Llama Guard能够捕捉到用户和模型回复之间的语义差异。通过利用LLM模型遵循指令(follow instructions)的能力,在单个模型中实现了这一点。
- 微调后的模型增强了模型能力,文章展示了Llama Guard通过零样本和少样本提示以及进一步微调适应新的分类法的能力,这种适应能力比从零开始训练新模型更为高效
这里我觉得值得借鉴的点主要是文章对微调数据集的构建prompt,及使用few-shot且不微调后的指标,证明只使用few-shot也能有效的解决问题。
风险类别构建
本文目的是建立自动的模型输入输出保护机制,所以需要分类器实时对内容进行判断。并具备以下2个组件:
- 关注的风险类别,这些将成为分类器的类别。
- 风险准则,需要确定每个风险类别中什么鼓励输出,什么不鼓励输出。
由于没有统一的标准(在做内容风控的时候我们也面临这个问题),文章基于LLM的输出通常需要考虑的风险类别基础上,构建了一个样本分类法。
该分类法主要聚焦于通用性而非全面衡量模型缓解所有潜在风险的有效性。
样本类别
文章提供了以下的示例风险类别:
类别 | 简介 |
---|---|
暴力和仇恨 | 包含鼓励或帮助人们计划或参与暴力或仇恨言论的语句 |
性内容 | 包含鼓励未成年人参与特定性行为或包含性暴露内容 |
枪支和非法武器 | 包含鼓励、宽恕或帮助人们计划或执行涉及非法获取、制作或使用枪支或非法武器的具体罪行 |
受监管或控制的物质 | 包含鼓励或帮助人们非法生产、转移或消费受控物质如非法药物、烟草、酒精或大麻 |
自杀和自残 | 包含鼓励、宽恕或帮助人们伤害自己的语句,包括提供自残方法或信息 |
犯罪计划 | 包含鼓励、宽恕或帮助人们计划或执行其他具体犯罪活动如纵火、绑架或盗窃 |
模型训练
微调指令数据集构建
如下图所示,Llama Guard的微调数据定义了如下四个主要成分(这里对图片做注释)。
一组指南:每个任务都输入一套指南,包含编号的违规类别及其描述,模型只根据这些类别及其描述进行安全评估。
分类类型:每个任务指示模型需要分类用户消息还是AI模型消息。
对话:每个任务包含用户和AI模型交替的对话,可以是单轮或多轮。
输出格式:每个任务指定所需的输出格式,决定了分类问题的性质。在输出格式中,Llama Guard首先输出“安全”或“不安全”,如果是“不安全”,则输出违反的类别
zero-shot and few-shot
其次,针对未出现的类别,可以使用zero-shot和few-shot的能力,在few-shot时,在prompt中为每个类别包含2至4个示例
需要注意的是,安全示例需要是hard negatives即对模型预测造成困难的负样本,即容易被错分成正样本的负样本。这类样本与正样本具有高相似度,因此模型难以区分它们,导致分类错误。
数据收集
详细步骤
数据收集的详细过程如下(这个过程也可以借鉴一下):
- 从Anthropic的harmlessness人类偏好数据集中挑选出第一个human prompt,并丢弃所有回复,构建一个初始的单轮提示数据集。
- 使用内部Llama checkpoints 生成与这些提示对应的合作式回复和拒绝式回复。
- 标注团队根据第2节定义的类别对提示-响应对进行标注,包括prompt-category、response-category、prompt-label(安全/不安全)和response-label(安全/不安全)。
- 在标注过程中进行数据清洗,删除格式错误的输入或输出示例。
- 最终的数据集包含13,997个提示和回复,以及它们的标注。
- 将数据按3:1的比例随机拆分为训练集和评估集。
最终收集数据量
最终收集的数据如下表所示,可以看出类别数据最多的为犯罪计划(包括4000左右的用户输入及回复),最少的为自杀和自残(只包括不到100条的输入和回复)
训练细节
模型基础:为了对用户更友好,Llama Guard基于Llama2-7b模型构建。
训练设备:使用单个机器上的8xA100 80GB GPU进行训练,batch size为2,序列长度为4096,采用模型并行度为1。
训练步数:训练500 steps,相当于约1个epoch。
数据增强:希望当只包含完整分类法中的部分分类时,安全评估只考虑被包含的分类。
第一种方法是,如果当前例子没有违反某些分类,就随机从模型提示中随机丢弃一些分类。(这一步我理解为在prompt中减少类别可作为一条新的数据)
第二种方法是,从输入提示中删除所有被违反的分类,并将该例子的标签改为“安全”。在训练示例之间随机打乱分类索引(同时相应修改所需输出),以防止模型记忆输入格式。
这两种数据增强方式很巧妙,值得借鉴。
实验分析
由于每个数据集都有独特的分类体系,导致评估模型质量变得困难,出于这个原因,我们在两个方向上评估模型:
- 根据分类数据集来衡量绝对性能;
- 适应其他分类类别的方向。由于 Llama Guard 是一个 LLM,使用零样本和少样本提示,并使用适用于数据集的分类法进行评估。
为了对不同数据集有一个全面的评估,对不同的数据集采用不同的3种评估设置
- Overall binary classification for APIs that provide per-category output 分类模型在任何一个类别下预测为正,则为它分配一个正标签。
- Per-category binary classification via 1-vs-all. 为每个类别运行一个分类任务。
- Per-category binary classification via 1-vs-benign 对于具有固定类别输出头的内容审核工具,在非策略设置中,没有直接的方法将每个头部的分数分配给目标类别。
评价指标
这里使用AUPRC(the area under the precision-recall curve)指标。AUPRC 专注于精度和召回率之间的权衡,突出了模型在正(“违规”)类上的性能。ROC 在评估通用分类时很有用,而 AUPRC 在对罕见事件进行分类时是更好的方法。
结果评估
总体结果如下表所示: LLama Guard在自有数据集上大幅领先OpenAI API,在公开数据集上小幅领先OpenAI API。在自有的6个数据分类下大幅领先,有些类别其余模型几乎不能分别,例如受监管或控制的物质上**,**这里比较奇怪的是在色情的分类上,OpenAI Mod只有0.23分。
自有数据集上的6个类别上的指标对比:
模型的适应性
从下图可以看出,在OpenAI-Mod 数据集上的结果表明,仅通过prompt来适应新的类别是有效的,并且与微调相比成本更低。
如下图所示: Llama Guard对 Toxic数据集中分类的适应性比Llama2-7b更好。
Llama Guard 只需要 20% 的 Toxic 数据集就可以与在 100% 的 Toxic 数据集上训练的 Llama2-7b 相媲美。这个也能理解,毕竟拿精调的数据已经微调过。
模型局限性
- 微调后的模型受到其训练数据的限制(尤其是预训练),可能会产生错误的判断,尤其是当涉及到与其预训练数据相关的知识时。
- 多语言的限制,Llama几乎只对英文生效,但我们可以使用其他基座模型进行微调。
- 虽然微调数据的质量较高,但覆盖面不足。
- 训练 Llama Guard 的用例是分类,输出空间相当有限。Llama Guard 作为 LLM,可以续写任何文本。特别是,它可能被更广泛的公众使用。我们在 Llama Guard 上使用我们的内部专家进行了red teaming(一种安全测试方法,通常用于模拟对手或攻击者的行为,以检测系统中的安全漏洞)。
- 当作为聊天模型时,可能会生成可以被认为是不道德或不安全的语言,这主要是由于缺乏对聊天用例的安全微调。
总结
总体而言,在内容风控上有一定的借鉴意义,具体的效果等后续使用后进行评价。