BigCodeBench:用于复杂 Python 代码生成的新基准
Hugging Face 已推出 BigCodeBench,这是一项新基准,旨在通过关注复杂的真实任务来评估大语言模型(LLM)的实用编程能力。与之前的基准(如 HumanEval)常依赖简单的算法片段不同,BigCodeBench 要求模型在 139 个不同库中组合多个函数调用,以解决面向用户的问题。
解决现有基准的局限性
BigCodeBench 的开发旨在解决现有代码评估框架中的三个主要问题:
- 任务简单性:HumanEval 任务往往过于简单,无法代表真实的软件开发,后者通常需要整合多种库。
- 污染与过拟合:越来越多的担忧表明 LLM 已在 HumanEval 数据上进行训练,使其成为衡量泛化能力的不可靠指标。
- 缺乏通用工具:现有的替代方案往往过于领域特定、确定性,或仅专注于代理(例如 DS-1000 或 SWE-bench),导致缺少易用且覆盖面广的编程基准。
技术设计与任务结构
BigCodeBench 包含 1,140 个函数级任务。为确保严格评估,每个任务平均包含 5.6 条测试用例,平均分支覆盖率为 99%。
任务变体
基准提供两个版本以测试不同模型的能力:
- BigCodeBench-Complete:代码补全场景,LLM 根据 docstring 中的详细指令完成函数。
- BigCodeBench-Instruct:更具挑战性的变体,需求以对话式、较少冗长的方式呈现,用于评估指令微调的 LLM。
任务创建流程
任务通过“Human-LLM 协作流程”生成:
- Seeding:该过程始于 ODEX 数据集(Stack Overflow Python 单行代码)。
- Expansion:GPT-4 将这些单行代码扩展为完整的函数级任务。
- Refinement:20 位拥有超过 5 年 Python 经验的人工专家在沙盒中指导 GPT-4 精炼任务并添加测试用例。
- Verification:另外 7 位人工专家交叉检查质量。人工专家在抽样任务上实现了 97% 的平均表现。
LLM 性能与评估指标
评估采用 Pass@1 with greedy decoding,衡量首次尝试即正确解决任务的比例。为应对“模型懒惰”——指令微调模型在长提示中省略关键 import 语句——研究者使用 calibrated Pass@1,在评估时补充缺失的设置(import 和全局常量)。
关键发现
- Performance Gap:LLM 的表现显著低于人类。GPT-4o 目前是表现最佳的模型,在
BigCodeBench-Complete上实现了 61.1% 的 calibrated Pass@1,在BigCodeBench-Instruct上为 51.1%。 - Closed vs. Open Models:闭源模型与开源模型之间存在显著的性能差距。
- Difficulty:该基准极具挑战性;在
BigCodeBench-Complete上,149 个任务所有测试模型均未解决,而仅有 6 个任务被所有模型解决。
基于 Elo 评分的排名
为了提供比 Pass@1 更细致的比较,团队采用了 Elo 评分系统(常用于国际象棋)。在该系统中,每个任务视为一局比赛,每个模型视为一名选手。GPT-4o 以大幅优势领跑排名,随后是第二梯队的 DeepSeekCoder-V2。
评估框架与实现
BigCodeBench 提供了一个用户友好的评估框架,可通过 PyPI 获取(pip install bigcodebench)。该框架基于 EvalPlus,但针对 unittest 以及 BigCodeBench 多样的库依赖进行了适配。
工作流
- Generation:使用
bigcodebench.generate生成代码样本。 - Sanitization:使用
bigcodebench.sanitize去除自然语言并确保代码可编译。 - Evaluation:在 Docker 沙箱中使用
bigcodebench.evaluate对代码执行测试用例。
未来路线图
BigCode 项目计划在多个关键领域推进基准的演进:
- Multilingualism:扩展至除 Python 之外的其他编程语言。
- Rigorousness:改进测试用例增强,确保所有 LLM 生成的解答得到正确评估。
- Generalization:在新兴库(如
transformers和langchain)上测试模型。 - Evolution:定期更新基准,以适应已废弃的库版本和不断变化的训练数据。
- Interaction:通过让模型与浏览器和终端交互,实现“LLM 作为代理”,以进行自我调试和反思。