大模型在研发效率提升方面的应用与实践 | 新程序员
【导读】在当今软件开发和科学研究领域,项目的复杂性日益增加,提升研发效率已成为行业迫切需求。本文深入探讨了大模型技术在研发效率提升方面的应用与实践,以实战摸索的方式,真实揭示了大模型究竟能够如何助力企业实现数智化转型。
本文精选自《 007:大模型时代的开发者》,《新程序员 007》聚焦开发者成长,其间既有图灵奖得主 Joseph Sifakis、前 OpenAI 科学家 Joel Lehman 等高瞻远瞩,又有对于开发者们至关重要的成长路径、工程实践及趟坑经验等,欢迎大家。
随着软件开发和科学研究的复杂性不断增加,人们对提高编程及研发效率的需求也越来越迫切。传统的编程工具和方法已经无法满足这一需求,因此人们开始探索新的技术手段来提升编程和研发效率。大模型作为一种新兴的人工智能技术,被广泛应用于辅助编程和研发效率提升领域。
例如,美国科技巨头谷歌利用大模型技术提升内部研发效率,通过在代码自增长工具中集成大模型,辅助完成部分重复性工作(如自动导入包、自动生成构造函数等),缩短了工程师的编码时间。同时它还开源了基于大模型的代码搜索引擎,可以自动匹配代码片段并提供相关文档,大幅提高了工程师的开发效率。微软研究院则开发了基于大模型的自动测试工具,它可以自动检测代码中的 Bug,并生成相应的测试用例。经过实测,该工具在发现错误率和测试覆盖率上都能超越人工编写的测试用例。目前它正在帮助微软各产品线提升测试质量。
中兴通讯以大模型为中心赋能企业数智化转型,坚持先自用再外溢。除自研大模型之外,我们还基于开源的大模型开发微调后在研发效能领域进行应用,并分析其优势和挑战。通过对相关研究和实践案例的综述,发现大模型在辅助编程和研发效率提升方面具有巨大潜力。在本文中,我将分享我们在研发类大模型的一些应用与实践,希望对开发者们有所裨益。
研发类 AI 场景分析
研发流程非常繁多,从项目立项到需求分析,再到产品设计、研发,再进行测试,进而投产和运维,贯穿了复杂的管理流程。
基于大模型的需求管理
对需求进行自动拆分,即把用户需求拆分成产品需求。
大模型能对用户提出的需求进行语义理解,识别其内在结构与逻辑关系,自动将需求拆分成独立的子需求。比如从一个用户定义的需求,自动提取出多个具体的产品需求点。
自动补全
(1)对需求进行自动介绍,指出需求背景、用户痛点以及实现该需求能为用户带来的价值。
(2)将用户用简单语言说明的需求,转化为标准的产品需求格式,详细描述功能点和约束条件。
(3)根据需求类型和项目阶段自动生成验收标准与测试用例。
自然语言查询/定义
具体包括:
(1)用户能通过日常话语式描述搜索到相关工作任务。例如搜索“如何实现单点登录”。
(2)用户通过在线对话的方式与系统交互,利用自然对话流程定义需求内容。
此外,大模型还可以为需求管理提供以下能力:
(1)识别需求之间的依赖关系,绘制需求关系图。
(2)利用主观概率算法为每个需求点评估重要程度与难易程度。
(3)通过对历史需求数据进行学习,提出可行性评估与风险识别。
分析设计
内容生成
(1)根据需求内容自动提炼重点,生成不同层级的内容提纲供浏览。
(2)根据产品类型和功能,绘制系列设计原型图或流程图,标识主流程和交互点。
(3)通过创意思维自动编写故事情景,展现产品如何解决用户痛点。
(4)对文档内容进行翻译、注释或解释,协助设计人员更好地理解需求细节。
内容结构化
(1)将图片、表格等非文本内容引用至正文,生成文档框架。
(2)在设计文档中自动标注待完善部分,给出改进建议或待定事项。
(3)检测文档风格与格式是否统一,给出转换建议供修改。
(4)将结构化设计文档自动生成到各类格式文档中,如 Word、PDF 等。
此外,分析设计阶段还可以利用大模型:
(1)检测设计方案创新性及可行性,给出评价建议。
(2)将历史优秀案例自动归纳提取,运用到当前设计中。
开发流水线
资源智能分配
(1)根据历史任务资源使用状况,针对不同类型任务动态设置资源上下限。
(2)根据任务并发情况实时调度任务到不同规模的资源池,聚焦于提高整体利用率。
故障定位
(1)通过对比历史错误日志,识别重要提示词进行分类,快速定位错误原因。
(2)调用相关开源工具分析异常快照,给出反向跟踪步骤以帮助修复。
一键生成
(1)根据用户自然语言自动创建符合用户需求的流水线。
(2)根据代码库结构,结合部门代码库和流水线规范,自动生成流水线。
(3)通过 API 调用底层工具,完成流水线的执行。
此外,开发流水线优化还可以:
(1)在不同阶段进行分支管理与合并。
(2)监控流水线状态并发送实时提醒,追踪任务进度。
(3)支持流水线模板管理和多项目重复应用。
CCA
漏洞自动治理
(1)针对代码漏洞、引入组件、开源合规、安全漏洞等问题提供一站式解决方案。
(2)当前代码存在哪些漏洞/问题,推荐如何治理,无需人工搜索。
组件版本依赖
即当某个组件要升级,AI 推荐建议升级版本和依赖版本,减少人工版本探索时间。
测试管理
测试用例代码生成,即不同粒度的自动化测试用例代码生成,包括函数级、模块级、功能级、API 级、性能级。
自动创建测试环境,即自动创建测试环境、测试执行任务并执行,最后生成测试报告。
自动生成测试文档,包括:
(1)自动创建测试计划。根据接口文档自动创建基准场景和边界条件测试计划。
(2)实例化测试记录。测试通过后自动更新通过率及接口文档,实时反馈测试进度。
版本管理
实现版本发布无人化,包括文档自动生成,和版本发布审批决策智能化。
研发大模型应用平台整体架构和思路
基础模型选择思路
对于基础模型的选择,在参数上有以下一些考虑:
10B 参数级别
这是目前综合性能与部署成本的平衡点。像 10B 左右的微型模型,在保留很强生成能力的同时,参数量相对较小,易于部署和精调。
25B - 50B 参数级别
如果有一定预算,可以选择略大一些的模型,像 GPT-J 25B,具有更全面强大的语言理解和应用能力。若重视研发投入且需要应对更复杂任务,选择 50B 以下大模型也未尝不可。
不宜超过 100B
超过 100B 的天然语言处理大模型,由于其部署和使用成本还不可控,当前尚不宜直接应用于产品。
总体而言,当前 10B - 50B 之间的模型规模是一个比较适宜的选择窗口。它可以满足大多数日常需求,同时考虑到成本和易用性的因素,超过这个范围就需要根据实际应用场景具体权衡。
其次,还需要考虑模型的开源程度。半开源模型信息不对称度高,我们优先选择完全开源的模型,可以推进后续定制和社区研发。
综上所述,对基础模型选择的标准如下:
具备编程领域能力,在编程类模型评估中各类语言得分越高越好(HumanEval/Babelcode 指标)。
考虑模型参数量,参数量过大,会导致精调和部署成本的提升。
在编码能力基础上,最好具备一定中文能力,当然其选择的优先级低于编码能力。
当前主流的基础模型如表 1 所示,最终我们选择 Code LLaMA 作为基础模型。
表 1 主流模型对比
增强预训练
模型选好后,接下来就是对模型进行增强预训练。增强预训练的框架要解决两个问题:资源和速度。我们采用以下优化方式:
对于模型训练,我们可以采用 3D 并行训练的方式来实现。将模型参数和梯度张量划分为多个分区,分配到不同 GPU 卡上进行计算。每张卡负责自己分区的梯度和参数更新工作,间隔时同步到其他卡上。这样可以很好地利用更多计算资源,降低单卡资源需求。
同时,我们还可以采用 Distributed Data Parallel 的方式,将训练数据并行读取和样本处理工作分发到各节点,充分利用多卡资源进一步提升训练速度。对于节省 GPU 资源,我们使用 ZeRO 技术。这个技术通过对静态和动态参数/张量进行精细地分区存储,有效减少显存占用。同时它支持异步参数更新,计算和参数传输可以重叠进行,有效缩短迭代周期。
对于模型训练加速,我们采用 FlashAttention 技术。它通过对注意力操作进行分块并进行融合,如将 QK 乘积和后续运算融成一个算子,可以大幅减少数据传输次数,从而提升计算吞吐。
训练数据组织及语料库建设
训练数据组织
明确训练数据的来源、用途和特点。在组织训练数据前,要了解数据的来源,确认其可靠性和有效性。同时,要明确这些数据将用于哪些任务,并了解其特点,如数据量的大小、数据类型等。
进行数据预处理。预处理是组织训练数据的关键步骤,包括数据清理、去重、变换等。数据清理主要是去除无效、错误或重复的数据;去重则是去除重复的信息,以避免模型过拟合;变换则是对数据进行必要的转换,以便于模型的学习和训练。
合理组织训练数据。首先要将数据进行分类,按照不同的任务需求划分不同的数据集。例如,可以将数据集分为训练集、验证集和测试集,以便于模型的训练和测试。同时,要合理存储数据文件,可以选择常见的存储格式,如 CSV、JSON 等,并确保文件的安全性和完整性。
图 1 训练数据组织及语料库建设架构
语料库建设
语料库是语言学研究的基础,为自然语言处理任务提供丰富的语料信息。建设语料库的目的是为了满足特定语言任务的需求,如文本分类、情感分析、信息提取等。
选择合适的语料库构建方法。常用的语料库构建方法有手工采集、自动化采集和混合采集。手工采集适用于小规模、高质量的语料库建设;自动化采集则可以快速地获取大量语料信息;混合采集则是结合前两种方法的优势,以获得高质量且大规模的语料库。
做好语料库的管理和维护。为了确保语料库的安全性和可靠性,需要对语料库进行科学的管理和维护,这包括文件管理、关键词提取、数据备份等。要建立完善的文件管理制度,对语料库进行合理的分类和存储;同时,要定期对语料库进行关键词提取,以便于检索和使用;此外,还要定期备份语料库数据,以防止数据丢失或损坏。
精调方法选型
接下来,需要对大模型进行精调。针对已经预训练好的研发大模型,在具体应用任务上进行优化和微调,以适应研发领域和应用场景的需求。在精调中,面临的问题包括:
显存占用量超过预训练需求
大模型通常需要大量的显存来存储模型参数和中间状态,而显存的有限性限制了模型的规模。在进行精调时,如果使用的数据量较大或者模型的复杂度较高,显存占用量可能会超过预训练的需求,导致模型训练失败或效率低下。
计算量超过预训练需求(单位数据量)
大模型通常需要大量的计算资源来进行推理和训练,这包括 CPU 核心数、GPU 内存和显存等。在进行精调时,如果使用的数据量较大或者模型复杂度较高,计算量可能会超过预训练的需求(单位数据量),导致模型训练速度变慢或者无法收敛。
此外,大模型精调还可能面临其他问题,如模型复杂度过高导致调参困难、数据量过大导致过拟合风险增加等。因此,在进行大模型精调时,需要根据实际情况进行权衡和优化。
图 2 精调方法选型
精调需要达到降低计算和存储成本、提高泛化能力和轻便性、克服灾难性遗忘的问题、根据不同任务动态地调整额外参数的效果。因此,我们需要在保持预训练模型的大部分参数不变的情况下,只微调少量额外的参数。在资源足够的情况下,也可以选择全量精调(选型可参见图 2)。
研发大模型实践结果
截至 2023 年三季度,我们针对研发场景的大模型在公司内部上线在短短两个月的时间里就取得了显著的效果。用户超过 3000 人,30 日留存率超过 50%,产品成功完成冷启动。在这背后是仅使用了 4 张 A800 卡,这意味着 AI 编程成本完全可以被企业所接受。需要注意的是,AI 编程对人员能力有比较高的要求,需要对员工进行系统性培训,才可能用得更好。
当然,大模型的使用也面临一些挑战,如计算资源需求和数据隐私问题。这些挑战主要来自于大模型庞大的计算规模和对大量个人敏感数据的依赖。经典的大模型需要大量 GPU 资源进行训练与推理,离线部署效率低下;同时由于学习自大量的互联网数据,模型内可能含有用户隐私信息。
因此,未来的研究应重点关注如何利用分布式计算和隐私保护技术等手段,来解决大模型计算资源和数据隐私的问题。例如采用 Model Parallel(模型并行)和 Data Parallel(数据并行)方法降低单机硬件需求,使用关注点机制和微分隐私等隐私算法来保护用户数据等。同时也应探索如何设计支持在线增量学习的大模型架构,有效应对业务需要持续迭代优化模型的需求。只有解决这些建设性的挑战,大模型才能在软件研发深度应用和持续推广。
4 月 25 - 26 日,由 CSDN 和高端 IT 咨询和教育平台 Boolan 联合主办的「全球机器学习技术大会」将在上海环球港凯悦酒店举行,特邀近 50 位技术领袖和行业应用专家,与 1000+ 来自电商、金融、汽车、智能制造、通信、工业互联网、医疗、教育等众多行业的精英参会听众,共同探讨人工智能领域的前沿发展和行业最佳实践。欢迎所有开发者朋友访问官网 http://ml-summit.org 或扫描下方海报中的二维码,进一步了解详情。