掌桥专利:专业的专利平台
掌桥专利
首页

一种基于上下文学习和大语言模型的Solidity注释生成方法

文献发布时间:2024-04-18 19:59:31


一种基于上下文学习和大语言模型的Solidity注释生成方法

技术领域

本发明涉及软件工程技术领域,尤其涉及基于上下文学习和大语言模型在注释生成领域的应用。

背景技术

智能合约是运行在区块链技术上的自动执行的数字合约。它们在没有中介机构的情况下自动化、验证和执行协议条款,从而提供了透明度和安全性。然而,研究发现,大多数智能合约代码注释都不可用,这使得开发人员很难理解代码的逻辑、目的和预期功能。此外,智能合约也很容易受到漏洞的影响,因为智能合约代码中使用到大量的代码克隆,而在之前的一项研究中发现10%的漏洞是由代码克隆引起的。如果智能合约代码缺乏解释潜在风险的注释,那么就很难识别和解决安全漏洞,这可能会增加黑客攻击的机会。

基于以上分析,为智能合约代码自动生成简洁流畅的注释变得极为重要。目前在智能合约领域,深度学习方法和信息检索方法都有很好的表现。然而,对于基于微调范式的深度学习方法,性能可能会受到下游任务收集的数据集质量的限制,存在知识遗忘问题,这会降低训练模型的泛化性。而对于基于信息检索的方法,如果在历史存储库中不存在类似的智能合同代码,它们就很难生成高质量的注释。因此,急需一种不依赖于微调范式,并且可以自主生成新注释的方法来解决上述问题。

在期刊计算机系统应用中的论文《基于神经网络和信息检索的源代码注释生成》也提出信息检索方法的弊端,为了生成高质量的注释,他们将信息检索作为信息增强使用,以此提高深度学习方法的性能。然而这种混合方法仍然依赖于数据集的质量,且知识遗忘和泛化能力差的问题没有得到根本解决。

本发明希望利用大型语言模型的新兴能力(如零样本学习和上下文学习)来解决这些问题。大语言模型已经经过了大量数据预训练,并拥有丰富的隐藏领域知识,可以自动生成智能合约注释。然而,仅仅利用大语言模型而不有效地利用其相关的领域知识可能不会产生最佳的结果。

如何挖掘出大语言模型在特定领域的潜在知识成为了本发明需要克服的问题。

发明内容

本发明的目的在于提供基于上下文学习和大语言模型的Solidity注释生成方法,该方法克服了信息检索方法不能生成新注释的缺陷,解决了深度学习方法知识遗忘和泛化能力不足的问题,本发明通过检索策略,提供高质量示范构成上下文学习,帮助大语言模型挖掘潜在领域知识,无需训练自动生成更为高质量的Solidity代码注释。

本发明包含三个阶段:在第一阶段演示选择阶段采用了一个定制的两阶段检索策略。该策略允许我们从一个历史语料库中检索前k个高质量的演示示例,并考虑到代码片段的语义、词汇和语法信息。随后,在上下文学习阶段,我们利用这些检索到的k个演示来构建一个定制的提示模板。通过整合这些演示,构成上下文学习,有效地利用大语言模型中与智能合约注释生成相关的知识。一旦构建了提示模板,我们就会继续进入大语言模型推理阶段。在这里,我们直接利用大语言模型的接口,提供自定义的提示模板和目标代码片段作为输入。然后,无需任何训练由大语言模型直接生成给定代码片段的相应注释。

本发明是通过如下措施实现的:基于上下文学习和大语言模型的Solidity注释生成方法,其中,包括以下步骤:

(1)在Etherscan.io社区收集数据,构成原始语料库。由于语料库中存在大量重复和模板数据导致其质量下降,因此采取预处理操作删除低质量的数据对,使用<代码,摘要>对的形式来标识数据。最后筛选出29,720个<代码,摘要>对作为实验对象。具体预处理操作包括如下步骤:

(1-1)首先根据以往研究,删除过短的代码函数,例如函数部分少于4个单词的代码;

(1-2)为防止语料库存在过拟合情况,删除代码完全相同的代码对;

(1-3)发现拥有不同语义的代码片段,却对应重复的注释,这会导致数据集在检索时出现低质量的示范。使用drop_duplicates函数完成注释去重;

(1-4)发现存在模板数据,即由智能合约开发工具自动生成,或开发人员直接进行代码克隆得到的。因此直接删除语料库中严重的模板数据;

(2)为大语言模型提供有效的演示示范,可以有效提高其在特定问题上的性能。选择一种结合代码语义、词汇和语法的示范选择策略,从语料库中检索出与目标智能合约Solidity代码最相似的前k个代码及其对应注释作为示范,具体包括如下步骤:

(2-1)针对目标代码,首先根据CamelCase命名约定进行数据处理,将得到的序列用代码预训练模型CodeBert进行语义信息学习,从而生成对应的语义向量表示。

(2-2)使用白化操作进一步处理得到的语义向量,通过提取其中的关键特征,使其空间维度降低。接着计算目标Solidity代码与语料库训练集中所有其他语义向量之间的L2距离,推导出语义相似度;最后检索出语义相似度最高的前n个Solidity代码片段和其对应注释。

(2-3)额外考虑目标Solidity代码的词汇和语法信息,从而实现更为准确的检索。首先借助集合表示目标Solidity代码和示范Solidity代码的令牌。接着基于代码序列,我们去除重复的令牌,得到两个令牌集。最后根据令牌集之间的Jaccard相似度得到Solidity代码的词汇相似度。

(2-4)将目标Solidity代码和示范Solidity代码转化为抽象语法树序列。为了更好的表示抽象语法树的结构,使用SimSBT方法为每个抽象语法树生成新序列。计算新序列之间的编辑距离,得到Solidity代码的语法相似度。

(2-5)通过融合比例,将Solidity代码的词汇相似度和Solidity代码的语法相似度融合计算,从前n个示范中,进一步选取出更为相似的前k个示范,完成示范的选取。

(3)将检索出的前k个最相似示范与特定的提示词结合,形成提示模板。提示模板中的演示示范和提示构成上下文学习,可以有效挖掘出大语言模型在Solidity智能合约领域的潜在知识,具体包括如下步骤:

(3-1)首先进行自然语言提示词的构造,告知大语言模型的任务目标为Solidity代码注释生成。利用“short”,“in one sentence”等单词限制生成的注释长度,并通过“Toalleviate the difficulty of this task,we will give you top-k examples.Pleaselearn from them”帮助大语言模型捕获上下文中的示范。

(3-2)接着进行代码示范,这部分使用“#”分隔每个示范Solidity代码和示范注释,易于大语言模型捕获对应的信息。

(3-3)最后进行目标Solidity代码的输入,使用“The length should not exceed”在提示的末尾进一步限制生成注释长度,以避免生成过于冗长的代码注释,其中是检索到的最相似代码的对应注释。

(4)直接调用大语言模型API,将调用代码与提示模板结合,无需任何训练,就可以利用大语言模型API接口直接生成Solidity代码注释;本发明选用OpenAI提供的API接口gpt-3.5-turbo版本,其是ChatGPT当前的主流版本,该版本使用了更多的训练数据进行大语言模型的训练,因此具有生成效果好和使用成本低的优点。

与现有技术相比,本发明的有益效果为:本发明提出了基于上下文学习和大语言模型的Solidity注释生成方法,利用定制的演示选择策略来提供高质量的示范,通过上下文学习有效地利用大语言模型中的相关知识进行Solidity代码注释生成;实验结果表明,本发明在自动评价和人工评价方面可以显著优于基线;本发明与之前的两种注释生成方法相比,克服了信息检索方法依赖数据集,不能生成新注释的问题,弥补了微调范式存在遗忘先前知识,泛化能力不足的缺陷;本发明首次探索大语言模型在Solidity代码注释生成领域的能力,通过上下文学习生成了更加有效,高质量的注释,可以帮助智能合约代码开发人员更加方便,有效的阅读Solidity代码。

附图说明

图1为本发明提供的基于上下文学习和大语言模型的Solidity注释生成方法的系统框架图。

图2为本发明构造的三阶段提示模板。

图3为本发明设计的SimSBT方法提取抽象语法树序列的具体实现流程。

具体实施方式

为了使本领域的开发人员更加了解本发明的具体实施过程,以下会结合附图信息进行详细说明。本部分的说明仅作为发明的解释和示范,并非限制发明的作用范围。

实施例1

详见图1,本实施例分为三个阶段:示范检索阶段、上下文学习阶段和大语言模型生成阶段,具体实施包括以下内容:

(1)实验对象的原始数据最初是从一个流行和活跃的智能合约社区Etherscan.io上的40,932个智能合同中收集的,对原始数据进行如下预处理:

(1-1)首先根据以往研究,删除过短的代码函数,例如函数部分少于4个单词的代码。

(1-2)由于语料库中存在语义不同但注释相同的代码对和严重的低质量模板数据,为提高语料库质量,应用drop_duplicates函数删除重复注释,审视低质量模板数据进行删除。最终筛选出29,720个<代码,摘要>对作为实验对象。

(1-3)将语料库分为训练集(80%)、验证集(10%)和测试集(10%)。划分完成后,语料库分为23776对训练集,2972对验证集,2972对测试集。表1显示了语料库的划分情况和各个数据集代码和注释令牌数量的详细信息。

表1实验对象的统计信息

(2)在示范检索阶段,使用一种结合代码语义、词汇和语法的示范选择策略,从语料库中检索出与目标代码最相似的前k个代码及其对应注释作为示范,具体实施过程如下:

(2-1)如图1计算语义相似度时,首先得到代码序列X

(2-2)如图1计算混合分数时,先计算词汇相似度,将代码视为一个顺序结构,并通过集合来表示两个智能合约代码片段的令牌。基于代码序列,我们去除重复的令牌,得到两个令牌集set

(2-3)计算语法相似度时,使用SimSBT方法生成两个序列

(2-4)基于第一部分检索到的前n个示范,通过融合语法相似度和词汇相似度,进一步选择最相似的前k个示范,计算公式如下,其中λ表示融合系数。

Mixed_score(A,B)=λ×lexical_similarity(A,B)+(1-λ)×syntactic_similarity(A,B)

(3)在第二部分的选择策略中,本实施例根据具体实验获得了最佳参数,表2是参数使用的详细数值。

表2演示选择阶段的超参数的配置

(4)如图2所示,上下文学习阶段:使用第二阶段检索到的前k个示范,构造提示模板,模板分为三个部分分别是自然语言提示部分、代码示范部分和测试代码部分,下面详细介绍:

(4-1)首先进行自然语言提示词的构造,告知大语言模型的任务目标为Solidity代码注释生成。利用“short”,“in one sentence”等单词限制生成的注释长度,并通过“Toalleviate the difficulty of this task,we will give you top-k examples.Pleaselearn from them”帮助大语言模型捕获上下文中的示范。

(4-2)接着进行代码示范,这部分使用“#”分隔每个示范Solidity代码和示范注释,易于大语言模型捕获对应的信息。

(4-3)最后进行目标Solidity代码的输入,使用“The length should not exceed”在提示的末尾进一步限制生成注释长度,以避免生成过于冗长的代码注释,其中是检索到的最相似代码的对应注释。

(5)在第四阶段大语言模型生成阶段:本实施例不需要任何模型训练,并且可以通过调用API接口直接生成Solidity代码注释。具体来说,我们直接通过OpenAI提供的APIgpt-3.5-turbo输入所构建的提示模板,然后为目标Solidity代码生成注释。API(gpt-3.5-turbo)是ChatGPT当前的主流版本,该版本使用了更多的训练数据进行大语言模型的训练,因此具有生成效果好和使用成本低的优点。

(6)考虑自动性能评估指标,例如BLEU、ROUGE-1、ROUGE-2和ROUGE-L。这些性能指标可以有效地评估生成的智能合约代码注释和真实注释之间的词汇相似性,并已广泛用于之前的智能合约代码注释生成研究和软件工程的类似生成任务。为了确保公平,本实施例和所有的基线方法全部采用同一个语料库和划分方法进行实验,结果如表3所示:

表3本实施例与基线方法在四个性能指标方面的比较结果

在这个表中,我们用粗体强调了不同性能指标的最佳性能。由表可知,本实施例在BLEU、ROUGE-1、ROUGE-2和ROUGE-L四个指标上的性能分别达到33.41%、35.38%、17.42%和27.89%。与基线方法相比,四个指标性能平均提高了7.70%、8.14%、2.49%和17.26%,值得注意的是在ROUGE-L这个指标上至少提高了15.97%的性能,表明本实施例生成了了比三种主流方法更加有效。

经实验表明,为大语言模型提供高质量的示范,从而构成上下文学习,可以帮助大语言模型挖掘特定领域的潜在知识。与当前Solidity注释生成领域主流的信息检索、深度学习和混合方法相比,本实施例不仅能够生成更加高质量的注释,而且弥补了主流方法依赖数据集和泛化能力不足等问题,进一步表明本实施例方法的合理性和竞争力。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种存储系统的状态检测方法、装置、设备及存储介质
  • 一种液位检测装置和包含其的设备以及液位检测方法、电子设备及计算机可读存储介质
  • 一种触觉信号检测方法、装置、系统、设备及存储介质
  • 一种系统状态的检测方法、装置、设备及存储介质
  • 一种数据存储方法、调度装置、系统、设备及存储介质
  • 一种口罩质量检测系统、方法、装置、设备以及存储介质
  • 一种口罩佩戴检测方法、系统、设备及可读存储介质
技术分类

06120116517183