《夏鑫-大语言模型是软件工程的银弹吗.pdf》由会员分享,可在线阅读,更多相关《夏鑫-大语言模型是软件工程的银弹吗.pdf(31页珍藏版)》请在三个皮匠报告上搜索。
1、大语言模型是软件工程的银弹吗?夏鑫 华为演讲嘉宾夏鑫 华为软件工程应用技术实验室主任夏鑫的研究方向是智能化软件工程、软件仓库挖掘和经验软件工程。夏鑫至今发表了290多篇论文,其中包括120多篇CCF A类期刊和会议长文,谷歌学术引用1.2万多次,H-index 62。夏鑫获得了2022年ACM SIGSOFT Early Career Researcher Award(亚太地区第一位),部分论文获得国际会议最佳/杰出论文奖项,包括6篇ACM SIGSOFT 杰出论文奖(连续四年获得软工顶会ASE 2018-2021的杰出论文奖)。此外他担任MSR、SANER、PROMISE等会议的Steeri
2、ng Committee,多个国际会议的PC(ICSE,ESEC/FSE,ASE等),多个期刊的编委(TOSEM、EMSE、ASEJ、JSEP等),以及参与组织了多个国际会议(ICSE 2023和2024,ASE 2016、2020和2021等)。目 录CONTENTS1.背景2.基于大语言模型的软件工程3.数据底座4.研究进展5.结论和展望背景PART 01构建软件工程的未来背景CMU软件工程研究所正在引领社区构建多年的研发愿景和路线图用于设计下一代依赖软件的系统。2.先进的架构范式AI 增强的软件开发(AI-Augmented Software Development):为实现这一目标,需
3、要通过增加AI和自动化工具对开发人员的支持重新设想整个软件开发过程,需要确保利用整个生命周期中生成的数据。重点:AI 增强的软件开发意味着 AI 将在软件开发过程和持续演化过程的每个阶段起特别的作用。确保持续演化的系统(Assuring Continuously Evolving Systems)组件正确的软件构建(Software Construction through Compositional Correctness)工程化社会规模的软件系统(Engineering Societal-Scale Software Systems)工程化 AI 赋能的软件系统(Engineering A
4、I-enabled Software Systems)工程化量子计算软件系统(Engineering Quantum Computing Software Systems)重点研究领域和目标(未来10-15年)1.先进的开发范式2020年12月,Gartner报告:人工智能增强软件开发的新兴技术有可能与脚本化自动化技术相结合,软件工程师手动完成的70%工作将实现自动化;2022年11月,OpenAI发布ChatGPT,充分利用了微软GitHub代码库数据,基于RLHF强化学习技术,在编程辅助的代码样例生成方面取得一定进展。从代码表征模型到大语言模型,深度学习对智能化软件工程的影响在增强Open
5、AI ChatGPT:在辅助编程领域取得一定进展,呈现人机协同提升研发效能的发展趋势。Cursor:GPT-4代码编辑器Copilot X:AI 结对编程工具Ghostwriter:从谷歌云上托管和提供 Replit 的代码编辑软件StarCoder:代码大模型工具大模型的快速发展历程ChatGPT的快速演进基于大模型的智能化软件工程应用开始涌现。ChatGPT大模型带来智能化软件工程技术新机遇Code ExplanationCode TranslationBrushesTest Generation根据选中的代码生成可理解的自然语言描述,Prompt:#explain what a part
6、icular block of code does实现不同编程语言之间的翻译,当前几乎覆盖了所有主流编程语言。目前这个功能处于试用过程中,还在收集用户反馈。集成TestPilot,实现从代码到完整测试方法的生成。TestPilot 将扫描repo中相关的文档注释和代码示例,然后根据这些信息为该函数生成一个单元测试。Adaptive Test Generation Using a Large Language Model除了基础的代码生成功能外,目前Copilot集成了最新的一些基于LLM的功能,包括代码解释、测试生成、代码翻译等,同时还提供了一些代码质量保障的工具,例如,bug修复,调试等。针
7、对代码质量,提供了代码格式化、bug修复、调试、注释生成等功能。https:/ 基于大模型的智能化结对编程助手:Copilot X 数字化:软件研发平台开始能够理解需求、设计、代码等,软件研发从过去的信息化进入数字化时代;AIGC:生成软件(software)的各种ware:验收标准、测试用例、UI、代码、测试脚本等;极致的持续交付:虽然软件工程2.0开始面向CI/CD,但还存在许多障碍,而在软件工程3.0,得益于设计、代码、测试脚本等生成,可以真正实现持续交付,即及时响应客户需求,交付客户所需的功能特性;人机交互智能:软件研发过程就是人与计算机的交互过程;以模型和数据为本:研发人员服务于大模
8、型和大数据平台,包括模型创建、训练、调优、使用等;研发团队的主要任务不是写代码、执行测试,而是训练模型、参数调优、围绕业务主题提问或给提示(prompt)。1968年NATO会议“软件工程”学科诞生软件工程1.0软件工程2.0软件工程3.02001年敏捷宣言发布2023年ChatGPT/GPT-4发布GPT-4 开启“软件工程3.0”全新时代基于大语言模型的软件工程PART 02前期工作:基于深度学习的软件工程技术受到学术界广泛的关注 背景:近年来随着深度学习的快速兴起,深度学习在软件工程领域也取得了广泛应用和突破性进展。仅2020年一年,就有超过100篇相关论文发表在软件工程高水平期刊和会议
9、上。数据采集数据预处理输入构建模型训练模型测试模型应用通用深度学习模型构建流程软件需求软件设计软件实现软件维护软件管理NER深度模型软件需求分析软件需求验证软件设计模式识别GUI 建模RNN/CNN/KNN CNN Autoencoder代码搜索DeepCSTree-LSTM API推荐Graph-GNN Attention 软件定位代码补全软件测试和缺陷缺陷预测SDAE模型DBN 模型语义缺陷检测SRLA 模型漏洞检测BGRU 模型CVE检测CNNFL 模型缺陷定位DeepSQLi 模型测试用例生成RNN-based克隆检测FNN-basedCoCoNut注释生成程序修复Tree CNN程序
10、表征Deep Review代码评审SATDCNN-based 深度学习模型在软件任务中的应用任务评估CRNNAnswerbotSO挖掘DeepTipGithub挖掘Youtube挖掘DeepTipA Survey on Deep Learning for Software Engineering.CSUR 整体方案:选取软件工程各个周期(开发,维护,测试,质量保证)的代表性任务,通过ChatGPT研究最前沿大语言模型在各类任务上的性能及可能的改进方向总览以ChatGPT为主的GPT系模型代表着当前业界大语言模型的最前沿涌现与泛化能力。本项工作主要为通过GPT-3.5系大语言模型,探索大语言模型
11、时代下的软件工程技术构建模式,包括如何有效构建各类软件工程任务的Prompt数据,使大语言模型具备高性能的代码生成、代码语言转换、代码文档生成、测试用例生成、缺陷自动修复等能力。GPT通用大语言模型API调用软件工程任务选定与数据获取针对具体任务构建promptAPI返回任务执行结果分析与验证代码生成:任务描述:根据代码功能的自然描述和方法的定义信息,生成完整的代码。数据集与评价指标:HumanEval-X数据集;指标为PassK(K值取1和10)。软件开发任务代码语言转换:任务描述:将给定代码片段转换至另一种编程语言。数据集与评价指标:CodeXGlue数据集;CodeBLEU分数和BLEU
12、-4分数。软件维护任务代码文档生成:任务描述:根据给定的代码片段,自动生成符合该段代码功能描述的自然语言(如Python方法的docstring)。数据集与评价指标:数据集使用CodeSearchNet;评价指标为BLEU-4分数,衡量生成的结果与数据集中标准答案的相似度。软件测试测试用例生成:任务描述:根据给定的代码,自动生成与其对应的单元测试用例(Unit Test Cases)。数据集与评价指标:数据集使用Defects4J;评价指标为测试用例的行覆盖率和条件覆盖率,其中行覆盖率衡量测试用例能够覆盖到的代码行数,条件覆盖率衡量条件语句中每个条件可能取值的覆盖情况。软件质量保证缺陷自动修复
13、:任务描述:给定一段包含缺陷的代码,模型返回对应的已经修复好缺陷的代码。数据集与评价指标:使用QuixBugs数据集,包含Python和Java两种语言的缺陷代码和测试用例;评价指标为修复后的代码片段能通过所有测试用例的数量和比例。前期工作:基于GPT-3.5系大模型的智能化软件工程技术研究任务名称输入I输出O代码生成包含代码功能描述的docstring相应代码片段测试用例生成焦点方法(Focal Method)测试用例代码文档生成代码片段代码片段的功能描述代码语言转换源语言代码片段目标语言代码片段缺陷自动修复含缺陷的代码片段修复好的代码片段前期工作:各类软件工程任务的输入与输出前期工作:基于
14、ChatGPT的代码生成ChatGPT在代码生成上取得了远强于其他非GPT系大模型的效果,相比于GPT-3.5系的其他大模型提升也十分显著。ModelsPythonC+P1(%)P10(%)P1(%)P10(%)GPT-J11.118.77.513.8GPT-NeoX13.822.79.919.0InCoder16.426.69.519.3CodeGen19.234.618.130.8CodeGeeX22.939.617.132.2Text-davinci-00220.463.418.763.4Text-davinci-00356.984.845.680.5GPT-3.5-turbo69.99
15、0.253.181.1生成的Python代码可以通过该样例所有的测试用例前期工作:基于ChatGPT的代码生成ChatGPT在测试用例生成上取得了强于其他SOTA方法的效果,提升了现有测试用例生成的行覆盖率和条件覆盖率ModelsLine CoverageCondition CoverageEvoSuite23.13.8AthenaTest23.24.1Text-davinci-00225.36.1Text-davinci-00325.56.0GPT-3.5-turbo26.26.7生成测试用例主要包含三个方面:有效值的测试 空值的测试 不合法值的测试ChatGPT生成的测试用例具有高可读性、
16、完备的测试Oracle数据底座序列特征软件工程大数据AST特征控制流特征数据流特征API使用特征大模型T5代码大模型与表征模型多模态知识图谱GPTBERT调优模型NL PL 匹配模型程序语言模型NLPL 生成模型PL表征模型基于大模型的智能化软件工程指导模型智能化能力代码生成程序理解克隆检测可扩展智能化软件工程能力代码变更表征模型缺陷修复测试生成代码搜索代码大数据通用大数据应用场景编程辅助开发者测试代码分析与检视软件设计基于大语言模型的智能化软件工程体系规划蓝图以通用大模型为基础,融入编程规范、程序理论、模型规则,构建软件工程专用大语言模型充分结合编程规范、模型规则、程序分析、软件资产、社区知
17、识,构筑智能化软件工程技术服务能力,提升编码效率与质量,达成人机协同开发软件编程规范门禁版本级检查代码审查机制代码评审机制软件工程能力:流程、规范、方法论通用大语言模型应用于软件工程的大模型提示词工程微调/RLHF代码仓,代码语义、语料知识库1.编程规范、程序理论、模型规则2.具体软件工程任务等提示词数据智能化软件设计智能化软件编码辅助智能化开发者测试代码审查、度量与可视化基于软件工程大数据的微调目标以通用大语言模型为基础,结合软件工程大数据,构建应用于软件工程的大模型充分结合编程规范、程序理论、模型规则、程序分析、软件资产、社区知识,构筑智能化软件工程技术服务能力,提升编码效率与质量,达成人
18、机协同开发软件挑战ChatGPT在智能化辅助编程方向的取得可观进展,急需跟进国际先进技术OpenAI和微软拥有GitHub超大代码库资源,在数据上有一定差距软件工程领域知识如何与大语言模型深度融合并改变现有软件开发范式,当前研究相对空白,具有很大技术挑战智能化分析与检视服务智能化软件设计服务智能化开发者测试服务智能化编码辅助服务编程规范门禁版本级检查代码审查机制代码评审机制软件工程能力:流程、规范、方法论代码化软件设计智能辅助设计建模软件设计知识库缺陷/漏洞检测故障定位代码规范检测代码坏味道检测代码搜索与推荐代码补全与生成智能问答代码重构代码文档生成开发者行为分析源代码表征代码模式挖掘变更日志
19、生成缺陷检测与修复代码坏味道检测智能降误报研究告警智能提示优秀代码示例软件知识图谱通用大语言模型应用于软件工程的大模型提示词工程微调/RLHF代码仓,代码语义、语料知识库1.编程规范、程序理论、模型规则2.具体软件工程任务等提示词数据智能化软件设计智能化软件编码辅助智能化开发者测试代码审查、度量与可视化测试覆盖率分析精准测试测试质量检测变异测试测试迁移技术测试辅助生成AI增强的Fuzzing可测试性设计蜕变测试组合测试架构逆向分析架构一致性分析变更历史分析告警自动重构告警可解释性代码度量演化度量问题呈现根因分析程序代码分析基于软件工程大数据的微调以通用大模型为基础,融入编程规范、程序理论、模型
20、规则,构建软件工程专用大语言模型数据底座PART 03 项目总目标:通过收集全量开源软件资产数据、软件和AI物料清单、软件过程元数据,软件资产全量有序管理,可视可追溯、主动风险削减/防腐化,持续识别/挖掘推荐高价值资产,支持软件工程大语言模型的训练和调优全量开源软件资产数据收集全量开源软件大数据采集与分析基础设施SBOM和AIBOM的构建软件过程元数据基于Git的代码仓数据(WoC)软件开发活动数据:邮件列表、Issue/PR基于包管理器的开源生态元数据其他开源数据:社交网络、漏洞、SO等SBOM生成SBOM验证软件开发全过程元数据采集软件开发全过程元数据服务漏洞E2E工程能力软件风控和合规A
21、IBOM验证AIBOM生成开源软件知识图谱软件工程领域大语言模型大模型数据底座-数字化软件资产WoC数据收集流程WoC数据映射关系开源软件合规分析全量开源数据收集框架系统分析了PyPI、Maven、NPM、RubyGems、和Cargo等多个主流包管理中的开源许可证使用情况,分析了4000多万开源软件包完成了多源异构的开源数据收集收集技术,初步打通了“华为云-华为云对象存储服务(obs)-浙大”的数据链路,收集了Top 1000万的Github数据、7个主流开源生态元数据、GHArchive等数据集。MavenNPMPyPIRubyGemsCargo软件包数量10,288,84129,750,
22、5524,413,8271,427,793709,755标准许可证使用率28.71%85.73%71.16%64.34%97.27%许可证变更次数62,863217,48158,89626,2718,563许可证兼容率7.33%4.14%3.29%7.17%7.81%全量开源代码数据集代码指纹分析代码克隆漏洞特征分析漏洞修复补丁定位多源信息特征提取开源漏洞库开源代码指纹库全量漏洞特征库公开漏洞/商业漏洞公开漏洞源感知开源漏洞拦截基于社区历史修复深度学习的漏洞自动修复推荐基于SBOM的高精度软件成分分析漏洞知识库提前感知模型补丁识别模型全局代码指纹局部敏感哈希倒排索引漏洞知识图谱代码指纹入库漏洞
23、特征入库漏洞代码深度表征关键技术漏洞感知漏洞定位与扫描漏洞修复基于大模型的漏洞提前感知构建漏洞端到端解决方案,利用代码指纹分析和漏洞特征分析技术,构建漏洞知识库,实现基于SBOM的高精度软件成分分析,支持漏洞感知、漏洞定位与扫描、漏洞修复等任务类CodeQL查询式漏洞检测发现漏洞端到端解决方案基于克隆检测的相似漏洞扫描二进制漏洞扫描基于Fuzz的漏洞挖掘漏洞感知:提出面向代码变更和缺陷报告的漏洞提前感知技术,达成60%高危漏洞提前感知战略目标。漏洞定位与扫描:提出基于面向漏洞的SZZ算法,即时追溯定位引入漏洞的软件版本;构建基于克隆检测的高性能漏洞扫描技术,一千万行代码扫描时间5分钟(比业界领
24、先工具SourcerCC快一倍)。漏洞修复:提出基于代码图结构的代码表示模型,识别代码中是否包含漏洞,从而实现函数级代码的漏洞识别技术。更多信息,请参加周六下午胡星老师的“基于大语言模型的漏洞提前感知、检测和定位”漏洞工程技术软件工程大语言模型研究进展PART 04问题:大量重要软件工程任务与代码变更的表征与生成相关。是否能够构建面向代码变更的预训练模型以提升此类任务?关键技术 采用Transformer Encoder-Decoder架构,为代码变更特别设计了五种预训练任务,能够帮助模型构建代码变更与自然语言之间的语义连接,捕捉代码变更中的语义信息。设计的五种预训练任务:MLM for Co
25、de ChangeMLM for Commit MessageCode Diff GenerationPL to NL GenerationNL to PL Generation代码变更日志生成即时注释更新即时缺陷预测基础理论与模型:面向代码变更的预训练模型 问题:程序的语义结构(例如代码中的控制依赖、数据依赖)对于分析和理解代码至关重要。但现有预训练代码模型都忽视了对于程序语义结构的学习。如何让大模型学习和吸收关于程序语义结构的知识?关键技术 提出两种新颖的预训练任务CDP和DDP,在预训练时基于输入代码片段分别预测代码中的控制依赖关系以及符号级数据依赖关系。预训练了一种代码模型PDBERT
26、,能够直接被用于分析代码中的依赖关系,也能提升程序语义敏感的下游任务的性能。PDBERT的预训练策略void foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567Transformer Token Contextual EmbeddingsCDP HeaderStatement FeaturesPredict Statement-Level Control DependenciesControl Control DependencyDependencyDDP HeaderDDPCDPMigrate to Downstream A
27、fter Pre-trainingM MM MPredict Token-Level Data DependenciesTokensvoidfoo(intx)ninty=MASK(if(MASKMAXn.n.n.Tokensvoidfoo(intx)ninty=MASK(if(MASKMAXn.n.n.Source Codevoid foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567void foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567void foo(
28、int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567void foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567void foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567void foo(int x)int y=source();if(y MAX)int z=y+x;sink(z);1234567Data Data DependencyDependencyMLM HeaderMLMS So ou ur
29、 rc ce eyPredict Masked Tokens(2,5)(3,4)M MM M程序依赖分析漏洞检测漏洞CWE类别预测基础理论与模型:程序语义感知的预训练代码模型数据集模型Pass1HumanEvalLLaMA-7B10.5LLaMA-13B15.8LLaMA-33B21.7LLaMA-7B-py24.63MBPPLLaMA-7B17.7LLaMA-13B22.0LLaMA-33B30.2LLaMA-7B-py29.62 初步评估结果:基础模型:LLaMA 7B 数据集:小规模Python AI代码数据集,5.8G大规模Python开源代码数据集,173G,约60B Tokens数
30、据处理:高质量项目,过滤,去重,删除评估数据集中的数据训练方式:全量微调训练精度:混合精度,bf16并行策略:Fully Sharded Data Parallel(FSDP)基于自然语言大模型训练代码模型:评估数据集及方法:30个AI相关问题:基于初学者的PyTorch使用经验和StackOverFlow中PyTorch相关的热门问题构建。人工撰写相应的prompt。评估方法:人工判断正确、部分正确、错误HumanEval,MBPP:广泛使用的Benchmark评估指标:Passk模型正确部分正确错误LLaMA-7B15213LLaMA-7B-AI2352LLaMA-7B-py达到了LLaM
31、A-33B的Pass1性能中小规模模型利用代码数据微调后可以实现可观的表现。基于大语言模型的代码生成基础模型:StarCoder 数据集:Method2Test78万条 Focal method/Unit test 对Focal method 包含其所在类的上下文训练方式:LoRA微调并行策略:Distribute Data Parallel(DDP)初步验证:生成测试样例无语法错误部分生成测试样例与实际样例差别较大部分生成样例与实际样例几乎一致,简单修改后可直接编译运行(1)生成测试样例与实际样例差别较大(2)生成测试样例与实际样例一致(3)在Apache 开源项目Commons-numbe
32、rs中生成测试样例,经简单修改后即可编译运行(1)生成样例调用了不存在的API(2)修改为正确API即可运行基于代码大模型的单元测试样例生成基于大规模预训练技术的测试代码智能演化技术开发人员在进行生产代码更新时,经常忽略测试代码的更新与维护,为软件带来了极大的安全隐患。现有的测试生成工具大多是为测试代码生成新的测试案例,而无法对已有的测试案例进行维护问题:。基于大模型的测试代码演化模型就可以有效的检测过时的测试案例,以及大幅度提升了现有测试案例的覆盖率以及演化性。大规模预训练模型可以有效的学习生产代码变更,更好的实现测试代码的维护结论和展望PART 05未来已来:以大语言模型为底座,构建人机物融合的下一代软件工程能力主要挑战1.如何训练软件工程大语言模型,达到与ChatGPT类似甚至超越ChatGPT的能力?2.如何将软件工程大语言模型融合到开发过程中,针对项目定制和微调,从而生成适配项目的代码和测试用例?3.软件工程大语言模型如何与传统软件工程技术(如程序分析等)融合,更好地进行代码分析与检视?THANKS