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 协作流程”生成:

  1. Seeding:该过程始于 ODEX 数据集(Stack Overflow Python 单行代码)。
  2. Expansion:GPT-4 将这些单行代码扩展为完整的函数级任务。
  3. Refinement:20 位拥有超过 5 年 Python 经验的人工专家在沙盒中指导 GPT-4 精炼任务并添加测试用例。
  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 多样的库依赖进行了适配。

工作流

  1. Generation:使用 bigcodebench.generate 生成代码样本。
  2. Sanitization:使用 bigcodebench.sanitize 去除自然语言并确保代码可编译。
  3. Evaluation:在 Docker 沙箱中使用 bigcodebench.evaluate 对代码执行测试用例。

未来路线图

BigCode 项目计划在多个关键领域推进基准的演进:

  • Multilingualism:扩展至除 Python 之外的其他编程语言。
  • Rigorousness:改进测试用例增强,确保所有 LLM 生成的解答得到正确评估。
  • Generalization:在新兴库(如 transformerslangchain)上测试模型。
  • Evolution:定期更新基准,以适应已废弃的库版本和不断变化的训练数据。
  • Interaction:通过让模型与浏览器和终端交互,实现“LLM 作为代理”,以进行自我调试和反思。

Sources