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