AI智能总结
大语言模型在真实开发场景下的实践 个人简介 吴 沁 芸 代码智能团队高级算法工程师 负责面向开发者的代码编程助手中代码生成相关的算法研发及业务落地,在MSR、FSE等重要学术会议上发表过相关学术工作。 目录 ⼯业界代码补全评估体系 代码补全未来:编辑推荐 代码生成Copilot回顾&探索 GitHub Copilot孵化于GitHubNext团队,⼀个主要有程序分析和软件⼯程研究员组成的研究型团队,其⽬标是探索未来的软件研发⽅式,持续在关注通⽤代码⽣成领域 模型 2020年6⽉GPT-3发布,GPT-3在性能上的突⾏进展让GitHubNext决定基于它构建⼀款代码智能产品,得益于微软与OpenAI的合作关系,GitHub和OpenAI开始合作训练基于GPT-3的代码⼤语⾔模型Codex,并持续迭代其私有模型,提升代码补全场景下的性能 G O P S全 球 运 维 大 会 暨 研 运 数 智 化 技 术 峰 会2 0 2 4·上 海 站 产品形态 GitHub在体验到GPT-3后⾸先想到的是做⼀个Chat Bot产品,但是经过测试后发现,虽然GPT-3在某些题⽬上表现很惊艳,但是还是有很多时候给出毫⽆意义的答案,不符合这种产品形态对容错率的要求,会让开发者失去信任。基于模型的能⼒判断,代码补全是⼀种容错率更⾼,更有⽤户粘性的产品形态。 交互 放弃从传统IDE补全的下拉列表选择交互,选择了⽤Ghost Text进⾏展⽰,⽤Tab键进⾏采纳,继续输入则取消推荐。这种交互⽅式发挥了模型在多⾏补全上的优势,推荐代码和已有代码融为⼀体,⽅便开发者快速基于上下⽂判断是否采纳。 G O P S全 球 运 维 大 会 暨 研 运 数 智 化 技 术 峰 会2 0 2 4·上 海 站 低延时&提示工程 •低延时:专业开发者的输入速度通常较快,过⾼的延迟会失去很多推荐的机会或者迫使⽤户停顿等待。GitHub Copilot在⼤语⾔模型的推理速度和⼯程链路上进⾏了优化,做到500ms左右的平均延迟 •提⽰⼯程:如果基座模型决定了能⼒上限,那么提⽰⼯程所做的就是去逼近这个上限。通过研究开发者⽇常开发中会关注的上下⽂,在prompt中加入⽂件路径、相似代码、浏览记录等信息,让模型在代码补全⽅⾯的表现⼤幅提升 字节跳动代码⽣成探索历程 产品体验快速迭代 功能扩展 •组建算法、⼯程和产品⼀体的智能编程助⼿团队•⾃研代码LLM评测集和⾃动评测系统 难点 评估 创新 ⼯业界代码补全评估体系 ⼯业界代码补全评估体系 HumanEval不是⼀个合适的评测指标 •题⽬不匹配真实项⽬的代码补全场景 •已有模型普遍存在HumanEval数据泄漏的情况•学术界/⼯业界刷分现象严重,分数⾼不代表实际表现更好 构建⾃研评测体系的重要性 02.缺乏仓库级信息 01.场景单一 评测集仅提供语句级、函数级或类级生成能力的模型评估。这些场景通常仅涉及生成单个代码单元(如语句、函数或类)且独立进行 在RepoBench等仓库级评测集中,虽然从代码库中构建基准测试案例,但未充分利用代码库中的丰富上下文信息进行更好的模型预测。而这些信息已被流行的代码补全工具所利用 挑战&难点 04.缺乏基准测试与真实生产环境相关性研究 03.单测不充分 HumanEval以单测通过率为评价指标,主要依赖测试用例评估模型生成代码的正确性。然而,这些测试用例通常不足,即使在模型预测错误时,它们也可能通过。使得评测结果不置信 目前尚无研究探讨基准测试结果中模型表现与实际生产环境的相关性,使得基准测试的可用性和有效性尚不确定。 RepoMasterEval Wu,Qinyun, Chao Peng,PengfeiGao,RuidaHu,HaoyuGan, Bo Jiang,JinheTang et al. "RepoMasterEval: Evaluating Code Completion via Real-World Repositories."arXivpreprint arXiv:2408.03519(2024). 仓库筛选 真实性 高质量 置信 每个代码仓库必须至少获得100颗星,确保其具备一定的社区认可度和知名度。 活跃且不断更新的GitHub代码仓库作为基础数据源,仅包含2023年3月之后创建的仓库,尽量消除数据泄露风险。 仓库必须包含测试文件,并且经过手动核实,确保其通过所有测试 题目构建 题目多样性 单测增强 为了保证测试的充分性,我们对每个题目生成了变异测试(mutation test),通过对题目中的代码片段进行不同的变形,检验是否需要补充单元测试。对于需要补充单测的题目,我们进行人工补充,以确保测试的充分性,并提升评测集的置信度。 •使用mutation testing的方法,为代码片段生成有缺陷版本•在这些缺陷版本上运行单测用例集•对于单测用例集无法kill的缺陷版本,补充单测(GPT生成和人工标注)•重复2-3,直到全部缺陷版本都可以被kill为止 评测流程 代码补全未来:编辑推荐 代码补全/续写的局限性 代码补全/续写解决的是编写全新代码的问题。但作为软件工程师,还有很大一部分时间我们所做的是编辑已存在的代码,这里面包括新增、删除、替换等操作,而当前的代码补全功能无法胜任这种任务。 代码编辑推荐的概念 开发者实现了一个log函数,并在do_something和do_something_else两个方法中调用 代码编辑推荐的概念 开发者为log函数增加了sourceMethod和level两个参数,用于打印日志触发时所在的方法及日志级别。但是此时,开发者还需要要进行一些列额外的修改! 代码编辑推荐的概念 为何不让AI帮你完成这⾥的操作? 开发者还需要在log函数中修改print语句打印新增的参数,并在log函数的调用方中传入额外的参数 数据构建和模型训练方法 数据构建 •Git仓库中海量的commit历史记录是个巨大的数据宝库,包含了丰富的用户编辑行为信息•Git commit信息中的噪音也是很多的,需要构造一系列的启发式规则,用于提取出有关联的修改记录•用户在IDE使用过程产生的LintError信息和对应修复 模型训练 •基于代码大语言基座模型•通过CT和SFT模型能够理解diff格式数据•对于Lint Error修复需要加入ErrorMessage•需要通过SFT修正模型过度编辑的行为 落地场景 功能与交互演示 批量修改 功能与交互演示 下一步预测 功能与交互演示 LintError修复 未来展望 关于产品形态 关于模型 •完全自主的代码生成Agent可能并不适合复杂开发任务•通过自然语言描述编码意图存在局限性•开发者与AI一起反复构思、确认、实现完成复杂功能的迭代•AI应该更智能地识别人类意图,并更主动地参与到编码过程 •更⻓的上下⽂⻓度⽀持,百K级别甚⾄M级别的⻓度•维持⻓上下⽂⽀持同时具备更快的推理速度•模型不⼀定是标准的Transformer架构•模型具备代码编辑的能⼒ 欢迎体验⾖包MarsCode 限时试用AI编程助手 T h a n k s 荣誉出品