这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

HumanEval

2021-07。164 道手写函数题,单测当完成谓词。完成谓词第一次可以不靠人判。

Chen 等,2021,随 Evaluating Large Language Models Trained on Code 发布。衡量「根据文档字符串合成 Python 函数」能否通过单元测试,而不是与参考解是否相似。

  1. 论文:按原文转述功能正确、pass@k、164 道题,以及必须手写的原因。
  2. 讲解:完成谓词停在函数级,以及它如何成为仓库级基准的起点。

数据与评测框架:openai/human-eval。同篇论文里的模型见 Codex。原文:arXiv:2107.03374。

1 - HumanEval(论文)

按 Chen 等 2021 年论文转述评测集本身:功能正确、pass@k、164 道手写题。

评测集随 Codex 论文一次交出。这里只转述 HumanEval 这张考卷;模型训练与限度见 Codex 论文。Chen 等,Evaluating Large Language Models Trained on Code,2021-07。arXiv:2107.03374。仓库:https://github.com/openai/human-eval。


主张

代码生成原先常用与参考解的精确或模糊匹配(BLEU)。匹配无法覆盖「功能等价但写法不同」的大空间。本文改用功能正确:样本通过一组单元测试即算对。这与测试驱动开发、合并代码前过单测的工程习惯一致。

为此手写 164 道带单测的 Python 题,覆盖语言理解、算法与简单数学,部分接近初级面试题。每题含签名、文档字符串、函数体与若干单测,平均 7.7 个测试。必须手写:模型训在 GitHub 很大一部分上,网上已有各种题解。

pass@k

每题生成 (k) 个样本,任一通过则该题算解出,再报解出比例。直接用 (k) 个样本方差大。改为每题生成 (n\ge k) 个(文中 (n=200),(k\le 100)),设 (c) 个通过,用无偏估计

[ \mathrm{pass@}k=\mathbb{E}_{\text{Problems}}\left[1-\frac{\binom{n-c}{k}}{\binom{n}{k}}\right] ]

用 (1-(1-\hat p)^k) 是有偏的。文中还显示:功能不等价的错误解与正确解的 BLEU 分布大量重叠,优化 BLEU 不等于优化功能正确。

当时报的分数(对照模型)

12B Codex 单样本解出 28.8%;GPT-3 约 0%;GPT-J 11.4%。每题 100 个样本,Codex 可解出约 70%。监督微调后的 Codex-S,pass@1 约 37.7%,pass@100 约 77.5%。这些数字属于模型对照,不是考卷自己的属性。

当时不是什么

不是仓库级、多文件、带真实 GitHub issue 的考试。164 道独立函数,尺度故意很小,为的是可复现、可自动判。执行在 gVisor 沙箱里,是为了安全地跑生成代码。

2 - HumanEval 讲解

用单元测试当完成谓词:看执行结果,不看流畅度。函数级尺子,完成谓词第一次可以不靠人判。

论文解决了什么问题

2021 年若只用 BLEU,分不清「形似」与「功能正确」。HumanEval 用手写题目与单元测试定义对错,并给出无偏的 pass@(k)。手写是为了减少训练语料泄漏。多采样(pass@100)被写成对「尝试多种写法」的近似。同日交出的模型见 Codex。

对后续 LLM 与 Agent 的影响

评测从「形似」转为「功能正确」。后来的 MBPP、LiveCodeBench 沿用功能正确;产品里的「再生成一次」与 pass@(k) 是同一逻辑。泄漏与手写基准这一问题,一直传到 SWE-bench 的去污染讨论。

它覆盖的是函数级合成,不是在仓库里修改缺陷、提交 PR。164 道题远窄于 2023 年的 SWE-bench。HumanEval 通过,不代表能修真实 issue。

对 Agent 循环而言,它提供的是完成谓词的早期形态:行动的反馈可以是测试退出码,而不只是人看一眼。循环本身不在这张考卷上。考卷没有决策核心,没有多步环境,也没有开放目标。这条路一直走到 2023 年的 SWE-bench。

时间线标成底层能力里的首证、标准。仓库级的完成谓词要到 SWE-bench。