System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于模态无关对比学习的多任务代码检索方法技术_技高网

一种基于模态无关对比学习的多任务代码检索方法技术

技术编号:40540416 阅读:7 留言:0更新日期:2024-03-05 18:55
本发明专利技术公开了一种基于模态无关对比学习的多任务代码检索方法。该方法包括:基于编程问答社区构建大规模编程问答数据集,进行数据过滤、去重操作;基于此数据集对孪生编码器网络进行模态无关的对比学习预训练,得到代码语言表示模型;以此代码语言表示模型作为初始化,在不同代码检索任务上进行有监督数据的微调得到相应的代码检索模型;利用训练后的代码检索模型对代码库进行编码构建代码表示向量索引库,将代码向量表示索引库和代码检索模型部署在计算设备上,通过对查询的流式编码和向量搜索的方式实现多任务代码检索。所述方法有效对齐了代码语言模型对代码和文本这两个模态的语义表示空间,从而在不同代码检索问答任务上表现出更好的性能。

【技术实现步骤摘要】

本专利技术属于代码智能技术和自然语言处理技术的交叉,具体涉及一种基于模态无关对比学习的多任务代码检索方法


技术介绍

1、随着软件开发人员的数量的增长,利用人工智能技术来帮助软件开发人员提高开发效率的代码智能技术正在变得越来越重要。在实际开发工作中,许多程序设计人员都希望能够通过一个代码搜索系统,利用自然语言查询到之前编写的具有相似功能的代码来进行复用;当刚刚入门编程的学生在进行编程语言和编程知识的学习时,经常会遇到一些自己难以解决的问题,需要从外部获取帮助。一个著名的用于解答编程问题的例子是国外的stackoverflow社区,但此类社区往往会存在回答不够及时的问题。自动化的编程问答技术能够极大的提高开发人员的开发效率,而实现这一技术的核心是对编程语言和自然语言进行处理。

2、不同于生成式问答系统,基于检索式的问答系统拥有推理效率更高、时效性更强、知识更新与可扩展性更加灵活的优势。早期的代码预训练语言模型,如codebert、graphcodebert通常将代码检索作为一个衡量预训练模型的表征能力的一个下游任务,并未针对任务代码检索这一
进行特殊的设计与改进。最近三年,随着对比学习在计算机视觉和自然语言处理领域中的表征学习的大放异彩,在代码检索这一领域出现了一些使用对比学习的新的技术。如2020年的contracode提出使用编译器等外部工具对代码进行扰动作为数据增强构造正例的方式来进行对比学习的预训练,在代码克隆、类型预测等任务上取得了显著的提升。2021年的unixcoder模型也提出了使用抽象语法树作为代码的另外一种表示,进行多种表示之间的对比学习预训练,作为众多预训练任务中的一个。同时期的disco也提出了使用bug注入的方式进行数据增强来构造困难负例,从而提升对比学习的效果,在代码漏洞检测上取得了显著的增益。2022年的coderetriever提出了一种从大规模无监督代码库中构造成对的单模态和跨模态数据的方法,其主要思路是利用多个预训练好的文本和代码检索模型来进行数据的挖掘、清洗和标注。现有的方法经常针对某个具体的检索任务进行优化,而在多任务代码检索上的表现往往不够好。


技术实现思路

1、为克服现有技术在多任务代码检索上的不足,本专利技术提供了一种基于模态无关对比学习的多任务代码检索方法,通过模态无关对比学习的方式,来更好地对齐文本和代码这两个模态之间的语义表示空间,提升模型在多任务代码检索这一
上的表现。

2、为达到上述目的,本专利技术采用的技术方案为:

3、通过构造大规模混合模态编程问答数据集,将不同模态的数据视为同一含义的不同外在表示,基于transformer编码器构建孪生网络,通过在代码文本交错出现的问答对上进行对比学习式的预训练,更高效地学习代码和文本这两个模态之间的匹配信息,得到代码语言表示模型;将预训练后的代码语言表示模型作为初始化,在不同代码检索任务上的训练数据上进行微调,得到多任务代码检索模型;利用训练好的代码检索模型对代码语料库进行编码及向量化,得到代码表示向量索引库,并将代码检索模型部署在终端设备上,流式对文本查询进行编码得到文本表示向量,通过向量最大内积搜索的方式实现多任务代码检索。通过上述步骤,有效提升模型在多任务代码检索上的表现。

4、该方法具体步骤如下:

5、步骤1:通过远程监督的方式构造高质量编程问答数据集procqa,包括对语料库的预处理、过滤、去重;

6、(1)、数据预处理:利用爬虫技术从stackoverflow网站上进行原始数据的爬取和下载,以xml的格式储存;每条数据中包括网页中的结构化信息,主要分为两类,由类型标识号码所区分;类型标识号码为1代表问题数据,包括问题的标题和描述;类型标识号码为2代表答案数据,包括用户的答案;使用beautifulsoup库对原始数据进行解析,去除文本中所包含的html标签,保留原始文本和代码,其中每条问题记录会有相应的被用户所认可的答案序号,每条答案数据也有相对应的问题序号;处理操作后的原始数据被整理成结构化的json形式,不同编程语言划分为不同的数据子集,每个子集以8:1:1的比例分为训练、验证、测试集;

7、(2)、数据过滤:在这类基于社交网络的编程问答社区中,许多答案的准确性难以得到保证,直接对网站上所有的问答对进行保留会对数据集的质量产生影响;本专利技术利用stackoverflow网站本身的一些元信息来对数据进行过滤;只有那些被问题的提出者所认可的答案被保留;考虑到过短的文本不会包含有效信息,且大部分预训练语言模型所支持的最大文本长度是有限的,如bert支持的最长的序列长度为512,本专利技术将字符数超过2048的文本或字符数小于20的文本过滤掉;根据stackoverflow网站提供的问题标签信息对所爬取的数据进行分类,将不同编程语言的问答对分别整合成不同的数据集,最终保留的所有的问答对的数量在五百万左右,该数据集记为procqa;

8、(3)、数据去重:数据集中的问答对是从stackoverflow上收集的,与一些常用的评测集的来源有部分重合;为了防止数据污染问题,以确保数据集的公平性,对procqa进行下游评测数据的去重;三个与procqa同源的评测集,即conala、so-ds、staqc,为去重的主要对象;将这三个数据集的测试集中所有的文本查询作为候选样本,若数据集中训练样本与任意一个候选样本有重复,则从数据集中去掉这条训练样本;采用两种方式进行样本重复与否的判定;第一种方式是基于字符串匹配的去重算法;该算法会遍历训练集中每条样本,当该样本包含任意子串出现在下游评测集时,就被认为是与下游评测集有重复现象的;第二种方式是基于minhash的模糊匹配去重算法;minhash算法通过对一段文本中的所有n-gram构建一系列哈希函数,将其映射到一个固定长度的哈希值的集合,并将哈希集合之间的jaccard相似系数作为两段文本重复的比例;设两段问题文本的n-gram集合所对应的哈希值集合分别为a和b,则两者之间的jaccard相似度计算公式为:

9、

10、当这一比例超出某个阈值时,就将这对样本认定为重复样本;本专利技术采用n=3和0.8的阈值来进行去重,使用的不同哈希函数的数量为128;结果表明,python子集中大概有3千条样本(占总样本数的0.5%)与评测集中的文本查询有重复现象,而其他语言的子集中的重复样本占比极少;

11、步骤2:以基础代码语言模型graphcodebert作为参数初始化,构建基于transformer的孪生编码器网络,针对代码检索任务,在步骤1构建的不同语言的编程问答对语料库上进行模态无关的对比学习增量预训练,以获取更好的代码语言表示模型;具体包括以下几个子步骤:

12、(1)、从步骤1构造的不同语言的问答对数据集中进行数据采样,得到用于模型训练的批次数据b,包含n个问答对:

13、b={(q1,a1),(q2,a2),...,(qn,an)本文档来自技高网...

【技术保护点】

1.一种基于模态无关对比学习的多任务代码检索方法,包括以下步骤:

2.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤1中,基于编程问答社区构建大规模高质量编程问答数据集。

3.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤2中,利用混合模态数据进行模态无关的对比学习预训练,得到代码语言表示模型。

4.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤4中,将使用监督数据微调后的代码检索模型和预编码的代码表示向量索引库部署在终端计算设备上,用于流式处理查询,以及多任务代码检索。

【技术特征摘要】

1.一种基于模态无关对比学习的多任务代码检索方法,包括以下步骤:

2.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于:所述步骤1中,基于编程问答社区构建大规模高质量编程问答数据集。

3.根据权利要求1所述的一种基于模态无关对比学习的多任务代码检索方法,其特征在于...

【专利技术属性】
技术研发人员:荣文戈李泽涵章健飞欧阳元新熊璋
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1