DeepSeek-Coder 深度解析:16K 长上下文,代码自己写自己
【免费下载链接】DeepSeek-CoderDeepSeek Coder: Let the Code Write Itself项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder
DeepSeek-Coder 是一套从 2T token 从头训练出来的开源代码语言模型,覆盖 1B 到 33B 共 4 个尺寸,核心卖点是一次能读进 16K token 的上下文,并专门支持项目级代码补全与"代码中间填空"。它跑在普通的 PyTorch + CUDA GPU 环境里,装好依赖、拉起 demo,几分钟就能看到效果。
它想解决什么问题
现有代码补全工具最大的短板,是"看不到整个项目"。传统模型的有效窗口通常只有几千 token,而现实里的编辑动作往往跨文件:新写一个函数要调用utils.py里的工具,补一段逻辑要遵守另一个文件里类的签名。窗口一旦装不下依赖关系,模型只能靠猜,给出的代码编译不过、跑不对。DeepSeek-Coder 的思路很直接:把窗口拉到 16K,再用跨文件的依赖解析重排训练语料,让模型见过"一个项目"而不只是"一个文件"。
技术亮点是怎么做到的 ⚙️
三个技术点,分别对应"读得广、补得准、见得全"。
16K 长上下文。窗口一次装下约 4 万字符,相当于十多个屏幕的源码,接近一个中大型模块的全部代码。好比老师傅改老房子电路之前先把整张图纸铺开看一遍,而不是只盯着眼前那面墙;跨文件调用、全局重构这类操作,模型才不会"断片"。
FIM(fill-in-the-middle)填空训练。代码不只是往后续写的,中间也常常缺一段。FIM 相当于专门练"接龙反着接":把for i in range(1, len(arr)):这样的片段挖成空格,让模型根据前后文把洞填上。README 里的 Code Insertion 示例正是这个机制,用特殊 token 标出待填的洞。
三阶段课程式训练。先看 pictures/model_pretraining.png 这张流程图,训练像上学一样分三步走:
- 代码预训练:4K 窗口、1.8T token,先学会写代码,语料构成 87% 代码、10% 代码相关文本、3% 中文;
- 长上下文预训练:窗口扩到 16K,再用 200B token,学会读长项目;
- 指令微调:2B token,得到能对话的 Instruct 版本。
语料侧同样围绕"项目级"做文章:从 GitHub 抓取后,按文件依赖解析重排顺序、把相互依赖的文件拼成一个样本、再做 repo 级 minhash 去重,最后筛掉语法错误和低可读性代码。相当于把一堆散页按装订顺序拼回整本书再发给模型:
| 能力 | 对应机制 |
|---|---|
| 项目级代码补全 | 16K 窗口,跨文件依赖可见 |
| 代码中间填空(infilling) | FIM 预训练 + 特殊标记 token |
| 对话式代码助手 | 2B token 指令微调 |
| 覆盖 80+ 编程语言 | 训练语料 87% 代码 + 13% 自然语言 |
效果与数据 📊
开源阵营里,33B 版本全面领跑。对比同量级的 CodeLlama-34B,DeepSeek-Coder-Base-33B 在 HumanEval Python、HumanEval 多语言、MBPP、DS-1000 四个基准上分别领先 7.9%、9.3%、10.8% 和 5.9%。
| 基准(pass@1) | CodeLlama-34B | DeepSeek-Coder-Base-33B |
|---|---|---|
| HumanEval Python | 48.2% | 56.1% |
| HumanEval 多语言(8 语言平均) | 41.0% | 50.3% |
| MBPP | 55.0% | 66.0% |
| DS-1000 | 34.3% | 40.2% |
更值得注意的是效率:7B 版本的多语言平均分 44.7%,已追平 34B 的 41.0%,小卡也能跑。指令版同样能打,DeepSeek-Coder-Instruct-33B 的 MBPP 为 70.0%,与 GPT-3.5-turbo 的 70.8% 基本持平,HumanEval Python 单语言得分 79.3%。多语言各语言维度的雷达图如下,外圈即 33B 的得分:
五分钟跑起来
先克隆仓库并装依赖:
git clone https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder cd DeepSeek-Coder pip install -r requirements.txt拉本地聊天 demo(Gradio 界面):
python demo/app.py不想看界面,直接加载模型也行,以 6.7B 补全版为例:
from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-coder-6.7b-base", trust_remote_code=True)四种用法(代码补全、代码插入、对话、仓库级补全)的完整示例见 README.md 的 How to Use 一节。需要微调的话,入口是 finetune/ 下的脚本,支持 DeepSpeed,准备每行含instruction与output两个字段的 JSON 数据即可;所有基准的复现代码放在 Evaluation/,想自己验证上面的表格数字,直接跑那里就行。
16K 长上下文加项目级 FIM 的组合,把"补全工具只在单文件里打转"这个问题基本解决了,代码与模型均允许商用。接下来可以盯着仓库里 33B 指令版和量化生态的更新;有想法欢迎直接在项目仓库提 issue 或提交 PR 一起打磨。
【免费下载链接】DeepSeek-CoderDeepSeek Coder: Let the Code Write Itself项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考