9月20 - 21日,第11届QECon全球软件质量与效能大会在上海落幕,大会聚集数百位专家和千余人从业者,顺应软件质量与效率前沿的发展方向,内容涵盖多个前沿话题,带领听众洞察前沿技术趋势,共筑品质内容,推动质量提升与效率优化。(10月25-26日,QECon北京站敬请期待:www.QECon.net)
在QECon上海站第一天上午主会场 Keynote Speech环节,复旦大学计算机科学技术学院教授、上海市数据科学重点实验室主任 肖仰华教授 率先为大会带来重磅演讲——《代码大模型改进的双引擎:数据增强和知识增强》。肖教授深入剖析了大模型技术在代码生成与优化领域的应用,探讨了数据增强和知识增强的双引擎驱动如何有效提升代码质量,并且分享了其在具体实践中的经验与挑战,赢得了与会者的高度关注与热烈掌声。
下面就附上豆包大模型对肖老师演讲内容的要点总结,最后再附上肖老师分享的PPT文件(PDF版)。
该演讲稿主要探讨了代码大模型的相关内容,包括认识代码大模型、训练代码大模型、优化代码大模型特定能力以及使用代码大模型等方面,具体要点如下:
认识代码大模型:
代码语言本质:介于形式语言与自然语言之间,包含可执行代码、注释和日志信息等,具有苛刻的正确性要求,与自然语言不同,主要关心正确与否,追求精确。 大模型的挑战:存在幻觉问题、先天能力不足、训练数据规模和质量有缺陷、训练不充分、实际任务复杂、指令复杂且输入有噪音、知识匮乏等问题,且难以满足代码的严格性要求,在理解代码中的复杂结构、处理代码依赖和进行代码评估等方面存在困难。 软件工程的系统性:涉及众多环节,代码大模型不仅需要支撑编码,还需胜任其他角色,如分析师、程序员、架构师、测试员等,需要建立健全面向软件工程各环节的能力体系。 数据的重要性:数据是软件编写组织的基础,现有代码大模型缺乏对数据的认知,人工评估准确率低,代码大模型需要提升对于数据的理解水平。 Debugging 的重要性:程序员通常很难一次性编码完整无误的代码,Debugging 有助于定位、分析、修复和测试错误,大模型缺少 debugging 能力很难调试代码,需要通过强化学习增加代码大模型多轮交互、试错反馈的能力。 人机协作:人是软件工程的核心要素之一,代码大模型应与人深度协同,融入软件开发过程中,协助人实现软件高效率高质量开发。 风险管控:代码大模型需要有风险管控能力,对低风险代码进行修正,对高风险代码设置防护,对用户警示中风险行为。 版本兼容性:版本不兼容问题是软件工程中的重大问题,代码大模型需要能处理代码及其依赖中的版本兼容性。
高质量数据是关键:不重复、完整、正确、干净和通用的代码库是构建代码大模型的关键,高质量数据应类型多样,包括代码、概念、技巧、场景、风格、编程练习题等,利用高质量数据训练和微调的小模型可超越大模型,对训练语料进行筛选,如 GPT - 4 标注训练一个分类器。 低资源代码预训练:当前代码大模型对低资源代码的支持严重不足,需要增强对低资源语言的支持,各种编程语言的数据分布很不平衡,Lua 等代码占比较小。 用什么数据训练:代码文本预训练模型和图预训练模型相结合,提升模型的理解能力。 用什么任务训练:包括代码补全、代码生成、代码翻译、代码填空等自监督任务,以及面向领域定制的预训练任务,如地理理解表征、用户行为预测、乱序 Query 理解等,能够有效实现领域持续预训练。 指令的来源:可以基于翻译的代码数据合成,将高资源代码翻译成低资源代码,并利用单元测试保证翻译代码的正确性;从领域文档构造任务指令,利用领域知识指导构建指令微调数据集;使用大模型生成指令,通过自己生成编程题和方案构造训练数据。 指令的评价:基于 SOLO 的指令评价,指令数据的多认知层次评价和构建是推动通用大模型领域化的关键。 指令的配比:基于教育分类法的指令配比,小模型仍然是大模型训练数据与指令处理的主要形态,指令数据的合理分类和优化配比是提升大模型能力的重要思路。 统一大模型:行业大模型并非只是一个大一统模型,一通多专是其基本形态,以语言为核心的大模型与若干非语言的大模型相结合,如预训练脚本命令语言模型和领域知识增强的日志语言模型等。
面向 Debug 的自我纠正:复杂程序难以一次性正确生成,需要依据反馈信息(简单反馈、单元测试)与代码解释等进行代码纠错,单元测试的反馈优于简单反馈,理解代码用途同时结合单元测试拥有更好的表现。 自我纠错数据集的构建与训练:构造自我纠错指令数据集,将自我纠错内化为模型能力,摆脱对于精心设计的提示的依赖。 LLM 的自我完善能力:完善初步结果是人类的一项重要能力,构建持续完善的指令数据集,自动识别更好的生成答案。 合成 “自我完善思考” 数据集:现有大模型无法通过 “思考再完善” 提升回答质量,合成自我完善思考数据集并微调,在绝大多数任务中,通过在模型生成答案前增加一次 “思考”,模型表现显著提高。 基于强化学习的工程师反馈:根据运维场景设计反馈机制和奖励函数,优化运维领域大模型。 基于 “执行环境反馈 + 大模型修正 “的优化:使用来自代码执行环境的结果反馈,增强自研小型专业模型的命令生成能力,使其具备自我修正能力。 代码检索能力优化:常见代码检索任务包括 NL2Code、Code2Code 和 Code Context Retrieval,需要统一的代码检索模型,通过代码逻辑增强(基于 LLM 生成伪代码作为中间模态)和训练策略优化(多任务学习)来实现。
降低大模型的认知负载:优化提升工程,包括提供清晰的上下文、明确的指令、思考过程的提示、足够的背景知识等,通过协作避免大模型从事困难任务。 逐步求精的生成策略:对于复杂算法,程序员通常先设计框架再补充算法细节,设计从粗到细的多阶段生成框架,通过抽象语法树对目标分层生成。 Planning + COT 解决复杂意图理解:大语言模型难以理解复杂的编程意图,通过对复杂意图拆解并规划求解步骤,利用大模型的 COT 能力求解问题。 多 Agent 协作:设计导师、执行者和评估者三种智能体专家角色,用于生成日志的文本描述,降低从业门槛。 大小模型协同:基于级联策略的大小模型协同框架,基于贝叶斯推断的模型不确定性估计,小模型在不确定时才调用 LLM,降低成本,基于错误案例推理增强策略,提高大模型的推理性能。 文档检索增强输出的准确性:检索相关信息,提升大模型泛化性与时效性,对于 NL2Code 问题,基于 “检索 + 生成” 框架,检索代码相关文档再生成最终的代码。 检索增强的代码生成:检索 - 复用 - 改写是人类程序员常用的方式,但 LLM 存在固执性,将检索代码进行语义保持、形式变异改写,基于抽象语法结构树解析检索代码,实现不改变语义的变换,并选取最优生成结果。 保持风格一致的代码补全:利用风格判别器和风格迁移模型,对功能正确的补全代码进行风格判别和迁移,以实现风格一致的代码补全。
------------------ End --------------------
关注本公众号,输入“CLLM双引擎”,下载共享版PPT
更多关注,请点击 “阅读原文”