DynaCode: A Dynamic Complexity-Aware Code Benchmark for Evaluating Large Language Models in Code Generation
作者: Wenhao Hu, Jinhao Duan, Chunchen Wei, Li Zhang, Yue Zhang, Kaidi Xu
分类: cs.CL, cs.AI
发布日期: 2025-03-13 (更新: 2025-05-29)
备注: 18 pages, 13 figures. Accepted to the ACL 2025 Findings
🔗 代码/项目: GITHUB
💡 一句话要点
DynaCode:动态复杂性感知代码基准,用于评估代码生成大语言模型
🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)
关键词: 代码生成 大语言模型 动态基准 复杂性评估 调用图 代码理解 模型评估
📋 核心要点
- 现有代码生成基准数据集静态,易被大语言模型记忆,导致评估结果失真,无法真实反映模型的泛化能力。
- DynaCode提出动态生成代码问题的基准,并引入复杂性感知指标,结合代码复杂度和调用图结构,更全面地评估模型。
- 实验表明,DynaCode能有效区分不同大语言模型的代码生成能力,并揭示模型在处理嵌套代码和子函数交互方面的偏好。
📝 摘要(中文)
大型语言模型(LLMs)的快速发展显著提高了它们在代码生成任务中的性能。然而,现有的代码基准仍然是静态的,由具有预定义问题的固定数据集组成。这使得它们容易在训练过程中被记忆,LLMs回忆起特定的测试用例,而不是泛化到新的问题,导致数据污染和不可靠的评估结果。为了解决这些问题,我们引入了DynaCode,一个动态的、复杂性感知的基准,它克服了静态数据集的局限性。DynaCode使用复杂性感知指标系统地评估LLMs,该指标结合了代码复杂性和调用图结构。DynaCode实现了大规模的多样性,生成了多达1.89亿个独特的嵌套代码问题,跨越四个不同的代码复杂性级别(称为单元)和16种类型的调用图。对12个最新的LLMs的结果显示,与静态代码生成基准MBPP+相比,平均性能下降了16.8%到45.7%,并且性能随着复杂性的增加而逐渐降低。这证明了DynaCode有效区分LLMs的能力。此外,通过利用调用图,我们深入了解了LLM的行为,特别是它们在嵌套代码中处理子函数交互的偏好。我们的基准和评估代码可在https://github.com/HWH-2000/DynaCode上找到。
🔬 方法详解
问题定义:现有代码生成基准数据集(如MBPP+)是静态的,包含固定的问题集。大型语言模型(LLMs)在这些数据集上训练时,容易记忆特定的测试用例,而不是真正理解和泛化代码生成能力。这导致评估结果虚高,无法准确反映LLMs在实际应用中的性能。
核心思路:DynaCode的核心思路是动态生成代码问题,避免LLMs记忆特定测试用例。通过控制代码的复杂度和调用图结构,DynaCode能够系统地评估LLMs在不同复杂度和结构化代码生成方面的能力。这种动态生成的方式可以有效防止数据污染,并提供更可靠的评估结果。
技术框架:DynaCode的整体框架包括以下几个主要模块:1) 代码单元生成器:生成不同复杂度的基本代码单元;2) 调用图生成器:生成不同类型的调用图结构;3) 代码问题组装器:根据代码单元和调用图,组装成完整的代码问题;4) 复杂性评估器:评估生成的代码问题的复杂性;5) 评估框架:用于评估LLMs在DynaCode上的性能。
关键创新:DynaCode的关键创新在于其动态生成代码问题的方式和复杂性感知的评估指标。与静态数据集相比,DynaCode能够生成大规模多样性的代码问题,有效防止数据污染。复杂性感知的评估指标不仅考虑了代码的长度和嵌套深度,还考虑了调用图的结构,从而更全面地评估LLMs的代码生成能力。
关键设计:DynaCode的关键设计包括:1) 代码单元的复杂度分级:定义了四个不同的代码复杂度级别(units),用于控制基本代码单元的复杂性;2) 调用图的类型:定义了16种不同类型的调用图,用于控制代码的结构化程度;3) 复杂性评估指标:结合代码复杂度和调用图结构,设计了综合的复杂性评估指标,用于评估生成的代码问题的难度。
🖼️ 关键图片
📊 实验亮点
实验结果表明,与静态基准MBPP+相比,12个最新的LLMs在DynaCode上的平均性能下降了16.8%到45.7%。性能下降幅度随着代码复杂性的增加而增大,表明DynaCode能够有效区分不同LLMs的代码生成能力。此外,通过分析LLMs在不同调用图结构上的表现,揭示了它们在处理嵌套代码和子函数交互方面的偏好。
🎯 应用场景
DynaCode可用于系统评估和比较不同大型语言模型在代码生成任务中的性能。通过分析模型在不同复杂度和结构化代码问题上的表现,可以深入了解模型的优势和不足,指导模型改进。此外,DynaCode还可用于开发更有效的代码生成训练方法和技术。
📄 摘要(原文)
The rapid advancement of large language models (LLMs) has significantly improved their performance in code generation tasks. However, existing code benchmarks remain static, consisting of fixed datasets with predefined problems. This makes them vulnerable to memorization during training, where LLMs recall specific test cases instead of generalizing to new problems, leading to data contamination and unreliable evaluation results. To address these issues, we introduce DynaCode, a dynamic, complexity-aware benchmark that overcomes the limitations of static datasets. DynaCode evaluates LLMs systematically using a complexity-aware metric, incorporating both code complexity and call-graph structures. DynaCode achieves large-scale diversity, generating up to 189 million unique nested code problems across four distinct levels of code complexity, referred to as units, and 16 types of call graphs. Results on 12 latest LLMs show an average performance drop of 16.8% to 45.7% compared to MBPP+, a static code generation benchmark, with performance progressively decreasing as complexity increases. This demonstrates DynaCode's ability to effectively differentiate LLMs. Additionally, by leveraging call graphs, we gain insights into LLM behavior, particularly their preference for handling subfunction interactions within nested code. Our benchmark and evaluation code are available at https://github.com/HWH-2000/DynaCode.