DeepSeek-Coder: When the Large Language Model Meets Programming - The Rise of Code Intelligence

Abstract

大型语言模型的快速发展革新了代码智能在软件开发中的应用。然而,闭源模型的主导地位限制了广泛的研究与开发。为此,我们推出DeepSeek-Coder系列模型——一组包含1.3B到33B参数规模的开源代码大模型,通过从头训练于2万亿token的高质量项目级代码语料库,并采用16K上下文窗口的填充空白预训练任务,显著提升了代码生成与补全能力。大量实验表明,DeepSeek-Coder不仅在多个基准测试中取得了开源代码模型的最优性能,更超越了如Codex和GPT-3.5等闭源模型。此外,DeepSeek-Coder系列采用宽松许可证,允许研究及无限制的商业使用。

image-20250131195207219

Introduction

背景与挑战

  • 大型语言模型(LLMs)正深刻改变软件开发,提升代码智能化水平。
  • 这些模型可用于自动化编码任务,如错误检测和代码生成,提高生产力并减少人为错误。
  • 现存挑战:开源模型 vs. 闭源模型的性能差距(闭源模型通常更强,但受限于专有性,不易获取)。

DeepSeek-Coder 系列概述

  • 提供一系列 开源代码模型,参数规模从 1.3B 到 33B,包括基础版(Base)和指令微调版(Instruct)。
  • 训练数据:2 万亿 tokens,涵盖 87 种编程语言,确保广泛的语言理解能力。
  • 采用 存储库级数据组织,增强模型跨文件代码理解能力。
  • 引入 Fill-In-Middle(FIM)训练,提升代码补全能力。
  • 上下文长度扩展至 16K tokens,支持处理更长的代码输入,提高模型适应性。

实验与评估

  • 采用多种 公开代码基准测试 进行评估。
  • DeepSeek-Coder-Base 33B:在所有开源代码模型中表现最优。
  • DeepSeek-Coder-Instruct 33B:超越 OpenAI GPT-3.5 Turbo,显著缩小开源模型与 GPT-4 之间的性能差距。
  • DeepSeek-Coder-Base 7B:虽参数量较少,但性能可与 CodeLlama-33B(大 5 倍) 竞争。

主要贡献

  • 推出 DeepSeek-Coder-Base 和 DeepSeek-Coder-Instruct,具备 87 种编程语言理解能力,并提供多种规模适配不同需求。
  • 首创存储库级数据构造,增强跨文件代码生成能力。
  • 深入分析 FIM 训练策略,揭示其对代码模型预训练的影响,为优化代码 LLMs 提供有价值的见解。
  • 全面基准测试,结果显示 DeepSeek-Coder-Base 在开源模型中表现最佳,DeepSeek-Coder-Instruct 超越 OpenAI GPT-3.5 Turbo。

Data Collection

  1. 数据组成
    • 87% 源代码
    • 10% 英文代码相关自然语言语料(GitHub Markdown、StackExchange)
      • 增强代码概念理解,提高库使用和错误修复能力。
    • 3% 与代码无关的中文自然语言语料(高质量文章)
      • 提升模型的中文理解能力。
  2. 数据构建流程
    • 数据爬取(Data Crawling)
    • 规则过滤(Rule-based Filtering)
    • 依赖解析(Dependency Parsing)
    • 存储库级去重(Repository-level Deduplication)
    • 质量筛选(Quality Screening)

这一流程确保训练数据的质量和多样性,使模型具备 代码理解、错误修复和跨语言处理能力

image-20250131222143953

2.1. GitHub Data Crawling and Filtering

  1. 数据收集
    • 采集 GitHub 2023年2月前 创建的 87 种编程语言公共存储库
  2. 数据过滤规则(借鉴 StarCoder 项目)
    • 减少低质量代码,最终数据量缩减至原始规模的 **32.8%**。
    • 行长限制:
      • 平均行长 > 100 字符 或 最大行长 > 1000 字符 → 过滤
    • 字符比例:
      • 非字母字符占比 > 75%过滤
    • XML 相关规则:
      • XSLT 语言外,若文件前 100 个字符中包含 <?xml version=过滤
    • HTML 文件:
      • 可见文本占比 ≥ 20% 且不低于 100 字符保留
    • JSON / YAML 文件:
      • 字符数 50 ~ 5000保留(去除大部分数据型文件)。

该过滤策略有效 提升数据质量,减少 冗余和低效代码,为模型训练提供更高质量的数据集。

2.2. Dependency Parsing

  1. 问题与挑战
    • 现有代码 LLM 主要在 文件级 进行预训练,忽略 了项目中 文件间的依赖关系
    • 这种方法在 处理整个项目级代码时 效果欠佳,难以捕捉实际的代码组织结构。
  2. 方法
    • 解析项目内部文件依赖关系,确保代码上下文按照 依赖顺序 组织输入。
    • 提高数据集的现实性和实用性,增强模型对 项目级代码的处理能力
  3. 依赖解析步骤
    • 识别文件间调用关系(基于正则匹配):
      • Python:import
      • C#:using
      • C:#include
    • 构建依赖图(Graph):
      • 使用 邻接表(graphs) 记录依赖关系。
      • 维护 入度字典(inDegree) 统计每个文件的依赖数量。
    • 拓扑排序(Topological Sort):
      • 处理 子图,按最小入度顺序排列文件,确保顺序合理。
      • 解决 循环依赖 问题(不同于标准拓扑排序)。
    • 数据组织:
      • 按照依赖顺序 连接文件形成训练样本。
      • 在每个文件开头 添加 文件路径注释,保留路径信息。

优势

增强模型对跨文件代码的理解能力
优化代码组织顺序,使训练数据更符合实际开发习惯
提升项目级代码生成与补全能力

image-20250131222419545

2.3. Repo-Level Deduplication

背景与必要性

  • 研究表明,去重显著提升 LLM 训练效果
  • 传统方法主要在 文件级 去重,但可能破坏存储库的整体结构。

方法

  • 采用近似去重(Near-Deduplication),删除长重复子串,优化训练数据质量。
  • 与以往不同之处:去重在 存储库级 进行,而非文件级
  • 具体操作:
    • 整个存储库代码拼接为单一样本
    • 应用去重算法,确保 存储库结构完整,避免误删关键文件。

优势
减少冗余,提高模型训练效率
避免文件级去重带来的结构破坏
优化代码 LLM 在基准测试中的表现

image-20250131222841872

2.4. Quality Screening and Decontamination

  1. 质量筛选(Quality Screening)
    • 在 2.1 过滤规则 基础上,额外 采用以下方法提高数据质量:
      • 编译器检测:剔除 语法错误 代码。
      • 质量模型评估:过滤 可读性差、模块化低 的代码。
      • 启发式规则(Heuristic Rules):进一步剔除低质量数据。
    • 数据统计(Table 1):
      • 87 种编程语言,总数据量 798GB,文件数 6.03 亿
  2. 去污染(Decontamination)
    • 防止测试集泄露(避免训练数据中包含评测集的代码)。
    • 采用 n-gram 过滤,剔除可能泄露的代码段:
      • 匹配 10-gram 及以上 → 直接删除。
      • 匹配 3-gram ~ 10-gram → 使用精确匹配剔除。
    • 过滤的数据来源(测试集):
      • HumanEval(Chen et al., 2021)
      • MBPP(Austin et al., 2021)
      • GSM8K(Cobbe et al., 2021)
      • MATH(Hendrycks et al., 2021)

优势

剔除低质量代码,提高模型训练数据质量
防止测试集污染,确保评测结果可靠性
提升代码 LLM 的泛化能力

Training Policy

3.1. Training Strategy

3.1.1 下一个 Token 预测(Next Token Prediction)

  • 目标:训练模型预测下一个 token,增强代码理解和生成能力。
  • 方法:将多个文件拼接成固定长度输入,模型学习基于上下文的 token 预测能力。

3.1.2 填空式训练(Fill-in-the-Middle, FIM)

  • 必要性:仅依赖下一个 token 预测难以处理 代码插入任务,因此引入 FIM 方法。
  • 方法:将文本随机拆分为三部分,打乱顺序,并用特殊 token 连接,以模拟代码补全场景。
  • FIM 模式:
    • PSM(Prefix-Suffix-Middle):前缀 + 后缀 + 中间部分
    • SPM(Suffix-Prefix-Middle):后缀 + 前缀 + 中间部分
  • 实验:
    • 使用 DeepSeek-Coder-Base 1.3B 进行测试,采用 HumanEval-FIM 基准测试(FIM 单行预测任务)。
    • 评估 不同 FIM 率(0%、50%、100%) 以及 Masked Span Prediction(MSP) 方法的影响。

实验结果与优化策略

  • 100% FIM 率最强 FIM 性能,但代码补全能力最弱,表明两者存在权衡关系
  • 50% PSM 率 > MSP,最终选定 50% PSM 率 作为最佳训练策略。
  • 实现细节:
    • 引入 三种特殊标记(sentinel tokens)。
    • 在数据打包前,先执行 文档级 FIM 处理,确保 FIM 任务的有效性。

优势

增强模型代码补全能力,适应不同结构的代码填充任务
优化 FIM 训练策略,兼顾插入预测和代码生成能力
使用特殊 token 提高模型对 FIM 任务的适应性

DeepSeek-Coder 训练过程示例

DeepSeek-Coder 的训练主要基于 无监督学习(Unsupervised Learning),因为它使用 大规模未标注的代码数据 进行训练,而不依赖人工标注的数据。主要训练方法包括:

  1. 自回归训练(Autoregressive Training)Next Token Prediction(NTP)
  2. 填空式训练(Fill-in-the-Middle,FIM)代码插入任务

训练示例:Next Token Prediction(NTP)

目标

训练模型在给定上下文的情况下预测下一个 token,类似 GPT 语言模型的训练方式。

示例数据(Python 代码片段)

1
2
def add(a, b):
return a +

模型训练步骤

  1. 输入:
    • 模型接收 "def add(a, b): return a + " 作为输入。
  2. 目标(Ground Truth):
    • 期望模型预测 下一个 tokenb
  3. 训练方式:
    • 计算模型输出 P(b | "def add(a, b): return a +") 的概率,并与实际 token b 对比,计算损失(如交叉熵)。
    • 通过 梯度下降 进行权重更新,使模型在类似场景下预测更准确。

训练示例:Fill-in-the-Middle(FIM)

目标

让模型能够补全缺失的代码片段,而不仅仅是从左到右地预测下一个 token。

示例数据(Python 代码片段)

原始代码

1
2
def add(a, b):
return a + b

FIM 处理后(PSM 模式)

1
<|fim_start|>def add(a, b):<|fim_hole|>return a + b<|fim_end|>

模型训练步骤

  1. 输入:
    • 模型接收 "def add(a, b):"(前缀 Prefix)和 "return a + b"(后缀 Suffix)。
  2. 目标(Ground Truth):
    • 期望模型预测缺失的部分,即 return a + b(中间部分 Middle)。
  3. 训练方式:
    • 计算 P("return a + b" | "def add(a, b):") 并优化模型参数,提高 FIM 任务的准确性。

训练方式总结

训练方法 目标 训练方式
Next Token Prediction (NTP) 预测下一个 token 传统自回归训练,适用于代码生成
Fill-in-the-Middle (FIM) 预测中间缺失代码 代码重组,适用于代码补全任务

DeepSeek-Coder 结合 NTP + FIM 训练,使模型既能 生成完整代码,又能 插入代码补全,从而更适用于实际编程场景。

image-20250131223642713

颜色与线型

  1. **绿色 (fim_0)**:仅使用 Next Token Prediction(无 FIM 目标)。
  2. **红色 (fim_0.5)**:50% 的训练任务为 FIM,其余为 Next Token Prediction。
  3. **蓝色 (fim_1.0)**:100% 的训练任务为 FIM。
  4. **青色 (msp_0.5)**:50% 的训练任务使用 MSP(Masked Span Prediction)。

MSP 更侧重于在原始文本中随机掩蔽出多个片段,并让模型通过上下文来恢复这些片段。

MSP(Masked Span Prediction)与 FIM(Fill-in-the-Middle)的主要区别

特点 MSP(Masked Span Prediction) FIM(Fill-in-the-Middle)
任务目标 在文本或代码中随机掩蔽多个片段,预测这些片段的内容。 将文本拆分为前缀、后缀和中间部分,预测中间部分。
掩蔽方式 随机掩蔽多个位置,可能是单词、代码片段或连续段落。 有结构性:固定预测中间部分,前缀和后缀作为上下文。
灵活性 较灵活,适合广泛场景,但结构性较弱。 更适合代码场景,能更好模拟真实的代码插入任务。
上下文结构 上下文可以是分散的、随机的。 上下文由固定的前缀和后缀组成,更强调语义和语法连续性。

示例比较

1. MSP 示例

原始代码:

1
2
3
def add(a, b):
result = a + b
return result

MSP 处理后:

1
2
3
def add(a, b):
[MASK]
return result

模型任务:预测 [MASK] 的内容,即 result = a + b

特点:掩蔽的是代码中的某一部分,可能是变量声明、函数调用或其他内容。

2. FIM 示例

原始代码:

1
2
3
def add(a, b):
result = a + b
return result

FIM(PSM 模式)处理后:

1
<|fim_start|>def add(a, b):<|fim_hole|>return result<|fim_end|>

模型任务:预测 <|fim_hole|> 的内容,即 result = a + b

特点:上下文明确分为 前缀(Prefix)后缀(Suffix),模型需要根据两者预测中间部分。

模型任务:预测 <|fim_hole|> 的内容,即 result = a + b

特点:上下文明确分为 前缀(Prefix)后缀(Suffix),模型需要根据两者预测中间部分。

总结

  • MSP 更通用,适合广泛场景,但在代码生成中可能不够高效。
  • FIM 设计更针对代码插入和补全任务,能更好地捕捉代码的上下文依赖关系。
  • 两者可以结合使用,根据任务需求调整比例,达到最优效果。

3.2. Tokenizer

  1. 工具
    • 使用 HuggingFace Tokenizer 库 进行分词训练。
  2. 方法
    • 采用 Byte Pair Encoding (BPE) 分词算法(参考 Sennrich et al., 2015)。
    • 基于训练语料的子集进行分词模型的训练。
  3. 结果
    • 最终配置的 词汇表大小(Vocabulary Size)为 32,000

总结

BPE 分词方法结合了高效性与灵活性,适合处理代码和自然语言的混合语料,同时能够支持高效的模型训练和推理。

3.3. Model Architecture

  1. 模型范围
    • 提供多种模型,参数分别为 1.3B、6.7B 和 33B,满足不同应用需求。
  2. 架构框架
    • 所有模型均基于 DeepSeek Large Language Model (LLM) 框架,采用 Decoder-only Transformer 架构。
  3. 技术细节
    • **Rotary Position Embedding (RoPE)**:增强模型的位置信息表示(参考 Su et al., 2023)。
    • **Grouped-Query-Attention (GQA)**:在 DeepSeek 33B 模型中使用,组大小为 8,提升训练与推理效率。
    • FlashAttention v2:加速注意力机制的计算(参考 Dao, 2023)。

总结

DeepSeek-Coder 模型采用先进的架构设计与优化技术,旨在提升训练和推理效率,适应不同规模的应用需求。

3.4. Optimization

  1. 优化器
    • 使用 AdamW 优化器(Loshchilov 和 Hutter, 2019),设置 𝛽1 = 0.9𝛽2 = 0.95
  2. 批大小与学习率调整
    • 根据 DeepSeek LLM缩放法则 调整批大小和学习率。
  3. 学习率调度
    • 实现 三阶段学习率调度策略:
      • 包括 2000 步的预热阶段
      • 最终学习率设置为初始学习率的 **10%**。
      • 每个阶段的学习率按 √1/10 缩小,遵循 DeepSeek LLM 指导原则。

总结

采用 AdamW 优化器和三阶段学习率调整策略,以优化训练过程并提高模型性能。

3.5. Environments

  1. 实验框架
    • 使用 HAI-LLM 框架(High-Flyer, 2023),该框架以高效和轻量化的方式训练大型语言模型。
  2. 并行化策略
    • 采用多种 并行化策略来优化计算效率:
      • Tensor Parallelism(Korthikanti et al., 2023)。
      • ZeRO 数据并行性(Rajbhandari et al., 2020)。
      • PipeDream 流水线并行性(Narayanan et al., 2019)。
  3. 硬件配置
    • 实验使用 NVIDIA A100 和 H800 GPUs 集群。
    • A100 集群:每个节点配置 8 个 GPU,通过 NVLink 桥接连接。
    • H800 集群:类似配置,每个节点也有 8 个 GPU,通过 NVLink 和 NVSwitch 技术互联,确保节点内数据传输高效。
    • 为确保 节点间高效通信,采用 InfiniBand 互连技术,提供高吞吐量和低延迟。

总结

使用高效的 HAI-LLM 框架 和先进的并行化策略,结合强大的 NVIDIA GPU 集群InfiniBand 网络,为大规模语言模型的训练提供了可靠的计算基础设施。

image-20250131233552505

3.6. Long Context

  1. 目标
    • 提升 DeepSeek-Coder 处理长上下文的能力,特别是用于存储库级代码处理场景。
  2. 方法
    • 调整 RoPE 参数(Su et al., 2023):
      • 缩放因子(Scaling Factor):从 1 增加到 4。
      • 基频(Base Frequency):从 10,000 调整为 100,000。
    • 训练设置:
      • 额外进行 1000 步训练,批大小为 512,序列长度扩展至 16K tokens
      • 学习率与预训练最终阶段一致。
  3. 理论与实验结果
    • 理论上支持处理 64K tokens 的上下文。
    • 实验表明,模型在 16K tokens 范围内 输出最可靠。
  4. 未来工作
    • 进一步优化和评估长上下文适配方法,以提升模型在扩展上下文中的效率和实用性。

总结

通过调整 RoPE 参数和扩展训练,DeepSeek-Coder 具备处理长上下文的能力,尤其在 16K tokens 范围内表现最佳,为复杂代码场景提供了更强的支持。

3.7. Instruction Tuning

目标

  • 基于 DeepSeek-Coder-Base 进行指令微调,开发 DeepSeek-Coder-Instruct,提升模型对指令的理解和响应能力。

数据与格式

  • 使用高质量数据进行微调,数据由 Alpaca Instruction 格式(Taori et al., 2023)组织。
  • 每轮对话以特殊分隔符 <|EOT|> 标记结束,确保多轮对话结构清晰。

训练设置

  • 学习率:初始值为 1e-5,采用 余弦调度策略,包含 100 步预热阶段
  • 批大小:4M tokens,每轮训练使用 2B tokens

image-20250201083942459

Experimental Results

评估任务

DeepSeek-Coder 在以下四个任务上进行评估:

  1. 代码生成 (§4.1)
  2. FIM(填空式代码补全) (§4.2)
  3. 跨文件代码补全 (§4.3)
  4. 基于程序的数学推理 (§4.4)

对比模型

  1. CodeGeeX2
    • 多语言代码生成模型的第二代版本,基于 ChatGLM2 架构开发。
    • 使用大量代码示例数据增强性能。
  2. StarCoder
    • 参数量 150 亿 的开源模型,训练于 Stack 数据集 的精心挑选子集。
    • 覆盖 86 种编程语言,擅长多种代码任务。
  3. CodeLlama
    • 基于 LLaMA2 的代码模型系列,参数规模分别为 7B、13B 和 34B
    • 训练数据包含 5000 亿 tokens 的代码语料,针对代码任务优化。
  4. code-cushman-001
    • OpenAI 开发的 120 亿参数模型,为 Github Copilot 的初始版本。
  5. GPT-3.5 和 GPT-4
    • 虽非专门为代码生成设计,但凭借其大规模参数展现出显著的代码生成能力。

4.1. Code Generation

评测基准(Benchmarks)

  1. HumanEval & MBPP
    • HumanEval:164 道手写 Python 题目,零样本(zero-shot)评估。
    • MBPP:500 道编程题,少样本(few-shot)评估。
    • 多语言扩展:将 HumanEval 任务扩展到 C++、Java、PHP、TypeScript、C#、Bash、JavaScript 等 7 种语言。
    • 结果(Table 3):
      • **DeepSeek-Coder-Base 在 HumanEval 上达 50.3%,MBPP 上达 66.0%**,均为 SOTA(最优)性能
      • 相较 CodeLlama-Base 34B,分别提升 **9% 和 11%**。
      • DeepSeek-Coder-Base 6.7B 甚至超过 CodeLlama-Base 34B
      • 指令微调后,DeepSeek-Coder-Instruct 超越 GPT-3.5-Turbo,显著缩小了开源模型与 GPT-4 之间的性能差距。
  2. DS-1000(数据科学代码生成)
    • 问题:HumanEval & MBPP 过于基础,缺乏对真实数据科学任务的代表性。
    • DS-1000:包含 Matplotlib、NumPy、Pandas、SciPy、Scikit-Learn、PyTorch、TensorFlow 七大库的 1000 个任务。
    • 结果(Table 4):
      • DeepSeek-Coder 在所有库上均取得较高准确率,证明其在 真实数据科学任务 中的代码生成能力。
  3. LeetCode Contest(编程竞赛题目)
    • 数据来源:
      • 收集 2023 年 7 月至 2024 年 1 月 LeetCode 竞赛中的 180 道最新题目,避免数据污染。
      • 每题包含 100 个测试用例 以确保覆盖度。
    • 结果(Table 5):
      • DeepSeek-Coder-Instruct 6.7B / 33B 的 **Pass@1 分别为 19.4% 和 27.8%**,超越所有现有开源模型(如 CodeLlama-33B)。
      • DeepSeek-Coder-Instruct 33B 是唯一超过 OpenAI GPT-3.5-Turbo 的开源模型,但与 GPT-4-Turbo 仍有较大差距。

优化策略:Chain-of-Thought(CoT)

  • 通过 CoT(思维链)提示(要求模型先写逻辑步骤,再写代码),可显著提升模型在复杂任务中的表现
  • 推荐使用 CoT 促进更系统的方法,提高代码生成的 逻辑性和准确性

数据污染问题

  • 可能存在数据污染风险,因 GPT-4-Turbo 和 DeepSeek-Coder 在 2023 年 7-8 月 LeetCode 竞赛中的表现异常优秀
  • 研究社区应关注此问题,在未来评估中谨慎处理。

总结

DeepSeek-Coder-Base 领先所有开源模型,并在 HumanEval & MBPP 上实现 SOTA 结果。
DeepSeek-Coder-Instruct 33B 超越 GPT-3.5-Turbo,在 LeetCode Contest 上表现最佳
使用 CoT 提示可进一步提升复杂编程任务的代码生成质量
尽管尽力避免数据污染,仍建议未来评估时审慎对待数据来源

image-20250201084508266

image-20250201084521367

image-20250201084537719

4.2. Fill-in-the-Middle Code Completion

FIM 训练策略

  • DeepSeek-Coder 采用 0.5 FIM 率进行预训练,增强模型根据 前缀(prefix)和后缀(suffix) 预测中间代码的能力。
  • 这一策略对 代码补全工具 尤为重要,使模型能更精准地完成代码片段。

对比模型

  • SantaCoder(Allal et al., 2023)
  • StarCoder(Li et al., 2023)
  • CodeLlama(Roziere et al., 2023)
  • 以上模型均为 主流开源代码补全模型,在 FIM 任务上具有较强能力。

评估基准

  • 采用 Single-Line Infilling 基准测试(Allal et al., 2023)。
  • 测试 多种编程语言,使用 行级精确匹配准确率(Exact Match Accuracy) 作为评测指标。

评估结果(Table 6)

  • DeepSeek-Coder-1.3B 超越更大规模的 StarCoder 和 CodeLlama,表现最佳。
  • 主要优势来源于高质量的预训练数据
  • 模型规模与补全性能呈正相关,即 模型越大,性能越好
  • 推荐使用 DeepSeek-Coder-Base 6.7B,因其 在效率与准确性之间达到最佳平衡,适合集成到代码补全工具中。

总结

DeepSeek-Coder 在 FIM 任务中超越更大规模的开源模型,表现卓越。
FIM 训练策略有效提升代码补全能力,适用于代码编辑器等工具。
建议使用 DeepSeek-Coder-Base 6.7B 以兼顾性能与效率。

image-20250201084816161

4.3. Cross-File Code Completion

任务特点

  • 不同于代码生成任务,跨文件代码补全要求模型理解跨多个文件的依赖关系
  • 评估基准:采用 CrossCodeEval(Ding et al., 2023) 数据集,该数据集涵盖 Python、Java、TypeScript、C# 四种语言,并严格要求跨文件上下文以进行准确补全。

数据集特点

  • 数据来源:真实世界的开源代码库,许可开放。
  • 时间筛选:数据集来自 2023 年 3 月 - 6 月 创建的代码,而 DeepSeek-Coder 的训练数据截至 2023 年 2 月,避免了数据泄露的可能性。

评估设置

  • 最大序列长度:2048 tokens
  • 最大输出长度:50 tokens
  • 跨文件上下文长度:512 tokens(基于 BM25 搜索结果 选取相关文件)
  • 评测指标:
    • Exact Match(精确匹配率)
    • Edit Similarity(编辑相似度)

评估结果(Table 7)

  • DeepSeek-Coder 在所有语言上均优于其他开源模型,表现最优。
  • 取消存储库级预训练(w/o Repo Pre-training)后,Java、TypeScript、C# 语言的性能下降,说明存储库级预训练的有效性

总结

DeepSeek-Coder 在跨文件代码补全任务中表现最佳,优于其他开源模型。
存储库级预训练显著提升了跨文件代码理解和补全能力。
该能力适用于真实软件开发场景,提高代码编辑器和 IDE 的智能补全质量。

image-20250201085024934

4.4. Program-based Math Reasoning

任务特点

  • 评估模型 通过编程解决数学问题的能力,对 数据分析、科学计算 领域至关重要。
  • 采用 Program-Aided Math Reasoning (PAL) 方法(Gao et al., 2023),要求模型 交替使用自然语言描述解题步骤,并用代码执行计算

评测基准(Benchmarks)

涵盖 7 大数学推理数据集:

  1. GSM8K(Cobbe et al., 2021)
  2. MATH(Hendrycks et al., 2021)
  3. GSM-Hard(Gao et al., 2023)
  4. SVAMP(Patel et al., 2021)
  5. TabMWP(Lu et al., 2022)
  6. ASDiv(Miao et al., 2020)
  7. MAWPS(Gou et al., 2023)

评估结果(Table 8)

  • DeepSeek-Coder 全系列模型在所有基准测试中均表现优异
  • DeepSeek-Coder-33B 版本表现尤为突出,展示了其在 复杂数学计算和问题求解 任务中的潜力。

总结

DeepSeek-Coder 在数学推理任务中表现优越,尤其在复杂数学计算场景中展现出巨大潜力。
PAL 方法结合自然语言和代码执行,提高了数学问题求解能力。
DeepSeek-Coder-33B 适用于数据分析、科学计算等高精度计算任务。

image-20250201090318881

Continue Pre-Training From General LLM

改进点

  • 基于 DeepSeek-LLM-7B Base 进行额外预训练,处理 2 万亿 tokens 以增强 自然语言理解数学推理能力
  • 不同于 DeepSeek-Coder,新版本 仅使用 Next Token Prediction 目标,并将 上下文长度设为 4K tokens

评估对比

  • 采用 DeepSeek-Coder-v1.5 7B vs. DeepSeek-Coder 6.7B 进行公平对比,重新运行所有基准测试。
  • 评估任务分为 三大类:
    1. 编程(Programming):
      • HumanEval(多语言代码生成)
      • MBPP(Python 代码任务)
    2. 数学推理(Math Reasoning):
      • GSM8K(基础数学推理)
      • MATH(复杂数学推理)
    3. 自然语言理解(Natural Language):
      • MMLU(通识知识)
      • BBH(大规模推理任务)
      • HellaSwag(常识推理)
      • Winogrande(指代消解)
      • ARC-Challenge(科学推理)

评估结果(Table 10)

  • DeepSeek-Coder-Base-v1.5 代码性能略有下降,但在 数学推理和自然语言任务 上显著优于原始 DeepSeek-Coder-Base。
  • 改进重点:增强了 数学推理(Math Reasoning)和 NLP 能力,适用于更广泛的任务。

总结

DeepSeek-Coder-v1.5 7B 在数学推理和自然语言理解任务上大幅超越前代模型
尽管代码性能略有下降,但整体智能水平提升,适用于更复杂的推理任务
扩展上下文窗口至 4K tokens,提高模型对长文本和复杂任务的处理能力

Conclusion

  1. DeepSeek-Coder 系列概述
    • 包含 1.3B、6.7B、33B 三种规模的 代码专用 LLM
    • 采用 项目级代码语料 进行训练,并使用 填空式(Fill-in-the-Middle, FIM) 预训练目标,增强代码补全能力。
    • 上下文窗口扩展至 16,384 tokens,提升长代码处理能力。
  2. 模型性能
    • DeepSeek-Coder-Base 33B 超越所有现有开源代码模型,在多项标准测试中表现最佳。
    • DeepSeek-Coder-Base 6.7B 规模虽小,但性能接近 CodeLlama-34B,证明预训练数据质量的重要性。
  3. 指令微调(Instruction Tuning)
    • 通过高质量指令数据进行微调,推出 DeepSeek-Coder-Instruct 33B
    • 超越 OpenAI GPT-3.5 Turbo,在多个代码相关任务中展现卓越能力。
  4. DeepSeek-Coder-v1.5 版本
    • DeepSeek-LLM 7B 基础上 额外预训练,处理 200 亿 tokens(包含自然语言、代码、数学数据)。
    • 增强自然语言理解能力,同时保持高水平代码性能,验证了强大的代码 LLM 需要构建在通用 LLM 之上
  5. 未来展望
    • 计划基于 更大规模的通用 LLM 开发更强大的 开源代码专用模型
    • 目标是持续推动代码 LLM 的发展,并开放更多先进模型

总结

DeepSeek-Coder 具备强大的代码补全、生成和理解能力,超越多款现有开源模型
DeepSeek-Coder-Instruct 33B 在指令任务上优于 GPT-3.5 Turbo,提升代码智能交互能力
DeepSeek-Coder-v1.5 兼顾代码性能与自然语言理解,验证了通用 LLM 作为代码 LLM 基础的有效性
未来将开发更大规模、更强大的开源代码 LLM,推动代码智能化发展