CN117032722B - 基于api文档的代码生成方法 - Google Patents

基于api文档的代码生成方法 Download PDF

Info

Publication number
CN117032722B
CN117032722B CN202311048307.4A CN202311048307A CN117032722B CN 117032722 B CN117032722 B CN 117032722B CN 202311048307 A CN202311048307 A CN 202311048307A CN 117032722 B CN117032722 B CN 117032722B
Authority
CN
China
Prior art keywords
task
vector
data
code
function
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
Application number
CN202311048307.4A
Other languages
English (en)
Other versions
CN117032722A (zh
Inventor
请求不公布姓名
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Lanma Technology Co ltd
Original Assignee
Shanghai Lanma Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Lanma Technology Co ltd filed Critical Shanghai Lanma Technology Co ltd
Priority to CN202311048307.4A priority Critical patent/CN117032722B/zh
Publication of CN117032722A publication Critical patent/CN117032722A/zh
Application granted granted Critical
Publication of CN117032722B publication Critical patent/CN117032722B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Machine Translation (AREA)

Abstract

本发明涉及一种基于API文档的代码生成方法,包括步骤:S1、将API文档规范化,将每个函数整理为标准化输入格式;S2、构建代码示例库;S3、对代码示例库进行向量化索引,并将向量化的结果存储在向量数据库;S4、当用户输入原始任务之后,将原始任务进行向量化,并与该向量数据库中的每条向量数据进行相似度计算,找到若干个匹配的向量数据,并进一步找到对应的若干个示例数据,对所有找到的示例数据进行召回;S5、将召回成功的示例数据通过语义分析得到所调用的函数;S6、将召回的所述示例数据及所调用的函数写入统一设计的提示框架中,然后利用语言模型自动生成代码内容。本发明可实现代码的自动生成,效率高、成本低、且质量可控。

Description

基于API文档的代码生成方法
技术领域
本发明涉及人工智能领域,特别涉及基于API文档的代码生成方法。
背景技术
在大模型出现之前,封闭域的代码生成主要方法是使用模型进行端到端的代码生成。这种方法首先需要针对封闭领域内的各个功能收集大量的供训练的代码用例,而一般收集代码用例的方法只能借助于人工标注(即人工编写代码用例)才能得到,同时还需要校验代码的可执行性和逻辑正确性。然后使用大量上述代码用例进行生成模型的训练、评估以及调优。整个过程费时费力,且代码用例的人工标注的成本非常高昂,对标注人员的要求相对较高,整体代码用例的质量可控性差,往往最终导致端到端生成效果不佳。
发明内容
为了解决上述问题,本发明提供了一种基于API文档的代码生成方法,基于API文档的规范化及相关代码示例库的构建,可实现代码的自动生成,效率高、成本低、且质量可控。
本发明通过如下方案来实现:一种基于API文档的代码生成方法,包括步骤:
S1、将API文档规范化:将API文档中的每个函数整理为标准化的输入格式;
S2、构建代码示例库:收集预定数量的基于所述API文档构建的无标注的代码用例,对照所述API文档的规范化标准对所有收集的代码用例进行函数调用标准化;从所有标准化的代码用例中挑选出常用函数,对所述常用函数进行人工标注,以获得基于函数功能的代码用例;将基于函数功能的代码用例作为示例数据存储在示例库,以形成基于函数功能的代码示例库;
S3、对所述代码示例库进行向量化索引,并将向量化的结果存储在向量数据库;其中,所述向量数据库中的向量数据与所述代码示例库中的示例数据一一对应;
S4、在接收到用户输入的原始任务之后,将所述原始任务进行向量化,并与所述向量数据库中的每条向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述代码示例库中找到对应的示例数据,对所有找到的示例数据进行召回;
S5、将召回成功的示例数据,通过语义分析得到所调用的函数;
S6、将召回的所述示例数据和所调用的函数写入统一设计的提示框架中,基于LLM对所述提示框架中所述示例数据和所调用的函数的学习,生成对应目标任务的代码。
本发明基于API文档的代码生成方法的进一步改进在于:
在执行步骤S2时,使存储在所述代码示例库中的每条所述示例数据的内容均包括:示例任务、示例拆解任务及示例代码;其中,所述示例拆解任务包括:根据所述示例任务的操作步骤进行拆解的多个子任务;所述示例代码为实现所述示例任务的代码;
在执行步骤S3时,分别针对所述代码示例库中每个示例数据的示例任务、示例拆解任务及示例代码进行向量化索引,并将所述向量数据库中的向量数据按照索引目标拆分成示例任务索引和示例拆解任务索引;
在执行步骤S4时,将所述原始任务按照操作步骤拆分成包括若干个子任务的拆解任务,然后分别将所述原始任务和拆解任务进行向量化,得到原始任务的表征向量和拆解任务的表征向量,并分别与所述示例任务索引和所述示例拆解任务索引的每条向量数据进行相似度计算,分别找到若干个匹配的向量数据。
本发明基于API文档的代码生成方法的进一步改进在于:
在执行步骤S2之后且在执行步骤S3之前,还包括:根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组和简单任务组;
在执行步骤S3时,包括:分别针对所述复杂任务组和所述简单任务组进行向量化索引,并将所述向量数据库中对应于所述简单任务组的向量数据拆分成示例任务索引和示例拆解任务索引,将所述向量数据库中对应于所述复杂任务组的向量数据拆分成示例任务索引、示例拆解任务索引和示例拼接任务索引,使所述示例拼接任务索引中的所有向量数据与所有的示例任务一一对应,且每条向量数据均由对应示例任务所对应的向量化的示例拆解任务中所有子任务的描述拼接而成;
在执行步骤S4时,在得到拆解任务的表征向量之后,将拆解任务的表征向量中对于各子任务的描述拼接成语义向量;然后分别进行简单示例搜索和复杂示例搜索;其中,
在进行复杂示例搜索时,将原始任务的表征向量、拆解任务的表征向量和所述语义向量分别与复杂任务组向量化索引中的示例任务索引、示例拆解任务索引和示例拼接任务索引的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述复杂任务组中找到对应的若干个示例数据;
在进行简单示例搜索时,将原始任务的表征向量和拆解任务的表征向量分别与简单任务组向量化索引中的示例任务索引和示例拆解任务索引的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述简单任务组中找到对应的若干个示例数据。
本发明基于API文档的代码生成方法的进一步改进在于,所述根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组和简单任务组的方法如下:
预设一长度阈值,将代码示例库中示例任务的描述长度超过所述长度阈值的示例数据归为复杂任务组,将不超过所述长度阈值的示例数据归为简单任务组;或者,
预设一数量阈值,将代码示例库中拆解任务的个数超过所述数量阈值的示例数据归为复杂任务组,将不超过所述数量阈值的示例数据归为简单任务组。
本发明基于API文档的代码生成方法的进一步改进在于,在进行复杂示例搜索时:设置第一相似度阈值、第二相似度阈值和第三相似度阈值;
在将原始任务的表征向量与对应示例任务索引中的向量数据进行相似度计算之后,将相似度高于所述第一相似度阈值的前a1个向量数据作为匹配的向量数据;
在将所述语义向量与对应示例拼接任务索引中的向量数据进行相似度计算之后,将相似度高于所述第二相似度阈值的前b1个向量数据作为匹配的向量数据;
在将拆解任务的表征向量与对应示例拆解任务索引中的向量数据进行相似度计算之后,将相似度高于所述第三相似度阈值的前c1个向量数据作为匹配的向量数据;其中,所述a1、b1、c1均为大于2的整数。
本发明基于API文档的代码生成方法的进一步改进在于,所述第一相似度阈值大于所述第二相似度阈值,所述第二相似度阈值大于所述第三相似度阈值,且所述第一相似度阈值、所述第二相似度阈值和所述第三相似度阈值均大于0.9。
本发明基于API文档的代码生成方法的进一步改进在于,在进行简单示例搜索时:设置第四相似度阈值和第五相似度阈值;
在将原始任务的表征向量与对应示例任务索引中的向量数据进行相似度计算之后,将相似度高于所述第四相似度阈值的前a2个向量数据作为匹配的向量数据;
在将拆解任务的表征向量与对应示例拆解任务索引中的向量数据进行相似度计算之后,将相似度高于所述第五相似度阈值的前b2个向量数据作为匹配的向量数据;其中,所述a2为大于2的整数,b2为1或2。
本发明基于API文档的代码生成方法的进一步改进在于:
在步骤S1中,所述将API文档中的每个函数整理为标准化的输入格式包括以下步骤:进行函数定义,其中,在所述函数定义中的参数类型为枚举或常量时,还要对所述枚举或所述常量进行类定义;
在执行步骤S5时,所述将召回成功的示例数据,通过语义分析得到所调用的函数的过程包括:针对召回成功的示例数据对所有调用函数进行函数定义召回;其中,在召回的函数定义中参数类型为枚举或常量时,还要进行类定义召回。
本发明基于API文档的代码生成方法的进一步改进在于:
在步骤S1中,整理为标准化的输入格式的函数的过程为函数定义的过程,函数定义的内容包括:函数名称、函数类型、函数描述、入参列表以及出参列表;其中,所述入参列表和所述出参列表均包括:参数名称、参数类型、参数默认值、参数是否必填以及参数描述。
本发明基于API文档的代码生成方法的进一步改进在于,在执行步骤S5时,所述针对召回成功的示例数据对所有调用函数进行函数定义召回的步骤包括:
S5.1、对照函数调用标准化的规则召回所有调用函数的函数名称;
S5.2、将API文档中所有已整理为标准化的输入格式的函数的函数描述进行向量化并存储为向量列表;将步骤S4中的拆解任务的表征向量分别与所述向量列表中的每条向量进行相似度计算,并找到匹配的向量,然后召回匹配的向量所对应函数的函数定义内容;
S5.3、将步骤S5.1和步骤S5.2所召回的内容进行去重整合,以获得函数召回集合。
本发明通过对API文档的规范化,可以提高API接口的可读性和可维护性,减少开发人员的沟通成本,提高开发效率和项目质量。通过获取常用函数来构建的基于函数功能的代码示例库,使得代码示例库中示例数据更具有针对性,从而有效提高语料质量,且仅需少量的人工标注工作即可,进一步提高了开发效率,降低了人工成本。通过函数输入格式标准化并基于API文档构建常用函数的相关代码示例库,使得在用户输入需求时,可以基于需求的语法解析从代码示例库中快速找到匹配的示例数据,然后基于匹配的示例数据设计提示框架,并借助于LLM的训练学习以实现目标任务代码的自动生成,质量可控。
附图说明
图1示出了本发明方法的流程示意图。
图2示出了API文档规范化后的标准示例示意图。
图3示出了代码示例库中的部分示例数据示意图。
图4示出了提示框架设计实例示意图。
图5示出了采用本方法自动生成的代码实例示意图。
具体实施方式
为了解决传统供训练的代码用例只能借助于人工编写才能得到而导致工作效率低、成本高且代码用例的质量可控性差等问题,本发明提供了一种基于API文档的代码生成方法,仅需少量的示例代码即可实现大量代码用例的自动生成,无需大量的人工标注工作,效率高、成本低、且质量可控。下面以具体实施例结合附图对该基于API文档的代码生成方法作进一步说明。
参阅图1所示,一种基于API文档的代码生成方法,包括步骤:
步骤S1、将API文档规范化:将API文档中的每个函数整理为标准化的输入格式。
具体来说:针对需求方给出的API文档进行规范化,并将规范化后的API文档以固定文本格式存储,不限于yaml、markdown table、jsonl等格式。请参阅图2所示,图2中的API文档为markdown table格式。API文档进行规范化主要包括以下两部分内容:函数定义和类定义(可能有),具体如下:
1、函数定义。API文档的每一个函数(也可称为方法)必须具有以下属性:函数名称、函数类型、函数描述、入参列表和出参列表,其中,该入参列表和该出参列表均包括:参数名称、参数类型、参数默认值、参数是否必填以及参数描述。如图2中[函数定义]下的第一行内容即为定义的函数属性,后续的内容为部分函数的示例。
2、类定义。如果函数定义中的参数类型属性为枚举或常量,则需要在该类定义内容处进行枚举或常量的类定义,即将该函数用到的枚举或常量以类的方式进行定义,所有常量或枚举都会对应一个类,如果没有确定的类,则归为默认类Object下。如图2中[类定义]下的内容。
通过对API文档的规范化,可以提高API接口的可读性和可维护性,减少开发人员的沟通成本,提高开发效率和项目质量。
步骤S2、构建代码示例库:收集预定数量的基于该API文档构建的无标注的代码用例,对照该API文档的规范化标准对所有收集的代码用例进行函数调用标准化;从所有标准化的代码用例中挑选出常用函数,对该常用函数进行人工标注,以获得基于函数功能的代码用例;将基于函数功能的代码用例作为示例数据存储在示例库,以形成基于函数功能的代码示例库。
具体来说,仅需少量的收集基于该API文档构建的无标注的代码用例,该少量是相对于待训练模型端对端代码用例数量而言的,通常端对端代码用例数量均是百万级,该步骤仅需收集其万分之一(即百数级)即可。而该无标注的代码用例指的是代码中并没有针对性地功能标注,只要是日常用到的代码段即可,这样可以降低收集难度。将收集到的代码用例根据步骤S1中API文档规范化的标准进行标准化,也即进行函数调用标准化,如:将代码用例中的“activesheet.Range(“D1:D1”)”对照API文档中的内容修改为“activesheet.Range”。然后对标准化的代码用例,统计所有函数调用的idf值(InverseDocument Frequency的缩写,指逆向文件频率),该idf值的具体计算公式为:
idf=lg[D/(1+d)]
其中:D表示所有代码用例,d表示出现某个函数的代码用例的数量,公式中的1是为了防止分母为0的情况,lg表示以10为底的对数。
将统计的所有idf值按照由小到大的顺序排列,然后取前K个函数作为常用函数,该K值根据经验可取所有函数量的20%~40%。
针对上述常用函数进行人工标注,进而形成基于函数功能的代码示例库。如:常用函数按照业务可分为7组,每个组内包括2~3个示例数据即可。采用常用函数的获取,使得构建的代码示例库中示例数据的数量虽然不大,但却涵盖了各种功能的常用的示例代码,更具有针对性,从而有效提高语料质量,且仅需少量的人工标注工作即可。
步骤S3、对该代码示例库进行向量化索引,并将向量化的结果存储在向量数据库;其中,该向量数据库中的向量数据与该代码示例库中的示例数据一一对应。
步骤S4、在接收到用户输入的原始任务之后,将该原始任务进行向量化,将向量化的原始任务与该向量数据库中的每条向量数据进行相似度计算,并找到若干个匹配的向量数据,针对若干个匹配的向量数据从该代码示例库中找到对应的示例数据,对所有找到的示例数据进行召回。
步骤S5、将召回成功的示例数据,通过语义分析得到所调用的函数。
步骤S6、将召回的示例数据和所调用的函数写入统一设计的提示框架中,然后基于语言模型LLM(如:openai chat)对该提示框架中该示例数据和所调用的函数的学习,进而快速地生成对应目标任务(即用户输入的原始任务)的代码,无需人工编写代码,提高了效率,降低了成本,且质量可控。该步骤中的提示框架的内容包括系统提示、函数说明以及相关示例等部分。其中:系统提示主要说明目标任务,并描述函数的标准化输入格式的定义和使用方法;函数说明主要用于语言模型的参考,指导其不要生成错误的函数调用,并增强其泛化性;相关示例主要由前序的召回示例数据构成,是与当前用户输入的原始任务相关的相似任务的描述以及实现代码,帮助语言模型学习代码写作的规范。
为了更快速且更全面的查找匹配的示例数据,作为一较佳实施方式:
在执行步骤S2时,使存储在该代码示例库中的每条该示例数据的内容均包括:示例任务、示例拆解任务及示例代码;其中,该示例拆解任务包括:根据该示例任务的操作步骤进行拆解的多个子任务;该示例代码为实现该示例任务的代码。例如:参阅图3所示,图3示出了代码示例库中的部分示例数据,一条示例数据对应该能有一个id,为了便于说明,在后续描述中,将代码示例库中的示例数据记为S,其包括一下内容:
1.示例任务,记为S.TASK。如:将B列第2个单元格设置细线边框。对应图2中第一条示例数据的“task”。
2.示例拆解任务,记为S.SUBTASK,包括多个子任务。如:“将B列第2个单元格设置细线边框”可以拆解为“1.获取B1列的第2个单元格”、“2.将单元格设置边框为细线”。对应图2中第一条示例数据的“cot”
3.示例代码,记为S.CODE,解决示例任务内容所需要的执行的代码片段。对应图2中第一条示例数据的“code”
较佳地,还可以根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组(记为CS)和简单任务组(记为BS),则复杂任务组中每条示例数据的示例任务记为S.CS.TASK,示例拆解任务记为S.CS.SUBTASK。而简单任务组中每条示例数据的示例任务记为S.BS.TASK,示例拆解任务记为S.BS.SUBTASK。
在执行步骤S3时,分别针对该代码示例库中每个示例数据的示例任务、示例拆解任务及示例代码进行向量化索引(关于向量化索引的方法不限于openai embedding的向量化方法),并将该向量数据库中的向量数据按照索引目标拆分成示例任务索引和示例拆解任务索引。
对于分为复杂任务组和简单任务组的代码示例库来说,需要分组进行上述向量化索引。如:将向量数据库中的向量数据记为V,针对简单任务组的示例任务索引中的向量数据记为V.BS.TASK,其为代码示例库中简单任务组的示例任务S.BS.TASK的索引,与简单任务组的每个示例任务一一对应,针对简单任务组的示例拆解任务索引中的向量数据记为V.BS.SUBTASK,其为代码示例库中简单任务组的示例拆解任务S.BS.SUBTASK的索引,与每个简单任务组的每个示例拆解任务一一对应。
相应的,针对复杂任务组的示例任务索引中的向量数据记为V.CS.TASK,其为对复杂任务组的示例任务S.CS.TASK的索引,示例拆解任务索引中的向量数据记为V.CS.SUBTASK,其为复杂任务组的示例拆解任务S.CS.SUBTASK的索引。进一步地,对于复杂任务组进行向量化索引时应更加细化,以便于对复杂任务组的示例数据进行匹配,具体为,针对复杂任务组的向量数据,进一步增加一示例拼接任务索引,记为V.CS.ALLSUBTASK,同样为对复杂任务组的示例任务S.CS.TASK的索引,与复杂任务组的每个示例任务一一对应,但该示例拼接任务索引中的每条向量数据均由对应示例任务所对应的向量化的示例拆解任务中所有子任务的描述拼接而成。
在执行步骤S4时,采用fewshot策略使用语言模型LLM对输入的原始任务进行拆解,将该原始任务按照操作步骤拆分成包括若干个子任务的拆解任务,然后分别将该原始任务和拆解任务进行向量化,得到原始任务的表征向量IV和拆解任务的表征向量IDV1~IDVN(与子任务一一对应),然后将拆解任务的表征向量中对于各子任务的描述IDV1、……、IDVN拼接成语义向量IDV。然后分别进行简单示例搜索和复杂示例搜索:
在进行复杂示例搜索时,将原始任务的表征向量IV、拆解任务的表征向量IDV1~IDVN和该语义向量IDV分别与复杂任务组向量化索引中的示例任务索引V.CS.TASK、示例拆解任务索引V.CS.SUBTASK和示例拼接任务索引V.CS.ALLSUBTASK的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从该复杂任务组CS中找到对应的若干个示例数据。
在进行简单示例搜索时,将原始任务的表征向量IV和拆解任务的表征向量IDV1~IDVN分别与简单任务组向量化索引中的示例任务索引V.BS.TASK和示例拆解任务索引V.BS.SUBTASK的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从该简单任务组BS中找到对应的若干个示例数据。
通过本实施方式的改进,可以实现分层召回策略,融合原始任务和拆解任务的语义进行任务相关示例的召回,提高召回示例数据的成功率。
较佳地,在该改进的实施方式中,该根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组和简单任务组的方法如下:
方法1、预设一长度阈值,将代码示例库中示例任务的描述长度超过该长度阈值的示例数据归为复杂任务组,将不超过该长度阈值的示例数据归为简单任务组。或者,
方法2、预设一数量阈值(如2),将代码示例库中拆解任务的个数超过该数量阈值的示例数据归为复杂任务组,将不超过该数量阈值的示例数据归为简单任务组。也就是说,将涉及2次操作及以下的示例任务归为简单任务组BS,而涉及大于2次操作的示例任务归为复杂任务组CS。由此,可以得到两组示例数据。
对于分组不限于前述方法,也可将上述两种方法进行融合,综合确定分组。
为了使找到的示例数据更加契合,进一步提高召回示例数据的成功率,作为一较佳实施方式:
在进行复杂示例搜索时:设置第一相似度阈值THC1、第二相似度阈值THC2和第三相似度阈值THC3;
在原始任务的表征向量IV与示例任务索引V.CS.TASK中的向量数据进行相似度计算(不限于cosine similarity的相似度计算方法)之后,将相似度高于该第一相似度阈值THC1的前a1个向量数据作为匹配的向量数据,并从复杂任务组CS中查找得到对应的示例数据,然后执行步骤S5;
在将该语义向量IDV与示例拼接任务索引V.CS.ALLSUBTASK中的向量数据进行相似度计算之后,将相似度高于该第二相似度阈值THC2的前b1个向量数据作为匹配的向量数据,并从复杂任务组CS中查找得到对应的示例数据,然后执行步骤S5;
在将拆解任务的表征向量IDV1~IDVN与对应示例拆解任务索引V.CS.SUBTASK中的向量数据进行相似度计算之后,将相似度高于该第三相似度阈值THC3的前c1个向量数据作为匹配的向量数据,并从复杂任务组CS中查找得到对应的示例数据(可看作分类),较佳地,使用KNN多数投票方法在这些示例数据中找到拆解子任务数量最多的示例数据作为最终需召回的示例数据,然后执行步骤S5;其中,该a1、b1、c1是根据经验设置第一相似度阈值THC1、第二相似度阈值THC2和第三相似度阈值THC3,而得到的匹配的值,均为大于2的整数。
需要说明的是:如果在进行上述任意相似度计算时,未能找到满足相似度与对应相似度阈值关系的,结果为空,则判断不能召回示例数据,无需执行步骤S5。较佳地,建议应严格进行初筛,只有相似度非常相似才能进行返回,故,根据经验确定该第一相似度阈值THC1、该第二相似度阈值THC2和该第三相似度阈值THC3,一般建议THC1、THC2、THC3均大于0.9,且THC1>THC2>THC3。
在进行简单示例搜索时:根据经验设置第四相似度阈值THB1和第五相似度阈值THB2;
在将原始任务的表征向量IV与示例任务索引V.BS.TASK中的向量数据进行相似度计算之后,将相似度高于该第四相似度阈值THB1的前a2个向量数据作为匹配的向量数据,并从简单任务组BS中查找得到对应的示例数据,然后执行步骤S5;
在将拆解任务的表征向量IDV1~IDVN与示例拆解任务索引V.BS.SUBTASK中的向量数据进行相似度计算之后,将相似度高于该第五相似度阈值THB2的前b2个向量数据作为匹配的向量数据,并从简单任务组BS中查找得到对应的示例数据,然后执行步骤S5;其中,该a2为大于2的整数,为了保证整体示例的多样性,每个子任务不需要太多示例,因此,通常设置b2为1或2个。
本实施方式通过对各相似度阈值的合理设定,能够更好的控制匹配示例数据的数量以及匹配示例数据的契合度。
关于函数的召回,作为一较佳实施方式,在执行步骤S5时,该将召回成功的示例数据,通过语义分析得到所调用的函数的过程包括:针对召回成功的示例数据对所有调用函数进行函数定义召回;其中,在召回的函数定义中参数类型为枚举或常量时,还要进行类定义召回。
关于函数定义的召回,具体方法如下:
1、规则召回(不限于正则的方法):对照函数调用标准化的规则将召回的示例数据所调用的函数进行语法解析,得到示例数据相关的所有函数名称。
2、语义召回:根据经验设置第六相似度阈值THF1;将步骤S1中API文档中所有已整理为标准化输入格式的函数的函数描述进行向量化并存储为向量列表,记为V.Func;将步骤S4中的拆解任务的表征向量IDV1~IDVN分别与该向量列表V.Func中的每条向量进行相似度计算,并找到相似度高于第六相似度阈值TH1的前K(为大于0的整数,根据经验取值)条向量作为匹配的向量,然后将匹配的向量所对应函数的函数定义内容作为召回结果。
3、将前述的规则召回和语义召回的结果去重整合后,得到函数召回集合。即:规则召回与语义召回两者函数召回方式之间形成召回互补,最终召回的所有函数去重,得到函数召回集合。
关于类定义内容的召回:针对函数定义内容召回时得到的函数召回集合,找到召回集合内每个函数定义中引用的枚举和常量,并找到其所属的类定义,作为相关的类定义召回。需要说明的是,只有函数定义内容中存在枚举或常量,才需要进行该类定义召回的步骤。
总结来说,本方案主要包括三个部分:
第一部分,API文档规范化。如图2所示的API文档标准示例。
第二部分,代码示例库构建。如图3所示的代码示例库中的部分代码示例所对应的代码数据内容。
第三部分,代码生成。假设用户输入的原始任务为:“将A列第4个单元格设置为红色粗线边框”。则该部分的步骤主要包括:
步骤S1:任务理解。拆解任务为:“1.获取A列第4个单元格”;“2.将单元格设置为红色细线边框”。
步骤S2~S4:示例召回。根据分层分组召回得到如图3所示的两个示例数据。
步骤S5:函数和类定义召回。分析召回的两个示例数据所调用的函数,不难得到关联的函数包括Border.Weight,Color,Range.Item等。
步骤S6:任务代码生成。提示框架如图4所示,其中,包括A区域所示的系统提示内容,B区域所示的函数和类定义内容,C区域所示的相关示例内容。最终输出的结果如图5所示,其中,框选内容为语言模型LLM泛化的内容。
本方案可以很大程度地提高在少样本/少标注的情况下代码生成的性能,在无需大量标注的情况下快速落地代码生成应用。同时,本方案提出了一个API文档(包括函数定义和/类定义等)以及代码示例库的构建标注和实现方法,并提供了一套统一召回示例数据及相关函数的框架,能够快速有效地支持后续LLM的代码生成。
以上结合附图实施例对本发明进行了详细说明,本领域中普通技术人员可根据上述说明对本发明做出种种变化例。因而,实施例中的某些细节不应构成对本发明的限定,本发明将以所附权利要求书界定的范围作为本发明的保护范围。

Claims (9)

1.一种基于API文档的代码生成方法,其特征在于,包括步骤:
S1、将API文档规范化:将API文档中的每个函数整理为标准化的输入格式;
S2、构建代码示例库:收集预定数量的基于所述API文档构建的无标注的代码用例,对照所述API文档的规范化标准对所有收集的代码用例进行函数调用标准化;从所有标准化的代码用例中挑选出常用函数,对所述常用函数进行人工标注,以获得基于函数功能的代码用例;将基于函数功能的代码用例作为示例数据存储在示例库,以形成基于函数功能的代码示例库;
S3、对所述代码示例库进行向量化索引,并将向量化的结果存储在向量数据库;其中,所述向量数据库中的向量数据与所述代码示例库中的示例数据一一对应;
S4、在接收到用户输入的原始任务之后,将所述原始任务进行向量化,并与所述向量数据库中的每条向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述代码示例库中找到对应的示例数据,对所有找到的示例数据进行召回;
S5、将召回成功的示例数据,通过语义分析得到所述示例数据所调用的函数;
S6、将召回的所述示例数据和所调用的函数写入统一设计的提示框架中,基于LLM对所述提示框架中所述示例数据和所调用的函数的学习,生成对应目标任务的代码;
在执行步骤S2时,使存储在所述代码示例库中的每条示例数据的内容均包括:示例任务、示例拆解任务及示例代码;其中,所述示例拆解任务包括:根据所述示例任务的操作步骤进行拆解的多个子任务;所述示例代码为实现所述示例任务的代码;
在执行步骤S3时,分别针对所述代码示例库中每个示例数据的示例任务、示例拆解任务及示例代码进行向量化索引,并将所述向量数据库中的向量数据按照索引目标拆分成示例任务索引和示例拆解任务索引;
在执行步骤S4时,将所述原始任务按照操作步骤拆分成包括若干个子任务的拆解任务,然后分别将所述原始任务和拆解任务进行向量化,得到原始任务的表征向量和拆解任务的表征向量,并分别与所述示例任务索引和所述示例拆解任务索引的每条向量数据进行相似度计算,分别找到若干个匹配的向量数据。
2.如权利要求1所述的基于API文档的代码生成方法,其特征在于:
在执行步骤S2之后且在执行步骤S3之前,还包括:根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组和简单任务组;
在执行步骤S3时,包括:分别针对所述复杂任务组和所述简单任务组进行向量化索引,并将所述向量数据库中对应于所述简单任务组的向量数据拆分成示例任务索引和示例拆解任务索引,将所述向量数据库中对应于所述复杂任务组的向量数据拆分成示例任务索引、示例拆解任务索引和示例拼接任务索引,使所述示例拼接任务索引中的所有向量数据与所有的示例任务一一对应,且每条向量数据均由对应示例任务所对应的向量化的示例拆解任务中所有子任务的描述拼接而成;
在执行步骤S4时,在得到拆解任务的表征向量之后,将拆解任务的表征向量中对于各子任务的描述拼接成语义向量;然后分别进行简单示例搜索和复杂示例搜索;其中,
在进行复杂示例搜索时,将原始任务的表征向量、拆解任务的表征向量和所述语义向量分别与复杂任务组向量化索引中的示例任务索引、示例拆解任务索引和示例拼接任务索引的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述复杂任务组中找到对应的若干个示例数据;
在进行简单示例搜索时,将原始任务的表征向量和拆解任务的表征向量分别与简单任务组向量化索引中的示例任务索引和示例拆解任务索引的向量数据进行相似度计算,找到若干个匹配的向量数据,针对若干个匹配的向量数据从所述简单任务组中找到对应的若干个示例数据。
3.如权利要求2所述的基于API文档的代码生成方法,其特征在于,所述根据代码示例库中示例数据的复杂程度将代码示例库分成复杂任务组和简单任务组的方法如下:
预设一长度阈值,将代码示例库中示例任务的描述长度超过所述长度阈值的示例数据归为复杂任务组,将不超过所述长度阈值的示例数据归为简单任务组;或者,
预设一数量阈值,将代码示例库中拆解任务的个数超过所述数量阈值的示例数据归为复杂任务组,将不超过所述数量阈值的示例数据归为简单任务组。
4.如权利要求2所述的基于API文档的代码生成方法,其特征在于,在进行复杂示例搜索时:设置第一相似度阈值、第二相似度阈值和第三相似度阈值;
在将原始任务的表征向量与对应示例任务索引中的向量数据进行相似度计算之后,将相似度高于所述第一相似度阈值的前a1个向量数据作为匹配的向量数据;
在将所述语义向量与对应示例拼接任务索引中的向量数据进行相似度计算之后,将相似度高于所述第二相似度阈值的前b1个向量数据作为匹配的向量数据;
在将拆解任务的表征向量与对应示例拆解任务索引中的向量数据进行相似度计算之后,将相似度高于所述第三相似度阈值的前c1个向量数据作为匹配的向量数据;其中,所述a1、b1、c1均为大于2的整数。
5.如权利要求4所述的基于API文档的代码生成方法,其特征在于,所述第一相似度阈值大于所述第二相似度阈值,所述第二相似度阈值大于所述第三相似度阈值,且所述第一相似度阈值、所述第二相似度阈值和所述第三相似度阈值均大于0.9。
6.如权利要求2所述的基于API文档的代码生成方法,其特征在于,在进行简单示例搜索时:设置第四相似度阈值和第五相似度阈值;
在将原始任务的表征向量与对应示例任务索引中的向量数据进行相似度计算之后,将相似度高于所述第四相似度阈值的前a2个向量数据作为匹配的向量数据;
在将拆解任务的表征向量与对应示例拆解任务索引中的向量数据进行相似度计算之后,将相似度高于所述第五相似度阈值的前b2个向量数据作为匹配的向量数据;其中,所述a2为大于2的整数,b2为1或2。
7.如权利要求1所述的基于API文档的代码生成方法,其特征在于:
在步骤S1中,所述将API文档中的每个函数整理为标准化的输入格式包括以下步骤:进行函数定义,其中,在所述函数定义中的参数类型为枚举或常量时,还要对所述枚举或所述常量进行类定义;
在执行步骤S5时,所述将召回成功的示例数据,通过语义分析得到所调用的函数的过程包括:针对召回成功的示例数据对所有调用函数进行函数定义召回;其中,在召回的函数定义中参数类型为枚举或常量时,还要进行类定义召回。
8.如权利要求7所述的基于API文档的代码生成方法,其特征在于:在步骤S1中,整理为标准化的输入格式的函数的过程为函数定义的过程,函数定义的内容包括:函数名称、函数类型、函数描述、入参列表以及出参列表;其中,所述入参列表和所述出参列表均包括:参数名称、参数类型、参数默认值、参数是否必填以及参数描述。
9.如权利要求8所述的基于API文档的代码生成方法,其特征在于,在执行步骤S5时,所述针对召回成功的示例数据对所有调用函数进行函数定义召回的步骤包括:
S5.1、对照函数调用标准化的规则召回所有调用函数的函数名称;
S5.2、将API文档中所有已整理为标准化的输入格式的函数的函数描述进行向量化并存储为向量列表;将步骤S4中的拆解任务的表征向量分别与所述向量列表中的每条向量进行相似度计算,并找到匹配的向量,然后召回匹配的向量所对应函数的函数定义内容;
S5.3、将步骤S5.1和步骤S5.2所召回的内容进行去重整合,以获得函数召回集合。
CN202311048307.4A 2023-08-18 2023-08-18 基于api文档的代码生成方法 Active CN117032722B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311048307.4A CN117032722B (zh) 2023-08-18 2023-08-18 基于api文档的代码生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311048307.4A CN117032722B (zh) 2023-08-18 2023-08-18 基于api文档的代码生成方法

Publications (2)

Publication Number Publication Date
CN117032722A CN117032722A (zh) 2023-11-10
CN117032722B true CN117032722B (zh) 2024-04-26

Family

ID=88642811

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311048307.4A Active CN117032722B (zh) 2023-08-18 2023-08-18 基于api文档的代码生成方法

Country Status (1)

Country Link
CN (1) CN117032722B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117951038B (zh) * 2024-03-27 2024-06-25 浙江大学 基于代码大模型的Rust语言文档测试自动生成方法及装置

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2906865A1 (en) * 2014-10-01 2016-04-01 Amadeus S.A.S. Automated task handling
CN112988785A (zh) * 2021-05-10 2021-06-18 浙江大学 基于语言模型编码和多任务解码的sql转换方法及系统
CN114091437A (zh) * 2020-08-24 2022-02-25 中国电信股份有限公司 新词召回方法和领域词向量表生成方法及其装置
CN114281977A (zh) * 2021-12-02 2022-04-05 东方财富信息股份有限公司 一种基于海量文档的相似文档搜索方法及设备
CN116151256A (zh) * 2023-01-04 2023-05-23 北京工业大学 一种基于多任务和提示学习的小样本命名实体识别方法
CN116185393A (zh) * 2023-02-28 2023-05-30 中国建设银行股份有限公司 接口文档的生成方法、装置、设备、介质及产品
CN116303980A (zh) * 2023-05-19 2023-06-23 无码科技(杭州)有限公司 一种大语言模型知识增强方法、系统、电子设备及介质
CN116431837A (zh) * 2023-06-13 2023-07-14 杭州欧若数网科技有限公司 基于大型语言模型和图网络模型的文档检索方法和装置
CN116501306A (zh) * 2023-06-29 2023-07-28 深圳市银云信息技术有限公司 一种基于自然语言描述生成接口文档代码的方法
CN116541497A (zh) * 2023-04-25 2023-08-04 百度时代网络技术(北京)有限公司 任务型对话的处理方法、装置、设备和存储介质

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2906865A1 (en) * 2014-10-01 2016-04-01 Amadeus S.A.S. Automated task handling
CN114091437A (zh) * 2020-08-24 2022-02-25 中国电信股份有限公司 新词召回方法和领域词向量表生成方法及其装置
CN112988785A (zh) * 2021-05-10 2021-06-18 浙江大学 基于语言模型编码和多任务解码的sql转换方法及系统
CN114281977A (zh) * 2021-12-02 2022-04-05 东方财富信息股份有限公司 一种基于海量文档的相似文档搜索方法及设备
CN116151256A (zh) * 2023-01-04 2023-05-23 北京工业大学 一种基于多任务和提示学习的小样本命名实体识别方法
CN116185393A (zh) * 2023-02-28 2023-05-30 中国建设银行股份有限公司 接口文档的生成方法、装置、设备、介质及产品
CN116541497A (zh) * 2023-04-25 2023-08-04 百度时代网络技术(北京)有限公司 任务型对话的处理方法、装置、设备和存储介质
CN116303980A (zh) * 2023-05-19 2023-06-23 无码科技(杭州)有限公司 一种大语言模型知识增强方法、系统、电子设备及介质
CN116431837A (zh) * 2023-06-13 2023-07-14 杭州欧若数网科技有限公司 基于大型语言模型和图网络模型的文档检索方法和装置
CN116501306A (zh) * 2023-06-29 2023-07-28 深圳市银云信息技术有限公司 一种基于自然语言描述生成接口文档代码的方法

Also Published As

Publication number Publication date
CN117032722A (zh) 2023-11-10

Similar Documents

Publication Publication Date Title
US11500818B2 (en) Method and system for large scale data curation
CN112069298B (zh) 基于语义网和意图识别的人机交互方法、设备及介质
CN108052583B (zh) 电商本体构建方法
US11521713B2 (en) System and method for generating clinical trial protocol design document with selection of patient and investigator
CN112307762B (zh) 搜索结果的排序方法及装置、存储介质、电子装置
KR20200007969A (ko) 정보 처리 방법, 단말기, 및 컴퓨터 저장 매체
CN112035599B (zh) 基于垂直搜索的查询方法、装置、计算机设备及存储介质
CN110580308B (zh) 信息审核方法及装置、电子设备、存储介质
CN117032722B (zh) 基于api文档的代码生成方法
CN114547072A (zh) 自然语言查询转换sql方法、系统、设备及存储介质
CN114495143B (zh) 一种文本对象识别方法、装置、电子设备及存储介质
CN110929119A (zh) 数据标注方法、装置、设备及计算机存储介质
CN115630843A (zh) 合同条款自动审核方法及系统
WO2024015319A1 (en) Question-answering system for answering relational questions
US20100325082A1 (en) System and Associated Method for Determining and Applying Sociocultural Characteristics
CN113553419A (zh) 民航知识图谱问答系统
CN113297251A (zh) 多源数据检索方法、装置、设备及存储介质
CN116049376B (zh) 一种信创知识检索回复的方法、装置和系统
CN110008448B (zh) 将SQL代码自动转换为Java代码的方法和装置
Saha et al. A large scale study of SVM based methods for abstract screening in systematic reviews
CN115017271B (zh) 用于智能生成rpa流程组件块的方法及系统
CN111104422A (zh) 一种数据推荐模型的训练方法、装置、设备及存储介质
CN114661890A (zh) 一种知识推荐方法、装置、系统及存储介质
CN114860872A (zh) 数据处理方法、装置、设备以及存储介质
CN113254612A (zh) 知识问答处理方法、装置、设备及存储介质

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