Evaluation of Code Language Models

Dec 21, 2023·
夏 伟
夏 伟

记录一些在实践代码大语言模型过程中的经验和总结,本篇是关于代码测评的相关内容,包括代码测评关键指标、常用公开 benchmark 数据集等。

Metric 指标

  • $pass@k$,代码生成最重要的指标之一,其含义是让模型对一个问题生成k次结果,测算其至少能通过一次的概率

    • 那么,最直接的估计方法是针对每一道题重复t次实验,每次生成k个结果,再计算所有实验的平均值;重复实验次数越多,实验平均值的方差越小,但是,该操作的计算量过大,共生成$\scriptsize t*k$次结果
    • codex 论文中给出了一种无偏的估计方法,每道题生成$\scriptsize n (n>k)$次结果,然后使用下面的公式进行无偏估计 $$ \scriptsize pass@k = \mathbb{E}{[1- \binom{n-c}{k}/\binom{n}{k}]} =1-{(1-\hat{p})}^k $$ 其中 $c$ 表示生成的n次结果里面,通过所有测试用例的数量
    • 上面无偏估计是通过生成错误代码的角度来计算的,$\scriptsize \binom{n-c}{k}/\binom{n}{k}$表示k次均错误生成结果的占比
    • 关于 $\scriptsize \hat{p}$ 的无偏估计,codex论文 给出了一个数值计算的方式,这位博主也进行了推导
    def pass_at_k(n, c, k):
        """
        :param n: total number of samples
        :param c: number of correct samples
        :param k: k in pass@$k$
        """
        if n - c < k: return 1.0
        return 1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1)
    
  • codeBLEU, 大模型时代之前,重点关注的指标,目前更多会看pass@k

    • codeBLUE是在普通文本翻译指标BLUE的基础上进行了扩展。
    • 考虑了代码的关键词优先级、代码语法和代码语义三个垂域属性 $\scriptsize CodeBLEU=\alpha * BLEU + \beta * BLEU_{weight}​ +\gamma * Match_{ast} + \delta * Match_{df} $
  • PPL 困惑度 (perplexity, the logarithm of which is the entropy),可以表述为训练过程中的无监督指标,是交叉熵的指数形式,

    $$ \scriptsize pp(w)=2^{- \frac{1}{N} \log_2{P(w)}} $$
  • Unittest 方法,包括Exact-set Match accuracy (EM) and EXecution accuracy (EX) 等

    • EM和EX在NL2SQL场景使用比较多
    • EM 关注模型的预测跟label的文本保持一致,EX考虑的是执行结果一致,一般情况下EX的分略高于EM
  • human score (包括对话偏好打分,如Arena, IDE Copilot 用户接纳率等用户体验指标)

  • 还有一些针对代码局部结构、跨文件代码生成、语义信息的匹配度或覆盖率指标

  • 另外,可以将多种指标聚合,得到更综合的指标

Eval dataset & Benchmark 等

  1. HumanEval (OpenAI)
    • 是最经典的一个代码生成(补全)测试集,出自openai 的Codex论文
    • 原版是164道python编程题,给出函数名,功能描述以及少量的可见测试用例,目标是续写完成函数功能主体
    • 后续清华唐杰老师CodeGeeX 团队将测评语言类型扩展到了5种 (Python, C++, Java, JavaScript, and Go), 并开源发布了HUmanEval-x数据集
  2. MBPP (The Mostly Basic Programming Problems, Google),包含974道基本的python编程题目,通过众包的方式收集得到,跟humaneval类似,主要用于代码生成的测评
  3. Evalplus (HumanEval+, MBPP+) 扩展了大量的测试用例
    • RepoQA: Long-Context Code Understanding 用于长文本的代码理解,是evalplus的子集
  4. APPs, UC Berkeley等机构发布开源的数据集,覆盖Introductory, Interview, Competition三个难度级别的10000道python编程题;APPs数据集中包含两个指标Test case averagestrict accuracy。后者跟$pass@k$类似;而前者是考虑每个测试用例的通过情况,即 $$ \scriptsize p_{tca}=\frac{1}{P}\sum_{p=1}^P \frac{1}{C_p} \sum_{c=1}^{C_p} \mathbb I \{eval (code_p, x_{p,c}) = y_{p,c}\} $$
  5. DS-1000,1000道数据科学相关的代码生成benchmark,覆盖了场景的Python数据处理任务,具体包括:Numpy,Scipy,pandas,Tensorflow, Pytorch,scikit-learn, matplotlib等七种场景任务。
  6. LiveCodeBench, 周期性从LeetCode, AtCoder, and Codeforces 等平台收集新的编程题目用于测评,从以下 code generation, self-repair, test output prediction, code execution 四个维度进行生成代码的评价
  7. BigCodeBench, 为验证LLM解决真实编程问题的能力,该benchmark从两个维度进行测评。a) LLM需要学会调用不同的库函数,来实现数据分析和网络开发;b) 通过对复杂指令的理解,来有效有效组合推理使用多个工具解决真实的任务。
  8. CodeEditorBench, 评估大语言模型在代码编辑任务中性能。涵盖了调试、翻译、优化和需求变更等多种代码编辑场景。
  9. SWE-bench, 处理github仓库上面真实软件编码的issue问题,覆盖面广。另外也有 SWE-bench LiteSWE-bench Verified 两个子集版本
  10. Pybench, 评估大语言模型在真实编程任务下的表现,包括图表、文字分析,图片编辑,复杂数学和软件开发等任务。
  11. Spider,NL2SQL的经典数据集,西湖大学的研究者在此基础上开源发布了中文翻译版本cspider
  12. CoIR, 是我们针对代码检索任务构造的一个数据集,包括text2code,code2code,code2text等多种任务
  13. Chatbot Arena,将大模型以众包的方式进行匿名投票,类似游戏计算Elo 排名。覆盖多个维度测评,其中包括一个coding 维度
夏 伟
Authors
Senior Researcher
My research interests include large language model, Reinforcement learning for Recommender System and Automatic (AI) Systems.