CN117556263B - 样本构建方法、代码生成方法、电子设备及存储介质 - Google Patents
样本构建方法、代码生成方法、电子设备及存储介质 Download PDFInfo
- Publication number
- CN117556263B CN117556263B CN202410033070.0A CN202410033070A CN117556263B CN 117556263 B CN117556263 B CN 117556263B CN 202410033070 A CN202410033070 A CN 202410033070A CN 117556263 B CN117556263 B CN 117556263B
- Authority
- CN
- China
- Prior art keywords
- code
- training
- model
- item
- training samples
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 101
- 238000010276 construction Methods 0.000 title claims abstract description 44
- 238000012549 training Methods 0.000 claims abstract description 470
- 230000006870 function Effects 0.000 claims description 45
- 230000008569 process Effects 0.000 claims description 24
- 238000012545 processing Methods 0.000 claims description 23
- 230000000295 complement effect Effects 0.000 claims description 8
- 230000000694 effects Effects 0.000 abstract description 24
- 238000013473 artificial intelligence Methods 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 13
- 230000007246 mechanism Effects 0.000 description 10
- 238000011161 development Methods 0.000 description 5
- 230000002452 interceptive effect Effects 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 238000003058 natural language processing Methods 0.000 description 4
- 238000004140 cleaning Methods 0.000 description 3
- 238000013135 deep learning Methods 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 238000013528 artificial neural network Methods 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000013136 deep learning model Methods 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000013475 authorization Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 238000000586 desensitisation Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000008451 emotion Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000013522 software testing Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 238000009966 trimming Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请提供一种样本构建方法、代码生成方法、电子设备及存储介质,应用于人工智能领域,其中方法包括:获取多个代码文件;根据所述多个代码文件之间的关联关系,构建多个训练样本;其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成;所述多个训练样本用于对代码模型进行训练。本申请有助于让代码模型学习到训练样本中各个代码文件内容之间的关联,更加完整、准确地理解代码的实现逻辑,减轻代码模型在实际应用中的幻觉问题,提升代码模型的训练效果,提高代码模型执行代码相关任务的准确性,提高用户体验度。
Description
技术领域
本申请涉及人工智能技术,尤其涉及一种样本构建方法、代码生成方法、电子设备及存储介质。
背景技术
随着自然语言大模型的不断发展,其背后的技术思路和方法也被用于其他领域,特别是代码编写与软件开发领域。参考通用自然语言大模型实现的代码模型,可以帮助用户实现代码自动补全、代码生成以及编程建议等任务。
但是,代码模型的训练和使用过程也面临着众多挑战。例如,目前代码模型的训练方式直接参照通用自然语言大模型的训练方式,在训练时,缺少针对代码模型的样本构建策略的研究。然而,代码文件具有不同于自然语言的特性,为了能让代码模型更好地学习到代码相关知识,需要一种更为有效的构建代码模型训练样本的方法,提升代码模型的训练效果。
发明内容
本申请提供一种样本构建方法、代码生成方法、电子设备及存储介质,用以提升代码模型的训练效果。
第一方面,本申请实施例提供一种样本构建方法,包括:
获取多个代码文件;
根据所述多个代码文件之间的关联关系,构建多个训练样本;其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成;
所述多个训练样本用于对代码模型进行训练。
可选的,根据所述多个代码文件之间的关联关系,构建多个训练样本,包括:
确定所述多个代码文件中各代码文件所属的项目;
根据各项目对应的代码文件,构建对应的训练样本;
其中,所述训练样本具体包括属于同一项目的至少一个代码文件的内容。
可选的,根据各项目对应的代码文件,构建对应的训练样本,包括:
针对任一项目,将属于该项目的多个代码文件的内容进行拼接,得到该项目的代码文本;
根据单个训练样本的长度,将该项目的代码文本切分为至少一个训练样本。
可选的,任一项目包括多个编程语言对应的代码文件;根据各项目对应的代码文件,构建对应的训练样本,包括:
根据各代码文件所属的项目以及对应的编程语言,构建多个训练样本;
其中,所述训练样本具体包括同一项目中不同编程语言的至少两个代码文件的内容。
可选的,根据各项目对应的代码文件,构建对应的训练样本,包括:
针对任一项目,对该项目对应的多个代码文件进行解析,确定该项目对应的多个代码文件之间的依赖关系;
根据该项目对应的多个代码文件之间的依赖关系,确定该项目对应的多个代码文件在训练样本中的顺序;
其中,对于某一训练样本包含的、属于同一项目的任意两个代码文件,若其中一个代码文件依赖于另一代码文件,则所述一个代码文件位于所述另一代码文件之后。
可选的,所述方法还包括:针对任一项目,获取该项目对应的至少一个自然语言文件;
所述根据各项目对应的代码文件,构建对应的训练样本,包括:针对任一项目,根据该项目对应的自然语言文件和代码文件的功能,构建至少一个训练样本;
其中,所述训练样本具体包括属于同一项目同一功能的、多种语言的文件的内容;所述多种语言包括自然语言和至少一种编程语言。
可选的,根据所述多个代码文件之间的关联关系,构建多个训练样本,包括:
根据所述多个代码文件中的函数或对象的引用关系,确定具有关联关系的代码文件,并根据所述多个代码文件之间的关联关系,构建多个训练样本。
可选的,所述代码模型的训练过程包括:预训练阶段、继续训练阶段和指令微调阶段;
其中,所述预训练阶段用于使用第一长度的训练样本对代码模型进行训练;
所述继续训练阶段用于使用第二长度的训练样本对代码模型进行训练;所述第二长度大于第一长度;
所述指令微调阶段用于使用至少一个任务对应的训练样本对代码模型进行有监督训练;
其中,构建的多个训练样本包括预训练阶段使用的训练样本和/或继续训练阶段使用的训练样本,所述多个训练样本用于对代码模型进行自监督训练。
可选的,所述预训练阶段的训练样本包括编程语言构成的训练样本;
所述继续训练阶段的训练样本对应的语言通过指令微调阶段的至少一个任务确定;
其中,若指令微调阶段的任务包括根据自然语言生成代码的任务,则所述继续训练阶段的训练样本包括自然语言和编程语言构成的训练样本;
若指令微调阶段的任务包括代码补全任务或代码检查任务,则所述继续训练阶段的训练样本包括编程语言构成的训练样本。
可选的,所述方法还包括:
获取用户输入的下述至少一项信息,以根据所述至少一项信息以及所述多个代码文件之间的关联关系,构建多个训练样本:训练样本的长度、训练样本的构建策略和代码模型对应的至少一个任务;
其中,所述构建策略用于指示根据下述任意一项或多项来构建训练样本:代码文件所属的项目、对应的功能、依赖关系、编程语言以及代码模型的任务。
第二方面,本申请实施例提供一种代码生成方法,包括:
获取待处理的需求信息;
将所述需求信息输入到代码模型,得到对应的代码文件;
其中,所述代码模型是通过第一方面任一项所述方法构建的训练样本训练得到的。
可选的,所述代码模型通过下述方式构建:
获取经过训练的基座模型;其中,所述基座模型包括多头注意力模块,所述多头注意力模块用于:通过多组查询参数、多组键参数、多组值参数,分别计算输入数据对应的查询向量、键向量和值向量,并对查询向量、键向量和值向量进行处理得到输出数据;
将所述多头注意力模块替换为多查询注意力模块,得到待训练的代码模型;其中,所述多查询注意力模块继承所述多头注意力模块的所述多组查询参数、所述多组键参数中的一组键参数、所述多组值参数中的一组值参数。
可选的,获取待处理的需求信息,包括:获取目标项目对应的多个需求信息;
所述将所述需求信息输入到代码模型,得到对应的代码文件,包括:
针对所述多个需求信息中的任一目标需求信息,若所述目标项目中存在与所述目标需求信息相关的其他需求信息、且已针对所述其他需求信息生成了对应的代码文件,则将所述目标需求信息和提示信息输入到代码模型,得到所述目标需求信息对应的代码文件;
其中,所述提示信息用于指示:与所述目标需求信息相关的其他需求信息以及其他需求信息对应的代码文件。
第三方面,本申请实施例提供一种模型训练方法,包括:
获取多个训练样本,其中,所述多个训练样本是通过第一方面任一项所述的方法得到的;
根据获取到的多个训练样本,对代码模型进行训练。
可选的,获取到的多个训练样本为第一长度的训练样本;
根据获取到的多个训练样本,对代码模型进行训练,包括:
根据获取到的多个训练样本对代码模型进行预训练;
从获取到的多个训练样本对应的项目中,选择部分项目,并根据所述部分项目对应的代码文件,构建第二长度的训练样本;
基于构建的第二长度的训练样本对预训练后的代码模型进行继续训练;
对继续训练后的代码模型进行指令微调。
第四方面,本申请实施例提供一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述电子设备执行上述任一方面所述的方法。
第五方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上述任一方面所述的方法。
本申请实施例提供的样本构建方法、代码生成方法、电子设备及存储介质,可以获取多个代码文件,根据所述多个代码文件之间的关联关系,构建多个训练样本,其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成,所述多个训练样本用于对代码模型进行训练,从而让代码模型学习到训练样本中各个代码文件内容之间的关联,更加完整、准确地理解代码的实现逻辑,减轻代码模型在实际应用中的幻觉问题,提升代码模型的训练效果,提高代码模型执行代码相关任务的准确性,提高用户体验度。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1为本申请实施例提供的一种应用场景示意图;
图2为本申请实施例提供的一种样本构建方法的流程示意图;
图3为本申请实施例提供的一种模型训练方法的流程示意图;
图4为本申请实施例提供的一种训练策略的示意图;
图5为本申请实施例提供的一种多头注意力模块的原理示意图;
图6为本申请实施例提供的一种从MHA模块加载参数到MQA模块的原理示意图;
图7为本申请实施例提供的一种通过交互界面选择构建策略的示意图;
图8为本申请实施例提供的一种代码生成方法的流程示意图;
图9为本申请实施例提供的一种面向项目的代码生成原理示意图;
图10为本申请实施例提供的一种电子设备的结构示意图。
通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户属性信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
本申请实施例可以借助于大模型,例如,大语言模型来实现。其中,大语言模型是指具有大规模语言模型参数的深度学习语言模型,通常包含上亿、上百亿、上千亿、上万亿甚至十万亿以上的语言模型参数。大语言模型又可以称为基石语言模型/基础语言模型(Foundation Model),通过大规模无标注的语料进行大语言模型的预训练,产出亿级以上参数的预训练语言模型,这种语言模型能适应广泛的下游任务,语言模型具有较好的泛化能力,例如大规模语言模型(Large Language Model,LLM)、多模态预训练语言模型(multi-modal pre-training model)等。
大语言模型在实际应用时,仅需少量样本对预训练语言模型进行微调即可应用于不同的任务中,大语言模型可以广泛应用于自然语言处理(Natural LanguageProcessing,NLP)、计算机视觉等领域,具体可以应用于如视觉问答(Visual QuestionAnswering,VQA)、图像描述(Image Caption,IC)、图像生成等计算机视觉领域任务,以及基于文本的情感分类、文本摘要生成、机器翻译等自然语言处理领域任务,大语言模型主要的应用场景包括数字助理、智能机器人、搜索、在线教育、办公软件、电子商务、智能设计等。
首先对本申请所涉及的名词进行解释:
Transformer:一种基于自注意力机制的神经网络。
Encoder:编码器,能够对输入的数据进行编码,输出一般是一个向量。
Decoder:解码器,能够将向量进行解码,输出人类可读的数据类型。
MHA:Multi Head Attention,多头注意力,Transformer中的一种注意力机制。
MQA:Multi Query Attention,多查询注意力,一种为Transformer推理加速的注意力机制的变体。
下面先对本申请的应用场景进行说明。
随着计算机技术的不断发展,软件开发领域的任务需求也越来越多,对代码编写等方面提出了更高的挑战。以代码生成为例,在现有技术中,可以使用预定义的模板来生成代码。具体的,开发者可以定义模板并使用占位符来标记需要替换的部分。当需要生成代码时,这些占位符会被实际的值或代码段替换。这种方法基于明确的规则和模板实现代码生成,确定性高、可预测且高效,但不够灵活,难以处理模板以外的需求,尤其是复杂和模糊的需求。
为了实现更加灵活的代码生成功能,可以将深度学习模型应用到代码生成过程中。例如,可以利用深度学习中的Encoder-Decoder架构组成代码模型,由Encoder对输入数据进行编码,得到输入数据的向量表示,并由Decoder根据此向量表示进行解码,输出最终需要生成的代码。
相比于传统的基于模板的代码生成技术,基于深度学习的代码生成技术可以处理更为复杂、模糊的需求,且生成的代码格式更为灵活。
进一步地,可以通过增加模型结构的深度和宽度,让代码模型的参数达到10亿以上的水平,结合大规模代码数据作为训练语料,对代码模型进行预训练,让代码模型具备通用、强大的代码生成能力。
但是,目前对代码模型的训练样本的研究较少,若采用与通用自然语言大模型(用于处理自然语言的大模型)类似的方式,对获取到的代码文件乱序,然后切分成样本作为训练数据,会对训练的效果产生限制。究其原因,是由于代码文件不同于自然语言文件,同一个项目中的各个代码文件实际上有非常强的关联性,参考通用自然语言大模型的训练方法无法建模同一项目下不同文件之间的关联,导致代码模型在实际应用中幻觉严重。
在发现该问题后,本申请实施例提出一种专精代码数据的训练策略:项目感知的训练策略。将孤立的代码文件组织形成一个完整的项目,在拼接样本的时候将同属一个项目的代码文件组织在一起训练,让代码模型充分了解到整个项目的背景和知识,大幅减轻模型生成代码时的幻觉问题。
图1为本申请实施例提供的一种应用场景示意图。如图1所示,在构建训练样本时,可以从代码数据平台爬取大量的代码文件,其中,代码数据平台可以为任意的包括代码文件的平台。
获取到的大量的代码文件通常需要进行清洗,包括过滤、去重、脱敏等操作,这些操作过程中会将代码文件的顺序打乱,方便进行数据的清洗。清洗完成后,将代码文件组织为训练样本的形式,由于目前代码模型的单条样本的长度一般较长(几千到几十万不等),而一个代码文件通常放不满一条样本,因此训练时会将前后很多个代码文件拼接到一起塞满一个样本来对代码模型进行训练。
在一些技术中,将代码文件组织为训练样本时,可以参考自然语言大模型的训练方式,将代码文件按照语言的类型进行分组,在拼接样本的时候选择同语言的代码文件拼接在一起,例如C++的所有代码文件放到一起,组织为训练样本,Java的所有代码文件也放到一起,组织为训练样本。
然而,和自然语言不同,同一个项目中不同的代码文件之间存在大量的函数、对象相互引用的现象,这些代码文件紧密配合形成工具或者产品。而参考自然语言大模型的训练方式将一个项目的不同代码文件看作一个个孤立的代码文件,损失了代码文件之间的关联信息,导致代码模型产生严重的幻觉。
因此,在本申请实施例中,可以在清洗等操作后,按照项目对代码文件进行组织,并分别构建训练样本,例如,项目1对应的代码文件拼接到一起,并按照单个样本的长度切分为多个样本,项目2对应的代码文件拼接到一起,也按照单个样本的长度切分为多个样本。这样,样本中的代码文件按照项目进行组织,在应用于代码模型的训练时,可以让代码模型根据样本中的一部分代码文件的内容预测该样本中其他代码文件的内容,从而让代码模型学习到样本中各个代码文件内容之间的关联关系,建模同一项目下不同代码文件之间的关联,减轻代码模型在实际应用中的幻觉问题,提升代码模型的训练效果,提高代码模型执行代码相关任务的准确性,提高用户体验度。
下面结合附图,对本申请的一些实施方式作详细说明。在各实施例之间不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。另外,下述各方法实施例中的步骤时序仅为一种举例,而非严格限定。
图2为本申请实施例提供的一种样本构建方法的流程示意图。本实施例中的方法可以在任意具有数据处理功能的设备上实施,例如,云上实施、本地部署、客户端实施、IOT(Internet of Things,物联网)设备实施等。如图2所示,所述方法可以包括:
步骤201、获取多个代码文件。
其中,代码文件可以是通过编程语言编写的文件。
可选的,所述多个代码文件可以是从代码数据平台爬取的海量的代码文件,可以涉及多种编程语言,例如C、C++、Python、Java等,每一编程语言可以对应多个代码文件。
步骤202、根据所述多个代码文件之间的关联关系,构建多个训练样本;其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成。
其中,代码文件可以表现为文件的形式,例如,Python对应的代码文件可以包括后缀为“.py”的文件等,Java对应的代码文件包括后缀为“.java”的文件等。代码文件的内容可以指文件内的代码文本。
可选的,不同代码文件之间的关联关系,可以具体是指代码文件的内容的关联关系,例如,代码文件涉及的函数或者对象之间的关系。若两个代码文件的内容具有关联关系,则可以认为这两个代码文件具有关联关系。具有关联关系的代码文件可以放到同一训练样本中,即,可以将具有关联关系的代码文件中的内容取出,拼接到一起作为一个训练样本。在本申请实施例中,若无特别说明,将代码文件作为训练样本,即指将代码文件中的内容取出作为训练样本。
在单个训练样本的长度有限制时,可以先将海量的代码文件按照关联关系排序或者分组,具有关联关系的代码文件放到一起,将排序或者分组后的代码文件按照单个训练样本的长度进行切分,得到多个训练样本。
或者,可以从海量的代码文件中随机选择一个代码文件,在该代码文件后依次拼接与该代码文件具有关联关系的代码文件,直至达到单个训练样本的长度。再从剩余的代码文件中随机选择一个代码文件,重复前述步骤,直至将所有的代码文件都填充为训练样本,得到多个训练样本。
可选的,得到的多个训练样本用于对代码模型进行自监督训练。其中,所述代码模型为实际应用中,输入和/或输出包括代码的模型。例如,代码模型可以用于实现代码生成、代码补全、代码检查等任务。
可选的,训练样本中,代码可以表现为token(元素)的形式,自监督训练可以在无标注的训练样本上通过自己监督自己实现模型的训练。
可选的,在根据训练样本对代码模型进行自监督训练时,可以将训练样本中的token依次输入到代码模型,让代码模型以预测下一个token为目标,即,根据前N个token预测第N+1个token。
或者,也可以使用其他的自监督训练方式,例如,可以掩住(mask)训练样本中的部分token,让代码模型通过其他token预测这部分token。
在实际应用中,代码文件之间会有相互的关联信息。在一示例中,C++中有后缀为“.h”和“.cpp”的代码文件,可以分别用于描述类(class)的定义和实现,需要读取这两种代码文件才能对class有完整的了解。如果这些代码文件被放在不同的训练样本中,代码模型很难全面学习到class的使用。
另一示例中,很多编程语言对应的代码文件会涉及函数的调用,某一代码文件中调用的函数可能在其他的代码文件中进行定义,这些代码文件放到一起进行学习更有利于代码模型对代码知识的理解。
由于本实施例在构建训练样本时,是按照代码文件之间的关联关系组织成训练样本,因此,在自监督的训练过程中,代码模型会学习到训练样本中各部分之间的关系,从而学习到代码文件之间的关联关系,进而更好地理解代码的实现逻辑。
除自监督训练以外,本申请实施例构建的训练样本,也可以应用于其他的训练方式,例如,在有监督训练(Supervised Fine-Tuning,SFT)中,可以构建并使用具有关联关系的代码文件拼接而成的训练样本,从而提升有监督训练的效果。
综上,本实施例提供的样本构建方法,可以获取多个代码文件,根据所述多个代码文件之间的关联关系,构建多个训练样本,其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成,所述多个训练样本用于对代码模型进行训练,从而让代码模型学习到训练样本中各个代码文件内容之间的关联,更加完整、准确地理解代码的实现逻辑,减轻代码模型在实际应用中的幻觉问题,提升代码模型的训练效果,提高代码模型执行代码相关任务的准确性,提高用户体验度。
在一种可选的实现方式中,代码文件之间的关联关系可以通过所属的项目来确定,即,具有关联关系的代码文件为属于同一项目的代码文件,可以按照项目将代码文件组织成训练样本。
具体的,根据所述多个代码文件之间的关联关系,构建多个训练样本,可以包括:确定所述多个代码文件中各代码文件所属的项目;根据各项目对应的代码文件,构建对应的训练样本;其中,所述训练样本具体包括属于同一项目的至少一个代码文件的内容。
可选的,可以先确定每个代码文件的文件属性,根据文件属性中的文件路径可以确定该代码文件所属的项目。具体的,文件路径的第一级可以作为项目的名称,不同项目对应的名称不同。其中,项目可以是指一批代码文件共同完成的一项应用。
可选的,可以允许开发者在代码数据平台新建仓库,仓库可以用于存储项目相关的代码文件,文件路径的第一级为仓库的名称,可以用于表示项目的名称,新建的仓库名称在全平台唯一,避免与其他仓库名称重复。
当需要构建训练样本时,在从代码数据平台爬取到的代码文件可能并不会按照项目进行排列,并且,经过过滤去重等操作后,代码文件更是被杂乱无章地打散了,此时,可以通过文件属性确定代码文件所属的项目。
在确定各个代码文件所属的项目后,可以按照项目对应的代码文件构建训练样本,原则是:尽量将属于同一项目的代码文件放到一起。可选的,由于一个项目的代码文件通常比单个训练样本的长度大很多,因此,可以先将代码文件按照项目聚合在一起,再切分为训练样本。
可选的,根据各项目对应的代码文件,构建对应的训练样本,可以包括:针对任一项目,将属于该项目的多个代码文件的内容进行拼接,得到该项目的代码文本;根据单个训练样本的长度,将该项目的代码文本切分为至少一个训练样本。
可选的,长度可以通过token的数量来表示。示例性地,一个项目对应多个代码文件,总的token数量大约在十几万及以上,单个训练样本的长度约为几千token,将一个项目的token数量除以单个训练样本的token数量,可以得到一个项目切分得到的训练样本数量。
通常情况下,一个项目可以切分为至少两个训练样本,一个训练样本可以包括至少两个代码文件的内容。当然,根据单个训练样本的长度限制,也可能存在一个训练样本仅包含一个代码文件,或者一个项目仅构建了一个训练样本的情况。例如,单个代码文件的长度等于或大于预先设置好的样本长度,则该代码文件会被截断,仅构成一个训练样本,剩余代码可以放在下一个训练样本中,也可以和同项目的其他代码文件组成新的训练样本。同理,如果整个项目中所有代码文件的总长度未超过单个训练样本的长度限制,则可以仅构建一个训练样本。
具体的,可以将一个项目的多个代码文件的内容取出并拼接到一起,按照单个训练样本的token数量将拼接后的内容切分为一个个的训练样本。
需要说明的是,在切分时,可能会出现一个代码文件的内容被切分到前后两个训练样本中,但是,由于单个训练样本的长度通常远大于单个代码文件的长度,因此,被从中间切开的代码文件的比例不会太大,对模型训练的影响较小。此外,即使存在被切开的代码文件,本实施例依照项目组织得到训练样本,相比于随机拼接代码文件得到训练样本的方式,对代码模型的训练效果依然有很大提升。
可选的,针对每一项目,可以参照上述的方法,构建至少一个训练样本,各个项目构建得到的多个训练样本用于对代码模型进行训练。或者,也可以先将多个项目对应的代码文本拼接到一起,再按照单个训练样本的长度,从前往后切分为多个训练样本。
通过上述的方法,可以快速准确地按照项目将代码文件组织为训练样本,提高训练样本构建的效率和准确性,并且,属于同一项目的代码文件是具有关联关系的代码文件,将同属一个项目的代码文件组织在一起训练,能让代码模型充分了解到整个项目的背景和知识,有效减轻代码模型的幻觉问题。
在另一种可选的实现方式中,可以按照编程语言构建训练样本,具体的,可以将不同编程语言的代码文件放到一起来构建训练样本。
其中,任一项目包括多个编程语言对应的代码文件;根据各项目对应的代码文件,构建对应的训练样本,可以包括:根据各代码文件所属的项目以及对应的编程语言,构建多个训练样本;其中,所述训练样本具体包括同一项目中不同编程语言的至少两个代码文件的内容。
具体的,一个项目中的代码文件无需按照编程语言严格分开,而是不同编程语言的代码文件可以穿插出现,这样,在将项目对应的代码文件切分为训练样本时,一个训练样本可以包括多种编程语言对应的代码文件。
可选的,在构建训练样本时,除了代码文件,还可以获取至少一个自然语言文件,其中,自然语言文件可以为基于自然语言描述的文件。例如,自然语言文件可以包括项目的帮助文档、QA(Question And Answer,问题和回答)文档等各种文件。自然语言文件所属的项目也可以通过文件属性确定。
相应的,同一个项目下,不同语言的文件可以放到一起,此处的语言包括编程语言和自然语言,从而一个训练样本可以包括至少两种编程语言,也可以包括至少一种编程语言和至少一种自然语言,至少一种自然语言例如可以包括中文和英文等。
通过上述方案,可以将不同编程语言的代码文件添加到一个训练样本中,使得代码模型可以学习到不同编程语言,有助于代码模型提升多编程语言的任务的处理效果。此外,训练样本还可以由编程语言和自然语言构成,使代码模型能够对属于同一项目的自然语言文件和代码文件进行学习,有利于代码模型理解编程语言和自然语言之间的关联,提升代码模型在相关任务上的处理效果。
在一种可选的实现方式中,还可以根据依赖关系构建训练样本。可选的,可以将具有依赖关系的代码文件放入同一训练样本。还可以根据代码文件之间的依赖关系,确定代码文件的先后顺序。
具体的,根据各项目对应的代码文件,构建对应的训练样本,包括:针对任一项目,对该项目对应的多个代码文件进行解析,确定该项目对应的多个代码文件之间的依赖关系;根据该项目对应的多个代码文件之间的依赖关系,确定该项目对应的多个代码文件在训练样本中的顺序;其中,对于某一训练样本包含的、属于同一项目的任意两个代码文件,若其中一个代码文件依赖于另一代码文件,则所述一个代码文件位于所述另一代码文件之后。
示例性地,经过解析,确定代码文件A依赖于代码文件B,则可以将代码文件B放在代码文件A的前面。
可选的,可以先将一个项目包含的代码文件按照依赖关系进行排序,排序后切分为至少一个训练样本。或者,也可以先将一个项目的代码文件切分为至少一个训练样本,再在训练样本中根据依赖关系对代码文件的顺序进行调整。
通过依赖关系对代码文件进行排序后,可以使代码模型先学习到被依赖的代码文件的内容,再学习到依赖前者的代码文件的内容,方便代码模型在被依赖的内容的基础上学习新的知识,增强代码模型对具有依赖关系的内容的理解,进一步提升代码模型的训练效果,提升后续代码生成等任务的准确性。
在又一种可选的实现方式中,若一个项目涉及多种功能,则可以进一步按照功能将代码文件组织为训练样本。示例性地,某一项目用于提供外卖服务,其对应的功能可以包括:外卖产品、订单处理、会员服务等。
可选的,针对任一项目,可以获取该项目对应的至少一个自然语言文件。所述自然语言文件可以包括用于对项目进行描述的文件,根据自然语言文件可以分析出项目包含的功能,例如,项目对应的服务文档集合中可以包括多个文件,分别用于描述不同功能的使用方法。或者,也可以由项目的开发者提供项目包含的功能。
可选的,所述根据各项目对应的代码文件,构建对应的训练样本,可以包括:针对任一项目,根据该项目对应的自然语言文件和代码文件的功能,构建至少一个训练样本;其中,所述训练样本具体包括属于同一项目同一功能的、多种语言的文件的内容;所述多种语言包括自然语言和至少一种编程语言。
具体的,可以将各个功能对应的文件(包括代码文件和自然语言文件)依次拼接在一起,再切分为至少一个训练样本,这样,每一训练样本会包括属于同一项目的同一功能的多个文件,且多个文件涉及不止一种语言。
在仅利用代码文件构建训练样本的方案中,自然语言文件在清洗阶段会被过滤掉,导致代码模型仅学习到了代码相关的知识,学习不到代码与自然语言之间的关系,而实际应用中,项目中的自然语言文件与代码文件可能也会有一定的关联关系,例如,自然语言文件用于对代码文件的功能进行描述,在本实施例中,可以将自然语言文件和代码文件按照功能放在一起并构建训练样本,便于代码模型在训练过程中按照不同的功能学习到该功能下的自然语言描述方式和代码具体实现过程,增强代码模型对自然语言和代码知识的理解,有助于代码模型更好地处理与自然语言相关的代码需求。
在实际应用中,代码文件之间的关联关系除了可以通过所属的项目来确定,也可以通过其他方式确定。
可选的,根据所述多个代码文件之间的关联关系,构建多个训练样本,可以包括:根据所述多个代码文件中的函数或对象的引用关系,确定具有关联关系的代码文件,并根据所述多个代码文件之间的关联关系,构建多个训练样本。
其中,所述多个代码文件中的函数或对象的引用关系,可以通过对代码文件进行分析确定,或者,也可以由用户输入各代码文件对应的引用关系。具有引用关系的代码文件可以认为是具有关联关系的,进而可以依照引用关系构建训练样本。
具体的,可以将具有引用关系的代码文件放到一起,再切分得到训练样本。这样,一个训练样本可以包括具有引用关系的至少两个代码文件。
通过上述方案,可以利用函数或对象的引用关系来构建训练样本,使得具有引用关系的代码文件可以放到一个训练样本中,使得代码模型可以学习到代码文件中函数或对象的具体实现方法和调用方法,有助于代码模型完整地理解函数或对象,提升代码模型在处理函数或对象相关的代码需求时的效果。
在构建多个训练样本后,可以使用多个训练样本对代码模型进行自监督训练。可选的,除了自监督训练,还可以对代码模型进行有监督训练或其他训练。
在本申请的一个或多个实施例中,可选的,所述代码模型的训练过程包括:预训练阶段、继续训练阶段和指令微调阶段。
其中,所述预训练阶段用于使用第一长度的训练样本对代码模型进行训练;所述继续训练阶段用于使用第二长度的训练样本对代码模型进行训练,所述第二长度大于第一长度;所述指令微调阶段用于使用至少一个任务对应的训练样本对代码模型进行有监督训练。
可选的,构建的多个训练样本包括预训练阶段使用的训练样本和/或继续训练阶段使用的训练样本,所述多个训练样本用于对代码模型进行自监督训练。
示例性地,预训练阶段使用的训练样本的长度可以为几千个token,继续训练阶段使用的训练样本的长度可以为上万个token。通过前述实施例的方法,可以构建预训练阶段的训练样本,也可以构建继续训练阶段的训练样本,也可以同时构建预训练阶段和继续训练阶段的训练样本。
预训练阶段和继续训练阶段都可以使用自监督的训练方式。指令微调阶段可以使用有监督的训练方式,对应的训练样本可以根据待训练的任务确定。其中,任务可以包括但不限于:代码生成、代码补全、代码检查等。
不同的任务可以对应不同的训练样本。示例性地,针对代码生成任务,训练样本可以包括需求信息和代码文件,使得代码模型可以根据需求信息生成对应的代码文件。
通过上述训练方式,可以使代码模型先通过自监督训练学习代码文件包含的代码知识,再通过有监督训练学会针对代码相关任务的处理过程,并且,在自监督训练时,先对较短的训练样本进行学习,再对较长的训练样本进行学习,使得代码模型可以按照从简单到困难的方式进行学习,提升代码模型的训练效果。
进一步的,还可以根据代码模型实际要处理的任务,指导预训练阶段或继续训练阶段的训练样本的构建过程。例如,在某些特定的场景下,代码模型仅需要处理代码文件,不需要对自然语言进行处理,这种情况下,预训练和继续训练阶段可以减少对自然语言的学习,因此,可以较少地或者取消通过自然语言文件构建训练样本。
在一种可选的实现方式中,所述预训练阶段的训练样本包括编程语言构成的训练样本;所述继续训练阶段的训练样本对应的语言通过指令微调阶段的至少一个任务确定。
其中,若指令微调阶段的任务包括根据自然语言生成代码的任务,则所述继续训练阶段的训练样本包括自然语言和编程语言构成的训练样本;若指令微调阶段的任务包括代码补全任务或代码检查任务,则所述继续训练阶段的训练样本包括编程语言构成的训练样本。
具体的,根据自然语言生成代码的任务可以是指前述的代码生成任务,其中,需求信息可以通过自然语言进行描述,则继续训练阶段对应的多个训练样本中,每一训练样本可以由自然语言文件和代码文件组成。
此外,还可以根据代码模型对应的主要编程语言,确定训练样本中代码文件的编程语言。例如,代码模型后续主要用于处理Python相关的任务,则训练样本可以主要包括Python的代码文件,使得代码模型可以更多地学习到Python相关的知识。
若指令微调阶段的任务只涉及代码补全任务或代码检查任务,则继续训练阶段的训练样本可以仅由编程语言组成。其中,代码补全任务可以用于:给定一个或多个不完整的代码文件,由代码模型将其补全;代码检查任务可以用于:给定一个或多个代码文件,由代码模型检查其中是否存在错误。这些任务在处理过程中,对自然语言能力的需求较小,因此,若代码模型后续仅涉及这些任务,则在继续训练阶段对自然语言文件可以减少处理或者不处理。
上述方案可以结合代码模型的训练过程对样本构建过程进行改进,先通过仅由编程语言构成的训练样本对代码模型进行预训练,使得代码模型可以先简单地学习到代码相关的知识,再通过继续训练阶段增加对自然语言文件的学习,使得代码模型可以在具备一定代码知识的基础上,学习自然语言与编程语言的内在关系,在此基础上,再对代码模型进行指令微调,学习处理具体的代码任务,进一步提升代码模型的训练效果。并且,可以根据代码模型在指令微调阶段的任务,调整自然语言文件在继续训练阶段的训练样本中的占比,使得继续训练后的代码模型的能力与指令微调阶段待处理的任务更加匹配,提升代码模型的整体训练效果。
本申请实施例还提供一种模型训练方法,可以获取多个训练样本,其中,所述多个训练样本是前述任一实施例所述的方法得到的,根据获取到的多个训练样本,对代码模型进行训练。
图3为本申请实施例提供的一种模型训练方法的流程示意图。如图3所示,根据获取到的多个训练样本,对代码模型进行训练,可以包括:
步骤301、根据获取到的多个训练样本对代码模型进行预训练。
其中,获取到的多个训练样本可以为第一长度的训练样本。
可选的,可以从一个或多个代码数据平台获取数据,获取到的数据可以包括代码文件等。每一代码数据平台可以包括多个项目对应的数据,可以利用这些数据构建训练样本并对代码模型进行预训练。
图4为本申请实施例提供的一种训练策略的示意图。如图4所示,第一阶段的训练为预训练,预训练使用的训练样本为短序列训练样本,单个样本的长度(第一长度)为4096,即,每一训练样本可以包括4096个token,较短的序列长度可以让模型训练过程更加高效。
可选的,在短序列预训练的过程中,可以加入MQA和FIM(Fill In Middle,中间填充技术)机制。
其中,MQA机制利用多查询注意力对输入数据进行处理,能够有效提高注意力计算的效率。FIM机制将输入到代码模型的文本随机划分为3个部分:前缀、中间、后缀,并将后缀文本放在前缀之前或者前缀之后的位置。FIM机制可以让代码模型看到预测位置的下文,能够让代码模型具备代码补全的能力。
步骤302、从获取到的多个训练样本对应的项目中,选择部分项目,并根据所述部分项目对应的代码文件,构建第二长度的训练样本。
步骤303、基于构建的第二长度的训练样本对预训练后的代码模型进行继续训练。
参见图4,第二阶段的训练为继续训练,继续训练的训练样本,可以在第一阶段训练样本的基础上重新构建。
示例性地,第一阶段可以使用数据总量为2500亿Token的训练样本,重复进行四次训练,训练的数据量总共为一万亿Token。在第二阶段,可以从2500亿Token中,选择部分项目对应的token,例如,可以从中选择500至1000亿Token,构建长序列的训练样本。
其中,长序列训练样本的长度(第二长度)可以为16384个token,长序列继续训练可以增强代码模型的长序列理解能力。为了让代码模型能够在不同长度实现训练,在代码模型中可以采用旋转位置编码。
可选的,从代码数据平台获取到的数据除了可以包括代码文件,还可以包括自然语言文件,可以根据代码文件和自然语言文件共同构建训练样本,使代码模型能够同时具备理解代码和理解自然语言的能力。
步骤304、对继续训练后的代码模型进行指令微调。
第三阶段的训练为指令微调,指令微调可以增强代码模型的指令跟随能力,让代码模型能够更好的理解人类需求。
在本实施例中,通过短序列的预训练,可以使代码模型高效地学习到代码知识,通过长序列的继续训练,使代码模型具备了理解和生成更长序列的代码的能力,再结合指令微调可以进一步提升代码模型对具体任务的处理效果,并且,在长序列的继续训练过程中,可以复用短序列的部分项目的代码文件,提升构建训练样本的效率,进而提升整体训练效率。
在本申请的一个或多个实施例中,可选的,代码模型可以采用任意的深度学习模型来实现,例如可以采用Transformer网络中的decoder结构作为代码模型的基础模型框架。
可选的,可以通过设定Transformer中的层数、注意力头数、隐藏层维度等来控制代码模型的规模。例如,可以将代码模型的参数量扩大到10亿以上,通过增加代码模型的参数量,代码模型对于人类需求的理解能力、代码的生成能力等各方面均可得到大幅提升。
可选的,也可以将已经训练好的基座模型,例如LLM,作为待训练的代码模型,直接加载经过训练的基座模型的参数,并进行上述三个阶段的训练。
可选的,也可以对基座模型进行改进,得到待训练的代码模型,并进一步进行训练。具体的,在根据获取到的多个训练样本,对代码模型进行训练之前,还可以获取经过训练的基座模型,其中,所述基座模型包括多头注意力模块,所述多头注意力模块用于:通过多组查询(query)参数、多组键(key)参数、多组值(value)参数,分别计算输入数据对应的查询向量、键向量和值向量,并对查询向量、键向量和值向量进行处理得到输出数据;将所述多头注意力模块替换为多查询注意力模块,得到待训练的代码模型;其中,所述多查询注意力模块继承所述多头注意力模块的所述多组查询参数、所述多组键参数中的一组键参数、所述多组值参数中的一组值参数。
在本实施例中,可以将基座模型中的多头注意力模块(基于MHA机制实现的模块),替换为多查询注意力模块(基于MQA机制实现的模块)。一般来说,如果修改了模型的结构,模型需要重新开始训练,无法利用基座模型已经学习过的海量知识。而本实施例提出的方案,可以将基座模型中多注意力模块的参数加载到新设计的多查询注意力模块中,这样,经过少量样本的训练即可达到基座模型的原有效果。
图5为本申请实施例提供的一种多头注意力模块的原理示意图。如图5所示,多头注意力模块包括查询参数、键参数和值参数,输入数据分别经过查询参数、键参数和值参数处理后,得到查询向量、键向量、值向量,再通过处理模块对查询向量、键向量、值向量进行处理,得到输出数据。
其中,多头注意力机制下,查询参数、键参数和值参数可以分别有多组,输入数据与多组查询参数进行计算,得到查询向量,同理,输入数据分别与多组键参数、多组值参数进行计算,得到对应的键向量和值向量。
图6为本申请实施例提供的一种从MHA模块加载参数到MQA模块的原理示意图。如图6所示,将多头注意力模块替换为多查询注意力模块后,查询参数保持不变,依然为多组,而键参数和值参数均可以仅保留一组。
可选的,可以从MHA模块中随机挑选一组键参数和值参数,作为MQA模块中的键参数和值参数。或者,也可以将MHA模块中的多组键参数或值参数取平均值,得到MQA模块中的一组键参数或值参数。或者,也可以遍历各组键参数和值参数,对于遍历到的每一组键参数和值参数,将该组键参数和值参数作为候选代码模型中MQA模块的键参数和值参数,通过测试样本确定各个候选代码模型对应的处理效果,并根据处理效果选择合适的候选代码模型,作为待训练的代码模型。
可选的,基座模型可以包括多层,每一层均可以包括多头注意力模块和其它模块(例如前馈神经网络等),针对每一层,可以将多头注意力模块替换为对应的多查询注意力模块,从而得到新的网络结构,作为待训练的代码模型。
通过上述方案,可以将基座模型中的MHA模块替换为MQA模块,能够显著减少模型的推理时间,降低实际应用中代码相关任务的时延,并且,采用MHA模块中的一组键参数和一组值参数,作为MQA模块中初始化的键参数和值参数,并进一步进行训练,能够有效利用基座模型已经学习过的知识,提升代码模型的训练效果。
本申请实施例中,代码文件之间的关联关系可以包括下述至少一项:项目、功能、依赖关系、函数或对象的引用关系等。可选的,可以将多个代码文件按照关联关系进行排序或分组,例如,同一项目的放到一起,或者,同一项目中同一功能的放到一起,或者,具有依赖关系的放到一起等;根据排序或分组后的代码文件,得到多个训练样本,例如,可以按照单个训练样本的长度,对排序或分组后的代码文件进行切分,得到多个训练样本。此外,还可以根据关联关系和语言、任务等,构建多个训练样本。
在此基础上,可选的是,还可以允许用户对训练样本的构建策略和/或代码模型的训练策略进行调整。
可选的,可以获取用户输入的下述至少一项信息,以根据所述至少一项信息以及所述多个代码文件之间的关联关系,构建多个训练样本:训练样本的长度、训练样本的构建策略和代码模型对应的至少一个任务。
其中,所述构建策略用于指示根据下述任意一项或多项来构建训练样本:代码文件所属的项目、对应的功能、依赖关系、编程语言以及代码模型的任务。
可选的,可以通过交互界面来向用户展示可供选择的训练样本长度、任务、构建策略等,由用户从中选择,也可以允许用户直接输入。
图7为本申请实施例提供的一种通过交互界面选择构建策略的示意图。如图7所示,可以在交互界面展示可供选择的构建策略,在用户选择后,可以根据相应的构建策略构建训练样本。
示例性地,用户选择的构建策略包括代码文件所属的项目,则代码文件的关联关系可以用是否属于同一项目来表示。根据多个代码文件所属的项目,确定具有关联关系的代码文件,并进一步构建训练样本。
若用户选择的构建策略包括代码文件所属的功能或依赖关系等,则代码文件的关联关系可以用是否对应同一功能、或是否具有依赖关系来表示。根据多个代码文件对应的功能或者依赖关系,构建训练样本。例如,可以将多个代码文件按照功能或依赖关系进行排序或分组,并切分得到训练样本。
若用户选择的构建策略包括编程语言或任务,则可以根据代码文件的关联关系以及对应的编程语言或者代码模型对应的任务,构建训练样本。例如,根据任务确定是否在训练样本中增加自然语言文件,或者,根据编程语言对训练样本中的代码文件进行排序等。
若用户同时选择了多项作为构建策略,则可以综合确定构建训练样本的方式,例如,用户选择的构建策略包括:代码文件所属的项目、对应的功能、依赖关系、编程语言以及代码模型的任务,则可以根据代码模型的任务确定是否在训练样本中增加自然语言文件,将多个代码文件和自然语言文件(若有)按照所属的项目和功能进行分组,并在每组中根据依赖关系和编程语言进行排序,将排序后的多组文件拼接,并切分为多个训练样本。
具体的构建方式可以参考前述实施例,此处不再赘述。可选的,在交互界面上还可以允许用户对各种构建策略进行详细配置,例如,用户可以根据软件开发的需求,从多个项目中选择部分项目构建训练样本,从多种编程语言中选择部分编程语言构建训练样本等。
此外,还可以允许用户对代码模型的训练策略进行调整,包括但不限于模型结构、模型训练过程等。
示例性地,在模型结构方面,用户可以对模型的具体结构、参数量等进行调整,新增、减少或者修改模型中的一个或多个模块。在模型训练过程方面,用户可以规划模型的训练阶段、选择每个阶段使用的训练样本、损失函数、训练的停止条件等。
此外,还可以向用户展示模型训练过程中的各种动态信息,例如,模型训练的中间结果,便于用户及时更新策略。
在本申请实施例中,允许用户对训练过程中使用到的相关策略进行配置,能够满足用户的各种实际需求,有利于提高具体场景下模型训练的整体效率和准确性,具有较强的灵活性和适用性。
图8为本申请实施例提供的一种代码生成方法的流程示意图。如图8所示,所述方法可以包括:
步骤801、获取待处理的需求信息。
步骤802、将所述需求信息输入到代码模型,得到对应的代码文件。
其中,所述代码模型是通过前述任一实施例所述方法构建的训练样本训练得到的。
所述需求信息可以用于表示任意代码相关的需求。根据所述需求信息,可以得到一个或多个代码文件。
可选的,所述需求信息可以为自然语言形式的文本。或者,所述需求信息可以包括多模态的信息,例如文本、图像、音频、视频中的至少一项。
可选的,可以在代码模型中增加多模态处理模块,将图像等其它模态的信息转换为token的形式,再对得到的token进行处理,得到最终的结果。
本申请实施例还支持面向项目的代码开发功能。可选的,获取待处理的需求信息,可以包括:获取目标项目对应的多个需求信息。其中,目标项目可以是用户希望开发的任意项目。多个需求信息可以由用户输入,或者,可以由大模型根据目标项目的描述信息生成。
针对目标项目中的每一需求信息,可以将该需求信息输入到代码模型,生成对应的代码文件。图9为本申请实施例提供的一种面向项目的代码生成原理示意图。如图9所示,可以针对目标项目的多个需求信息分别生成代码文件,生成的代码文件经过用户确认或修改后,可以发布使用。
在实际应用中,目标项目对应的需求信息之间可能会存在一定的关联关系,可以利用这些关联关系进行代码生成。
可选的,步骤802可以包括:针对所述多个需求信息中的任一目标需求信息,若所述目标项目中存在与所述目标需求信息相关的其他需求信息、且已针对所述其他需求信息生成了对应的代码文件,则将所述目标需求信息和提示信息输入到代码模型,得到所述目标需求信息对应的代码文件;其中,所述提示信息用于指示:与所述目标需求信息相关的其他需求信息以及其他需求信息对应的代码文件。
其中,所述其他需求信息可以是目标项目中除目标需求信息以外的需求信息。
一个简单的示例是,目标项目用于提供外卖服务,包含如下需求信息:需求信息A,用于查询卖家提供的产品列表以及各产品对应的价格并进行展示;需求信息B,用于查询买家当前可用的优惠券信息;需求信息C,用于根据买家从产品列表中选择的产品的价格以及优惠券信息,计算需要支付的实际价格。
这些需求信息彼此之间会有一定的关联关系,在生成代码文件时可以进行参考。例如,当前需要处理需求信息C,可以将需求信息C作为目标需求信息,需求信息A和需求信息B作为与需求信息C相关的其他需求信息。若需求信息A和需求信息B之前已经生成过对应的代码文件,则可以将需求信息C和提示信息输入到代码模型,提示信息可以包括需求信息A以及对应的代码文件、需求信息B以及对应的代码文件,提示代码模型根据这些信息,生成需求信息C对应的代码文件。
目前的代码模型大都聚焦于代码片段的生成,而较少地关注针对一个项目的多种需求信息的代码生成能力,本实施例可以提供面向项目的代码生成能力,有效提高项目开发的效率。并且,在进行代码生成时,可以将一个项目中相关的需求信息及其代码文件作为参考,可以使生成的代码文件在函数、对象的命名和处理逻辑上尽量保持一致,提高生成的代码文件的准确性,有助于提升整个项目的代码生成准确性和效率。
在其他可选的实现方式中,目标项目也可以对应一个需求信息,直接根据需求信息生成目标项目对应的代码文件。或者,目标项目对应多个需求信息,多个需求信息可以整合后输入到代码模型中,得到对应的多个代码文件。
除了面向项目以外,图8所示的代码生成方法,也可以应用于单个需求信息的代码生成或者其他场景的代码生成,此处不作限制。
可选的,所述代码模型通过下述方式构建:获取经过训练的基座模型,其中,所述基座模型包括多头注意力模块,所述多头注意力模块用于:通过多组查询参数、多组键参数、多组值参数,分别计算输入数据对应的查询向量、键向量和值向量,并对查询向量、键向量和值向量进行处理得到输出数据;将所述多头注意力模块替换为多查询注意力模块,得到待训练的代码模型;其中,所述多查询注意力模块继承所述多头注意力模块的所述多组查询参数、所述多组键参数中的一组键参数、所述多组值参数中的一组值参数。
在得到待训练的代码模型后,可以根据前述实施例构建的训练样本,对待训练的代码模型进行训练,训练后的代码模型可以用于执行图8所示的方法。
除了代码生成任务,上述实施例提供的代码模型,还可以应用于任意的与代码相关的其它任务,例如代码补全等。
综上所述,本申请实施例提供的方案,可以采用海量数据和大参数规模对代码模型进行训练,训练后的代码模型具有较强的自然语言和编程语言的理解能力,能够适用于各种与代码相关的任务,相比于传统的基于模板的代码生成方法,不必局限于预先设定好的模板,可以适用于更多的开发场景。并且,本申请实施例中,提出了项目感知的代码训练策略,大幅减轻模型生成代码的幻觉问题,结合从MHA模块加载参数到MQA模块的方法,以及短序列预训练、长序列继续训练、指令微调等训练阶段,在保证基座模型效果的同时加快模型推理速度,使模型训练更加高效,训练后的模型具备代码理解、自然语言意图理解、代码生成和补全等能力,能够显著提高软件领域开发者的工作效率,使得代码模型在实际应用中的落地成为了可能,对软件编写、软件测试、项目管理以及整个软件工程行业能够提供更好的帮助。
对应于上述的方法,本申请实施例提供一种样本构建装置,包括:
获取模块,用于获取多个代码文件;
构建模块,用于根据所述多个代码文件之间的关联关系,构建多个训练样本;其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成;
其中,所述多个训练样本用于对代码模型进行训练。
本申请实施例还提供一种模型训练装置,包括:
获取模块,用于获取多个训练样本,其中,所述多个训练样本是通过上述任一实施例所述的样本构建方法得到的;
训练模块,用于根据获取到的多个训练样本,对代码模型进行训练。
本申请实施例还提供一种代码生成装置,包括:
获取模块,用于获取待处理的需求信息;
生成模块,用于将所述需求信息输入到代码模型,得到对应的代码文件;
其中,所述代码模型是通过上述任一实施例所述的样本构建方法构建的训练样本训练得到的。
本申请实施例提供的装置的具体实现原理和效果可以参见前述实施例,此处不再赘述。
图10为本申请实施例提供的一种电子设备的结构示意图。如图10所示,本实施例的电子设备可以包括:
至少一个处理器1001;以及与所述至少一个处理器通信连接的存储器1002;其中,所述存储器1002存储有可被所述至少一个处理器1001执行的指令,所述指令被所述至少一个处理器1001执行,以使所述电子设备执行如上述任一实施例所述的方法。可选地,存储器1002既可以是独立的,也可以跟处理器1001集成在一起。
本实施例提供的电子设备的实现原理和技术效果可以参见前述各实施例,此处不再赘述。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现前述任一实施例所述的方法。
本申请实施例还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现前述任一实施例所述的方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器执行本申请各个实施例所述方法的部分步骤。
应理解,上述处理器可以是处理单元(Central Processing Unit,CPU),还可以是其它通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合申请所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。存储器可能包含高速随机存取存储器(Random Access Memory,RAM),也可能还包括非易失性存储(Non-Volatile Memory,NVM),例如至少一个磁盘存储器,还可以为U盘、移动硬盘、只读存储器、磁盘或光盘等。
上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(Static Random-Access Memory,SRAM),电可擦除可编程只读存储器(Electrically-Erasable Programmable Read-Only Memory,EEPROM),可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM),可编程只读存储器(Programmable read-only memory,PROM),只读存储器(Read-Only Memory,ROM),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于专用集成电路中。当然,处理器和存储介质也可以作为分立组件存在于电子设备或主控设备中。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本申请各个实施例所述的方法。
以上仅为本申请的优选实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (17)
1.一种样本构建方法,其特征在于,包括:
获取多个代码文件;
根据所述多个代码文件之间的关联关系,构建多个训练样本;其中,所述训练样本由具有关联关系的代码文件中的内容拼接而成;
所述多个训练样本用于对代码模型进行训练;
其中,代码文件之间的关联关系包括下述至少一项:项目、功能、依赖关系、函数或对象的引用关系。
2.根据权利要求1所述的方法,其特征在于,根据所述多个代码文件之间的关联关系,构建多个训练样本,包括:
确定所述多个代码文件中各代码文件所属的项目;
根据各项目对应的代码文件,构建对应的训练样本;
其中,所述训练样本具体包括属于同一项目的至少一个代码文件的内容。
3.根据权利要求2所述的方法,其特征在于,根据各项目对应的代码文件,构建对应的训练样本,包括:
针对任一项目,将属于该项目的多个代码文件的内容进行拼接,得到该项目的代码文本;
根据单个训练样本的长度,将该项目的代码文本切分为至少一个训练样本。
4.根据权利要求2所述的方法,其特征在于,任一项目包括多个编程语言对应的代码文件;根据各项目对应的代码文件,构建对应的训练样本,包括:
根据各代码文件所属的项目以及对应的编程语言,构建多个训练样本;
其中,所述训练样本具体包括同一项目中不同编程语言的至少两个代码文件的内容。
5.根据权利要求2所述的方法,其特征在于,根据各项目对应的代码文件,构建对应的训练样本,包括:
针对任一项目,对该项目对应的多个代码文件进行解析,确定该项目对应的多个代码文件之间的依赖关系;
根据该项目对应的多个代码文件之间的依赖关系,确定该项目对应的多个代码文件在训练样本中的顺序;
其中,对于某一训练样本包含的、属于同一项目的任意两个代码文件,若其中一个代码文件依赖于另一代码文件,则所述一个代码文件位于所述另一代码文件之后。
6.根据权利要求2所述的方法,其特征在于,所述方法还包括:针对任一项目,获取该项目对应的至少一个自然语言文件;
所述根据各项目对应的代码文件,构建对应的训练样本,包括:针对任一项目,根据该项目对应的自然语言文件和代码文件的功能,构建至少一个训练样本;
其中,所述训练样本具体包括属于同一项目同一功能的、多种语言的文件的内容;所述多种语言包括自然语言和至少一种编程语言。
7.根据权利要求1所述的方法,其特征在于,根据所述多个代码文件之间的关联关系,构建多个训练样本,包括:
根据所述多个代码文件中的函数或对象的引用关系,确定具有关联关系的代码文件,并根据所述多个代码文件之间的关联关系,构建多个训练样本。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述代码模型的训练过程包括:预训练阶段、继续训练阶段和指令微调阶段;
其中,所述预训练阶段用于使用第一长度的训练样本对代码模型进行训练;
所述继续训练阶段用于使用第二长度的训练样本对代码模型进行训练;所述第二长度大于第一长度;
所述指令微调阶段用于使用至少一个任务对应的训练样本对代码模型进行有监督训练;
其中,构建的多个训练样本包括预训练阶段使用的训练样本和/或继续训练阶段使用的训练样本,所述多个训练样本用于对代码模型进行自监督训练。
9.根据权利要求8所述的方法,其特征在于,所述预训练阶段的训练样本包括编程语言构成的训练样本;
所述继续训练阶段的训练样本对应的语言通过指令微调阶段的至少一个任务确定;
其中,若指令微调阶段的任务包括根据自然语言生成代码的任务,则所述继续训练阶段的训练样本包括自然语言和编程语言构成的训练样本;
若指令微调阶段的任务包括代码补全任务或代码检查任务,则所述继续训练阶段的训练样本包括编程语言构成的训练样本。
10.根据权利要求1所述的方法,其特征在于,还包括:
获取用户输入的下述至少一项信息,以根据所述至少一项信息以及所述多个代码文件之间的关联关系,构建多个训练样本:训练样本的长度、训练样本的构建策略和代码模型对应的至少一个任务;
其中,所述构建策略用于指示根据下述任意一项或多项来构建训练样本:代码文件所属的项目、对应的功能、依赖关系、编程语言以及代码模型的任务。
11.一种代码生成方法,其特征在于,包括:
获取待处理的需求信息;
将所述需求信息输入到代码模型,得到对应的代码文件;
其中,所述代码模型是通过权利要求1-10任一项所述方法构建的训练样本训练得到的。
12.根据权利要求11所述的方法,其特征在于,所述代码模型通过下述方式构建:
获取经过训练的基座模型;其中,所述基座模型包括多头注意力模块,所述多头注意力模块用于:通过多组查询参数、多组键参数、多组值参数,分别计算输入数据对应的查询向量、键向量和值向量,并对查询向量、键向量和值向量进行处理得到输出数据;
将所述多头注意力模块替换为多查询注意力模块,得到待训练的代码模型;其中,所述多查询注意力模块继承所述多头注意力模块的所述多组查询参数、所述多组键参数中的一组键参数、所述多组值参数中的一组值参数。
13.根据权利要求11所述的方法,其特征在于,获取待处理的需求信息,包括:获取目标项目对应的多个需求信息;
所述将所述需求信息输入到代码模型,得到对应的代码文件,包括:
针对所述多个需求信息中的任一目标需求信息,若所述目标项目中存在与所述目标需求信息相关的其他需求信息、且已针对所述其他需求信息生成了对应的代码文件,则将所述目标需求信息和提示信息输入到代码模型,得到所述目标需求信息对应的代码文件;
其中,所述提示信息用于指示:与所述目标需求信息相关的其他需求信息以及其他需求信息对应的代码文件。
14.一种模型训练方法,其特征在于,包括:
获取多个训练样本,其中,所述多个训练样本是通过权利要求1-10任一项所述的方法得到的;
根据获取到的多个训练样本,对代码模型进行训练。
15.根据权利要求14所述的方法,其特征在于,获取到的多个训练样本为第一长度的训练样本;
根据获取到的多个训练样本,对代码模型进行训练,包括:
根据获取到的多个训练样本对代码模型进行预训练;
从获取到的多个训练样本对应的项目中,选择部分项目,并根据所述部分项目对应的代码文件,构建第二长度的训练样本;
基于构建的第二长度的训练样本对预训练后的代码模型进行继续训练;
对继续训练后的代码模型进行指令微调。
16.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述电子设备执行权利要求1-15任一项所述的方法。
17.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1-15任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410033070.0A CN117556263B (zh) | 2024-01-10 | 2024-01-10 | 样本构建方法、代码生成方法、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410033070.0A CN117556263B (zh) | 2024-01-10 | 2024-01-10 | 样本构建方法、代码生成方法、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117556263A CN117556263A (zh) | 2024-02-13 |
CN117556263B true CN117556263B (zh) | 2024-04-23 |
Family
ID=89823456
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410033070.0A Active CN117556263B (zh) | 2024-01-10 | 2024-01-10 | 样本构建方法、代码生成方法、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117556263B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112052160A (zh) * | 2020-08-06 | 2020-12-08 | 中信银行股份有限公司 | 一种代码的用例获取方法、装置、电子设备及介质 |
CN115146282A (zh) * | 2022-08-31 | 2022-10-04 | 中国科学院大学 | 基于ast的源代码异常检测方法及其装置 |
CN115390806A (zh) * | 2022-09-06 | 2022-11-25 | 大连理工大学 | 基于双模态联合建模的软件设计模式推荐方法 |
CN116401289A (zh) * | 2023-03-16 | 2023-07-07 | 南京航空航天大学 | 一种基于多源信息结合的可追溯性链接自动恢复方法 |
CN116820429A (zh) * | 2023-08-28 | 2023-09-29 | 腾讯科技(深圳)有限公司 | 代码处理模型的训练方法、装置、电子设备及存储介质 |
CN116910567A (zh) * | 2023-09-12 | 2023-10-20 | 腾讯科技(深圳)有限公司 | 推荐业务的在线训练样本构建方法及相关装置 |
CN116932384A (zh) * | 2023-06-29 | 2023-10-24 | 华南理工大学 | 一种基于特征融合和特征选择的软件缺陷预测方法 |
CN117113083A (zh) * | 2023-08-17 | 2023-11-24 | 北京爱奇艺科技有限公司 | 样本数据的生成方法和大型语言模型的训练方法 |
CN117215935A (zh) * | 2023-09-12 | 2023-12-12 | 南京工业大学 | 一种基于多维度代码联合图表示的软件缺陷预测方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105975857A (zh) * | 2015-11-17 | 2016-09-28 | 武汉安天信息技术有限责任公司 | 基于深度学习方法推断恶意代码规则的方法及系统 |
CN112015859B (zh) * | 2019-05-31 | 2023-08-18 | 百度在线网络技术(北京)有限公司 | 文本的知识层次抽取方法及装置、计算机设备及可读介质 |
US11893385B2 (en) * | 2021-02-17 | 2024-02-06 | Open Weaver Inc. | Methods and systems for automated software natural language documentation |
-
2024
- 2024-01-10 CN CN202410033070.0A patent/CN117556263B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112052160A (zh) * | 2020-08-06 | 2020-12-08 | 中信银行股份有限公司 | 一种代码的用例获取方法、装置、电子设备及介质 |
CN115146282A (zh) * | 2022-08-31 | 2022-10-04 | 中国科学院大学 | 基于ast的源代码异常检测方法及其装置 |
CN115390806A (zh) * | 2022-09-06 | 2022-11-25 | 大连理工大学 | 基于双模态联合建模的软件设计模式推荐方法 |
CN116401289A (zh) * | 2023-03-16 | 2023-07-07 | 南京航空航天大学 | 一种基于多源信息结合的可追溯性链接自动恢复方法 |
CN116932384A (zh) * | 2023-06-29 | 2023-10-24 | 华南理工大学 | 一种基于特征融合和特征选择的软件缺陷预测方法 |
CN117113083A (zh) * | 2023-08-17 | 2023-11-24 | 北京爱奇艺科技有限公司 | 样本数据的生成方法和大型语言模型的训练方法 |
CN116820429A (zh) * | 2023-08-28 | 2023-09-29 | 腾讯科技(深圳)有限公司 | 代码处理模型的训练方法、装置、电子设备及存储介质 |
CN116910567A (zh) * | 2023-09-12 | 2023-10-20 | 腾讯科技(深圳)有限公司 | 推荐业务的在线训练样本构建方法及相关装置 |
CN117215935A (zh) * | 2023-09-12 | 2023-12-12 | 南京工业大学 | 一种基于多维度代码联合图表示的软件缺陷预测方法 |
Non-Patent Citations (3)
Title |
---|
Recognition of Alternative Splice Sites Based on Discrete Cosine Transform Learned by SVM With The Mixed Pseudo-image Coding Method;Wang, J;《2010 4TH INTERNATIONAL CONFERENCE ON BIOINFORMATICS AND BIOMEDICAL ENGINEERING (ICBBE 2010)》;20101231;全文 * |
基于深度学习的API误用缺陷检测;汪昕;陈驰;赵逸凡;彭鑫;赵文耘;;软件学报;20190515(第05期);全文 * |
面向异常处理的代码智能化推荐;林锴;《计算机科学与探索》;20210909;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN117556263A (zh) | 2024-02-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hope et al. | Learning tensorflow: A guide to building deep learning systems | |
CN110032633B (zh) | 多轮对话处理方法、装置和设备 | |
CN110321291A (zh) | 测试案例智能提取系统及方法 | |
CN112100401B (zh) | 面向科技服务的知识图谱构建方法、装置、设备及存储介质 | |
US11797281B2 (en) | Multi-language source code search engine | |
CN110362663A (zh) | 自适应多感知相似度检测和解析 | |
Bateman et al. | The The Supervised Learning Workshop: A New, Interactive Approach to Understanding Supervised Learning Algorithms | |
Rai | Advanced deep learning with R: Become an expert at designing, building, and improving advanced neural network models using R | |
CN113761863A (zh) | 一种列表页面的配置方法、设备及存储介质 | |
Chatterjee et al. | DREQ: Document Re-ranking Using Entity-Based Query Understanding | |
CN117290481A (zh) | 基于深度学习的问答方法、装置、存储介质及电子设备 | |
CN115828307B (zh) | 应用于ocr的文本识别方法及ai系统 | |
CN117556263B (zh) | 样本构建方法、代码生成方法、电子设备及存储介质 | |
CN116932694A (zh) | 一种针对知识库的智能化检索方法、设备及存储介质 | |
CN117633162A (zh) | 机器学习任务模板生成方法、训练方法、微调方法及设备 | |
Sobrecueva | Automated Machine Learning with AutoKeras: Deep learning made accessible for everyone with just few lines of coding | |
CN115836288A (zh) | 用于生成训练数据的方法以及装置 | |
Mitra et al. | A Systematic Review of Methods for Consistency Checking in SBVR-based Business Rules. | |
CN116737964B (zh) | 一种人工智能大脑系统 | |
CN116383883B (zh) | 一种基于大数据的数据管理权限处理方法及系统 | |
CN118227096B (zh) | 一种基于大模型的开发任务编排方法和装置 | |
CN118396123B (zh) | 文本生成方法、装置、计算机程序产品、电子设备及介质 | |
Califf et al. | Applying ilp-based techniques to natural language information extraction: An experiment in relational learning | |
CN118350024A (zh) | 加密方案确定方法、装置、存储介质及电子设备 | |
Duvvada et al. | Image Tagging Using Deep Learning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |