2023 年 11 月 11 日,掘金在北京举办了掘力计划第 27 期活动,集结了众多行业专家和学者,共同探讨大模型技术的最新发展和实际应用。北京大学知识计算实验室的谢睿博士作为特邀讲师,为开发者带来了一场关于《CodeShell:本地化轻量化的智能代码助手》的精彩演讲。
谢睿博士毕业于北京大学软件工程国家工程研究中心知识计算实验室(KCL),他的研究主要集中在软件工程与人工智能交叉领域,尤其关注大模型在软件开发中的训练与评估。作为 CodeShell 项目的核心贡献者,他在此次活动中详细介绍了 CodeShell 的创新理念、技术实现及其在实际软件开发中的应用。
本文旨在全面总结谢博士的演讲内容,深入探讨 CodeShell 这一代表性项目如何将大模型技术应用于软件工程领域,以及其对未来软件开发模式可能带来的影响和改变。通过本文,读者将能更加深入地理解大模型技术的实际应用,特别是在高度专业化的软件开发领域中的重要性和潜力。
一、大模型背景简介
谢睿博士的演讲从大模型的发展背景开始。他以一张侯老师论文中的图为例,介绍了大模型的主要分类和发展历程。大模型主要分为三类:encoder-only、decoder-only、以及encoder-decoder。自 Bert 模型发布以来,大模型像雨后春笋般迅速发展,尤其在文本理解和生成方面取得了显著进步。
最初的 Bert 等模型采用的是 encoder-only 模式,这种模式的优势在于能够显著提升文本的语义理解能力,进而提高在下游任务中的性能。然而,由于缺乏 decoder 模块,即文本生成模块,在下游生成任务中的表现一般。因此,在 Bert 的基础上,后续研究逐渐探索了 encoder-decoder 和 decoder-only 模式,以提升模型在文本生成方面的能力。
除了技术架构上的分类,大模型还可以根据训练场景进行分类,主要分为底座模型和微调模型。底座模型通常从零开始,进行冷启动的预训练,而微调模型则在已经训练好的底座大模型的基础上,结合大量领域特定数据,进行热启动训练。微调模型的研究多种多样,包括有监督的奖励模型,以及 OpenAI 提出的基于人类反馈学习的微调方法。
谢博士指出,尽管大模型在预训练语料的加持下获得了强大的能力,但它们并非万能的解决方案。在许多下游任务上,原始的大模型预训练底座模型表现并不理想。例如,在软件工程的各个下游任务中,通过微调的方式可以充分激发大底座大模型的能力,从而显著提高性能。在此背景下,团队面向软件工程的应用场景研制了 CodeShell 系列大模型。
二、CodeShell代码大模型
随后,谢博士深入介绍了 CodeShell 项目。这个项目专注于解决软件工程中的关键问题,例如代码生成和缺陷检测。CodeShell 通过在大量代码相关语料上进行训练,显著提高了模型在软件工程任务中的性能。
CodeShell 模型的构建
CodeShell 项目的重点是改善大模型在软件工程任务上的表现。为此,北京大学知识计算实验室团队开发了CodeShell 底座模型,该模型通过在大量代码相关语料上训练,显示出在各种软件工程任务上的显著性能提升。CodeShell 大模型在多个主流数据集上取得了优异成绩,例如在 humaneval 和 MBPP 数据集上表现突出。谢博士特别强调了 CodeShell 模型在多种编程语言上的优势,即使与规模更大的模型如 Starcoder 15B 相比,CodeShell 在许多语言上也显示出明显的优势。
此外,团队还在 CodeShell 底座模型之上开发了 CodeShell-Chat,一个经过微调的模型,它进一步提升了模型对软件开发具体任务的适应性。
隐私保护和本地化部署
CodeShell 模型特别关注隐私保护问题。大多数现有的大模型服务都是基于云的,这意味着开发者需要将代码和数据上传到云端。为解决这一问题,CodeShell 团队针对团队 GPU、个人 GPU、个人 CPU 三种场景均提供了相应的本地化部署方案,从而更好地保护了用户的隐私。
面向开发者的解决方案
考虑到大多数开发者可能没有足够的大模型应用背景,CodeShell 团队还开发了一系列 IDE 插件作为解决方案,使得广大开发者可以更方便地使用这一工具。这些插件不仅简化了大模型的使用过程,还为开发者在实际工作中提供了实用的辅助功能。
三、CodeShell 预训练与微调
接下来谢博士详细阐述了 CodeShell 代码大模型的预训练和微调过程,这是理解其功能和效果的关键。
预训练的重要性与实现
谢博士强调了预训练在构建 CodeShell 模型中的重要性。在预训练阶段,团队对大量多样化的代码语料库进行学习和训练,旨在将丰富的编程知识和模式融入到大型模型的参数空间中,从而使模型能够有效地理解各种编程语言和场景。这个阶段的成功是建立在高质量、大规模的数据集上的。CodeShell 项目组织通过综合利用来自 GitHub 等平台的开源代码和自建的高质量数据集,创建了一个包含多种编程语言和风格的庞大数据库。
为了提高数据集的质量,团队采取了多种过滤和筛选技术,比如基于 MD5 的过滤、minhash 的文本相似度检测,以及基于深度学习的质量评估方法。这些技术帮助他们去除重复和低质量的代码片段,确保了训练数据集的高质量。
微调的策略与效果
在预训练的基础上,微调是 CodeShell 实现特定功能的关键步骤。谢博士介绍了他们如何利用特定的微调数据集来调整模型,以适应特定的软件工程任务,如代码生成、缺陷检测等。这些微调数据集主要基于实际的软件开发任务和问题构建,目的是使模型能够更好地理解和回应开发者的具体需求。
他还强调了微调过程中的一些挑战,比如如何处理大量的微调数据,以及如何平衡模型的普遍性和特定任务间的专业性。通过持续的实验和调整,团队成功地提升了 CodeShell 在各种软件工程任务中的表现,显著提高了代码生成的准确度和效率。
通过这个深入的预训练和微调过程,CodeShell 能够有效地支持软件开发者,提供高质量的代码建议和解决方案。谢博士的讲解不仅展示了 CodeShell 背后的复杂工作,也体现了大模型在实际应用中的巨大潜力。通过这些技术,CodeShell 成为了一个强大的工具,能够在各种软件开发场景中提供实时的支持和指导。
四、CodeShell代码智能助手
谢博士在演讲中重点介绍了 CodeShell 代码智能助手的创新与应用。CodeShell 智能助手的设计目标是为软件开发者提供一个本地化、轻量化的代码编写和维护工具。这一工具的推出,不仅意味着在代码生成和维护方面的技术进步,还体现了对隐私保护的高度重视。
本地化与隐私保护
在谢博士的讲解中,CodeShell 智能助手的一个重要特点是其本地化能力。这意味着,与传统依赖于云服务的代码助手不同,CodeShell 可以在用户的个人计算机或企业内部网络中运行。这一设计有效缓解了将代码上传到云端可能带来的隐私泄露风险。此外,本地化运行还允许用户根据个人需求定制化使用助手,增强了用户体验的灵活性和个性化。
功能丰富与易于部署
CodeShell 智能助手具备丰富的功能,包括代码生成、缺陷检测、自动编写测试用例等。更为关键的是,谢博士强调了其易于部署的特点。无论是在个人电脑上还是企业服务器中,CodeShell 都提供了简单快捷的部署方式。例如,通过 Docker 容器技术,可以实现一键部署,极大地简化了软件安装和配置过程。
IDE集成与用户体验
为了提高开发者的使用便捷性,CodeShell 智能助手还提供了与主流集成开发环境(IDE)如 Vscode 和 JetBrains 的深度集成。这一集成使得开发者能够在熟悉的开发环境中直接调用 CodeShell 的功能,例如代码补全、智能提示等。谢博士特别提到,为了提升用户体验,他们还考虑了智能助手在实际编码过程中的交互流畅性和响应速度。
五、结论与展望
谢博士对 CodeShell 项目的未来展望表达了乐观态度。他认为,随着技术的不断进步和开发者社区的积极参与,CodeShell 将继续演进,更好地满足软件工程的多样化需求。他特别提到了模型的可定制性和适应性,认为这将是推动模型在各种软件开发环境中广泛应用的关键。此外,他还提到了隐私保护的重要性,强调 CodeShell 在保证数据安全的同时,为开发者提供了强大的工具。
在演讲的结束阶段,谢博士特别强调了 CodeShell 项目与开发社区之间的互动。他指出,开源社区的参与是 CodeShell 成功的关键因素之一。他鼓励开发者参与到项目中来,通过反馈、共享经验和贡献代码来共同推动项目的发展。他还提到了北京大学知识计算实验室将持续支持 CodeShell 项目,并期待与更广泛的社区合作,共同探索大模型在软件工程中的新应用。
六、结语
在这场充满洞见的技术分享中,谢睿博士不仅向我们展示了 CodeShell 项目的深度和广度,还突显了大模型在软件开发和AI领域的潜力与前景。CodeShell 作为一个先进的代码助手,其本地化和轻量化的特性使其在实际应用中更加灵活高效。随着这样的创新技术的不断发展,我们期待在不久的将来见证 CodeShell 在软件工程和人工智能交叉领域中所带来的更多突破。
掘力计划
掘力计划由稀土掘金技术社区发起,致力于打造一个高品质的技术分享和交流的系列品牌。聚集国内外顶尖的技术专家、开发者和实践者,通过线下沙龙、闭门会、公开课等多种形式分享最前沿的技术动态。