通义灵码AI编码助手和AI程序员背后的技术
技术分享来自通义实验室科学家——黎槟华
汇报摘要
在大模型时代背景下,AI编码助手如通义灵码被设计用于提升开发者效率和扩展其能力边界,分为初期使用基于规则或小模型的工具,现阶段AI辅助提高开发效率,未来AI可能成为开发主力,人类更多担任决策和监督角色。讨论了AI编码助手在代码生成补全功能的构建与优化,强调了在生成代码质量和契合开发者行为两方面的挑战,通过高质量代码对齐、代码post training、跨文件感知和版本感知等技术措施提升实用性和用户体验。提出了一种基于真实场景的数据集来评估代码生成模型的方法,强调了通义灵码编码助手在评价中的良好表现。讨论了AI程序员在提高开发效率方面的局限性,以及国内外AI程序员的发展情况和面临的挑战。提出通过合成数据复现实际问题和团队自建模型在代码修复任务上的进展,展望了AI在软件开发中与人类协作的未来,强调了超大算力的重要性。
主要内容
通义灵码AI编码助手与未来编程趋势分享
在大模型时代背景下,通义灵码AI编码助手被设计用于提升开发者和软件工程的效率,扩展开发者能力边界。分享分为三个阶段:初期开发者使用基于规则或小模型的工具;现阶段AI如通义灵码能充当辅助工具,提高开发效率;未来AI将成为开发主力,人类则更多担任决策和监督角色。
构建优秀AI编码助手的技术与挑战
讨论了AI编码助手的技术发展方向,特别是代码生成补全功能的构建与优化。强调了在生成代码质量与契合开发者行为两方面的挑战,以及为此所采取的技术措施,如高质量代码对齐、代码post training、跨文件感知和版本感知等,以提升AI编码助手的实用性和用户体验。
代码生成模型的真实场景评价方法
讨论了提升开发者体验的方法,指出传统评价方法的局限性,提出了一种基于真实场景的数据集来评估代码生成模型,该方法考虑了多种编程行为和需求,包括单行、多行补全以及特定的代码生成需求。通过构建实际业务数据集,对多个模型进行了测试,结果显示,某些模型在生成质量和契合开发者行为方面表现不佳。特别提到了通义灵码编码助手在评价中的良好表现。
AI程序员的优势及挑战
AI程序员通过利用大模型和代码模型提高开发效率,但存在局限性,如不了解具体用户仓库、未进行环境交互训练以及缺乏软件工程全过程理解。目前,国内外AI程序员的发展正受到关注,产品应用和评估指标多样化。通过学术界和工业界的合作,AI程序员在解决实际问题上的能力正逐步提升,但要将其技术落地到实际产品中,还需克服多方面的挑战。
软件工程中的四大挑战:数据构建、项目感知、解决方案生成与缺陷复现
在软件工程领域,处理数据构建、项目感知、解决方案生成以及缺陷复现是面临的主要挑战。首先,数据构建是核心,需要大量的数据和算力支持,尤其在模型训练过程中。其次,项目感知涉及对软件开发和演化的理解和处理,由于数据记录的不完整,导致很多细节丢失。为了解决这些问题,提出通过合成数据的方式去复现软件开发过程中的各个阶段,帮助模型理解如何解决实际问题。
自研模型在代码修复中的应用与效果
团队自建模型在代码修复任务上取得了一定的进展,包括模型的训练和验证,以及在修复问题解决率上的表现。面对大型代码库带来的挑战,提出了一种基于项目感知的方法,利用蒙特卡洛树构建来定位和修复代码问题。此外,还探讨了解决方案生成与缺陷复现的过程,通过先规划再生成代码的策略,以及如何有效利用经验库来提升修复的效率和准确性。最后,展望了AI在软件开发中与人类协作的未来,强调了通过超大算力提升软件开发成功率和效率的可能性。
问题回顾
AI对软件工程影响的发展阶段有哪些?
AI对软件工程的影响分为三个阶段,首先是基于规则和简单神经网络的小模型工具配合的阶段;其次是AI加持下的dev和copilot阶段,AI能充当copilot协助开发者提高效率;最后是AI成为开发主力,开发者负责决策指导和审核,而AI执行细节工作,从而提高效率并扩展开发者能力边界。
AI编码助手的技术构建和评价标准是什么?
本次分享的第一部分聚焦于AI编码助手的技术构建,包括单元测试、底层模型训练等技术,并重点讨论了代码生成补全场景下的技术挑战。要构建优秀的AI编码助手,需注重代码生成质量保障(避免语法错误、逻辑错误、代码幻觉、版本错误等)和契合开发者行为(适应开发者习惯,减少重复造轮子、风格混乱和过度打扰等情况)。
在代码生成的质量评价方面,您们提出了哪些数据集和评价维度?
我们提出了多种真实场景下的代码生成补全的数据集,并针对股权代码需求的分布进行了统计,发现50%的开发者希望补全单行代码,另一半则涉及多行补全,包括函数、类等内容。此外,还考虑了代码生成力度的需求,如逻辑语句、类函数和if else等语句,并注意到了某些情况下不应补充任何内容的情况。为了构建高质量的评价方式,我们根据真实业务数据和开发者行为的分布筛选出丰富的场景进行比对,并构建了链路来综合考虑生成正确性和开发者行为。
AI编码助手存在哪些局限性?
AI编码助手虽然能提高开发者的效率,但也有一些局限性。首先,大模型在训练过程中并没有深入了解用户的仓库层级关系,无法理解跨文件和跨语言间的关联。其次,模型在训练时没有经历过环境交互,不了解编译正确或运行正确的概念,也未学会如何通过编译错误或堆栈报错修复代码。最后,模型缺乏对软件工程全过程的理解,不懂得编码、调试、验证等步骤的规划。
在解决真实项目中遇到的issue时,你们是如何构建数据的?
我们在解决真实项目中的issue时,需要收集和构建过程数据,包括需求文档、issue、解决方案、变更记录等。这个过程中的数据收集非常关键,因为它记录了软件开发过程中的迭代和完善过程。然而,由于软件过程记录的数据有限,会丢失很多细节,如设计需求文档。因此,我们还需要通过合成数据的方式去复现中间的各个环节,让模型了解我们在解决问题时是如何思考的。
在解决大型项目中的issue时,如何处理代码库庞大的问题?
在处理大型项目中,由于代码库庞大,直接放入大模型进行处理是不可行的。我们需要知道在哪里进行变更,即召回变更点。这是一项非常困难的任务,因为与简单的检索不同,代码问题的解决涉及到更复杂的理解和定位。
在解决软件开发中的问题时,如何通过推理和验证来确定代码修改的正确性?
在解决软件开发问题时,采用一种基于推理和验证的方法,即通过构建蒙特卡洛树结构,逐步确定候选代码片段与issue描述之间的关系,并利用大模型进行判断。在这个过程中,通过分析类之间的调用关系、从属关系以及文件之间的重用关系,构建置信度扩散模型,最终锁定需要修改的文件和函数位置,以解决特定的issue。
如何生成正确的代码并进行整合以解决软件缺陷?
首先,在生成正确的代码时,遵循代码间依赖关系的顺序,优先编写具体实现后再进行调用,以确保流程顺畅。此外,在合并其他代码时,还需考虑新增文件和函数的位置选择,以及将它们融入现有代码库的过程。为此,研究团队提出了先planning,再生成代码,最后apply到实际项目的三步思路,并通过人为干预调整内容,形成可产品化的链路。
如何实现缺陷复现以验证解决方案的正确性?
缺陷复现是缺陷修复的基础,它要求模型能够准确地复现缺陷,了解预期结果与实际报错情况的一致性。通过大模型自动复现缺陷,然后对比预期结果,若一致则认为正确复现。成功复现后,将经验编辑合并到经验库中,形成针对特定项目或语言的独特经验库。在解决新问题时,大模型能够通过召回相关经验进行复现,从而在迭代过程中不断迭代优化,同时人可以适时干预以减少工作量。
如何利用经验复用来提高缺陷修复的效率和准确性?
基于经验复用的方法旨在提高缺陷复现的效率和准确性。首先利用大模型自动复现缺陷,然后根据复现结果(如预期结果和实际报错情况)判断是否正确。若正确,则提取经验并编辑合并到经验库中,形成企业或特定语言独有的经验库。在解决新问题时,模型可以召回相关经验,通过多次迭代来复现和解决issue,同时允许人工干预以优化结果。