技术领域
[0001] 本发明涉及软件开发技术领域,具体涉及一种基于大语言模型的PLM系统代码生成方法。
相关背景技术
[0002] 目前业内代码生成方法主要有以下两种方式:形式化方法和借助编程助手。形式化方法是基于严格的数学基础,通过采用数学逻辑证明来对计算机软硬件系统进行建模、规约、分析、推理和验证,可利用专业软件自动转换为应用代码,被应用在联锁系统、车载系统及其他信号系统中。但形式化方法学习成本高,也存在模型库庞杂、管理困难等难以解决的问题。编程助手软件可以辅助开发人员进行代码编写,它通过智能的自动补全和建议功能,减少了手动编写代码的工作量,帮助开发者极大提高编码效率。但编程助手的作用仅仅局限在智能提示、错误检查和代码自动补全,对代码质量的提升有限。
具体实施方式
[0029] 以下结合附图和具体实施方式对本发明作进一步详细说明。根据下面说明,本发明的优点和特征将更清楚。需要说明的是,附图采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施方式的目的。为了使本发明的目的、特征和优点能够更加明显易懂,请参阅附图。须知,本说明书所附图式所绘示的结构、比例、大小等,均仅用以配合说明书所揭示的内容,以供熟悉此技术的人士了解与阅读,并非用以限定本发明实施的限定条件,故不具技术上的实质意义,任何结构的修饰、比例关系的改变或大小的调整,在不影响本发明所能产生的功效及所能达成的目的下,均应仍落在本发明所揭示的技术内容能涵盖的范围内。
[0030] LLM(LARGE LANGUAGE MODEL,大语言模型),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的任务,包括代码生成。对于零基础想要学习编程的人来说,大语言模型的智能识别和解释功能将成为他们的良师益友,帮助他们快速掌握编程技巧。同时,大语言模型还可以提供多项实用功能,如代码自动生成、代码补齐、代码纠错等,大大提高了开发效率和代码质量。
[0031] 面向列车自动控制系统功能完善和新产品功能开发,针对代码实现质量和实现效率提升问题,本实施例提供一种基于大语言模型的PLM(Product Lifecycle Management,产品生命周期管理)系统代码生成方法。
[0032] 如图1所示,本实施例提供一种基于大语言模型的PLM系统代码生成方法,包括:分析PLM系统需求,包括需求条目嵌入、需求条目文本拆分以及需求条目向量数据库构建;基于所述PLM系统需求构建产品需求模型单元;基于大语言模型构建代码生成平台;通过所述产品需求模型单元描述所述产品,并将所述产品描述输入所述代码生成平台,以生成产品代码。
[0033] 本实施例面向列车自动控制系统功能完善和新产品功能开发,针对代码实现质量和实现效率提升问题,在PLM系统需求条目化、模块化的基础上,构建信号产品需求模型单元,利用需求模型描述软件系统的功能、结构和行为,基于LLM大模型构建RBC(Radio Block Center,无线闭塞中心)系统的代码生成平台,通过LLM大模型自动生成代码,以需求模型驱动系统的模块化、复用和集成,以智能协作的方式实现测试用例生成、代码测试和完善,研发人员的主要工作由编码实现转变为PLM需求分析、分解,需求模型构建和自动生成代码审核,最终实现代码质量和开发效率的提升。
[0034] 具体的,本实施例中的需求条目嵌入包括:将需求条目中需要量化的条目,转化为对应的数值和向量。
[0035] 具体的,本实施例中的需求条目文本拆分包括:将需求条件进行分割,转化成需求单元。
[0036] 具体的,本实施例中的需求条目文本拆分包括:将较长的需求条件进行分割,转化成小片段的需求单元。
[0037] 具体的,本实施例中的需求条目文本拆分包括:通过文档拆分器进行需求条目文本拆分。
[0038] 本实施例将某商用大模型进行私有部署,并通过设计专用接口与既有PLM系统进行信息交互,专用接口基于LangChain(浪链)框架开发,LangChain是一个开源框架,用于构建基于大型语言模型(LLM)的应用程序。具体包括如下过程:
[0039] 1、RBC系统PLM需求认知
[0040] (1)RBC系统PLM需求条目嵌入(Embeddings):对RBC需求条目中需要量化的条目,转化为对应的数值和向量,方便大模型理解和处理。例如:将Taf距离描述为列车估计前距离前方区段300m(根据配置)以内;将相邻RBC通信超时时间转化为7秒(根据配置)没有收到相邻RBC的消息。
[0041] (2)RBC系统PLM需求条目文本拆分(Text Splitters):将PLM中较长的需求条件进行分割,转化成小片段的需求单元。如某需求“当列车估计前端在区间或股道时,若RBC判断站内列车进路信息为正常、道岔状态信息正确、站内列车信号为开放、进路上的区段灾害区信息未激活、进路上无故障防护区域且进路上无其他通信列车的安全包络时,RBC将进路按照可用处理。”,可以依次拆分为:
[0042] 1)列车估计前端在区间;
[0043] 2)列车估计前端在股道;
[0044] 3)列车估计前端前方进路信息为正常;
[0045] 4)列车估计前端前方进路道岔状态信息与离线配置一致;
[0046] 5)列车估计前端前方进路信号为开放状态;
[0047] 6)列车估计前端前方进路上各个区段灾害区没有激活;
[0048] 7)列车估计前端前方进路上各个区段无故障防护区;
[0049] 8)列车估计前端前方进路上各个区段无其他通信列车的安全包络;
[0050] 9)可以认为列车估计前端前方进路可用。
[0051] 该过程可借助文档拆分器进行。
[0052] (3)RBC系统PLM需求条目向量数据库(Vectorstores):本实施例借助向量数据库存储和索引PLM需求条目处理模型的向量嵌入,用于理解需求中的文本字符串、条目和需求场景的含义和上下文,从而获得更准确和相关的搜索结果。
[0053] 本实施例采用离线部署模型的方式保证数据安全。
[0054] 作为一种优选地实施方式,构建产品需求模型单元包括:构建基础数据需求模型和构建动态功能需求模型。
[0055] 2、RBC代码生成平台模型应用和持续优化
[0056] 在RBC代码生成平台构建后,已经初步对RBC专业词汇和需求进行转化和理解,对于RBC领域需求,大模型很难直接生成对应的代码,分解为通用需求,该步骤被称为需求模型单元构建。
[0057] 本实施例基于PLM模块化需求,构建RBC需求模型单元。包括:线路、车站、进路、信号机、道岔等基础数据模型,也包括列车定位、行车许可生成、信息包解析等动态功能模型。每个需求模型单元均由若干通用模型模块组成,例如线路数据静态需求模型单元就包括:
线路区段单元、线路区段链表等通用模型模块组成。在平台使用初期,可以在LLM大模型中输入通用模型模块描述,即可得到所需实现代码。
[0058] 作为一种优选地实施方式,代码生成方法还包括:依据编码规范和需求对所述代码生成平台生成的产品代码进行审核校验。
[0059] 在本实施例中,需求模型单元建立后,输入代码生成平台即可得到符合C语言最新标准的代码实现。研发人员可以对生成的产品代码进行审核,利用平台进行单元测试,并添加足够详细的注释。还需要确认代码准确度、完整度以及执行效率,是否符合编码规范等。
[0060] 作为一种优选地实施方式,代码生成方法还包括:构建产品需求模型单元对应的代码库,用作训练样本对所述代码生成平台进行训练。
[0061] 具体的,本实施例中的所述构建产品需求模型单元对应的代码库包括:收集校验后的产品代码以及既有产品代码,从而构建所述代码库。
[0062] 在平台使用过程中,可以持续收集研发人员修改完善代码、既有优秀代码,构建PLM需求模型对应代码库。以PLM需求模型单元和代码库为训练样本对代码生成平台进行训练,培养平台对RBC领域模型的认知。
[0063] 作为一种优选地实施方式,代码生成方法还包括:组建代码生成虚拟团队,用于对所述代码生成平台生成的产品代码进行修正。
[0064] 具体的,本实施例中的所述代码生成虚拟团队包括研发人员模型、虚拟程序员模型和虚拟测试员模型,分别负责PLM系统需求分析、编码和测试。
[0065] 具体的,本实施例中的研发人员模型对PLM系统需求分析包括:将PLM系统需求拆分为若干个子任务,根据每个子任务定义数据结构、功能模块、接口以及执行过程。
[0066] 再具体的,本实施例中虚拟程序员模型对PLM系统编码包括:虚拟程序员模型根据给定的要求、设计的拆分和数据结构以及实现逻辑来编码,将代码中的每个子模块都与拆分的子任务一一对应。
[0067] 再具体的,本实施例中的虚拟测试员模型对PLM系统测试包括:虚拟测试员模型为编写的代码编写测试报告,找出其中的错误。
[0068] 再具体的,本实施例中的代码生成方法还包括:虚拟程序员模型根据测试报告中提供的反馈修改代码。
[0069] 再具体的,本实施例中的代码生成方法还包括:虚拟测试员模型评估修改后的代码,并确认修改后的代码已经通过所有测试。
[0070] 3、RBC代码质量持续提升方法
[0071] 代码编写不仅仅关系到软件开发过程的编码阶段,还需要考虑产品质量保证至关重要的其他阶段(如测试验证),本实施例拟组建一个由多个模型扮演的RBC代码生成虚拟团队,包括RBC研发人员模型、RBC虚拟程序员模型和虚拟测试员模型,分别负责RBC需求分析、软件开发的编码和测试阶段,以进一步提高RBC代码的生成质量。具体的:
[0072] 1)RBC研发人员模型对PLM需求进行全面分析,将其拆分为几个易于解决的子任务,根据每个子任务定义数据结构、功能模块、接口以及执行过程。
[0073] 2)RBC虚拟程序员模型根据给定的要求以及设计的拆分和数据结构、实现逻辑等实现代码。将实现代码中的每个子模块都与拆分的子任务一一对应。
[0074] 3)虚拟测试员模型为实现的代码编写详细的测试报告,找出其中的错误。虚拟测试人员模型指出所实现的代码可能发生的错误,从而可能导致某些测试用例失败。
[0075] 4)虚拟程序员模型根据测试报告中提供的反馈完善代码。在编码器提供的修改后的代码中,整合了测试报告中的建议。
[0076] 5)虚拟测试员模型评估修改后的代码,确认没有任何问题,至此代码生成过程结束。在最后一次交互中,虚拟测试员确认修改后的代码已经通过所有测试,满足要求。
[0077] 本实施例在代码生成任务中通过增加RBC研发人员模型、虚拟测试人员模型的设定,显著的提升代码生成质量,与单一角色相比,多角色的虚拟团队能够更有效地处理代码生成过程中的各种问题和挑战。
[0078] 下面以RBC系统为例说明大模型代码自动生成。RBC系统功能实现中区间列车排序、行车许可计算、故障防护区设置等模块均会涉及“判断两点之间的位置关系”。从PLM系统中提取两条关于行车许可计算的需求条目:
[0079] 需求‑423424需要判断当前行车许可终点与故障防护区起点的位置关系;需求‑423396需要判断当前行车许可终点与分相区起点的位置关系。
[0080] 首先,利用需求认知模块抽象出比较两个点位置关系的模型单元:CellModel_Compare_Positions_of_Two_Points;
[0081] 其次,研发人员通过与代码自动生成平台交互,详细描述该模型单元的上下文背景:
[0082] 1、定义一个区段数据结构,由区段编号,区段长度,上行方向区段、下行方向区段组成,区段长度不相等。
[0083] 2、用链表的方式表示由多个区段组成的线路。
[0084] 3、定义一个点结构,位置坐标由所在区段和偏移组成。
[0085] 4、假设有两个点,可能在线路中同一个区段上,也可能在不同的区段上。
[0086] 5、需要用C语言实现一个函数,用于从一个点出发,延给定方向,循环遍历区段链表,查找另一个点,如果找到返回TRUE,否则返回FALSE。
[0087] 然后将模型单元描述输入代码自动生成平台,可以得到如下所示代码:
[0088] #include
[0089] #include
[0090] #include
[0091] //区段数据结构
[0092] typedefstruct{
[0093] int id;//区段编号
[0094] double length;//区段长度
[0095] intup_segment;//上行方向区段
[0096] int down_segment;//下行方向区段
[0097] }Segment;
[0098] //点数据结构
[0099] typedefstruct{
[0100] int segment_id;//所在区段
[0101] double offset;//偏移量
[0102] }Point;
[0103] //链表节点
[0104] typedefstructNode{
[0105] Segment*segment;//区段指针
[0106] structNode*next;//下一个节点指针
[0107] }Node;
[0108] //创建新节点
[0109] Node*create_node(Segment*segment){
[0110] Node*new_node=(Node*)malloc(sizeof(Node));
[0111] new_node‑>segment=segment;
[0112] new_node‑>next=NULL;
[0113] return new_node;
[0114] }
[0115] //将两个节点连接成一个链表
[0116] void connect_nodes(Node*head,Node*tail,Segment*segment){[0117] Node*new_node=create_node(segment);
[0118] tail‑>next=new_node;
[0119] tail=new_node;
[0120] }
[0121] //从一个点出发,延给定方向,循环遍历区段链表,查找另一个点,如果找到返回TRUE,否则返回FALSE。
[0122] int search_point(Node*head,Point start,Point target,int direction){[0123] int current_segment=start.segment_id;
[0124] intnext_segment=current_segment+direction;
[0125] Node*current=head;
[0126] Node*previous=NULL;
[0127] while(current!=NULL&&next_segment>=0&&next_segment
[0129] return true;
[0130] }
[0131] previous=current;
[0132] current=current‑>next;
[0133] next_segment=current‑>segment‑>id;
[0134] }
[0135] if(current==NULL){
[0136] return false;
[0137] }else{
[0138] return same_segment(start,target);
[0139] }
[0140] }
[0141] 最后,虚拟测试员和虚拟程序员会依据需求模型单元和生成的代码对代码进行质量提升操作,包括对代码中变量定义进行检查、替换,并检查其逻辑是否可以满足需求单元模型要求,是否符合编码规范等。
[0142] 采用RBC代码自动生成平台后,编码效率提高30%,编码质量得到大幅提升,避免了低级错误的出现。
[0143] 本实施例基于人工智能模型构建RBC领域专用代码生成工具,解决低成本、高效率构建产品的问题,符合智能化、数字化赋能企业发展的趋势。
[0144] 本实施例基于LLM模型开发适配PLM的代码生成平台,通过需求建模、代码生成等工具,可以快速地构建和实现软件系统,减少开发时间和成本,适应RBC系统快速发展的需要,具有研究思路上的先进性。
[0145] 本实施例结合PLM系统需求条目化、模块化的特点,通过构建需求单元模型、复用和集成等手段,降低RBC系统软件的开发成本,具有实现方法上的先进性。
[0146] 本实施例中的代码生成平台的研制符合列控系统快速发展、高安全、高可用的趋势,系统开发和架构设计符合先进系统设计开发理念,解决了在列车运行控制领域,缺少专用的代码生成工具应用的问题。
[0147] 尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。