关于从大型语言模型中提取专业代码能力的可行性研究

互联不一般哥 2024-07-18 02:01:06

On Extracting Specialized Code Abilities from Large Language Models: A Feasibility Study

引用

Li, Zongjie, et al. "On extracting specialized code abilities from large language models: A feasibility study." Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024.

论文:https://arxiv.org/pdf/2303.03012

仓库:https://sites.google.com/view/saellcm/main.

摘要

大型语言模型(LLM)的最新进展在软件工程中应用广泛,但训练高性能LLM需要大量数据和昂贵的GPU资源。商业LLM的高价值使其成为模仿攻击的目标,但创建相似参数的模仿模型成本仍然很高。因此,本文方法探索了使用中型模型对商业黑盒LLM进行切片的方法。本文方法的研究显示,通过合理数量的查询,可以训练一个中等规模的模型复制目标LLM的专门代码行为,从而揭示了LLM模仿攻击的实际威胁。

1 引言

近年来,大型语言模型(LLM)的开发取得了显著进展,推动了它们在软件工程中的广泛应用。主要企业如OpenAI部署了他们的LLMapi,帮助开发者更准确、更高效地编写代码和文档。通过利用带有自然语言注释的大型代码语料库,这些模型提高了计算机编程的效率。高级LLM被用作“AI编程助手”,处理各种代码相关任务,包括帮助编写自动脚本、提供代码注释、发现漏洞和进行克隆检测等。

一些如ChatGPT的LLM具备更高的互动能力,可以从与人类的互动中学习,在对话中提高性能,从而更有效地发现和修复传统工具难以检测的错误。尽管LLMapi越来越受欢迎,但训练一个高性能的LLM需要大量的数据收集和注释工作,以及大量的GPU资源。因此,尽管一些模型架构是公开的,但模型权重和训练数据被视为模型所有者的知识产权(IP),具有很高的商业价值。

近期研究表明,计算机视觉(CV)和自然语言处理(NLP)模型容易受到模仿攻击(或模型提取攻击),即对手通过发送精心设计的查询并收集响应来训练本地模型,模仿目标模型的行为。乍一看,对商业LLM进行模仿攻击似乎不切实际,因为对手需要准备一个具有类似参数的模仿模型,成本高昂。然而,与LLM的广泛功能相比,开发者通常只需要其中的专门子集,如代码翻译和摘要。因此,探索使用中型骨干模型对商业LLM进行切片是一个实用且新颖的方向。

本文方法的目标是演示使用中型主干模型提取LLM的特定代码能力的高可能性。例如,攻击者可能特别关注从LLM中提取“代码翻译”能力,这允许LLM将源代码从一种编程语言翻译到另一种语言。这种能力在软件开发行业中具有很高的价值,并已广泛应用于商业产品中。模仿攻击还允许用户避免与第三方提供商共享他们的代码片段,通过局部部署的中型主干模型从LLM中提取的专门模仿模型实现这一目标。

提取特定代码能力带来了独特的技术挑战。根据具体任务,LLMs可以处理自然语言(NL)或编程语言(PL)的输入,并相应地生成NL/PL输出。此外,现代LLM通常可以在不同上下文或思想链提示下工作,增加了确定LLM攻击面的难度。考虑到代码相关任务的复杂性和输出的潜在模糊性,目前尚不清楚如何利用目标LLM的输出来提高模仿模型的性能。

本文方法首次系统且实际地研究了使用通用中型模型从LLM中提取专门代码能力的有效性。为解决上述技术挑战,本文方法设计并实施了对LLM的全面模仿攻击,涵盖所有三个代码相关任务和不同的查询方案。本文方法开发了几种方法来细化LLM的输出,使模仿模型的训练更有效,如CodeT5和CodeBERT。最终,本文方法证明了模仿模型可以促进关键的下游任务,如对抗性示例生成。

实验结果表明,模仿攻击对代码相关任务的LLM是有效的,模仿模型的性能超过了目标LLM(平均提高10.33%)。此外,不同任务的查询方案影响存在显著差异(从4.94%到62.83%)。提供足够上下文的查询通常会提高所有任务的性能,而思想链提示仅对代码合成有显著帮助,这强调了选择适当查询方案的重要性。

本文方法还探讨了不同超参数的影响,发现查询数量和上下文示例显著影响性能(从41.97%到115.43%)。本文方法建议对代码相关任务使用三个上下文示例来平衡有效性和成本。此外,本文方法证明了模仿模型可以帮助生成对抗性示例,比现有最先进模型多发现高达9.5%的对抗性示例。最后,本文方法展示了本文方法的方法在不同LLMapi上的普遍性,例如在gpt-3.5-turbo上训练的模仿模型达到了在文本-davinci-003上训练模型的92.84%。

综上所述,本文方法的贡献如下:

首次系统研究了LLM的代码知识切片上的模仿攻击的有效性。本文方法的研究包括三种具有代表性的查询方案和不同的代码相关任务,并设计了几种方法来细化LLM输出,提高模仿模型的训练有效性。本文方法制定了5个研究问题(RQs),全面评估对LLM的模仿攻击的有效性及其潜在的下游应用,如对抗性示例生成,并汇总了结果和观察结果。

2 方法实现

本文的目标是使用中等规模的骨干模型发起模仿攻击,从LLM中提取代码知识的“切片”。这一任务具有挑战性,因为LLM可以通过多种方式进行查询,因此需要探索各种查询方案。LLM强大的上下文理解能力和跨任务的灵活性增加了对其攻击表面进行基准测试的复杂性。具体来说,LLM在提供较少示例的情况下,依然能够高效理解下游任务,同时展示了复杂的推理能力。因此,系统地将LLM的攻击面与模型提取进行基准测试具有很高的挑战性和成本。

本文的方法包括四个阶段:(1) 查询生成,(2) 响应检查,(3) 模仿模型训练,(4) 下游应用。首先,根据不同的代码任务和查询方案生成LLM查询。然后,使用基于规则的过滤器检查LLM响应的正确性和质量。通过过滤器的高质量响应用于训练模仿模型。接下来,通过使用这些高质量响应微调中等大小的骨干模型来训练模仿模型。最后,使用模仿模型进行各种下游应用,如提供竞争性服务和生成对抗性示例。本文将详细描述每个阶段。

3 模拟查询生成

根据初步测试,查询方案和及时的质量对引出LLM的输出有显著影响。为充分利用这种攻击的可能性,本文对以下三种查询方案进行了基准测试,并将查询分解为两部分:问题头和问题体,前者因任务而异,后者可从代理数据集收集。

1. 零样本查询(ZSQ):此方案中,攻击者迭代使用每个问题查询目标LLM,无需上下文信息,直接收集响应用于训练模仿模型。ZSQ适用于几乎所有分类和生成任务,本文方法也遵循此方法准备查询。

2. 上下文查询(ICQ):研究表明,提供上下文信息显著提高LLM性能。因此,本文方法也考虑此方案。具体来说,每个问题与问题头一起提供几个示例作为上下文。选择合适数量的示例对于模型理解任务至关重要,过少或过多都可能影响效果。本文方法在研究中探讨了其影响。

3. 零样本CoT(ZS-CoT):与依赖手工提示不同,ZS-CoT的核心思想是添加提示句子,如“让我们一步步地思考”,以提取模型中的推理过程。本文方法将ZS-CoT视为两步提示过程,并在实验中调整答案触发模式以适应不同任务。例如,在代码翻译任务中使用“因此,翻译的C#代码是”,在代码摘要任务中使用“代码摘要是”。

即使使用精心设计的过滤系统,确保推理过程的正确性仍然困难,因为代码相关任务开放性强,比NLP推理任务更具挑战。本文方法评估了每个任务生成的推理过程,但未考虑上下文CoT(IC-CoT),因为为代码相关任务构建适当的思维链推理过程比算术或符号推理任务更困难。

3.1 响应检查方案

如前所述,应该对收集到的响应进行细化,以达到训练模仿模型的高有效性。也就是说,当攻击者从llm接收到响应时,最好在将其添加到训练数据之前首先执行一个检查。这可以通过帮助攻击者识别和排除质量较差的内容来提高数据集的总体质量,从而提高响应的平均质量。此外,修剪训练数据可以降低模仿模型的整体训练成本。

为了处理可能同时产生NL和PL输出的llm,本文方法为每个输出设计了不同的过滤规则。对于NL输出,本文方法计算长度,并丢弃低于或高于预定义阈值的任何文本。按照CodexGLUE中的设置,上限设置为256,下限设置为3。

对于PL输出,本文方法只保留那些通过解析器进行语法检查的输出。为此,本文方法使用树生成器,这是一个可以解析不完整代码片段的解析器生成器工具。与特定于语言的编译器或解释器(例如,Python的CPython)不同,树处理器支持大多数主流语言3和一个统一的接口,这使得它很方便地适应各种pl。此外,树处理器为不正确的代码语法提供了错误消息,这使本文方法能够计算失败的次数,并进一步调查它们背后的原因。

3.2 模拟模型训练

与之前的模仿攻击类似,通过响应选择模块的答案被认为是高质量的答案,并用于训练模仿模型。Treesitter版本0.20.7现在支持113种不同的编程语言。与代码相关的目标llm是本文方法模仿攻击的焦点。然后,本文方法解释了所使用的评价指标和训练模仿模型的过程。

目标llm。除非另有说明,本文方法在所有实验中使用OpenAI‘stext-003作为受害者LLM,因为它在之前的研究中被广泛使用,支持了其有效性和可靠性。在本文方法的评估中,本文方法通过使用另一个名为gpt-3.5-turbo的LLM API对其进行评估,进一步证明了本文方法的攻击的通用性。

表2: 被评估的任务和数据集。CSyn、CT和CSum分别表示代码合成、代码翻译和代码摘要。CSN表示代码搜索网络数据集。Dproxy和Dref是代理和参考数据集。

目标LLM任务。在详细介绍过滤规则之前,本文方法在本研究中介绍了目标LLM任务。从输入和输出类型的变化中提取出来,本文方法选择了三个具有代表性的任务:代码合成、代码翻译和代码摘要。重要的是,本文方法的模仿攻击并不仅限于这些任务。这里使用了两个数据集,Dproxy和Dref来模拟提取过程。对手只允许使用代理数据集的训练分割来构造查询。另一方面,参考数据集Dref被认为是对手无法访问的。为了建立比较的基线,骨干模型将在两个数据集上进行训练,以形成Mproxy和Mref。

代码合成(CSyn)。本研究中的CSyn指的是一项“NL-pL”任务,其目的是基于NL描述生成特定的程序。如表2所示,本文方法使用CONALA作为此任务的代理数据集,其中包含2,879个注释,以及从堆栈溢出中手动收集的相应的Python3解决方案。由于输入令牌长度的限制,本文方法没有使用在线判断数据集,如代码测试。

代码翻译(CT)。作为一项“PL-PL”任务,CT涉及到将遗留软件从一种语言迁移到另一种语言。如表2所示,本文方法使用XLCOST作为代理数据集,使用CodeXGLUE作为参考数据集,其中用共享相同功能的Java和c#编写的代码片段配对在一起。本文方法选择Java作为源语言,并选择c#作为目标语言。

代码汇总(CSum)。作为一个“PL-NL”任务,CSum生成一个NL注释,以总结给定PL片段的功能。如表2所示,本文方法重用DualCODE数据集作为代理数据集。本文方法分别使用Dproxy和Dref来表示代理数据和参考数据集。

3.3 AE生成

声发射生成已成为提高模型鲁棒性的常用技术。然而,有效地发现不良事件对于高级模型仍然是一个挑战性。为了解决这个问题,本文方法演示了使用模仿模型来增强代码相关任务的AE生成的可行性。与之前的方法对现代llm的不足相比(详见表6),本文方法使用模仿模型的方法允许在近似白盒设置中生成AEs。具体来说,给定手头的Mini,本文方法依赖注意力分数来定位输入提示符中的敏感标记,然后应用几个语义等价的转换(从CCTest的代码库推导和扩展)来迭代地突变这些敏感标记,直到在Mimi上生成AEs。然后将这些产生的ae反馈给远程受害者LLM,以测试它们是否会导致故障。

为了演示,本文方法将本文方法的方法应用于代码摘要(CSum)任务中,一个成功的AE意味着代码输入中的微妙突变导致一个巨大的、不正确的摘要。本文方法通过两个步骤生成潜在的AEs:(i)识别最敏感的标记,(ii)对这些标记应用语义等价的转换传递。为此,本文方法从一个输入序列X开始,并使用其原始注意力评分Attori生成输出序列(代码摘要)。接下来,本文方法用[MASK]迭代替换每个标记,并使用相应的注意力分数Atti重新生成摘要。然后,本文方法通过计算每个令牌的Gapi=Atti−Attori来量化差距分数。最后,本文方法根据所有标记的间隙分数进行降序排序,以找到最敏感的标记。然后,本文方法检查每个top-k敏感标记,并决定它是否满足CCTest提供的任何转换传递。如果是这样,本文方法就应用这个变换来生成潜在的声发射。

4 实验结果

4.1 RQ1:模仿攻击的有效性

为了回答RQ1,本文方法研究了本文方法对三个代码相关任务的有效性: CSyn、CT和CSum。如第2节所述。在4.3和表2中,本文方法使用代理数据集对目标LLM启动查询,并验证了模仿模型在参考数据集上的性能。

表3给出了本文方法的模型提取攻击的主要结果。Mproxy和Mref列显示了两个基线设置,其中主干模型分别直接在代理数据集和参考数据集上进行训练。Mimi列报告攻击精度,而API列显示LLM性能。需要注意的是,Mproxy、Mref和Mimi具有相同的模型架构(CodeT5基或Codebert基),并且它们的训练数据集大小相同。本文方法在同一个测试数据集上测试了所有三个模型,并从所有三种查询方案中选择了最佳性能。每个单元格中的值表示自然语言文本的BLEU分数和编程语言内容的CodeBLEU分数。此外,由于所有三个模型(以及LLMapi)都是使用参考数据集的测试分割来评估的,因此可以合理地观察到Mref(使用同一数据集的训练分割来训练)在所有三个任务中始终获得最佳性能。

从表3中可以明显看出,模仿攻击是非常有效的。首先,CSyn和CT任务的性能非常有希望,因为模仿模型Mimi在CodeT5和CodeBert上分别平均比Mproxy高出57.59%和56.62%。请注意,代理数据集由一组输入-输出元组组成,而Mimi则是使用来自LLM API的相同的输入和相应的输出来进行训练的。因此,本文方法将Mimi优于Mproxy的优势归因于LLMapi提供了高质量的代码片段作为输出,这进一步提高了模仿模型的性能。此外,Mproxy在所有三个任务上的表现始终最差,这表明llm提供的输出值很高。

表3:模仿攻击的主要结果

当模型使用公开可用的资源进行训练时,它们在不同的数据集上进行测试时可能表现不佳,表3的Mproxy列的结果得到了证明。这就是为什么对手可能会求助于提取llm的原因之一。令人鼓舞的是,本文方法发现,用LLMapi提取的知识增强模仿模型Mimi,在CSyn和CT任务中都能大大优于基线模型Mproxy,在CodeT5和CodeBert上分别平均提高了140.3%和170.8%。此外,本文方法观察到一些非常有希望的结果,即Mimi甚至可以在CT和CSum任务上优于LLMapi,这证明了本文方法的模仿模型的总体有效性。

表4: 使用不同的查询方案的攻击效果。CBLEU表示CodeBLEU度量

发现1:通过中型主干模型提取llm的专门代码能力对于具有代表性的代码相关任务是有效的。在这些专门的代码能力方面,经过训练的模仿模型获得了比原始llm更好的性能。

4.2 RQ2:不同的查询方案的影响

模拟性能。从列出的结果中,本文方法可以发现ICQ在CSum和CT任务上都比其他方案具有更好的性能。其中,与ZSQ和ZS-COT相比,ICQ对CSum的BLEU评分分别提高了62.83%和36.91%。这些发现表明,结合上下文信息可以通过提供更准确的答案,极大地提高模仿训练的质量。本文方法注意到,这一发现与之前的研究相一致,后者强调了上下文在自然语言处理任务中的重要性。

此外,ZS-COT在CodeT5的CSyn任务上的CodeBLEU得分为24.84,比ICQ高出4.94%。本文方法进一步比较了CodeBLEU中的四个子分数,发现ZS-COT的语义数据流匹配得分DF_Score为40.65分,比ICQ方案高出24.12%。为了探究本文方法的发现的根本原因,本文的两位作者手动检查了每个任务的150个ZS-COT响应。令人惊讶的是,只有7个(4.6%)应答提供了CSum有意义的理论基础。对于其余的回答,ri的基本原理与最终的回答ai相同,这表明ZS-COT花费了大量的资源,但获得的有用信息有限。

故障率。为了全面了解查询方案的影响,本文方法还探讨了生成的内容之间的差异。前文中本文方法计算了文本和代码片段中的失败次数,并返回失败率rf%。对于CSum任务,所有方案都具有较低的失败率(小于0.2%),而CoT的失败率略高,因为它可能包含了最终内容中超过上界的额外推理步骤;它还可能生成一个低于下界的过于简洁的总结。此外,与ZSQ和ICQ相比,CSyn上的ZS-COT的故障率明显较高,为4.62%。这意味着思维链可能不太适合用于旨在生成代码片段的任务。需要注意的是,这三种方案在CT上都表现出很高的失败率(25%),这是由于CT任务的性质。前文中本文方法在函数级将Java程序转换为c#程序,这减少了一些关键信息。为了通过经验证实这一点,本文方法在参考数据集的测试分割上重复了相同的语法检查实验,结果显示其失败率相对较高,为17%。

响应检查的影响。前文中本文方法设计了一种响应检查算法来去除低质量的响应。在这一步中,本文方法探讨了它对CSum任务的影响。本文方法报告说,当启用该算法时,本文方法的方法可以将CodeT5和CodeBERT的训练时间分别降低约34.81%和14.98%。此外,模仿模型的性能最大仅下降了4%。

发现2:查询方案对模仿攻击的性能有重大影响。用合适的模板设计来构建查询方案是至关重要的。具有足够上下文的查询通常会增强对所有任务的攻击,而CoT只显示了代码合成的显著增强。

4.3 RQ3:超参数的影响

为了回答RQ3,本文方法需要研究超参数的影响。为此,本文方法将探讨以下三个方面: 1)受害者模型参数,2)上下文中的示例的数量,以及3)已发布的查询的数量。

受害者模型参数。根据OpenAI的说法,text-davinci-003主要提供两个参数来控制其生成的输出:temperature,它表示选择不太可能的令牌的倾向;和topp,它在生成的每一步控制可能令牌集合的采样。为了确定这些参数的适当值,本文方法以所有25种组合(5temperature×5topp)提示text-davinci-003。本文方法在这一步中使用CSum任务,并查询这25组组合,然后将响应与地面真实答案进行比较,以计算出BLEU分数。

图3: 超参数的影响(RQ3)。

图3:(a)报告了评价结果。对于每个设置,本文方法发出50个查询,收集LLM产生的答案,并将它们与地面真相进行比较(对于CSum,地面真相是用于代码摘要的自然语言片段)。如果答案的相似度得分高于平均值,则认为通过了检查,否则视为失败。本文方法计算传递的答案的数量,并将它们呈现在每个单元格中。这两个超参数的边值都会使性能明显下降。在整个实验中,最佳参数分别为topp= 0.5和temperature= 0.5。

表5: 在不同数量的上下文示例下的攻击性能。T5和CB分别代表CodeT5和CodeBERT

结果如表5所示,表明性能水平随着#上下文中示例的增加而升级,并在E=4时达到峰值。然而,在性能上的改进和伴随的成本之间存在着差异。尽管性能随着时间的推移以下降的速度逐渐提高,但保持最佳性能会导致成本线性增长。这是因为添加的每个新示例都需要为所有查询提供与该示例关联的额外令牌,即使是那些已经完成了令人满意的性能的查询。考虑到这种权衡,对手必须仔细评估他们的选择。为了模仿,本文方法建议将例子数固定为3。本文方法认为这是一个合理的权衡,对手愿意接受在实现。

评价结果如图3(b)所示,其中T5和CB分别代表CodeT5和CodeBERT。由于空间有限,本文方法报告了CSyn任务的评估结果。简而言之,当对手收集的数据集的大小等于模型所有者的训练数据集时,模仿模型超过了在代理数据集上训练的模型(“T5/CB-代理-full”),并获得了与在参考数据集上训练的模型相当的性能(“T5/CB-ref-full”)相当的性能。这清楚地表明了进行模仿攻击的价值,因为在现实世界中的对手通常面临着缺乏适当的训练数据的问题。本文方法注意到,对于CSyn任务,越来越多的查询可以帮助解决数据不足的问题并提高性能。只有5%的查询,本文方法对收集的数据训练的模拟模型Mimi在Mproxy上比CodeT5上可以显著提高41.97%的性能,性能不断提高,达到115.43%的峰值。

发现3:输出/采样超参数对攻击性能有可观察到的(但不显著)的影响。相比之下,#查询和#上下文内的示例会显著地影响攻击性能。

转述:沐燕舟

0 阅读:23
评论列表
  • 2024-07-18 06:05

    只要代码都是中文,说明华夏真正的强大了。

互联不一般哥

简介:感谢大家的关注