认识Yi-Coder:一个虽小但强大的代码LLM
引言
Yi-Coder 是一系列开源代码大型语言模型 (LLM),参数不足 100 亿,却能提供最先进的编码性能。
Yi-Coder 提供 1.5B 和 9B 两种尺寸,并有基础版和聊天版,专为高效推理和灵活训练而设计。值得注意的是,Yi-Coder-9B 在 Yi-9B 的基础上,额外增加了 2.4T 的高质量令牌,这些令牌经过精心筛选,来源于 GitHub 上的仓库级代码语料库和 CommonCrawl 中过滤的代码相关数据。
Yi-Coder 的主要特点包括
在 2.4 万亿高质量令牌上进行持续预训练,涵盖 52 种主要编程语言。
长上下文建模:最大上下文窗口为 128K 令牌,能够实现项目级代码理解和生成。
小而强大:Yi-Coder-9B 优于其他参数不足 100 亿的模型,例如 CodeQwen1.5 7B 和 CodeGeex4 9B,甚至达到与 DeepSeek-Coder 33B 相媲美的性能。
这个演示想法的灵感来自:https://github.com/nutlope/llamacoder
Yi-Coder 提供令人印象深刻的编码性能
LiveCodeBench
LiveCodeBench 是一个公开平台,旨在为 LLM 提供全面、公平的竞争性编程评估。它实时从 LeetCode、AtCoder 和 CodeForces 等竞争性平台收集新问题,形成一个动态且全面的基准库。为确保数据无污染,鉴于 Yi-Coder 的训练数据截止日期为 2023 年底,我们选择了 2024 年 1 月至 9 月的问题进行测试。
如下图所示,Yi-Coder-9B-Chat 实现了令人印象深刻的 23.4% 通过率,使其成为唯一一个参数小于 10B 且通过率超过 20% 的模型。这一性能超越了
- DeepSeek-Coder-33B-Instruct(简称 DS-Coder),通过率为 22.3%
- CodeGeex4-All-9B,通过率为 17.8%
- CodeLLama-34B-Instruct,通过率为 13.3%
- CodeQwen1.5-7B-Chat,通过率为 12%
HumanEval、MBPP 和 CRUXEval-O
除了竞赛级别的评估,我们还选择了 HumanEval、MBPP 和 CRUXEval-O 等流行基准来评估模型的代码生成和推理能力。下图所示的评估结果表明,Yi-Coder 在这三项任务中取得了出色的表现。具体而言,Yi-Coder-9B-Chat 在 HumanEval 上达到了 85.4% 的通过率,在 MBPP 上达到了 73.8% 的通过率,超越了其他代码 LLM。此外,Yi-Coder 9B 成为第一个在 CRUXEval-O 上准确率超过 50% 的开源代码 LLM。
Yi-Coder 在代码编辑和补全方面表现出色
CodeEditorBench
为了评估 Yi-Coder 在代码修改任务中的熟练程度,我们使用了 CodeEditorBench,涵盖了四个关键领域:调试、翻译、语言切换和代码优化。如下图所示,Yi-Coder-9B 在开源代码 LLM 中取得了令人印象深刻的平均胜率,在主要子集和附加子集中始终优于 DeepSeek-Coder-33B-Instruct 和 CodeQwen1.5-7B-Chat。
Aider LLM 排行榜
Aider 的代码编辑基准评估 LLM 修改 Python 源文件的能力,涵盖来自 Exercism 的 133 个编码练习。此评估不仅测试模型生成新代码的能力,还确定其将代码无缝集成到现有代码库中的熟练程度。此外,模型必须自主应用所有更改,无需在过程中进行任何人工指导。
模型发布后,Yi-Coder-9B-Chat 成功完成了 54.1% 的练习,介于 Qwen2-72B Instruct (55.6%) 和 codestral-2405 (51.1%) 之间,大大优于同等规模的模型,例如 LLama-3.1-8B-Instruct (37.6%) 和 CodeQwen1.5-7B-Chat (34.6%)。
CrossCodeEval
在代码补全方面,这是现代人工智能驱动的 IDE 工具中的关键用例,Yi-Coder 也表现出色。与代码生成不同,跨文件代码补全要求模型访问和理解跨多个文件以及众多跨文件依赖关系的仓库。我们针对两种不同场景(检索相关上下文和不检索)对 CrossCodeEval 基准进行了评估。
下表中的结果显示,在 Python 和 Java 数据集的检索和非检索场景中,Yi-Coder 均优于同等规模的其他模型。这一成功验证了在具有较长上下文长度的软件仓库级代码语料库上进行训练,使 Yi-Coder 能够有效捕获长期依赖关系,从而为其卓越的性能做出贡献。
Yi-Coder 能够建模 128K 长上下文
代码中的针
为了测试 Yi-Coder 的长上下文建模能力,我们创建了一个名为“代码中的针”的合成任务,其序列长度为 128K,是 CodeQwen1.5 评估中使用的 64K 序列长度的两倍。在此任务中,一个简单的自定义函数被随机插入到一段长代码库中,然后测试模型是否能在代码库末尾重现该函数。此评估旨在评估 LLM 是否能够从长上下文中提取关键信息,从而反映其理解长序列的基本能力。
下图中全绿色的结果表明 Yi-Coder-9B 在 128K 长度范围内完美地完成了此任务。
Yi-Coder 在数学推理方面表现出色
程序辅助数学推理
之前对 DeepSeek-Coder 的研究表明,强大的编码能力可以通过编程解决问题来增强数学推理。受此启发,我们在程序辅助设置(即 PAL:程序辅助语言模型)下,在 7 个数学推理基准上评估了 Yi-Coder。在每个基准中,模型被要求生成一个 Python 程序,然后通过执行该程序返回最终答案。
下图所示的平均准确率得分表明,Yi-Coder-9B 取得了令人瞩目的 70.3% 准确率,超越了 DeepSeek-Coder-33B 的 65.8%。
结论
我们已经开源了 Yi-Coder 1.5B/9B,并向社区提供了基础版和聊天版。尽管 Yi-Coder 尺寸相对较小,但在各种任务中展现出卓越的性能,包括基础和竞争性编程、代码编辑和仓库级补全、长上下文理解以及数学推理。我们相信 Yi-Coder 可以突破小型代码 LLM 的边界,解锁能够加速和改变软件开发的用例。
Yi-Coder 系列模型是 Yi 开源家族的一部分。要了解更多关于如何使用 Transformers、Ollama、vLLM 和其他框架使用 Yi-Coder 的信息,请参阅 Yi-Coder README。
我们鼓励开发者探索这些资源,并将 Yi-Coder 集成到他们的项目中,亲身体验其强大的功能。欢迎加入我们的 Discord 群组或发送电子邮件至 yi@01.ai 进行任何咨询或讨论。
祝好,
来自 01.AI 的 DevRel
引用
@misc{yicoder,
title = {Meet Yi-Coder: A Small but Mighty LLM for Code},
url = {https://01-ai.github.io/blog.html?post=en/2024-09-05-A-Small-but-Mighty-LLM-for-Code.md},
author = {01.AI},
month = {September},
year = {2024}
}