Daya Guo*1, Qihao Zhu∗1,2, 杨德建1, 谢振达1, 邓凯1, 张文涛1Guanting Chen1,Xiao Bi 1, Y. Wu 1, 李永凯1, 罗富立1, 邢莹飞2Wenfeng Liang1 1DeepSeek-AI2HCST (PKU) 国家重点实验室,教育部;北京大学,物理学院{zhuqh, guodaya}@deepseek.com https://github.com/deepseek-ai/DeepSeek-Coder 摘要 大型语言模型的快速发展革新了软件开发中的代码智能。然而,封闭源模型的主导地位限制了广泛的研究与开发。为此,我们推出了DeepSeek-Coder系列,这是一系列开源代码模型,规模从1.3B至33B不等,在2万亿个token上进行从头训练。这些模型在高质量项目级代码语料库上进行预训练,并采用带有16K窗口的填空任务来提升代码生成与填充能力。我们广泛的评估表明,DeepSeek-Coder不仅在多个基准测试中实现了开源代码模型的顶尖性能,还超越了现有的封闭源模型如Codex和GPT-3.5。此外,DeepSeek-Coder模型采用宽松许可证,允许进行研究和不受限制的商业使用。 1. 引言 软件开发领域因大型语言模型的迅速发展而发生了显著变革(OpenAI, 2023; Touvron 等人, 2023),这些模型带来了代码智能的新时代。这些模型有潜力自动化并简化编码的许多方面,从错误检测到代码生成,从而提高生产力并降低人为错误的可能性。然而,在该领域面临的主要挑战之一是开源模型(Li 等人, 2023; Nijkamp 等人, 2022; Roziere 等人, 2023; Wang 等人,2021)与闭源模型(Gemini 团队, 2023; OpenAI, 2023)之间的性能差距。强大的巨大型闭源模型因其专有性质,通常对许多研究人员和开发者难以获得。 为应对这一挑战,我们推出了DeepSeek-Coder系列。该系列涵盖了一系列开源代码模型,规模从1.3B到33B不等,包括每个规模的基准版本和指令版本。系列中的每个模型都基于来自87种编程语言的200万亿条令牌从头开始训练,确保了对编程语言和语法的全面理解。此外,我们尝试在代码库级别组织预训练数据,以增强预训练模型对代码库内跨文件上下文的理解能力。除了在预训练过程中采用下一令牌预测损失外,我们还引入了填充中间(Fill-In-Middle, FIM)方法(Bavarian等人,2022年;Li等人,2023年)。该方法旨在进一步增强模型的代码补全能力。为满足处理更长的代码输入的需求,我们将上下文长度扩展至16K。这一调整使我们的模型能够处理更复杂和广泛的编码任务,从而提高其在各种编码场景中的通用性和适用性。 我们使用各种与公共代码相关的基准测试进行了全面的实验。结果表明,在开源模型中,DeepSeek-Coder-Base 33B在所有基准测试中始终表现出卓越的性能。此外,DeepSeek-OpenAI GPT-3.5 TurboCoder-Instruct 33B 超过在大多数评估基准中,OpenAI GPT-4显著缩小了绩效差距之间和开源模型。值得注意的是,与参数量是DeepSeek-Coder-Base 7B五倍的大型模型(如CodeLlama-33B)相比,DeepSeek-Coder-Base 7B尽管参数量较少,却展现了具有竞争力的性能(Roziere等,2023)。总而言之,我们的主要贡献是: • 我们介绍了DeepSeek-Coder-Base和DeepSeek-Coder-Instruct,我们先进的以代码为重点的大型语言模型(LLMs)。这些模型通过在庞大的代码语料库上进行广泛训练而开发,展现出在87种编程语言上理解的专业能力。此外,它们以多种模型规模提供,以满足广泛的计算和应用需求。我们首次尝试在模型开发过程中整合仓库级数据构建。• 我们模型的预训练阶段。我们发现它可以显著提升跨文件代码生成的能力。 • 我们的分析 严格检验了FIM训练策略对代码模型预训练阶段的影响。这些综合研究的成果揭示了FIM配置的有趣方面,为代码预训练模型的改进和发展提供了宝贵的见解。 • 我们对我们的代码LLM在各种涵盖大量代码相关任务的基准上进行了广泛的评估。结果表明,DeepSeek-Coder-Base在这些基准上超越了所有现有的开源代码LLM。此外, 通过使用教学数据进行的细致微调,DeepSeek-Coder-Instruct实现了OpenAI GPT-3.5 Turbo与相比更好的表现在代码相关任务中的模型。 2. 数据收集 DeepSeek-Coder的训练数据集由87%的源代码、10%的英文代码相关自然语言语料库和3%的代码无关中文自然语言语料库组成。英文语料库包括来自GitHub的Markdown和StackExchange的材料。1,这些被用于增强模型对代码相关概念的理解,并提高其处理库使用和错误修复等任务的能力。与此同时,中文语料库由旨在提升模型汉语理解能力的优质文章组成。在本节中,我们将概述构建代码训练数据的过程。该过程涉及数据爬取、基于规则的过滤、依存句法分析、仓库级别去重和质量筛选,如图2所示。在下文中,我们将分步骤描述数据创建流程。 2.1. GitHub数据爬取与过滤 我们收集了2023年2月之前在GitHub上创建的公共仓库,并仅保留表1中列出的87种编程语言。为减少待处理的数据量,我们应用了与StarCoder项目(Li等人,2023)相似的过滤规则,初步筛选出质量较低的代码。通过应用这些过滤规则,数据总量减少至原始规模的32.8%。为使论文自包含,我们简要描述了StarCoder数据项目中使用的过滤规则: 首先,我们过滤掉平均行长度超过100个字符或最大行长度超过1000个字符的文件。此外,我们移除字母字符少于25%的文件。除了XSLT编程语言之外,我们进一步过滤掉文件