发明内容
本发明的目的在于克服现有技术的缺陷,提供一种示例库的构建、使用方法及生成的示例代码的评估方法,解决现有的通过人工标注代码生成训练数据存在的效率低下,耗时耗力,存在误差等问题。
实现上述目的的技术方案是:
本发明提供了一种示例库的构建方法,包括如下步骤:
构建种子示例库,所述种子示例库中的种子示例包括种子示例任务和种子示例代码;
生成增强示例,基于所构建的种子示例库,使用LLM生成增强示例任务和增强示例代码;对生成的增强示例任务和增强示例代码进行人工校验;将校验后的增强示例任务和增强示例代码对应关联形成增强示例,并将所述增强示例加入到创建的增强示例库中;
生成新的增强示例,从所述种子示例库和所述增强示例库中选取设定数量的种子示例和增强示例;基于所选取的种子示例和增强示例,使用LLM生成新的增强示例任务和新的增强示例代码;再对新的增强示例任务和新的增强示例代码进行人工校验;将校验后新的增强示例任务和新的增强示例代码对应关联形成新的增强示例加入到所述增强示例库中;
判断所述增强示例库中的增强示例的数量是否满足设定要求,若不满足,则重复执行生成新的增强示例的步骤,直至所述增强示例库中的增强示例的数量满足设定要求为止;若满足,则将所述种子示例库和所述增强示例库组合在一起作为示例库,从而完成示例库的构建。
本发明利用人工构建种子示例库,该种子示例库中的种子示例的数量远小于端到端代码生成模型所需要的示例数量,基于人工构建的少量的种子示例库,利用LLM自动生成增强示例,大大降低了开发者的工作量和难度,也使得代码生成更为高效和准确,本发明的示例库自动构建方法能够快速实现示例库的构建,还极大地提高了代码生成的效率和质量。
本发明示例库的构建方法的进一步改进在于,使用LLM生成增强示例任务包括以下步骤:
设计生成任务提示框架,所述生成任务提示框架包括任务提示说明部分和任务样本部分;
从所构建的种子示例库中选取设定数量的种子示例,并将所选取的种子示例中的种子示例任务以设定格式排列并存入到所述任务样本部分;
将所述生成任务提示框架输入到LLM中,让LLM进行文本续写,以生成与之对应的增强示例任务。
本发明示例库的构建方法的进一步改进在于,使用LLM生成增强示例代码包括以下步骤:
设定生成代码提示框架,所述生成代码提示框架包括代码提示说明部分、生成操作内容定义部分以及示例样本部分;
从所构建的种子示例库中选取设定数量的种子示例,并将所选取的种子示例中的种子示例任务和种子示例代码以设定格式排列并存入到所述示例样本部分;
将所述生成代码提示框架输入到LLM中,让LLM进行文本续写,以生成与之对应的增强示例代码。
本发明示例库的构建方法的进一步改进在于,在使用LLM生成增强示例任务和使用LLM生成新的增强示例任务的两个步骤之后,均还包括以下步骤:
对生成的增强示例任务和新的增强示例任务与所构建的种子示例库中的种子示例任务进行相关性指标的计算,以得到相似度结果;
将相似度结果高于参考值的增强示例任务和新的增强示例任务删除,对相似度结果不高于参考值的增强示例任务和新的增强示例任务进行人工校验。
本发明示例库的构建方法的进一步改进在于,所构建的种子示例库基于人工收集获得。
本发明还提供了一种示例库的使用方法,所述示例库基于所述的示例库的构建方法构建而成,所述使用方法包括如下步骤:
将所构建的示例库拆分为训练集和测试集;
构建所述测试集的执行结果表示作为标准执行结果表示;
提供代码生成模型,利用所述训练集对提供的代码生成模型进行模型训练;
使用经过训练后的代码生成模型,针对所述测试集中的示例任务生成对应的新生示例代码;
构建所述新生示例代码的执行结果表示作为实际执行结果表示;
基于所述标准执行结果表示和所述实际执行结果表示,对所述代码生成模型进行评估。
本发明的示例库的使用方法的进一步改进在于,所构建的测试集的执行结果表示和新生示例代码的执行结果表示包括以下的一种、两种或多种:
终端输出表示、数据图像表示及数据文本表示。
本发明又提供了一种基于示例任务生成的示例代码的评估方法,包括如下步骤:
基于示例代码对应的示例任务构建执行结果表示类型,并将获得与所述示例任务对应的执行结果表示作为标准执行结果表示;
执行基于示例任务生成的示例代码,以获得实际执行结果表示;
判断所述实际执行结果表示与所述标准执行结果表示是否相一致,若一致,则得到生成的示例代码执行正确的评估结果;反之,则得到生成的示例代码执行错误的评估结果。
本发明的基于示例任务生成的示例代码的评估方法的进一步改进在于,所述的生成的示例代码由代码生成模型生成而得到。
本发明的基于示例任务生成的示例代码的评估方法的进一步改进在于,获得与所述示例任务对应的执行结果表示作为标准执行结果表示包括如下步骤:
从所述的示例库的构建方法中构建的示例库中查找得到与所述示例任务相对应的示例代码并执行,以得到对应的标准执行结果表示。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明。
参阅图1,本发明提供了一种示例库的构建、使用方法及生成的示例代码的评估方法,用于解决封闭域中代码生成面临的缺乏足够的训练语料(也即示例)以及没有有效的评估方法的问题。本发明提供的示例库的构建方法使用少量种子示例实现低成本的示例库的构建,本发明提供的生成的示例代码的评估方法能够自动且高效的评估生成的代码执行的正确性,缩短整个生成代码的迭代周期,能够更好地进行代码的生成和优化。下面结合附图对本发明示例库的构建、使用方法及生成的示例代码的评估方法进行说明。
参阅图1,显示了本发明示例库的构建方法的流程图。下面结合图1,对本发明示例库的构建方法进行说明。
如图1所示,本发明的示例库的构建方法,包括如下步骤:
执行步骤S11,构建种子示例库,该种子示例库中的种子示例包括种子示例任务和种子示例代码;其中种子示例库中包括有一定数量的种子示例,种子示例代码是用于实现对应的种子示例任务所需执行的代码片段。接着执行步骤S12。
执行步骤S12,生成增强示例,基于所构建的种子示例库,使用LLM生成增强示例任务和增强示例代码;对生成的增强示例任务和增强示例代码进行人工校验;将校验后的增强示例任务和增强示例代码对应关联形成增强示例,并将增强示例加入到创建的增强示例库中;其中LLM(Large Language Model)为大语言模型,也简称为大模型。接着执行步骤S13。
执行步骤S13,生成新的增强示例,从种子示例库和增强示例库中选取设定数量的种子示例和增强示例;基于所选取的种子示例和增强示例,使用LLM生成新的增强示例任务和新的增强示例代码;再对新的增强示例任务和新的增强示例代码进行人工校验;将校验后新的增强示例任务和新的增强示例代码对应关联形成新的增强示例加入到增强示例库中;接着执行步骤S14。
执行步骤S14,判断增强示例库中的增强示例的数量是否满足设定要求;若不满足,则重复执行步骤S13;若满足,则种子示例库和增强示例库组合在一起作为示例库,从而完成了示例库的构建。
进一步地,步骤S11构建种子示例库,是基于人工收集获得。具体地,人工收集与相关的代码用例,作为种子示例,将所收集的多条种子示例存储到数据库中形成种子示例库,记为S,种子示例库S中的每一条种子示例包含示例任务和示例代码,示例任务比如将B列最大值标红等的任务内容,记为S.TASK;示例代码为任务内容所需要执行的代码片段,记为S.CODE。人工收集的相关的代码用例整理形成种子示例,所收集的种子示例的数量远小于端到端代码生成模型所需要的示例数量,也即收集的种子示例属于少量样本。
在本发明的一种具体实施方式中,使用LLM生成增强示例任务包括以下步骤:设计生成任务提示框架,生成任务提示框架包括任务提示说明部分和任务样本部分;从所构建的种子示例库中选取设定数量的种子示例,并将所选取的种子示例中的种子示例任务以设定格式排列并存入到任务样本部分;将生成任务提示框架输入到LLM中,让LLM进行文本续写,以生成与之对应的增强示例任务。
本发明的步骤S12生成增强示例的首要步骤是利用LLM生成增强示例任务,然后再基于增强示例任务生成对应的增强示例代码。
初始构建增强示例库(记为E)时,利用种子示例库中的种子示例任务来生成增强示例任务。在增强示例库中已经有增强示例后,可利用种子示例任务和增强示例库中已有的增强示例任务来生成新的增强示例任务。
使用LLM生成增强示例任务,首先需要进行生成任务提示框架的设计,包括任务提示说明部分以及任务样本部分,其中任务提示说明部分用于说明目标任务,并描述任务相关的操作内容的定义。任务样本部分作为小样本示例,具体地是将从种子示例库中选取的设定数量的种子示例任务(即S.TASK)以指定格式排列,以帮助LLM学习返回的任务的格式与内容。LLM基于任务提示框架能够生成指定格式的增强示例任务,该LLM(比如可选用openai chat)进行文本续写即可快速生成增强示例任务,记为E.TASK。
进一步地,使用LLM生成新的增强示例任务包括以下步骤:设计生成任务提示框架,生成任务提示框架包括任务提示说明部分以及任务样本部分;从所构建的种子示例库和增强示例库中选取设定数量的种子示例和增强示例,并将所选取的种子示例中的种子示例任务和增强示例中的增强示例任务以设定格式排列并存入到任务样本部分;将生成任务提示框架输入到LLM中,让LLM进行文本续写,以生成与之对应的新的增强示例任务。
其中的设定数量可人工进行设定,该设定数量可即为n,n的取值可是5~10不等,受限于11m上下文长度限制。在选取设定数量的种子示例和增强示例时,设定选取的种子示例的数量大于增强示例数量,较佳地,可选取60%的种子示例,选取40%的增强示例,在增强示例库E中的增强示例数量不足时,可从种子示例库S中补齐。LLM基于生成任务提示框架生成的增强示例任务及新的增强示例任务的数量为t,t的取值可是5~10不等,受限于11m上下文长度限制,t与n的取值可以相同,也可不相同。
本发明在自动生成增强示例任务时,让LLM不仅学习种子示例库中的种子示例任务进行自动生成,也学习已经生成的增强示例任务进行自动生成,这样能够让LLM生成的增强示例任务具有多样性,而学习的增强示例任务的数量小于种子示例任务,可确保生成的增强示例任务不会超出种子示例任务的初始范围,也即生成的增强示例任务与构建的种子示例任务具有相关性。
进一步地,在使用LLM生成增强示例任务和使用LLM生成新的增强示例任务的两个步骤之后,均还包括以下步骤:对生成的增强示例任务及新的增强示例任务与所构建的种子示例库中的种子示例任务进行相关性指标的计算,以得到相似度结果;将相似度结果高于参考值的增强示例任务及新的增强示例任务删除。对相似度结果不高于参考值的增强示例任务和新的增强示例任务进行人工校验。
具体地,生成增强示例任务或新的增强示例任务后,将生成的每一条任务与种子示例库中每一条种子示例任务(S.TASK中)计算相关性指标,可通过ROUGE-L/BLEU等方法计算相关性,但不以此为限,还可以使用其他的相关性算法进行计算。然后将相似度过高的任务剔除,以满足生成任务的多样性,避免重复。参考值可人工设定,该参考值的设定依据相似度结果的数值范围确定。若相似度以百分比来表示,参考值可设定为70%、80%等,若相似度以0~1之间的数值来表示,参考值可设定为0.7、0.8等。以ROUGE-L为例,当ROUGE-L大于0.7时可将该条任务剔除。
在本发明的一种具体实施方式中,使用LLM生成增强示例代码包括以下步骤:设定生成代码提示框架,生成代码提示框架包括代码提示说明部分、生成操作内容定义部分以及示例样本部分;从所构建的种子示例库中选取设定数量的种子示例,并将所选取的种子示例中的种子示例任务和种子示例代码以设定格式排列并存入到示例样本部分;将生成代码提示框架输入到LLM中,让LLM进行文本续写,以生成与之对应的增强示例代码。
具体地,在生成了增强示例任务或者新的增强示例任务后,结合种子示例库S,可使用LLM进行有条件的代码生成,首先需要进行生成代码提示框架的设计,主要包含代码提示说明部分、生成操作内容定义部分以及示例样本部分,其中代码提示说明部分用于说明目标任务,并描述任务相关的操作内容的定义和使用方法;生成操作内容定义部分用于定义操作内容的格式及内容,为LLM提供参考,指导LLM在fewshot场景下不要生成错误的操作内容引用,并增强其泛化性;示例样本部分,由生成增强示例任务或者新的增强示例任务所选取的种子示例任务或者种子示例任务和增强示例任务以及其一一对应的种子示例代码或者种子示例代码和增强示例代码组成,以指定格式排列,帮助LLM学习代码协作的规范。
基于生成代码提示框架,调用拥有代码生成能力的LLM(如:openai chat)进行文本续写即可快速得到生成的代码内容,增强示例代码记为E.CODE。增强示例代码与增强示例任务一一对应,从而得到了t条增强示例或新的增强示例。
对生成的增强示例和新的增强示例在将其加入到增强示例库中之前,需要进行人工校验,人工在代码对应的沙盒中执行生成的代码,可采用在线web执行代码的方法执行生成的代码,还可以采用其他执行方法,判定生成代码是否符合任务的描述,判定其准确性,并修正错误代码,最终将人工校验后的增强示例加入增强示例库中,在增强示例库中的增强示例的数量达到设定要求时,就完成了示例库的构建。
如图4所示,对本发明示例库的构建方法的流程进行说明。
本发明的构建方法包括数据集构建模块和LLM:首先,构建种子示例库S和增强示例库E,比如(TASK:Excel操作任务描述,CODE:TASK对应的代码)。接着数据集构件模块发送提示(随机K个S.TASK)/(随机K个S.TASK+E.TASK)给LLM,LLM返回生成的J个E'.TASK给数据集构件模块。然后,数据集构件模块发送提示(J个E'.TASK,K个S.CODE)/(J个E'.TASK,K个S.CODE+E.CODE)给LLM,LLM返回生成的J个E'.TASK对应的E'.CODE。数据集构件模块将E'.TASK对应的E'.CODE输出,由人工校验,修改后加入E。
本发明示例库的构建方法的有益效果为:
本发明使用种子示例自动生成增强示例,相比于传统的从零开始进行人工代码编写,大大降低了开发者的工作量和难度,这不仅节省了大量的时间和精力,而且也使得代码生成更为高效和准确。
本发明可在很大程度上提高在少样本、少标注的情况下代码生成的性能,在传统的代码生成过程中,需要大量的样板和标准才能保证代码的质量和性能,然而,本发明能够在无需大量标注的情况下快速实现代码库的构建,极大地提高了代码生成的效率和质量。
本发明的构建方法是利用提示框架进行代码自动生成的方法,能够快速的得到所需的增强示例,实现了低成本的示例库的构建。
本发明还提供了一种生成的示例代码的评估方法,用于评估生成的代码是否能够正确执行并达到预期的效果,可实现评估代码生成质量。在封闭域中,很多独特的代码执行工具(如在线Excel编辑器中的脚本执行器)的执行结果并不能直观的反映出代码对错。而现有的评估方法主要依赖于人工检查,这不仅耗时耗力,而且难以保证评估结果的客观性和准确性。例如,人工检查可能会忽略某些隐藏的错误,或者对于复杂的代码逻辑无法做出准确的判断。本发明的评估方法用于解决人工检查存在的上述问题。
如图3所示,本发明生成的示例代码的评估方法,包括如下步骤:
执行步骤S31,基于生成的示例代码对应的示例任务构建执行结果表示类型,并将获得与示例任务对应的执行结果表示作为标准执行结果表示;接着执行步骤S32;
执行步骤S32,执行生成的示例代码,以获得实际执行结果表示;接着执行步骤S33;
执行步骤S33,判断实际执行结果表示与标准执行结果表示是否相一致,若一致,则得到生成的示例代码执行正确的评估结果,反之,则得到生成的示例代码执行错误的评估结果。
本发明的生成的示例代码的评估方法可用于评估本发明提供的示例库的构建方法中构建的增强示例库中的增强示例代码,还可用于评估传统的python代码,也可以用于评估针对封闭域一些特殊类型的代码执行结果,比如针对Excel的在线脚本执行。
本发明步骤S32执行生成的示例代码中的示例代码可为本发明提供的示例库的构建方法中构建的增强示例库中的增强示例代码,还可为传统的python代码,也可以为针对封闭域一些特殊类型的代码,比如Excel的在线脚本。
较佳地,生成的示例代码由代码生成模型生成而得到。具体地,建立代码生成模型,包括如下步骤:提供代码生成模型;从生成的示例代码来源库中选取训练集,利用训练集对代码生成模型进行模型训练,即完成了代码生成模型的建立。所提供的代码生成模型可为LLM,还可为现有的开源或闭源模型,比如开源模型StarCoder,闭源模型ChatGPT等。。其中的来源库可为本发明示例库的构建方法中构建的示例库,还可以为传统的python代码库,也可以为针对封闭域一些特殊类型的代码库。
本发明步骤S31中获得与示例任务对应的执行结果表示作为标准执行结果表示包括如下步骤:从本发明的示例库的构建方法中构建的示例库中查找得到与所述示例任务相对应的示例代码并执行,以得到对应的标准执行结果表示。较佳地,在利用代码生成模型生成对应的代码时,从本发明的示例库的构建方法中构建的示例库中选取对应的示例代码和示例任务,将选取的示例任务输入给代码生成模型进行代码的生成,由于本发明构建的示例库中的示例代码经过人工校验,其正确性相当于人工标注,故而能够作为标准来评估代码生成模型所生成的代码的正确性。
本发明的步骤S31和步骤S32中执行对应的代码可通过建立的自动化执行容器实现,该自动化执行容器可由RPA程序为基础编辑而成,还可由其他程序建立,自动化执行容器相当于自动化的代码执行沙盒,能够实现自动化的执行代码,并根据构建的执行结果表示类型获取对应的执行结果表示。
在本发明的一种具体实施方式中,所构建的执行结果表示类型包括以下的一种、两种或多种:终端输出表示、数据图像表示及数据文本表示。
其中数据图像表示和数据文本表示用于对源数据在终端输出表示层面没有任何变化的任务进行结果表示,比如:将第三列数据标记为红色,这个任务中源数据(Excel表格)上才有类似的变化,任务代码本身没有任何输出内容。终端输出表示(console):在代码执行过程中,可能最终没有对源数据的修改,(比如“获取A列最大值”的任务,只需要输出最大值即可),这种任务通过包括且不限于类似return/console.log/print等函数将内容输出到控制台。具体范围包括结果值、中间关键变量值等。将这些值按照执行顺序依次,通过自动化执行容器从终端提取为列表即可作为终端输出表示。数据文本表示(richtext):在代码执行过程中,对源数据有修改(比如“将A列最大值标红”的任务),这样的执行结果通常无法得到终端输出表示,只能通过对源数据的变化部分进行表示才能确定执行效果。数据文本表示采用标准化的富文本信息,通过自动化执行容器从源数据进行拷贝并将内容粘贴到(不限于ckeditor等)富文本编辑/表示工具后得到(不限于html表示的)内容,以此获取源数据在代码执行后的内容、数量以及(颜色、大小、字体等)富文本信息的变化。数据图像表示(screen snapshot):在代码执行过程中,对源数据有修改(比如“将A列设置为只能输入数字”的任务),这样的执行结果通过上述两种方法都无法得到内容的完整表示(代码执行前后的表示提取都没有变化)。但是通常这类的代码执行目标,可以通过设计源数据内容(比如A列部分行内容设计为非数字类)就可以得到在显示效果上的区分(非数字类的单元格会显示红色小三角),这样的显示区别可以通过自动化执行容器中进行屏幕截图的方式来提取数据图像表示。数据图像表示:对源数据执行结果区域进行屏幕截图。
在一种实施方式中,将示例任务按照构建的执行结果表示类型进行分类,然后执行得到对应类型的执行结果,再进行评估。
在另一种实施方式中,执行示例代码获取该示例代码的三种执行结果,在评估时,判断标准和实际的三个表示内容是否完全一致。
本发明的生成的代码的评估方法可实现对代码的有效评估,可为后续代码优化和改进提供有力支持,让开发者可以更好地理解和掌握代码质量,从而更好地进行代码的生成和优化。
本发明又提供了一种示例库的使用方法,该示例库基于本发明示例库的构建方法构建而成,该使用方法包括如下步骤:
如图2所示,执行步骤S21,将所构建的示例库拆分为训练集和测试集;接着执行步骤S22;
执行步骤S22,构建测试集的执行结果表示作为标准执行结果表示;接着执行步骤S23;
执行步骤S23,提供代码生成模型,利用训练集对提供的代码生成模型进行模型训练;接着执行步骤S24;
执行步骤S24,使用经过训练后的代码生成模型,针对测试集中的示例任务生成对应的新生示例代码;接着执行步骤S25;
执行步骤S23,构建新生示例代码的执行结果表示作为实际执行结果表示;接着执行步骤S26;
执行步骤S26,基于标准执行结果表示与实际执行结果表示,对代码生成模型进行评估。
步骤S21中的示例库即为本发明示例库的构建方案中所构建的示例库,即种子示例库S+增强示例库E。该示例库中包括若干示例,每一示例均包括示例任务和示例代码。
本发明的使用方法将示例库拆分为训练集TrainData和测试集TestData,执行测试集TestData中的示例代码并获取执行结果表示,作为标准执行结果表示。将该标准执行结果表示添加到测试集中,记为TestDataGT(T.TASK,T.CODE,T.CONSOLE,T.RICHTEXT,T.SCREENSNAP SHOT),每一示例记为T。
利用训练集对代码生成模型进行训练,然后再利用代码生成模型对测试集中的示例任务进行代码生成,得到新生示例代码,记为AT.CODE。该代码生成模型可选用LLM模型,还可根据需要对该LLM模型进行微调,或者还可以选用已有的模型。比如开源模型StarCoder,闭源模型ChatGPT等。
执行新生示例代码以得到执行结果表示,作为实际执行结果表示,将该实际执行结果表示加入到原测试集形成比对集,记为TextDateAT(T.TASK,AT.CODE,AT.CONSOLE,AT.RICHTEXT,AT.SCREENSNAPSH OT)。
在一较佳实施方式中,执行对应的代码并得到执行结果表示可通过本发明的生成代码评估方法中的自动化执行容器实现。具体地,利用自动化执行容器获取测试集中示例代码的执行结果表示,利用自动化执行容器获取新生示例代码的执行结果表示。
在本发明的一种具体实施方式中,所构建的测试集的执行结果表示和新生示例代码的执行结果表示包括以下的一种、两种或多种:终端输出表示、数据图像表示及数据文本表示。
在本发明的一种具体实施方式中,对测试集进行评估包括以下步骤:
比对判断标准执行结果表示与实际执行结果表示是否相一致,
若是,则得到实际执行结果表示对应的代码执行正确的评估结果;
若否,则得到实际执行结果对应的代码执行错误的评估结果。
进一步地,还可建立评估引擎,利用评估引擎对所得到的标准执行结果表示与实际执行结果表示进行评估,以得到代码生成模型所生成的代码的正确性,实现了对代码及代码生成模型正确性的评估。
如图4所示,对本发明的使用方法的流程进行说明。
本发明的使用方法包括自动化执行容器,评估引擎和微调模块(可选)。若已有代码生成模型,可不选择微调模块。
首先将示例库拆分为训练集TrainData和测试集TestData。
将TestData(T.TASK,T.CODE)输入到自动化执行容器得到执行结果表示,即
TestDataGT(T.TASK,T.CODE,T.CONSOLE,T.RICHTEXT,T.SCREENSNAP SHOT)。
若选用微调模块,可将提示(TrainData.TASK,TrainData.CODE)发送给微调模块创建微调任务,得到模型id。将提示(T.TASK)使用微调模型对测试集生成对应的CODE,得到对应代码AT.CODE。
将TestData(T.TASK,AT.CODE)输入自动化执行容器得到执行结果表示,即TextDateAT
(T.TASK,AT.CODE,AT.CONSOLE,AT.RICHTEXT,AT.SCREENSNAPSH OT)。
将TestDataGT和TextDateAT输入评估引擎进行评估,得到模型评估结果,包括执行准确率和执行通过率。
以上结合附图实施例对本发明进行了详细说明,本领域中普通技术人员可根据上述说明对本发明做出种种变化例。因而,实施例中的某些细节不应构成对本发明的限定,本发明将以所附权利要求书界定的范围作为本发明的保护范围。